@hivehub/rulebook 5.7.0 → 5.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/analysis.md +35 -35
- package/.claude/commands/continue.md +33 -33
- package/.claude/commands/rulebook-decision-create.md +55 -55
- package/.claude/commands/rulebook-decision-list.md +15 -15
- package/.claude/commands/rulebook-knowledge-add.md +41 -41
- package/.claude/commands/rulebook-knowledge-list.md +15 -15
- package/.claude/commands/rulebook-memory-save.md +48 -48
- package/.claude/commands/rulebook-memory-search.md +47 -47
- package/.claude/commands/rulebook-task-apply.md +67 -67
- package/.claude/commands/rulebook-task-archive.md +94 -94
- package/.claude/commands/rulebook-task-create.md +93 -93
- package/.claude/commands/rulebook-task-list.md +42 -42
- package/.claude/commands/rulebook-task-show.md +52 -52
- package/.claude/commands/rulebook-task-validate.md +53 -53
- package/.claude-plugin/marketplace.json +28 -28
- package/.claude-plugin/plugin.json +8 -8
- package/README.md +86 -0
- package/dist/cli/commands/claude.d.ts +17 -0
- package/dist/cli/commands/claude.d.ts.map +1 -0
- package/dist/cli/commands/claude.js +56 -0
- package/dist/cli/commands/claude.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +18 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +6 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/prompts.d.ts +13 -0
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +106 -0
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/claude/claude-mcp.d.ts +9 -0
- package/dist/core/claude/claude-mcp.d.ts.map +1 -1
- package/dist/core/claude/claude-mcp.js +30 -0
- package/dist/core/claude/claude-mcp.js.map +1 -1
- package/dist/core/claude/claude-settings-manager.d.ts +12 -0
- package/dist/core/claude/claude-settings-manager.d.ts.map +1 -1
- package/dist/core/claude/claude-settings-manager.js +59 -3
- package/dist/core/claude/claude-settings-manager.js.map +1 -1
- package/dist/core/detect/detector.d.ts +8 -1
- package/dist/core/detect/detector.d.ts.map +1 -1
- package/dist/core/detect/detector.js +225 -0
- package/dist/core/detect/detector.js.map +1 -1
- package/dist/core/detect/library-registry.d.ts +40 -0
- package/dist/core/detect/library-registry.d.ts.map +1 -0
- package/dist/core/detect/library-registry.js +239 -0
- package/dist/core/detect/library-registry.js.map +1 -0
- package/dist/core/generators/generator.d.ts +1 -0
- package/dist/core/generators/generator.d.ts.map +1 -1
- package/dist/core/generators/generator.js +37 -0
- package/dist/core/generators/generator.js.map +1 -1
- package/dist/core/generators/rules-generator.d.ts +1 -5
- package/dist/core/generators/rules-generator.d.ts.map +1 -1
- package/dist/core/generators/rules-generator.js +40 -1
- package/dist/core/generators/rules-generator.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.js +0 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +23 -22
- package/templates/agents/accessibility-reviewer.md +43 -43
- package/templates/agents/api-designer.md +42 -42
- package/templates/agents/architect.md +51 -51
- package/templates/agents/build-engineer.md +36 -36
- package/templates/agents/code-reviewer.md +47 -47
- package/templates/agents/compiler/codegen-debugger.md +34 -34
- package/templates/agents/compiler/stdlib-engineer.md +28 -28
- package/templates/agents/compiler/test-coverage-guardian.md +31 -31
- package/templates/agents/database-architect.md +41 -41
- package/templates/agents/devops-engineer.md +42 -42
- package/templates/agents/docs-writer.md +38 -38
- package/templates/agents/game-engine/cpp-core-expert.md +35 -35
- package/templates/agents/game-engine/render-engineer.md +22 -22
- package/templates/agents/game-engine/shader-engineer.md +38 -38
- package/templates/agents/game-engine/systems-integration.md +43 -43
- package/templates/agents/generic/code-reviewer.md +41 -41
- package/templates/agents/generic/docs-writer.md +25 -25
- package/templates/agents/generic/project-manager.md +36 -36
- package/templates/agents/generic/researcher.md +34 -34
- package/templates/agents/generic/test-engineer.md +41 -41
- package/templates/agents/i18n-engineer.md +42 -42
- package/templates/agents/implementer.md +42 -42
- package/templates/agents/migration-engineer.md +42 -42
- package/templates/agents/mobile/platform-specialist.md +22 -22
- package/templates/agents/mobile/ui-engineer.md +22 -22
- package/templates/agents/performance-engineer.md +49 -49
- package/templates/agents/project-manager.md +215 -0
- package/templates/agents/quality-gatekeeper.md +205 -0
- package/templates/agents/refactoring-agent.md +41 -41
- package/templates/agents/researcher.md +38 -38
- package/templates/agents/security-reviewer.md +40 -40
- package/templates/agents/team-lead.md +37 -37
- package/templates/agents/tester.md +48 -48
- package/templates/agents/ux-reviewer.md +43 -43
- package/templates/agents/web-app/api-designer.md +22 -22
- package/templates/agents/web-app/backend-engineer.md +30 -30
- package/templates/agents/web-app/database-engineer.md +22 -22
- package/templates/agents/web-app/frontend-engineer.md +29 -29
- package/templates/agents/web-app/security-reviewer.md +32 -32
- package/templates/ci/rulebook-review.yml +26 -26
- package/templates/claude-workflows/bugfix.js +94 -0
- package/templates/claude-workflows/feature-pipeline.js +88 -0
- package/templates/claude-workflows/release-gate.js +64 -0
- package/templates/claude-workflows/review-fanout.js +118 -0
- package/templates/claude-workflows/rulebook-driver.js +343 -0
- package/templates/claude-workflows/spec-author.js +133 -0
- package/templates/cli/AIDER.md +49 -49
- package/templates/cli/AMAZON_Q.md +25 -25
- package/templates/cli/AUGGIE.md +32 -32
- package/templates/cli/CLAUDE.md +117 -117
- package/templates/cli/CLINE.md +99 -99
- package/templates/cli/CODEBUDDY.md +20 -20
- package/templates/cli/CODEIUM.md +20 -20
- package/templates/cli/CODEX.md +21 -21
- package/templates/cli/CONTINUE.md +34 -34
- package/templates/cli/CURSOR_CLI.md +62 -62
- package/templates/cli/FACTORY.md +18 -18
- package/templates/cli/GEMINI.md +35 -35
- package/templates/cli/KILOCODE.md +18 -18
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
- package/templates/commands/rulebook-decision-create.md +55 -55
- package/templates/commands/rulebook-decision-list.md +15 -15
- package/templates/commands/rulebook-knowledge-add.md +41 -41
- package/templates/commands/rulebook-knowledge-list.md +15 -15
- package/templates/commands/rulebook-memory-save.md +48 -48
- package/templates/commands/rulebook-memory-search.md +47 -47
- package/templates/commands/rulebook-task-apply.md +67 -67
- package/templates/commands/rulebook-task-archive.md +94 -94
- package/templates/commands/rulebook-task-create.md +93 -93
- package/templates/commands/rulebook-task-list.md +42 -42
- package/templates/commands/rulebook-task-show.md +52 -52
- package/templates/commands/rulebook-task-validate.md +53 -53
- package/templates/compact-context/_default.md +23 -23
- package/templates/compact-context/cpp.md +26 -26
- package/templates/compact-context/go.md +26 -26
- package/templates/compact-context/python.md +26 -26
- package/templates/compact-context/rust.md +28 -28
- package/templates/compact-context/typescript.md +29 -29
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +296 -296
- package/templates/core/CLAUDE_MD_v2.md +90 -90
- package/templates/core/DAG.md +304 -304
- package/templates/core/DECISIONS.md +38 -38
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- package/templates/core/KNOWLEDGE.md +49 -49
- package/templates/core/MULTI_AGENT.md +74 -74
- package/templates/core/PLANS.md +28 -28
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
- package/templates/core/RULEBOOK.md +1947 -1947
- package/templates/core/TIER1_PROHIBITIONS.md +154 -154
- package/templates/core/TOKEN_OPTIMIZATION.md +49 -49
- package/templates/git/CI_CD_PATTERNS.md +661 -661
- package/templates/git/GITHUB_ACTIONS.md +728 -728
- package/templates/git/GITLAB_CI.md +730 -730
- package/templates/git/GIT_WORKFLOW.md +1192 -1192
- package/templates/git/SECRETS_MANAGEMENT.md +585 -585
- package/templates/hooks/COMMIT_MSG.md +530 -530
- package/templates/hooks/POST_CHECKOUT.md +546 -546
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
- package/templates/hooks/PRE_COMMIT.md +414 -414
- package/templates/hooks/PRE_PUSH.md +601 -601
- package/templates/hooks/check-context-and-handoff.sh +16 -6
- package/templates/hooks/update-check.ps1 +84 -0
- package/templates/hooks/update-check.sh +103 -0
- package/templates/ides/CONTINUE_RULES.md +16 -16
- package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
- package/templates/ides/GEMINI_RULES.md +17 -17
- package/templates/ides/WINDSURF_RULES.md +14 -14
- package/templates/languages/C.md +333 -333
- package/templates/languages/CPP.md +743 -743
- package/templates/languages/CSHARP.md +417 -417
- package/templates/languages/ELIXIR.md +454 -454
- package/templates/languages/ERLANG.md +361 -361
- package/templates/languages/GO.md +645 -645
- package/templates/languages/HASKELL.md +177 -177
- package/templates/languages/JAVA.md +607 -607
- package/templates/languages/JAVASCRIPT.md +631 -631
- package/templates/languages/JULIA.md +97 -97
- package/templates/languages/KOTLIN.md +511 -511
- package/templates/languages/LISP.md +100 -100
- package/templates/languages/LUA.md +74 -74
- package/templates/languages/OBJECTIVEC.md +90 -90
- package/templates/languages/PHP.md +416 -416
- package/templates/languages/PYTHON.md +682 -682
- package/templates/languages/RUBY.md +421 -421
- package/templates/languages/RUST.md +477 -477
- package/templates/languages/SAS.md +73 -73
- package/templates/languages/SCALA.md +348 -348
- package/templates/languages/SOLIDITY.md +580 -580
- package/templates/languages/SQL.md +137 -137
- package/templates/languages/SWIFT.md +466 -466
- package/templates/languages/TYPESCRIPT.md +591 -591
- package/templates/languages/ZIG.md +265 -265
- package/templates/libraries/go/ECHO.md +18 -0
- package/templates/libraries/go/GIN.md +18 -0
- package/templates/libraries/go/GORM.md +18 -0
- package/templates/libraries/python/DJANGO.md +18 -0
- package/templates/libraries/python/FASTAPI.md +18 -0
- package/templates/libraries/python/FLASK.md +17 -0
- package/templates/libraries/python/PYDANTIC.md +17 -0
- package/templates/libraries/python/PYTEST.md +17 -0
- package/templates/libraries/python/SQLALCHEMY.md +17 -0
- package/templates/libraries/rust/ACTIX.md +17 -0
- package/templates/libraries/rust/AXUM.md +18 -0
- package/templates/libraries/rust/SERDE.md +16 -0
- package/templates/libraries/rust/SQLX.md +17 -0
- package/templates/libraries/rust/TOKIO.md +16 -0
- package/templates/libraries/typescript/ANGULAR.md +17 -0
- package/templates/libraries/typescript/DRIZZLE.md +16 -0
- package/templates/libraries/typescript/EXPRESS.md +17 -0
- package/templates/libraries/typescript/HEROUI.md +16 -0
- package/templates/libraries/typescript/JEST.md +17 -0
- package/templates/libraries/typescript/NESTJS.md +17 -0
- package/templates/libraries/typescript/NEXT.md +18 -0
- package/templates/libraries/typescript/PRISMA.md +16 -0
- package/templates/libraries/typescript/RADIX.md +16 -0
- package/templates/libraries/typescript/REACT.md +18 -0
- package/templates/libraries/typescript/SHADCN.md +16 -0
- package/templates/libraries/typescript/SVELTE.md +16 -0
- package/templates/libraries/typescript/TAILWIND.md +16 -0
- package/templates/libraries/typescript/TRPC.md +16 -0
- package/templates/libraries/typescript/VITEST.md +17 -0
- package/templates/libraries/typescript/VUE.md +17 -0
- package/templates/libraries/typescript/ZOD.md +17 -0
- package/templates/modules/ATLASSIAN.md +255 -255
- package/templates/modules/CONTEXT7.md +54 -54
- package/templates/modules/FIGMA.md +267 -267
- package/templates/modules/GITHUB_MCP.md +64 -64
- package/templates/modules/GRAFANA.md +328 -328
- package/templates/modules/MEMORY.md +126 -126
- package/templates/modules/NOTION.md +247 -247
- package/templates/modules/PLAYWRIGHT.md +90 -90
- package/templates/modules/RULEBOOK_MCP.md +208 -208
- package/templates/modules/SERENA.md +337 -337
- package/templates/modules/SUPABASE.md +223 -223
- package/templates/modules/SYNAP.md +69 -69
- package/templates/modules/VECTORIZER.md +63 -63
- package/templates/modules/sequential-thinking.md +42 -42
- package/templates/rules/consult-analysis-before-implementing.md +23 -23
- package/templates/rules/cpp.md +46 -46
- package/templates/rules/csharp.md +44 -44
- package/templates/rules/diagnostic-first.md +39 -39
- package/templates/rules/fail-twice-escalate.md +46 -46
- package/templates/rules/follow-task-sequence.md +36 -36
- package/templates/rules/git-safety.md +29 -29
- package/templates/rules/go.md +40 -40
- package/templates/rules/incremental-implementation.md +56 -56
- package/templates/rules/incremental-tests.md +29 -29
- package/templates/rules/java.md +43 -43
- package/templates/rules/javascript.md +39 -39
- package/templates/rules/knowledge-base-usage.md +41 -41
- package/templates/rules/multi-agent-teams.md +75 -75
- package/templates/rules/no-deferred.md +31 -31
- package/templates/rules/no-shortcuts.md +30 -30
- package/templates/rules/python.md +43 -43
- package/templates/rules/research-first.md +30 -30
- package/templates/rules/respect-handoff-trigger.md +41 -41
- package/templates/rules/rust.md +40 -40
- package/templates/rules/sequential-editing.md +21 -21
- package/templates/rules/session-workflow.md +24 -24
- package/templates/rules/task-decomposition.md +32 -32
- package/templates/rules/typescript.md +40 -40
- package/templates/skills/cli/aider/SKILL.md +59 -59
- package/templates/skills/cli/amazon-q/SKILL.md +35 -35
- package/templates/skills/cli/auggie/SKILL.md +42 -42
- package/templates/skills/cli/claude/SKILL.md +42 -42
- package/templates/skills/cli/cline/SKILL.md +42 -42
- package/templates/skills/cli/codebuddy/SKILL.md +30 -30
- package/templates/skills/cli/codeium/SKILL.md +30 -30
- package/templates/skills/cli/codex/SKILL.md +31 -31
- package/templates/skills/cli/continue/SKILL.md +44 -44
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
- package/templates/skills/cli/factory/SKILL.md +28 -28
- package/templates/skills/cli/gemini/SKILL.md +45 -45
- package/templates/skills/cli/kilocode/SKILL.md +28 -28
- package/templates/skills/core/agent-automation/SKILL.md +194 -194
- package/templates/skills/core/dag/SKILL.md +314 -314
- package/templates/skills/core/documentation-rules/SKILL.md +46 -46
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
- package/templates/skills/core/rulebook/SKILL.md +176 -176
- package/templates/skills/core/rulebook-terse/SKILL.md +116 -116
- package/templates/skills/core/rulebook-terse-commit/SKILL.md +96 -96
- package/templates/skills/core/rulebook-terse-review/SKILL.md +112 -112
- package/templates/skills/dev/accessibility/SKILL.md +17 -17
- package/templates/skills/dev/analysis/SKILL.md +19 -19
- package/templates/skills/dev/api-design/SKILL.md +15 -15
- package/templates/skills/dev/architect/SKILL.md +17 -17
- package/templates/skills/dev/build-fix/SKILL.md +17 -17
- package/templates/skills/dev/db-design/SKILL.md +15 -15
- package/templates/skills/dev/debug/SKILL.md +16 -16
- package/templates/skills/dev/deploy/SKILL.md +17 -17
- package/templates/skills/dev/docs/SKILL.md +17 -17
- package/templates/skills/dev/handoff/SKILL.md +27 -27
- package/templates/skills/dev/migrate/SKILL.md +15 -15
- package/templates/skills/dev/perf/SKILL.md +17 -17
- package/templates/skills/dev/refactor/SKILL.md +17 -17
- package/templates/skills/dev/research/SKILL.md +14 -14
- package/templates/skills/dev/review/SKILL.md +18 -18
- package/templates/skills/dev/security-audit/SKILL.md +17 -17
- package/templates/skills/dev/spec/SKILL.md +65 -0
- package/templates/skills/ides/copilot/SKILL.md +47 -47
- package/templates/skills/ides/cursor/SKILL.md +53 -53
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
- package/templates/skills/ides/replit/SKILL.md +46 -46
- package/templates/skills/ides/tabnine/SKILL.md +39 -39
- package/templates/skills/ides/vscode/SKILL.md +50 -50
- package/templates/skills/ides/windsurf/SKILL.md +46 -46
- package/templates/skills/ides/zed/SKILL.md +42 -42
- package/templates/skills/languages/c/SKILL.md +343 -343
- package/templates/skills/languages/cpp/SKILL.md +753 -753
- package/templates/skills/languages/csharp/SKILL.md +427 -427
- package/templates/skills/languages/elixir/SKILL.md +464 -464
- package/templates/skills/languages/erlang/SKILL.md +371 -371
- package/templates/skills/languages/go/SKILL.md +655 -655
- package/templates/skills/languages/haskell/SKILL.md +187 -187
- package/templates/skills/languages/java/SKILL.md +617 -617
- package/templates/skills/languages/javascript/SKILL.md +641 -641
- package/templates/skills/languages/julia/SKILL.md +107 -107
- package/templates/skills/languages/kotlin/SKILL.md +521 -521
- package/templates/skills/languages/lisp/SKILL.md +110 -110
- package/templates/skills/languages/lua/SKILL.md +84 -84
- package/templates/skills/languages/objectivec/SKILL.md +100 -100
- package/templates/skills/languages/php/SKILL.md +426 -426
- package/templates/skills/languages/python/SKILL.md +692 -692
- package/templates/skills/languages/ruby/SKILL.md +431 -431
- package/templates/skills/languages/rust/SKILL.md +487 -487
- package/templates/skills/languages/sas/SKILL.md +83 -83
- package/templates/skills/languages/scala/SKILL.md +358 -358
- package/templates/skills/languages/solidity/SKILL.md +590 -590
- package/templates/skills/languages/sql/SKILL.md +147 -147
- package/templates/skills/languages/swift/SKILL.md +476 -476
- package/templates/skills/languages/typescript/SKILL.md +302 -302
- package/templates/skills/languages/zig/SKILL.md +275 -275
- package/templates/skills/modules/atlassian/SKILL.md +265 -265
- package/templates/skills/modules/context7/SKILL.md +64 -64
- package/templates/skills/modules/figma/SKILL.md +277 -277
- package/templates/skills/modules/github-mcp/SKILL.md +74 -74
- package/templates/skills/modules/grafana/SKILL.md +338 -338
- package/templates/skills/modules/memory/SKILL.md +73 -73
- package/templates/skills/modules/notion/SKILL.md +257 -257
- package/templates/skills/modules/playwright/SKILL.md +100 -100
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
- package/templates/skills/modules/serena/SKILL.md +347 -347
- package/templates/skills/modules/supabase/SKILL.md +233 -233
- package/templates/skills/modules/synap/SKILL.md +79 -79
- package/templates/skills/modules/vectorizer/SKILL.md +73 -73
- package/dist/agents/ralph-parser.d.ts +0 -91
- package/dist/agents/ralph-parser.d.ts.map +0 -1
- package/dist/agents/ralph-parser.js +0 -415
- package/dist/agents/ralph-parser.js.map +0 -1
- package/dist/cli/commands/analysis.d.ts +0 -8
- package/dist/cli/commands/analysis.d.ts.map +0 -1
- package/dist/cli/commands/analysis.js +0 -78
- package/dist/cli/commands/analysis.js.map +0 -1
- package/dist/cli/commands/compress.d.ts +0 -18
- package/dist/cli/commands/compress.d.ts.map +0 -1
- package/dist/cli/commands/compress.js +0 -100
- package/dist/cli/commands/compress.js.map +0 -1
- package/dist/cli/commands/ralph.d.ts +0 -45
- package/dist/cli/commands/ralph.d.ts.map +0 -1
- package/dist/cli/commands/ralph.js +0 -694
- package/dist/cli/commands/ralph.js.map +0 -1
- package/dist/cli/docs-prompts.d.ts +0 -3
- package/dist/cli/docs-prompts.d.ts.map +0 -1
- package/dist/cli/docs-prompts.js +0 -45
- package/dist/cli/docs-prompts.js.map +0 -1
- package/dist/core/agent-manager.d.ts +0 -69
- package/dist/core/agent-manager.d.ts.map +0 -1
- package/dist/core/agent-manager.js +0 -476
- package/dist/core/agent-manager.js.map +0 -1
- package/dist/core/agent-template-engine.d.ts +0 -51
- package/dist/core/agent-template-engine.d.ts.map +0 -1
- package/dist/core/agent-template-engine.js +0 -291
- package/dist/core/agent-template-engine.js.map +0 -1
- package/dist/core/analysis-manager.d.ts +0 -56
- package/dist/core/analysis-manager.d.ts.map +0 -1
- package/dist/core/analysis-manager.js +0 -218
- package/dist/core/analysis-manager.js.map +0 -1
- package/dist/core/auto-fixer.d.ts +0 -14
- package/dist/core/auto-fixer.d.ts.map +0 -1
- package/dist/core/auto-fixer.js +0 -207
- package/dist/core/auto-fixer.js.map +0 -1
- package/dist/core/changelog-generator.d.ts +0 -44
- package/dist/core/changelog-generator.d.ts.map +0 -1
- package/dist/core/changelog-generator.js +0 -222
- package/dist/core/changelog-generator.js.map +0 -1
- package/dist/core/claude-mcp.d.ts +0 -59
- package/dist/core/claude-mcp.d.ts.map +0 -1
- package/dist/core/claude-mcp.js +0 -220
- package/dist/core/claude-mcp.js.map +0 -1
- package/dist/core/claude-md-generator.d.ts +0 -52
- package/dist/core/claude-md-generator.d.ts.map +0 -1
- package/dist/core/claude-md-generator.js +0 -104
- package/dist/core/claude-md-generator.js.map +0 -1
- package/dist/core/claude-settings-manager.d.ts +0 -44
- package/dist/core/claude-settings-manager.d.ts.map +0 -1
- package/dist/core/claude-settings-manager.js +0 -191
- package/dist/core/claude-settings-manager.js.map +0 -1
- package/dist/core/cli-bridge.d.ts +0 -113
- package/dist/core/cli-bridge.d.ts.map +0 -1
- package/dist/core/cli-bridge.js +0 -1094
- package/dist/core/cli-bridge.js.map +0 -1
- package/dist/core/compact-context-manager.d.ts +0 -34
- package/dist/core/compact-context-manager.d.ts.map +0 -1
- package/dist/core/compact-context-manager.js +0 -60
- package/dist/core/compact-context-manager.js.map +0 -1
- package/dist/core/complexity-detector.d.ts +0 -36
- package/dist/core/complexity-detector.d.ts.map +0 -1
- package/dist/core/complexity-detector.js +0 -334
- package/dist/core/complexity-detector.js.map +0 -1
- package/dist/core/compress/compressor.d.ts +0 -60
- package/dist/core/compress/compressor.d.ts.map +0 -1
- package/dist/core/compress/compressor.js +0 -232
- package/dist/core/compress/compressor.js.map +0 -1
- package/dist/core/compress/discover.d.ts +0 -19
- package/dist/core/compress/discover.d.ts.map +0 -1
- package/dist/core/compress/discover.js +0 -100
- package/dist/core/compress/discover.js.map +0 -1
- package/dist/core/compress/validator.d.ts +0 -47
- package/dist/core/compress/validator.d.ts.map +0 -1
- package/dist/core/compress/validator.js +0 -131
- package/dist/core/compress/validator.js.map +0 -1
- package/dist/core/config-manager.d.ts +0 -86
- package/dist/core/config-manager.d.ts.map +0 -1
- package/dist/core/config-manager.js +0 -621
- package/dist/core/config-manager.js.map +0 -1
- package/dist/core/coverage-checker.d.ts +0 -14
- package/dist/core/coverage-checker.d.ts.map +0 -1
- package/dist/core/coverage-checker.js +0 -176
- package/dist/core/coverage-checker.js.map +0 -1
- package/dist/core/cursor-mdc-generator.d.ts +0 -30
- package/dist/core/cursor-mdc-generator.d.ts.map +0 -1
- package/dist/core/cursor-mdc-generator.js +0 -98
- package/dist/core/cursor-mdc-generator.js.map +0 -1
- package/dist/core/decision-manager.d.ts +0 -25
- package/dist/core/decision-manager.d.ts.map +0 -1
- package/dist/core/decision-manager.js +0 -183
- package/dist/core/decision-manager.js.map +0 -1
- package/dist/core/dependency-checker.d.ts +0 -21
- package/dist/core/dependency-checker.d.ts.map +0 -1
- package/dist/core/dependency-checker.js +0 -247
- package/dist/core/dependency-checker.js.map +0 -1
- package/dist/core/detector.d.ts +0 -27
- package/dist/core/detector.d.ts.map +0 -1
- package/dist/core/detector.js +0 -1763
- package/dist/core/detector.js.map +0 -1
- package/dist/core/docs-generator.d.ts +0 -9
- package/dist/core/docs-generator.d.ts.map +0 -1
- package/dist/core/docs-generator.js +0 -531
- package/dist/core/docs-generator.js.map +0 -1
- package/dist/core/doctor.d.ts +0 -19
- package/dist/core/doctor.d.ts.map +0 -1
- package/dist/core/doctor.js +0 -229
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/generator.d.ts +0 -56
- package/dist/core/generator.d.ts.map +0 -1
- package/dist/core/generator.js +0 -1193
- package/dist/core/generator.js.map +0 -1
- package/dist/core/github-issues-importer.d.ts +0 -82
- package/dist/core/github-issues-importer.d.ts.map +0 -1
- package/dist/core/github-issues-importer.js +0 -161
- package/dist/core/github-issues-importer.js.map +0 -1
- package/dist/core/gitignore-generator.d.ts +0 -13
- package/dist/core/gitignore-generator.d.ts.map +0 -1
- package/dist/core/gitignore-generator.js +0 -307
- package/dist/core/gitignore-generator.js.map +0 -1
- package/dist/core/health-scorer.d.ts +0 -61
- package/dist/core/health-scorer.d.ts.map +0 -1
- package/dist/core/health-scorer.js +0 -638
- package/dist/core/health-scorer.js.map +0 -1
- package/dist/core/iteration-tracker.d.ts +0 -85
- package/dist/core/iteration-tracker.d.ts.map +0 -1
- package/dist/core/iteration-tracker.js +0 -295
- package/dist/core/iteration-tracker.js.map +0 -1
- package/dist/core/knowledge-manager.d.ts +0 -24
- package/dist/core/knowledge-manager.d.ts.map +0 -1
- package/dist/core/knowledge-manager.js +0 -173
- package/dist/core/knowledge-manager.js.map +0 -1
- package/dist/core/learn-manager.d.ts +0 -29
- package/dist/core/learn-manager.d.ts.map +0 -1
- package/dist/core/learn-manager.js +0 -159
- package/dist/core/learn-manager.js.map +0 -1
- package/dist/core/mcp-reference-generator.d.ts +0 -13
- package/dist/core/mcp-reference-generator.d.ts.map +0 -1
- package/dist/core/mcp-reference-generator.js +0 -66
- package/dist/core/mcp-reference-generator.js.map +0 -1
- package/dist/core/minimal-scaffolder.d.ts +0 -8
- package/dist/core/minimal-scaffolder.d.ts.map +0 -1
- package/dist/core/minimal-scaffolder.js +0 -51
- package/dist/core/minimal-scaffolder.js.map +0 -1
- package/dist/core/modern-console.d.ts +0 -98
- package/dist/core/modern-console.d.ts.map +0 -1
- package/dist/core/modern-console.js +0 -556
- package/dist/core/modern-console.js.map +0 -1
- package/dist/core/multi-tool-generator.d.ts +0 -59
- package/dist/core/multi-tool-generator.d.ts.map +0 -1
- package/dist/core/multi-tool-generator.js +0 -157
- package/dist/core/multi-tool-generator.js.map +0 -1
- package/dist/core/override-manager.d.ts +0 -23
- package/dist/core/override-manager.d.ts.map +0 -1
- package/dist/core/override-manager.js +0 -82
- package/dist/core/override-manager.js.map +0 -1
- package/dist/core/plans-manager.d.ts +0 -46
- package/dist/core/plans-manager.d.ts.map +0 -1
- package/dist/core/plans-manager.js +0 -158
- package/dist/core/plans-manager.js.map +0 -1
- package/dist/core/prd-generator.d.ts +0 -48
- package/dist/core/prd-generator.d.ts.map +0 -1
- package/dist/core/prd-generator.js +0 -233
- package/dist/core/prd-generator.js.map +0 -1
- package/dist/core/ralph-manager.d.ts +0 -163
- package/dist/core/ralph-manager.d.ts.map +0 -1
- package/dist/core/ralph-manager.js +0 -555
- package/dist/core/ralph-manager.js.map +0 -1
- package/dist/core/ralph-parallel.d.ts +0 -55
- package/dist/core/ralph-parallel.d.ts.map +0 -1
- package/dist/core/ralph-parallel.js +0 -201
- package/dist/core/ralph-parallel.js.map +0 -1
- package/dist/core/ralph-plan-checkpoint.d.ts +0 -58
- package/dist/core/ralph-plan-checkpoint.d.ts.map +0 -1
- package/dist/core/ralph-plan-checkpoint.js +0 -154
- package/dist/core/ralph-plan-checkpoint.js.map +0 -1
- package/dist/core/ralph-scripts.d.ts +0 -12
- package/dist/core/ralph-scripts.d.ts.map +0 -1
- package/dist/core/ralph-scripts.js +0 -50
- package/dist/core/ralph-scripts.js.map +0 -1
- package/dist/core/review-manager.d.ts +0 -74
- package/dist/core/review-manager.d.ts.map +0 -1
- package/dist/core/review-manager.js +0 -371
- package/dist/core/review-manager.js.map +0 -1
- package/dist/core/rules-generator.d.ts +0 -73
- package/dist/core/rules-generator.d.ts.map +0 -1
- package/dist/core/rules-generator.js +0 -202
- package/dist/core/rules-generator.js.map +0 -1
- package/dist/core/skills-manager.d.ts +0 -126
- package/dist/core/skills-manager.d.ts.map +0 -1
- package/dist/core/skills-manager.js +0 -654
- package/dist/core/skills-manager.js.map +0 -1
- package/dist/core/state-writer.d.ts +0 -35
- package/dist/core/state-writer.d.ts.map +0 -1
- package/dist/core/state-writer.js +0 -81
- package/dist/core/state-writer.js.map +0 -1
- package/dist/core/task-manager.d.ts +0 -127
- package/dist/core/task-manager.d.ts.map +0 -1
- package/dist/core/task-manager.js +0 -607
- package/dist/core/task-manager.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -29
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -57
- package/dist/core/telemetry.js.map +0 -1
- package/dist/core/validator.d.ts +0 -21
- package/dist/core/validator.d.ts.map +0 -1
- package/dist/core/validator.js +0 -177
- package/dist/core/validator.js.map +0 -1
- package/dist/core/version-bumper.d.ts +0 -19
- package/dist/core/version-bumper.d.ts.map +0 -1
- package/dist/core/version-bumper.js +0 -180
- package/dist/core/version-bumper.js.map +0 -1
- package/dist/core/watcher.d.ts +0 -9
- package/dist/core/watcher.d.ts.map +0 -1
- package/dist/core/watcher.js +0 -22
- package/dist/core/watcher.js.map +0 -1
- package/dist/core/workflow-generator.d.ts +0 -15
- package/dist/core/workflow-generator.d.ts.map +0 -1
- package/dist/core/workflow-generator.js +0 -391
- package/dist/core/workflow-generator.js.map +0 -1
- package/dist/hooks/terse-activate.d.ts +0 -59
- package/dist/hooks/terse-activate.d.ts.map +0 -1
- package/dist/hooks/terse-activate.js +0 -149
- package/dist/hooks/terse-activate.js.map +0 -1
- package/dist/hooks/terse-config.d.ts +0 -51
- package/dist/hooks/terse-config.d.ts.map +0 -1
- package/dist/hooks/terse-config.js +0 -130
- package/dist/hooks/terse-config.js.map +0 -1
- package/dist/hooks/terse-mode-tracker.d.ts +0 -78
- package/dist/hooks/terse-mode-tracker.d.ts.map +0 -1
- package/dist/hooks/terse-mode-tracker.js +0 -213
- package/dist/hooks/terse-mode-tracker.js.map +0 -1
- package/dist/memory/hnsw-index.d.ts +0 -68
- package/dist/memory/hnsw-index.d.ts.map +0 -1
- package/dist/memory/hnsw-index.js +0 -544
- package/dist/memory/hnsw-index.js.map +0 -1
- package/dist/memory/memory-cache.d.ts +0 -33
- package/dist/memory/memory-cache.d.ts.map +0 -1
- package/dist/memory/memory-cache.js +0 -85
- package/dist/memory/memory-cache.js.map +0 -1
- package/dist/memory/memory-search.d.ts +0 -42
- package/dist/memory/memory-search.d.ts.map +0 -1
- package/dist/memory/memory-search.js +0 -180
- package/dist/memory/memory-search.js.map +0 -1
- package/dist/memory/memory-store.d.ts +0 -84
- package/dist/memory/memory-store.d.ts.map +0 -1
- package/dist/memory/memory-store.js +0 -566
- package/dist/memory/memory-store.js.map +0 -1
- package/dist/memory/memory-vectorizer.d.ts +0 -29
- package/dist/memory/memory-vectorizer.d.ts.map +0 -1
- package/dist/memory/memory-vectorizer.js +0 -199
- package/dist/memory/memory-vectorizer.js.map +0 -1
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
import { exec } from 'child_process';
|
|
2
|
-
import { promisify } from 'util';
|
|
3
|
-
import chalk from 'chalk';
|
|
4
|
-
import { fileExists, readFile } from '../utils/file-system.js';
|
|
5
|
-
import path from 'path';
|
|
6
|
-
const execAsync = promisify(exec);
|
|
7
|
-
/** Maximum diff length sent to the AI tool to avoid token limits. */
|
|
8
|
-
const MAX_DIFF_LENGTH = 10_000;
|
|
9
|
-
/** Maximum length of AGENTS.md context included in the prompt. */
|
|
10
|
-
const MAX_AGENTS_CONTEXT_LENGTH = 2_000;
|
|
11
|
-
// ─── Diff retrieval ─────────────────────────────────────────────────────────
|
|
12
|
-
/**
|
|
13
|
-
* Retrieve the git diff between the current HEAD and a base branch.
|
|
14
|
-
*
|
|
15
|
-
* Returns an empty string when:
|
|
16
|
-
* - The working directory is not a git repo.
|
|
17
|
-
* - There is no diff between the branches.
|
|
18
|
-
* - An error occurs during execution.
|
|
19
|
-
*
|
|
20
|
-
* The returned string is truncated to {@link MAX_DIFF_LENGTH} characters.
|
|
21
|
-
*/
|
|
22
|
-
export async function getDiffContext(projectRoot, baseBranch = 'main') {
|
|
23
|
-
try {
|
|
24
|
-
const [statResult, diffResult] = await Promise.all([
|
|
25
|
-
execAsync(`git diff ${baseBranch}...HEAD --stat`, {
|
|
26
|
-
cwd: projectRoot,
|
|
27
|
-
timeout: 15_000,
|
|
28
|
-
}).catch(() => ({ stdout: '' })),
|
|
29
|
-
execAsync(`git diff ${baseBranch}...HEAD`, {
|
|
30
|
-
cwd: projectRoot,
|
|
31
|
-
timeout: 15_000,
|
|
32
|
-
}).catch(() => ({ stdout: '' })),
|
|
33
|
-
]);
|
|
34
|
-
const stat = (statResult.stdout ?? '').trim();
|
|
35
|
-
const diff = (diffResult.stdout ?? '').trim();
|
|
36
|
-
if (!stat && !diff) {
|
|
37
|
-
return '';
|
|
38
|
-
}
|
|
39
|
-
const combined = `${stat}\n\n${diff}`;
|
|
40
|
-
if (combined.length > MAX_DIFF_LENGTH) {
|
|
41
|
-
return combined.slice(0, MAX_DIFF_LENGTH) + '\n\n[... diff truncated]';
|
|
42
|
-
}
|
|
43
|
-
return combined;
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return '';
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// ─── Prompt construction ────────────────────────────────────────────────────
|
|
50
|
-
/**
|
|
51
|
-
* Build a structured review prompt suitable for an AI code reviewer.
|
|
52
|
-
*/
|
|
53
|
-
export function buildReviewPrompt(diff, context) {
|
|
54
|
-
const projectLine = context.projectName
|
|
55
|
-
? `Project: ${context.projectName}`
|
|
56
|
-
: 'Project: (unknown)';
|
|
57
|
-
const guidelinesBlock = context.agentsMdContent
|
|
58
|
-
? context.agentsMdContent.slice(0, MAX_AGENTS_CONTEXT_LENGTH)
|
|
59
|
-
: '(no project guidelines available)';
|
|
60
|
-
return [
|
|
61
|
-
'You are a code reviewer. Review the following git diff for issues.',
|
|
62
|
-
'',
|
|
63
|
-
projectLine,
|
|
64
|
-
'',
|
|
65
|
-
'Guidelines:',
|
|
66
|
-
guidelinesBlock,
|
|
67
|
-
'',
|
|
68
|
-
'Git Diff:',
|
|
69
|
-
diff,
|
|
70
|
-
'',
|
|
71
|
-
'Provide your review in this exact format:',
|
|
72
|
-
'',
|
|
73
|
-
'## Summary',
|
|
74
|
-
'<one paragraph summary>',
|
|
75
|
-
'',
|
|
76
|
-
'## Issues',
|
|
77
|
-
'For each issue, use this format:',
|
|
78
|
-
'- [CRITICAL|MAJOR|MINOR|SUGGESTION] <file>:<line> — <message>',
|
|
79
|
-
'',
|
|
80
|
-
'## Suggestions',
|
|
81
|
-
'- <suggestion 1>',
|
|
82
|
-
'- <suggestion 2>',
|
|
83
|
-
].join('\n');
|
|
84
|
-
}
|
|
85
|
-
// ─── Output parsing ─────────────────────────────────────────────────────────
|
|
86
|
-
const SEVERITY_MAP = {
|
|
87
|
-
CRITICAL: 'critical',
|
|
88
|
-
MAJOR: 'major',
|
|
89
|
-
MINOR: 'minor',
|
|
90
|
-
SUGGESTION: 'suggestion',
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Parse the raw AI output into a structured {@link ReviewResult}.
|
|
94
|
-
*
|
|
95
|
-
* Handles missing sections gracefully — every field has a sensible default.
|
|
96
|
-
*/
|
|
97
|
-
export function parseReviewOutput(output) {
|
|
98
|
-
const summary = extractSection(output, 'Summary');
|
|
99
|
-
const issuesRaw = extractSection(output, 'Issues');
|
|
100
|
-
const suggestionsRaw = extractSection(output, 'Suggestions');
|
|
101
|
-
const issues = parseIssues(issuesRaw);
|
|
102
|
-
const suggestions = parseBulletList(suggestionsRaw);
|
|
103
|
-
const approved = !issues.some((i) => i.severity === 'critical' || i.severity === 'major');
|
|
104
|
-
return { summary, issues, suggestions, approved };
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Extract the text content under a `## <heading>` section.
|
|
108
|
-
*
|
|
109
|
-
* Returns everything between the given heading and either the next `##` heading
|
|
110
|
-
* or the end of the string.
|
|
111
|
-
*/
|
|
112
|
-
function extractSection(text, heading) {
|
|
113
|
-
const pattern = new RegExp(`##\\s+${heading}\\s*\\n([\\s\\S]*?)(?=\\n##\\s|$)`, 'i');
|
|
114
|
-
const match = pattern.exec(text);
|
|
115
|
-
return match ? match[1].trim() : '';
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Parse issue lines from the Issues section.
|
|
119
|
-
*
|
|
120
|
-
* Expected line format:
|
|
121
|
-
* `- [SEVERITY] file.ts:42 — Some message`
|
|
122
|
-
* or
|
|
123
|
-
* `- [SEVERITY] Some message without file reference`
|
|
124
|
-
*/
|
|
125
|
-
function parseIssues(raw) {
|
|
126
|
-
if (!raw)
|
|
127
|
-
return [];
|
|
128
|
-
const issues = [];
|
|
129
|
-
const lines = raw.split('\n');
|
|
130
|
-
const issuePattern = /^[-*]\s*\[(CRITICAL|MAJOR|MINOR|SUGGESTION)]\s*(.*)/i;
|
|
131
|
-
for (const line of lines) {
|
|
132
|
-
const match = issuePattern.exec(line.trim());
|
|
133
|
-
if (!match)
|
|
134
|
-
continue;
|
|
135
|
-
const severity = SEVERITY_MAP[match[1].toUpperCase()];
|
|
136
|
-
if (!severity)
|
|
137
|
-
continue;
|
|
138
|
-
const rest = match[2].trim();
|
|
139
|
-
const issue = { severity, message: rest };
|
|
140
|
-
// Try to extract file:line — pattern: filename.ext:123 — message
|
|
141
|
-
const fileLinePattern = /^(\S+?):(\d+)\s*[—-]\s*(.*)/;
|
|
142
|
-
const fileLineMatch = fileLinePattern.exec(rest);
|
|
143
|
-
if (fileLineMatch) {
|
|
144
|
-
issue.file = fileLineMatch[1];
|
|
145
|
-
issue.line = parseInt(fileLineMatch[2], 10);
|
|
146
|
-
issue.message = fileLineMatch[3].trim();
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
// Try file without line number — filename.ext — message
|
|
150
|
-
const fileOnlyPattern = /^(\S+?\.\w+)\s*[—-]\s*(.*)/;
|
|
151
|
-
const fileOnlyMatch = fileOnlyPattern.exec(rest);
|
|
152
|
-
if (fileOnlyMatch) {
|
|
153
|
-
issue.file = fileOnlyMatch[1];
|
|
154
|
-
issue.message = fileOnlyMatch[2].trim();
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
issues.push(issue);
|
|
158
|
-
}
|
|
159
|
-
return issues;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Parse a markdown bullet list into an array of strings.
|
|
163
|
-
*/
|
|
164
|
-
function parseBulletList(raw) {
|
|
165
|
-
if (!raw)
|
|
166
|
-
return [];
|
|
167
|
-
return raw
|
|
168
|
-
.split('\n')
|
|
169
|
-
.map((line) => line.replace(/^[-*]\s*/, '').trim())
|
|
170
|
-
.filter((line) => line.length > 0);
|
|
171
|
-
}
|
|
172
|
-
// ─── AI tool execution ──────────────────────────────────────────────────────
|
|
173
|
-
/**
|
|
174
|
-
* Run the specified AI CLI tool with the given prompt.
|
|
175
|
-
*
|
|
176
|
-
* Returns the tool's stdout. On any error (timeout, missing tool, etc.)
|
|
177
|
-
* returns an empty string.
|
|
178
|
-
*/
|
|
179
|
-
export async function runAIReview(prompt, tool = 'claude') {
|
|
180
|
-
const commands = {
|
|
181
|
-
claude: 'claude',
|
|
182
|
-
gemini: 'gemini',
|
|
183
|
-
amp: 'amp',
|
|
184
|
-
};
|
|
185
|
-
const binary = commands[tool];
|
|
186
|
-
const flag = tool === 'gemini' ? '' : '-p';
|
|
187
|
-
// Build the command — pipe prompt via stdin for safety (avoids shell escaping)
|
|
188
|
-
const escapedPrompt = prompt.replace(/'/g, "'\\''");
|
|
189
|
-
const command = flag
|
|
190
|
-
? `echo '${escapedPrompt}' | ${binary} ${flag} -`
|
|
191
|
-
: `${binary} '${escapedPrompt}'`;
|
|
192
|
-
try {
|
|
193
|
-
const { stdout } = await execAsync(command, { timeout: 60_000 });
|
|
194
|
-
return stdout.trim();
|
|
195
|
-
}
|
|
196
|
-
catch {
|
|
197
|
-
return '';
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// ─── Terminal formatting ────────────────────────────────────────────────────
|
|
201
|
-
const SEVERITY_COLORS = {
|
|
202
|
-
critical: chalk.red,
|
|
203
|
-
major: chalk.yellow,
|
|
204
|
-
minor: chalk.blue,
|
|
205
|
-
suggestion: chalk.gray,
|
|
206
|
-
};
|
|
207
|
-
const SEVERITY_LABELS = {
|
|
208
|
-
critical: 'CRITICAL',
|
|
209
|
-
major: 'MAJOR',
|
|
210
|
-
minor: 'MINOR',
|
|
211
|
-
suggestion: 'SUGGESTION',
|
|
212
|
-
};
|
|
213
|
-
/**
|
|
214
|
-
* Format a {@link ReviewResult} as a chalk-colored terminal string.
|
|
215
|
-
*/
|
|
216
|
-
export function formatReviewTerminal(result) {
|
|
217
|
-
const lines = [];
|
|
218
|
-
// Header
|
|
219
|
-
if (result.approved) {
|
|
220
|
-
lines.push(chalk.green.bold('\n Review Result: APPROVED'));
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
lines.push(chalk.red.bold('\n Review Result: REJECTED'));
|
|
224
|
-
}
|
|
225
|
-
// Issue counts
|
|
226
|
-
const counts = countBySeverity(result.issues);
|
|
227
|
-
const countLine = [
|
|
228
|
-
counts.critical > 0 ? chalk.red(`${counts.critical} critical`) : null,
|
|
229
|
-
counts.major > 0 ? chalk.yellow(`${counts.major} major`) : null,
|
|
230
|
-
counts.minor > 0 ? chalk.blue(`${counts.minor} minor`) : null,
|
|
231
|
-
counts.suggestion > 0 ? chalk.gray(`${counts.suggestion} suggestion`) : null,
|
|
232
|
-
]
|
|
233
|
-
.filter(Boolean)
|
|
234
|
-
.join(', ');
|
|
235
|
-
if (countLine) {
|
|
236
|
-
lines.push(` Issues: ${countLine}`);
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
lines.push(chalk.green(' No issues found'));
|
|
240
|
-
}
|
|
241
|
-
lines.push('');
|
|
242
|
-
// Summary
|
|
243
|
-
if (result.summary) {
|
|
244
|
-
lines.push(chalk.bold(' Summary'));
|
|
245
|
-
lines.push(` ${result.summary}`);
|
|
246
|
-
lines.push('');
|
|
247
|
-
}
|
|
248
|
-
// Issues
|
|
249
|
-
if (result.issues.length > 0) {
|
|
250
|
-
lines.push(chalk.bold(' Issues'));
|
|
251
|
-
for (const issue of result.issues) {
|
|
252
|
-
const colorFn = SEVERITY_COLORS[issue.severity];
|
|
253
|
-
const label = SEVERITY_LABELS[issue.severity];
|
|
254
|
-
const location = issue.file ? (issue.line ? `${issue.file}:${issue.line}` : issue.file) : '';
|
|
255
|
-
const locationStr = location ? ` ${chalk.gray(location)}` : '';
|
|
256
|
-
lines.push(` ${colorFn(`[${label}]`)}${locationStr} ${issue.message}`);
|
|
257
|
-
}
|
|
258
|
-
lines.push('');
|
|
259
|
-
}
|
|
260
|
-
// Suggestions
|
|
261
|
-
if (result.suggestions.length > 0) {
|
|
262
|
-
lines.push(chalk.bold(' Suggestions'));
|
|
263
|
-
for (const suggestion of result.suggestions) {
|
|
264
|
-
lines.push(` ${chalk.gray('-')} ${suggestion}`);
|
|
265
|
-
}
|
|
266
|
-
lines.push('');
|
|
267
|
-
}
|
|
268
|
-
return lines.join('\n');
|
|
269
|
-
}
|
|
270
|
-
/**
|
|
271
|
-
* Count issues grouped by severity.
|
|
272
|
-
*/
|
|
273
|
-
function countBySeverity(issues) {
|
|
274
|
-
const counts = {
|
|
275
|
-
critical: 0,
|
|
276
|
-
major: 0,
|
|
277
|
-
minor: 0,
|
|
278
|
-
suggestion: 0,
|
|
279
|
-
};
|
|
280
|
-
for (const issue of issues) {
|
|
281
|
-
counts[issue.severity]++;
|
|
282
|
-
}
|
|
283
|
-
return counts;
|
|
284
|
-
}
|
|
285
|
-
// ─── GitHub comment posting ─────────────────────────────────────────────────
|
|
286
|
-
/**
|
|
287
|
-
* Format a {@link ReviewResult} as a GitHub-flavored markdown comment.
|
|
288
|
-
*/
|
|
289
|
-
export function formatReviewMarkdown(result) {
|
|
290
|
-
const lines = [];
|
|
291
|
-
const statusIcon = result.approved ? ':white_check_mark:' : ':x:';
|
|
292
|
-
lines.push(`## ${statusIcon} Rulebook AI Review`);
|
|
293
|
-
lines.push('');
|
|
294
|
-
if (result.summary) {
|
|
295
|
-
lines.push(`**Summary:** ${result.summary}`);
|
|
296
|
-
lines.push('');
|
|
297
|
-
}
|
|
298
|
-
if (result.issues.length > 0) {
|
|
299
|
-
lines.push('### Issues');
|
|
300
|
-
lines.push('');
|
|
301
|
-
for (const issue of result.issues) {
|
|
302
|
-
const label = issue.severity.toUpperCase();
|
|
303
|
-
const location = issue.file
|
|
304
|
-
? issue.line
|
|
305
|
-
? `\`${issue.file}:${issue.line}\``
|
|
306
|
-
: `\`${issue.file}\``
|
|
307
|
-
: '';
|
|
308
|
-
const locationStr = location ? ` ${location}` : '';
|
|
309
|
-
lines.push(`- **[${label}]**${locationStr} ${issue.message}`);
|
|
310
|
-
}
|
|
311
|
-
lines.push('');
|
|
312
|
-
}
|
|
313
|
-
if (result.suggestions.length > 0) {
|
|
314
|
-
lines.push('### Suggestions');
|
|
315
|
-
lines.push('');
|
|
316
|
-
for (const suggestion of result.suggestions) {
|
|
317
|
-
lines.push(`- ${suggestion}`);
|
|
318
|
-
}
|
|
319
|
-
lines.push('');
|
|
320
|
-
}
|
|
321
|
-
lines.push('---');
|
|
322
|
-
lines.push('*Generated by [@hivehub/rulebook](https://github.com/hivellm/rulebook) AI Review*');
|
|
323
|
-
return lines.join('\n');
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Post a review result as a PR comment using the `gh` CLI.
|
|
327
|
-
*
|
|
328
|
-
* When `prNumber` is omitted the `gh` CLI auto-detects the current PR
|
|
329
|
-
* from the branch.
|
|
330
|
-
*/
|
|
331
|
-
export async function postGitHubComment(result, prNumber) {
|
|
332
|
-
const markdown = formatReviewMarkdown(result);
|
|
333
|
-
const prArg = prNumber ? ` ${prNumber}` : '';
|
|
334
|
-
const escapedBody = markdown.replace(/'/g, "'\\''");
|
|
335
|
-
const command = `gh pr comment${prArg} --body '${escapedBody}'`;
|
|
336
|
-
try {
|
|
337
|
-
await execAsync(command, { timeout: 15_000 });
|
|
338
|
-
}
|
|
339
|
-
catch (error) {
|
|
340
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
341
|
-
throw new Error(`Failed to post GitHub comment: ${message}`);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
// ─── Severity threshold check ───────────────────────────────────────────────
|
|
345
|
-
const SEVERITY_RANK = {
|
|
346
|
-
critical: 3,
|
|
347
|
-
major: 2,
|
|
348
|
-
minor: 1,
|
|
349
|
-
suggestion: 0,
|
|
350
|
-
};
|
|
351
|
-
/**
|
|
352
|
-
* Check whether any issue meets or exceeds the given severity threshold.
|
|
353
|
-
*
|
|
354
|
-
* Returns `true` when at least one issue is at the threshold level or higher.
|
|
355
|
-
*/
|
|
356
|
-
export function hasFailingIssues(issues, failOn) {
|
|
357
|
-
const threshold = SEVERITY_RANK[failOn];
|
|
358
|
-
return issues.some((i) => SEVERITY_RANK[i.severity] >= threshold);
|
|
359
|
-
}
|
|
360
|
-
// ─── Convenience: read project AGENTS.md ────────────────────────────────────
|
|
361
|
-
/**
|
|
362
|
-
* Read AGENTS.md from the given project root, if it exists.
|
|
363
|
-
*/
|
|
364
|
-
export async function readAgentsMd(projectRoot) {
|
|
365
|
-
const agentsPath = path.join(projectRoot, 'AGENTS.md');
|
|
366
|
-
if (await fileExists(agentsPath)) {
|
|
367
|
-
return readFile(agentsPath);
|
|
368
|
-
}
|
|
369
|
-
return undefined;
|
|
370
|
-
}
|
|
371
|
-
//# sourceMappingURL=review-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"review-manager.js","sourceRoot":"","sources":["../../src/core/review-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { DetectionResult } from '../types.js';
|
|
2
|
-
/**
|
|
3
|
-
* v5.3.0 `.claude/rules/` generator.
|
|
4
|
-
*
|
|
5
|
-
* For every detected language that rulebook ships a template for, emit
|
|
6
|
-
* `.claude/rules/<language>.md` with YAML `paths:` frontmatter. These are
|
|
7
|
-
* Anthropic's path-scoped rules (loaded only when Claude reads a file
|
|
8
|
-
* matching the glob), so they cost zero context budget outside of the
|
|
9
|
-
* relevant file types.
|
|
10
|
-
*
|
|
11
|
-
* Files generated by rulebook carry a sentinel comment immediately after
|
|
12
|
-
* the frontmatter. On `rulebook update`, any `.claude/rules/*.md` without
|
|
13
|
-
* the sentinel is treated as user-authored and left alone. This lets users
|
|
14
|
-
* adopt a generated rule file as their own by simply deleting the sentinel
|
|
15
|
-
* comment line.
|
|
16
|
-
*/
|
|
17
|
-
export declare const RULES_DIR = ".claude/rules";
|
|
18
|
-
export declare const GENERATED_SENTINEL = "Generated by @hivehub/rulebook v5.3.0";
|
|
19
|
-
/**
|
|
20
|
-
* Languages with shipped rule templates. Adding a new entry here requires a
|
|
21
|
-
* matching `templates/rules/<slug>.md` file.
|
|
22
|
-
*/
|
|
23
|
-
export declare const SUPPORTED_RULE_LANGUAGES: readonly ["typescript", "javascript", "rust", "python", "go", "cpp", "java", "csharp"];
|
|
24
|
-
/**
|
|
25
|
-
* Generic (non-language) rules shipped by rulebook v5.3.0.
|
|
26
|
-
* These are always emitted regardless of detection result.
|
|
27
|
-
*/
|
|
28
|
-
export declare const ALWAYS_ON_RULES: readonly ["full-task-no-questions", "multi-agent-teams", "consult-analysis-before-implementing", "respect-handoff-trigger", "diagnostic-first", "fail-twice-escalate"];
|
|
29
|
-
export type SupportedRuleLanguage = (typeof SUPPORTED_RULE_LANGUAGES)[number];
|
|
30
|
-
export interface RulesGenerationResult {
|
|
31
|
-
/** Paths of rule files written (new or overwritten). */
|
|
32
|
-
written: string[];
|
|
33
|
-
/** Paths of rule files skipped because they lack the generated sentinel. */
|
|
34
|
-
preserved: string[];
|
|
35
|
-
/** Languages detected but not shipped as rule templates. */
|
|
36
|
-
unsupported: string[];
|
|
37
|
-
}
|
|
38
|
-
export declare function getRulesDir(projectRoot: string): string;
|
|
39
|
-
export declare function getRulePath(projectRoot: string, language: SupportedRuleLanguage): string;
|
|
40
|
-
/**
|
|
41
|
-
* Normalize a detected language string to a supported rule template slug.
|
|
42
|
-
* Returns null if rulebook does not ship a template for it.
|
|
43
|
-
*/
|
|
44
|
-
export declare function resolveRuleLanguage(detected: string): SupportedRuleLanguage | null;
|
|
45
|
-
/**
|
|
46
|
-
* Read a language rule template from the package's `templates/rules/`
|
|
47
|
-
* directory.
|
|
48
|
-
*/
|
|
49
|
-
export declare function readRuleTemplate(language: SupportedRuleLanguage): Promise<string>;
|
|
50
|
-
/**
|
|
51
|
-
* Check whether an existing rule file was generated by rulebook. Returns
|
|
52
|
-
* true only if the canonical sentinel comment is present. User files that
|
|
53
|
-
* the user "adopted" by deleting the sentinel return false and are
|
|
54
|
-
* preserved across updates.
|
|
55
|
-
*/
|
|
56
|
-
export declare function hasGeneratedSentinel(content: string): boolean;
|
|
57
|
-
/**
|
|
58
|
-
* Generate `.claude/rules/<language>.md` for every detected language that
|
|
59
|
-
* has a shipped template. User-authored rules (no sentinel) are preserved.
|
|
60
|
-
*/
|
|
61
|
-
export declare function generateRules(projectRoot: string, detection: Pick<DetectionResult, 'languages'>): Promise<RulesGenerationResult>;
|
|
62
|
-
/**
|
|
63
|
-
* List all rule files currently present in `.claude/rules/`, classifying
|
|
64
|
-
* each by origin (generated by rulebook vs user-authored).
|
|
65
|
-
*/
|
|
66
|
-
export interface ListedRule {
|
|
67
|
-
name: string;
|
|
68
|
-
path: string;
|
|
69
|
-
source: 'generated' | 'user';
|
|
70
|
-
paths: string[] | null;
|
|
71
|
-
}
|
|
72
|
-
export declare function listRulesWithSource(projectRoot: string): Promise<ListedRule[]>;
|
|
73
|
-
//# sourceMappingURL=rules-generator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rules-generator.d.ts","sourceRoot":"","sources":["../../src/core/rules-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,SAAS,kBAAkB,CAAC;AACzC,eAAO,MAAM,kBAAkB,0CAA0C,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,wBAAwB,wFAS3B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,eAAe,wKAOlB,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAkB9E,MAAM,WAAW,qBAAqB;IACpC,wDAAwD;IACxD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4EAA4E;IAC5E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAExF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAMlF;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAC5C,OAAO,CAAC,qBAAqB,CAAC,CA2DhC;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACxB;AAED,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAuBpF"}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import { readFile, writeFile, fileExists, ensureDir } from '../utils/file-system.js';
|
|
3
|
-
import { getTemplatesDir } from './generator.js';
|
|
4
|
-
/**
|
|
5
|
-
* v5.3.0 `.claude/rules/` generator.
|
|
6
|
-
*
|
|
7
|
-
* For every detected language that rulebook ships a template for, emit
|
|
8
|
-
* `.claude/rules/<language>.md` with YAML `paths:` frontmatter. These are
|
|
9
|
-
* Anthropic's path-scoped rules (loaded only when Claude reads a file
|
|
10
|
-
* matching the glob), so they cost zero context budget outside of the
|
|
11
|
-
* relevant file types.
|
|
12
|
-
*
|
|
13
|
-
* Files generated by rulebook carry a sentinel comment immediately after
|
|
14
|
-
* the frontmatter. On `rulebook update`, any `.claude/rules/*.md` without
|
|
15
|
-
* the sentinel is treated as user-authored and left alone. This lets users
|
|
16
|
-
* adopt a generated rule file as their own by simply deleting the sentinel
|
|
17
|
-
* comment line.
|
|
18
|
-
*/
|
|
19
|
-
export const RULES_DIR = '.claude/rules';
|
|
20
|
-
export const GENERATED_SENTINEL = 'Generated by @hivehub/rulebook v5.3.0';
|
|
21
|
-
/**
|
|
22
|
-
* Languages with shipped rule templates. Adding a new entry here requires a
|
|
23
|
-
* matching `templates/rules/<slug>.md` file.
|
|
24
|
-
*/
|
|
25
|
-
export const SUPPORTED_RULE_LANGUAGES = [
|
|
26
|
-
'typescript',
|
|
27
|
-
'javascript',
|
|
28
|
-
'rust',
|
|
29
|
-
'python',
|
|
30
|
-
'go',
|
|
31
|
-
'cpp',
|
|
32
|
-
'java',
|
|
33
|
-
'csharp',
|
|
34
|
-
];
|
|
35
|
-
/**
|
|
36
|
-
* Generic (non-language) rules shipped by rulebook v5.3.0.
|
|
37
|
-
* These are always emitted regardless of detection result.
|
|
38
|
-
*/
|
|
39
|
-
export const ALWAYS_ON_RULES = [
|
|
40
|
-
'full-task-no-questions',
|
|
41
|
-
'multi-agent-teams',
|
|
42
|
-
'consult-analysis-before-implementing',
|
|
43
|
-
'respect-handoff-trigger',
|
|
44
|
-
'diagnostic-first',
|
|
45
|
-
'fail-twice-escalate',
|
|
46
|
-
];
|
|
47
|
-
/**
|
|
48
|
-
* Detected languages from the `detector.ts` pipeline may use aliases
|
|
49
|
-
* (e.g. `"c"` — which rulebook treats as C/C++ and routes to the `cpp`
|
|
50
|
-
* template). Map them here.
|
|
51
|
-
*/
|
|
52
|
-
const LANGUAGE_ALIASES = {
|
|
53
|
-
c: 'cpp',
|
|
54
|
-
'c++': 'cpp',
|
|
55
|
-
cs: 'csharp',
|
|
56
|
-
'c#': 'csharp',
|
|
57
|
-
ts: 'typescript',
|
|
58
|
-
js: 'javascript',
|
|
59
|
-
py: 'python',
|
|
60
|
-
rs: 'rust',
|
|
61
|
-
};
|
|
62
|
-
export function getRulesDir(projectRoot) {
|
|
63
|
-
return path.join(projectRoot, RULES_DIR);
|
|
64
|
-
}
|
|
65
|
-
export function getRulePath(projectRoot, language) {
|
|
66
|
-
return path.join(getRulesDir(projectRoot), `${language}.md`);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Normalize a detected language string to a supported rule template slug.
|
|
70
|
-
* Returns null if rulebook does not ship a template for it.
|
|
71
|
-
*/
|
|
72
|
-
export function resolveRuleLanguage(detected) {
|
|
73
|
-
const lower = detected.toLowerCase().trim();
|
|
74
|
-
if (SUPPORTED_RULE_LANGUAGES.includes(lower)) {
|
|
75
|
-
return lower;
|
|
76
|
-
}
|
|
77
|
-
return LANGUAGE_ALIASES[lower] ?? null;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Read a language rule template from the package's `templates/rules/`
|
|
81
|
-
* directory.
|
|
82
|
-
*/
|
|
83
|
-
export async function readRuleTemplate(language) {
|
|
84
|
-
const templatePath = path.join(getTemplatesDir(), 'rules', `${language}.md`);
|
|
85
|
-
if (!(await fileExists(templatePath))) {
|
|
86
|
-
throw new Error(`Rule template not found at ${templatePath}`);
|
|
87
|
-
}
|
|
88
|
-
return await readFile(templatePath);
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Check whether an existing rule file was generated by rulebook. Returns
|
|
92
|
-
* true only if the canonical sentinel comment is present. User files that
|
|
93
|
-
* the user "adopted" by deleting the sentinel return false and are
|
|
94
|
-
* preserved across updates.
|
|
95
|
-
*/
|
|
96
|
-
export function hasGeneratedSentinel(content) {
|
|
97
|
-
return content.includes(GENERATED_SENTINEL);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Generate `.claude/rules/<language>.md` for every detected language that
|
|
101
|
-
* has a shipped template. User-authored rules (no sentinel) are preserved.
|
|
102
|
-
*/
|
|
103
|
-
export async function generateRules(projectRoot, detection) {
|
|
104
|
-
const rulesDir = getRulesDir(projectRoot);
|
|
105
|
-
await ensureDir(rulesDir);
|
|
106
|
-
const result = {
|
|
107
|
-
written: [],
|
|
108
|
-
preserved: [],
|
|
109
|
-
unsupported: [],
|
|
110
|
-
};
|
|
111
|
-
// Deduplicate: a project might detect both "typescript" and "javascript";
|
|
112
|
-
// we emit both rules since both apply. But if two detection entries map
|
|
113
|
-
// to the same template slug, only write once.
|
|
114
|
-
const seen = new Set();
|
|
115
|
-
for (const entry of detection.languages) {
|
|
116
|
-
const slug = resolveRuleLanguage(entry.language);
|
|
117
|
-
if (!slug) {
|
|
118
|
-
result.unsupported.push(entry.language);
|
|
119
|
-
continue;
|
|
120
|
-
}
|
|
121
|
-
if (seen.has(slug))
|
|
122
|
-
continue;
|
|
123
|
-
seen.add(slug);
|
|
124
|
-
const targetPath = getRulePath(projectRoot, slug);
|
|
125
|
-
if (await fileExists(targetPath)) {
|
|
126
|
-
const existing = await readFile(targetPath);
|
|
127
|
-
if (!hasGeneratedSentinel(existing)) {
|
|
128
|
-
// User-owned file — never touch it.
|
|
129
|
-
result.preserved.push(targetPath);
|
|
130
|
-
continue;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
const template = await readRuleTemplate(slug);
|
|
134
|
-
await writeFile(targetPath, template);
|
|
135
|
-
result.written.push(targetPath);
|
|
136
|
-
}
|
|
137
|
-
// Always-on rules (not language-scoped) — emit if sentinel-based skip allows
|
|
138
|
-
for (const ruleName of ALWAYS_ON_RULES) {
|
|
139
|
-
const targetPath = path.join(rulesDir, `${ruleName}.md`);
|
|
140
|
-
if (await fileExists(targetPath)) {
|
|
141
|
-
const existing = await readFile(targetPath);
|
|
142
|
-
if (!hasGeneratedSentinel(existing)) {
|
|
143
|
-
result.preserved.push(targetPath);
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
const templatePath = path.join(getTemplatesDir(), 'rules', `${ruleName}.md`);
|
|
148
|
-
if (await fileExists(templatePath)) {
|
|
149
|
-
const template = await readFile(templatePath);
|
|
150
|
-
await writeFile(targetPath, template);
|
|
151
|
-
result.written.push(targetPath);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return result;
|
|
155
|
-
}
|
|
156
|
-
export async function listRulesWithSource(projectRoot) {
|
|
157
|
-
const rulesDir = getRulesDir(projectRoot);
|
|
158
|
-
if (!(await fileExists(rulesDir)))
|
|
159
|
-
return [];
|
|
160
|
-
const { promises: fs } = await import('fs');
|
|
161
|
-
const entries = await fs.readdir(rulesDir, { withFileTypes: true });
|
|
162
|
-
const results = [];
|
|
163
|
-
for (const entry of entries) {
|
|
164
|
-
if (!entry.isFile() || !entry.name.endsWith('.md'))
|
|
165
|
-
continue;
|
|
166
|
-
const filePath = path.join(rulesDir, entry.name);
|
|
167
|
-
const content = await readFile(filePath);
|
|
168
|
-
const source = hasGeneratedSentinel(content) ? 'generated' : 'user';
|
|
169
|
-
results.push({
|
|
170
|
-
name: entry.name.replace(/\.md$/, ''),
|
|
171
|
-
path: filePath,
|
|
172
|
-
source,
|
|
173
|
-
paths: extractPathsFrontmatter(content),
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
results.sort((a, b) => a.name.localeCompare(b.name));
|
|
177
|
-
return results;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Extract the `paths:` field from a YAML frontmatter block at the top of a
|
|
181
|
-
* markdown file. Returns null if no frontmatter or no `paths:` field.
|
|
182
|
-
* Intentionally simple — handles the exact shape the shipped templates use,
|
|
183
|
-
* not arbitrary YAML. Callers that need full YAML support should use a real
|
|
184
|
-
* parser.
|
|
185
|
-
*/
|
|
186
|
-
function extractPathsFrontmatter(content) {
|
|
187
|
-
// Handle both LF and CRLF line endings (Windows writes CRLF)
|
|
188
|
-
const normalized = content.replace(/\r\n/g, '\n');
|
|
189
|
-
const match = normalized.match(/^---\n([\s\S]*?)\n---/);
|
|
190
|
-
if (!match)
|
|
191
|
-
return null;
|
|
192
|
-
const frontmatter = match[1];
|
|
193
|
-
const pathsMatch = frontmatter.match(/^paths:\s*\n((?:\s*-\s+.+\n?)+)/m);
|
|
194
|
-
if (!pathsMatch)
|
|
195
|
-
return null;
|
|
196
|
-
const lines = pathsMatch[1].split('\n').filter((l) => l.trim().startsWith('-'));
|
|
197
|
-
return lines.map((l) => l
|
|
198
|
-
.replace(/^\s*-\s+/, '')
|
|
199
|
-
.replace(/^["']|["']$/g, '')
|
|
200
|
-
.trim());
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=rules-generator.js.map
|