mirror of
https://github.com/alirezarezvani/ClaudeForge.git
synced 2026-07-04 02:43:15 -04:00
feat(plugin): ship as Claude Code plugin with 150-line cap and sync command
Turns ClaudeForge into an installable Claude Code plugin and adds the missing pieces for a clean lifecycle: hard line-cap enforcement, modular chaining via @path imports, a sync/cleanup command, and Explore-agent delegation for project discovery. - .claude-plugin/plugin.json: plugin manifest registering both skills, both commands, and the guardian agent (installable via /plugin marketplace add alirezarezvani/ClaudeForge && /plugin install claudeforge) - skill/validator.py: MAX_RECOMMENDED_LINES 300 -> 150 (warning at 120) - skill/template_selector.py: target_lines capped at 150 across all team sizes (solo 75 / small 100 / medium 125 / large 150) so any single CLAUDE.md fits within the cap; bigger projects spread content across modular sub-files - skill/analyzer.py: length thresholds, quality scoring, and recommendations rebased on the 150 cap (was 300/400) - skill/generator.py: modular root now emits @path imports next to the human-readable links; every sub-CLAUDE.md gets a back-link header pointing to ../CLAUDE.md (markdown + @import) for bidirectional chaining - command/sync-claude-md.md: new /sync-claude-md command that inventories every CLAUDE.md, prunes stale references, enforces the 150 cap by splitting into sub-files, and repairs the root <-> sub chain - command/enhance-claude-md.md: discovery phase now delegates the deep codebase scan to the Explore subagent to keep context lean - install.sh / install.ps1: each command in command/ installs as its own ~/.claude/commands/<name>.md (legacy bundle backed up on upgrade) - skill/SKILL.md, CLAUDE.md, README.md, CHANGELOG.md: docs updated for the plugin install path, sync command, and new line cap Verified via smoke test: validator constants, template targets, generator output line counts across 5 presets (all <= 150), context files with backlinks, @-import chain in modular root, idempotent merge_with_existing, validator status transitions at the new cap, analyzer quality differential, and plugin manifest JSON shape with all referenced paths existing on disk.
This commit is contained in:
+36
-11
@@ -99,7 +99,8 @@ class ContentGenerator:
|
||||
context: Context name ('backend', 'frontend', 'database', etc.)
|
||||
|
||||
Returns:
|
||||
Context-specific CLAUDE.md content
|
||||
Context-specific CLAUDE.md content with a back-link to the root
|
||||
CLAUDE.md so Claude can navigate back up the chain.
|
||||
"""
|
||||
generators = {
|
||||
'backend': self._generate_backend_file,
|
||||
@@ -110,7 +111,17 @@ class ContentGenerator:
|
||||
}
|
||||
|
||||
generator = generators.get(context, self._generate_generic_context_file)
|
||||
return generator()
|
||||
body = generator()
|
||||
|
||||
# Depth-aware back-link: most context dirs are one level deep, but
|
||||
# ``.github`` may sit at the repo root next to the root CLAUDE.md.
|
||||
rel_root = "../CLAUDE.md"
|
||||
backlink = (
|
||||
"> Parent context: see the root [CLAUDE.md]"
|
||||
f"({rel_root}) for project-wide guidelines and behavioural rules.\n"
|
||||
f"> Chained import: `@{rel_root}`\n\n"
|
||||
)
|
||||
return backlink + body
|
||||
|
||||
def _generate_backend_file(self) -> str:
|
||||
"""Generate backend-specific CLAUDE.md."""
|
||||
@@ -412,22 +423,36 @@ class ContentGenerator:
|
||||
return sections
|
||||
|
||||
def _generate_navigation_section(self, template: Dict[str, Any]) -> List[str]:
|
||||
"""Generate navigation section for modular architecture."""
|
||||
"""Generate navigation section for modular architecture.
|
||||
|
||||
Emits both human-readable markdown links and Claude Code ``@`` imports
|
||||
so the chained CLAUDE.md files are loaded automatically when the root
|
||||
file is read.
|
||||
"""
|
||||
project_type = self.project_context.get('type')
|
||||
links = []
|
||||
targets: List[tuple] = [] # (label, relative_path)
|
||||
|
||||
if project_type == 'fullstack':
|
||||
links.append("- [Backend Guidelines](backend/CLAUDE.md)")
|
||||
links.append("- [Frontend Guidelines](frontend/CLAUDE.md)")
|
||||
links.append("- [Database Operations](database/CLAUDE.md)")
|
||||
targets.append(("Backend Guidelines", "backend/CLAUDE.md"))
|
||||
targets.append(("Frontend Guidelines", "frontend/CLAUDE.md"))
|
||||
targets.append(("Database Operations", "database/CLAUDE.md"))
|
||||
|
||||
if 'cicd' in self.project_context.get('workflows', []):
|
||||
links.append("- [CI/CD Workflows](.github/CLAUDE.md)")
|
||||
targets.append(("CI/CD Workflows", ".github/CLAUDE.md"))
|
||||
|
||||
if not links:
|
||||
links.append("- [Add links to context-specific CLAUDE.md files]")
|
||||
if not targets:
|
||||
return ["- [Add links to context-specific CLAUDE.md files]"]
|
||||
|
||||
return links
|
||||
lines: List[str] = []
|
||||
for label, path in targets:
|
||||
lines.append(f"- [{label}]({path})")
|
||||
lines.append("")
|
||||
lines.append("Chained context (Claude Code auto-imports these):")
|
||||
lines.append("")
|
||||
for _, path in targets:
|
||||
lines.append(f"@{path}")
|
||||
|
||||
return lines
|
||||
|
||||
def _generate_core_principles(self, template: Dict[str, Any], max_count: int = 7) -> List[str]:
|
||||
"""Generate core principles list."""
|
||||
|
||||
Reference in New Issue
Block a user