@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,654 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skills Manager Module
|
|
3
|
-
*
|
|
4
|
-
* Handles discovery, loading, merging, and management of skills for Rulebook v2.0.
|
|
5
|
-
* Skills are self-contained capability modules with SKILL.md files containing
|
|
6
|
-
* YAML frontmatter (metadata) and guidance content.
|
|
7
|
-
*
|
|
8
|
-
* Compatible with:
|
|
9
|
-
* - Hugging Face Skills format
|
|
10
|
-
* - Claude Code plugin system
|
|
11
|
-
* - Codex AGENTS.md format
|
|
12
|
-
* - Gemini CLI extensions
|
|
13
|
-
*/
|
|
14
|
-
import { readdir } from 'fs/promises';
|
|
15
|
-
import { join, dirname, relative } from 'path';
|
|
16
|
-
import { fileExists, readFile, writeFile } from '../utils/file-system.js';
|
|
17
|
-
// Default skills directory relative to templates
|
|
18
|
-
const DEFAULT_SKILLS_DIR = 'skills';
|
|
19
|
-
const SKILL_FILE_NAME = 'SKILL.md';
|
|
20
|
-
const LEGACY_TEMPLATE_EXTENSIONS = ['.md'];
|
|
21
|
-
// Category mappings from legacy template structure
|
|
22
|
-
const CATEGORY_MAPPINGS = {
|
|
23
|
-
languages: 'languages',
|
|
24
|
-
frameworks: 'frameworks',
|
|
25
|
-
modules: 'modules',
|
|
26
|
-
services: 'services',
|
|
27
|
-
workflows: 'workflows',
|
|
28
|
-
ides: 'ides',
|
|
29
|
-
core: 'core',
|
|
30
|
-
cli: 'cli',
|
|
31
|
-
git: 'git',
|
|
32
|
-
hooks: 'hooks',
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* Parse YAML frontmatter from SKILL.md content
|
|
36
|
-
*/
|
|
37
|
-
export function parseSkillFrontmatter(content) {
|
|
38
|
-
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/;
|
|
39
|
-
const match = content.match(frontmatterRegex);
|
|
40
|
-
if (!match) {
|
|
41
|
-
// No frontmatter, treat entire content as body
|
|
42
|
-
return {
|
|
43
|
-
metadata: {
|
|
44
|
-
name: 'Unknown',
|
|
45
|
-
description: 'No description provided',
|
|
46
|
-
},
|
|
47
|
-
body: content,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
const [, yamlContent, body] = match;
|
|
51
|
-
const metadata = parseYamlMetadata(yamlContent);
|
|
52
|
-
return { metadata, body };
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Parse simple YAML metadata (key: value format)
|
|
56
|
-
*/
|
|
57
|
-
function parseYamlMetadata(yaml) {
|
|
58
|
-
const lines = yaml.split('\n');
|
|
59
|
-
const metadata = {};
|
|
60
|
-
for (const line of lines) {
|
|
61
|
-
const colonIndex = line.indexOf(':');
|
|
62
|
-
if (colonIndex === -1)
|
|
63
|
-
continue;
|
|
64
|
-
const key = line.slice(0, colonIndex).trim();
|
|
65
|
-
let value = line.slice(colonIndex + 1).trim();
|
|
66
|
-
// Handle arrays (simple format: [item1, item2])
|
|
67
|
-
if (typeof value === 'string' && value.startsWith('[') && value.endsWith(']')) {
|
|
68
|
-
value = value
|
|
69
|
-
.slice(1, -1)
|
|
70
|
-
.split(',')
|
|
71
|
-
.map((s) => s.trim().replace(/^['"]|['"]$/g, ''));
|
|
72
|
-
}
|
|
73
|
-
// Handle quoted strings
|
|
74
|
-
else if (typeof value === 'string' && /^['"].*['"]$/.test(value)) {
|
|
75
|
-
value = value.slice(1, -1);
|
|
76
|
-
}
|
|
77
|
-
if (key && value !== '') {
|
|
78
|
-
metadata[key] = value;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return {
|
|
82
|
-
name: metadata.name || 'Unknown',
|
|
83
|
-
description: metadata.description || 'No description provided',
|
|
84
|
-
version: metadata.version,
|
|
85
|
-
category: metadata.category,
|
|
86
|
-
author: metadata.author,
|
|
87
|
-
tags: metadata.tags,
|
|
88
|
-
dependencies: metadata.dependencies,
|
|
89
|
-
conflicts: metadata.conflicts,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Generate YAML frontmatter from metadata
|
|
94
|
-
*/
|
|
95
|
-
export function generateSkillFrontmatter(metadata) {
|
|
96
|
-
const lines = ['---'];
|
|
97
|
-
lines.push(`name: "${metadata.name}"`);
|
|
98
|
-
lines.push(`description: "${metadata.description}"`);
|
|
99
|
-
if (metadata.version) {
|
|
100
|
-
lines.push(`version: "${metadata.version}"`);
|
|
101
|
-
}
|
|
102
|
-
if (metadata.category) {
|
|
103
|
-
lines.push(`category: "${metadata.category}"`);
|
|
104
|
-
}
|
|
105
|
-
if (metadata.author) {
|
|
106
|
-
lines.push(`author: "${metadata.author}"`);
|
|
107
|
-
}
|
|
108
|
-
if (metadata.tags && metadata.tags.length > 0) {
|
|
109
|
-
lines.push(`tags: [${metadata.tags.map((t) => `"${t}"`).join(', ')}]`);
|
|
110
|
-
}
|
|
111
|
-
if (metadata.dependencies && metadata.dependencies.length > 0) {
|
|
112
|
-
lines.push(`dependencies: [${metadata.dependencies.map((d) => `"${d}"`).join(', ')}]`);
|
|
113
|
-
}
|
|
114
|
-
if (metadata.conflicts && metadata.conflicts.length > 0) {
|
|
115
|
-
lines.push(`conflicts: [${metadata.conflicts.map((c) => `"${c}"`).join(', ')}]`);
|
|
116
|
-
}
|
|
117
|
-
lines.push('---');
|
|
118
|
-
return lines.join('\n');
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Convert legacy template to skill format
|
|
122
|
-
*/
|
|
123
|
-
export function convertLegacyTemplateToSkill(templateContent, templateName, category) {
|
|
124
|
-
// Extract name from filename (e.g., TYPESCRIPT.md -> TypeScript)
|
|
125
|
-
const name = templateName
|
|
126
|
-
.replace(/\.md$/i, '')
|
|
127
|
-
.replace(/_/g, ' ')
|
|
128
|
-
.split(' ')
|
|
129
|
-
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
130
|
-
.join(' ');
|
|
131
|
-
// Try to extract description from first paragraph
|
|
132
|
-
const lines = templateContent.split('\n');
|
|
133
|
-
let description = `${name} skill for Rulebook`;
|
|
134
|
-
// Look for first non-empty, non-header line
|
|
135
|
-
for (const line of lines) {
|
|
136
|
-
const trimmed = line.trim();
|
|
137
|
-
if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('<!--')) {
|
|
138
|
-
description = trimmed.slice(0, 150);
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
const metadata = {
|
|
143
|
-
name,
|
|
144
|
-
description,
|
|
145
|
-
version: '1.0.0',
|
|
146
|
-
category,
|
|
147
|
-
tags: [category],
|
|
148
|
-
};
|
|
149
|
-
return { metadata, content: templateContent };
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Skills Manager Class
|
|
153
|
-
*/
|
|
154
|
-
export class SkillsManager {
|
|
155
|
-
templatesPath;
|
|
156
|
-
skillsPath;
|
|
157
|
-
skillsIndex = null;
|
|
158
|
-
constructor(templatesPath, _projectPath = process.cwd()) {
|
|
159
|
-
this.templatesPath = templatesPath;
|
|
160
|
-
this.skillsPath = join(templatesPath, DEFAULT_SKILLS_DIR);
|
|
161
|
-
// _projectPath reserved for future custom skills path support
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Discover all available skills from templates directory
|
|
165
|
-
*/
|
|
166
|
-
async discoverSkills() {
|
|
167
|
-
const skills = [];
|
|
168
|
-
const categories = {
|
|
169
|
-
languages: [],
|
|
170
|
-
frameworks: [],
|
|
171
|
-
modules: [],
|
|
172
|
-
services: [],
|
|
173
|
-
workflows: [],
|
|
174
|
-
ides: [],
|
|
175
|
-
core: [],
|
|
176
|
-
cli: [],
|
|
177
|
-
git: [],
|
|
178
|
-
hooks: [],
|
|
179
|
-
};
|
|
180
|
-
// First, check if new skills directory exists
|
|
181
|
-
if (await fileExists(this.skillsPath)) {
|
|
182
|
-
await this.scanSkillsDirectory(this.skillsPath, skills, categories);
|
|
183
|
-
}
|
|
184
|
-
// Also scan legacy template directories for backward compatibility
|
|
185
|
-
await this.scanLegacyTemplates(skills, categories);
|
|
186
|
-
this.skillsIndex = {
|
|
187
|
-
skills,
|
|
188
|
-
categories,
|
|
189
|
-
lastUpdated: new Date().toISOString(),
|
|
190
|
-
};
|
|
191
|
-
return this.skillsIndex;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Scan skills directory for SKILL.md files
|
|
195
|
-
*/
|
|
196
|
-
async scanSkillsDirectory(dir, skills, categories) {
|
|
197
|
-
try {
|
|
198
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
199
|
-
for (const entry of entries) {
|
|
200
|
-
const entryPath = join(dir, entry.name);
|
|
201
|
-
if (entry.isDirectory()) {
|
|
202
|
-
// Check if this directory contains SKILL.md
|
|
203
|
-
const skillFilePath = join(entryPath, SKILL_FILE_NAME);
|
|
204
|
-
if (await fileExists(skillFilePath)) {
|
|
205
|
-
const skill = await this.loadSkillFromFile(skillFilePath, entry.name);
|
|
206
|
-
if (skill) {
|
|
207
|
-
skills.push(skill);
|
|
208
|
-
categories[skill.category].push(skill);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
// Recurse into subdirectories
|
|
213
|
-
await this.scanSkillsDirectory(entryPath, skills, categories);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
catch {
|
|
219
|
-
// Directory doesn't exist or can't be read
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Scan legacy template directories
|
|
224
|
-
*/
|
|
225
|
-
async scanLegacyTemplates(skills, categories) {
|
|
226
|
-
for (const [dirName, category] of Object.entries(CATEGORY_MAPPINGS)) {
|
|
227
|
-
const dirPath = join(this.templatesPath, dirName);
|
|
228
|
-
if (!(await fileExists(dirPath)))
|
|
229
|
-
continue;
|
|
230
|
-
try {
|
|
231
|
-
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
232
|
-
for (const entry of entries) {
|
|
233
|
-
if (!entry.isFile())
|
|
234
|
-
continue;
|
|
235
|
-
const ext = entry.name.slice(entry.name.lastIndexOf('.'));
|
|
236
|
-
if (!LEGACY_TEMPLATE_EXTENSIONS.includes(ext.toLowerCase()))
|
|
237
|
-
continue;
|
|
238
|
-
// Skip if already loaded as skill
|
|
239
|
-
const skillId = this.generateSkillId(entry.name, category);
|
|
240
|
-
if (skills.some((s) => s.id === skillId))
|
|
241
|
-
continue;
|
|
242
|
-
const filePath = join(dirPath, entry.name);
|
|
243
|
-
const skill = await this.loadLegacyTemplate(filePath, entry.name, category);
|
|
244
|
-
if (skill) {
|
|
245
|
-
skills.push(skill);
|
|
246
|
-
categories[category].push(skill);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
catch {
|
|
251
|
-
// Directory can't be read
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Load skill from SKILL.md file
|
|
257
|
-
*/
|
|
258
|
-
async loadSkillFromFile(filePath, dirName) {
|
|
259
|
-
try {
|
|
260
|
-
const content = await readFile(filePath);
|
|
261
|
-
const { metadata, body } = parseSkillFrontmatter(content);
|
|
262
|
-
// Determine category from directory structure
|
|
263
|
-
const relPath = relative(this.skillsPath, dirname(filePath));
|
|
264
|
-
const pathParts = relPath.split(/[/\\]/);
|
|
265
|
-
const category = (CATEGORY_MAPPINGS[pathParts[0]] ||
|
|
266
|
-
metadata.category ||
|
|
267
|
-
'core');
|
|
268
|
-
const skillId = this.generateSkillId(metadata.name || dirName, category);
|
|
269
|
-
return {
|
|
270
|
-
id: skillId,
|
|
271
|
-
path: filePath,
|
|
272
|
-
metadata,
|
|
273
|
-
content: body,
|
|
274
|
-
category,
|
|
275
|
-
enabled: false,
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
catch {
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Load legacy template as skill
|
|
284
|
-
*/
|
|
285
|
-
async loadLegacyTemplate(filePath, fileName, category) {
|
|
286
|
-
try {
|
|
287
|
-
const content = await readFile(filePath);
|
|
288
|
-
const { metadata, content: skillContent } = convertLegacyTemplateToSkill(content, fileName, category);
|
|
289
|
-
const skillId = this.generateSkillId(fileName.replace(/\.md$/i, ''), category);
|
|
290
|
-
return {
|
|
291
|
-
id: skillId,
|
|
292
|
-
path: filePath,
|
|
293
|
-
metadata,
|
|
294
|
-
content: skillContent,
|
|
295
|
-
category,
|
|
296
|
-
enabled: false,
|
|
297
|
-
};
|
|
298
|
-
}
|
|
299
|
-
catch {
|
|
300
|
-
return null;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Generate unique skill ID
|
|
305
|
-
*/
|
|
306
|
-
generateSkillId(name, category) {
|
|
307
|
-
const cleanName = name
|
|
308
|
-
.toLowerCase()
|
|
309
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
310
|
-
.replace(/^-|-$/g, '');
|
|
311
|
-
return `${category}/${cleanName}`;
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Get all available skills
|
|
315
|
-
*/
|
|
316
|
-
async getSkills() {
|
|
317
|
-
if (!this.skillsIndex) {
|
|
318
|
-
await this.discoverSkills();
|
|
319
|
-
}
|
|
320
|
-
return this.skillsIndex.skills;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Get skills by category
|
|
324
|
-
*/
|
|
325
|
-
async getSkillsByCategory(category) {
|
|
326
|
-
if (!this.skillsIndex) {
|
|
327
|
-
await this.discoverSkills();
|
|
328
|
-
}
|
|
329
|
-
return this.skillsIndex.categories[category] || [];
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Get skill by ID
|
|
333
|
-
*/
|
|
334
|
-
async getSkillById(id) {
|
|
335
|
-
const skills = await this.getSkills();
|
|
336
|
-
return skills.find((s) => s.id === id) || null;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Search skills by name or description
|
|
340
|
-
*/
|
|
341
|
-
async searchSkills(query) {
|
|
342
|
-
const skills = await this.getSkills();
|
|
343
|
-
const lowerQuery = query.toLowerCase();
|
|
344
|
-
return skills.filter((s) => s.id.toLowerCase().includes(lowerQuery) ||
|
|
345
|
-
s.metadata.name.toLowerCase().includes(lowerQuery) ||
|
|
346
|
-
s.metadata.description.toLowerCase().includes(lowerQuery) ||
|
|
347
|
-
(s.metadata.tags || []).some((t) => t.toLowerCase().includes(lowerQuery)));
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Enable a skill in the configuration
|
|
351
|
-
*/
|
|
352
|
-
async enableSkill(skillId, config) {
|
|
353
|
-
const skill = await this.getSkillById(skillId);
|
|
354
|
-
if (!skill) {
|
|
355
|
-
throw new Error(`Skill not found: ${skillId}`);
|
|
356
|
-
}
|
|
357
|
-
// Initialize skills config if not present
|
|
358
|
-
if (!config.skills) {
|
|
359
|
-
config.skills = {
|
|
360
|
-
enabled: [],
|
|
361
|
-
disabled: [],
|
|
362
|
-
order: [],
|
|
363
|
-
autoDetect: true,
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
// Initialize optional arrays if not present
|
|
367
|
-
if (!config.skills.disabled) {
|
|
368
|
-
config.skills.disabled = [];
|
|
369
|
-
}
|
|
370
|
-
if (!config.skills.order) {
|
|
371
|
-
config.skills.order = [];
|
|
372
|
-
}
|
|
373
|
-
// Remove from disabled if present
|
|
374
|
-
config.skills.disabled = config.skills.disabled.filter((id) => id !== skillId);
|
|
375
|
-
// Add to enabled if not present
|
|
376
|
-
if (!config.skills.enabled.includes(skillId)) {
|
|
377
|
-
config.skills.enabled.push(skillId);
|
|
378
|
-
}
|
|
379
|
-
// Add to order if not present
|
|
380
|
-
if (!config.skills.order.includes(skillId)) {
|
|
381
|
-
config.skills.order.push(skillId);
|
|
382
|
-
}
|
|
383
|
-
return config;
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Disable a skill in the configuration
|
|
387
|
-
*/
|
|
388
|
-
async disableSkill(skillId, config) {
|
|
389
|
-
const skill = await this.getSkillById(skillId);
|
|
390
|
-
if (!skill) {
|
|
391
|
-
throw new Error(`Skill not found: ${skillId}`);
|
|
392
|
-
}
|
|
393
|
-
// Initialize skills config if not present
|
|
394
|
-
if (!config.skills) {
|
|
395
|
-
config.skills = {
|
|
396
|
-
enabled: [],
|
|
397
|
-
disabled: [],
|
|
398
|
-
order: [],
|
|
399
|
-
autoDetect: true,
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
// Initialize optional arrays if not present
|
|
403
|
-
if (!config.skills.disabled) {
|
|
404
|
-
config.skills.disabled = [];
|
|
405
|
-
}
|
|
406
|
-
if (!config.skills.order) {
|
|
407
|
-
config.skills.order = [];
|
|
408
|
-
}
|
|
409
|
-
// Remove from enabled if present
|
|
410
|
-
config.skills.enabled = config.skills.enabled.filter((id) => id !== skillId);
|
|
411
|
-
// Add to disabled if not present
|
|
412
|
-
if (!config.skills.disabled.includes(skillId)) {
|
|
413
|
-
config.skills.disabled.push(skillId);
|
|
414
|
-
}
|
|
415
|
-
// Remove from order
|
|
416
|
-
config.skills.order = config.skills.order.filter((id) => id !== skillId);
|
|
417
|
-
return config;
|
|
418
|
-
}
|
|
419
|
-
/**
|
|
420
|
-
* Validate skills configuration
|
|
421
|
-
*/
|
|
422
|
-
async validateSkills(config) {
|
|
423
|
-
const result = {
|
|
424
|
-
valid: true,
|
|
425
|
-
errors: [],
|
|
426
|
-
warnings: [],
|
|
427
|
-
conflicts: [],
|
|
428
|
-
};
|
|
429
|
-
if (!config.skills) {
|
|
430
|
-
return result;
|
|
431
|
-
}
|
|
432
|
-
const enabledSkills = [];
|
|
433
|
-
// Check that all enabled skills exist
|
|
434
|
-
for (const skillId of config.skills.enabled) {
|
|
435
|
-
const skill = await this.getSkillById(skillId);
|
|
436
|
-
if (!skill) {
|
|
437
|
-
result.errors.push(`Enabled skill not found: ${skillId}`);
|
|
438
|
-
result.valid = false;
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
enabledSkills.push(skill);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
// Check for conflicts
|
|
445
|
-
for (let i = 0; i < enabledSkills.length; i++) {
|
|
446
|
-
const skillA = enabledSkills[i];
|
|
447
|
-
const conflictsA = skillA.metadata.conflicts || [];
|
|
448
|
-
for (let j = i + 1; j < enabledSkills.length; j++) {
|
|
449
|
-
const skillB = enabledSkills[j];
|
|
450
|
-
// Check if A conflicts with B
|
|
451
|
-
if (conflictsA.includes(skillB.id) || conflictsA.includes(skillB.metadata.name)) {
|
|
452
|
-
result.conflicts.push({
|
|
453
|
-
skillA: skillA.id,
|
|
454
|
-
skillB: skillB.id,
|
|
455
|
-
reason: `${skillA.metadata.name} conflicts with ${skillB.metadata.name}`,
|
|
456
|
-
});
|
|
457
|
-
result.warnings.push(`Conflict detected: ${skillA.metadata.name} and ${skillB.metadata.name}`);
|
|
458
|
-
}
|
|
459
|
-
// Check if B conflicts with A
|
|
460
|
-
const conflictsB = skillB.metadata.conflicts || [];
|
|
461
|
-
if (conflictsB.includes(skillA.id) || conflictsB.includes(skillA.metadata.name)) {
|
|
462
|
-
if (!result.conflicts.some((c) => c.skillA === skillA.id && c.skillB === skillB.id)) {
|
|
463
|
-
result.conflicts.push({
|
|
464
|
-
skillA: skillB.id,
|
|
465
|
-
skillB: skillA.id,
|
|
466
|
-
reason: `${skillB.metadata.name} conflicts with ${skillA.metadata.name}`,
|
|
467
|
-
});
|
|
468
|
-
result.warnings.push(`Conflict detected: ${skillB.metadata.name} and ${skillA.metadata.name}`);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
// Check dependencies
|
|
474
|
-
for (const skill of enabledSkills) {
|
|
475
|
-
const deps = skill.metadata.dependencies || [];
|
|
476
|
-
for (const dep of deps) {
|
|
477
|
-
const depEnabled = enabledSkills.some((s) => s.id === dep || s.metadata.name === dep);
|
|
478
|
-
if (!depEnabled) {
|
|
479
|
-
result.warnings.push(`Skill ${skill.metadata.name} depends on ${dep}, which is not enabled`);
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
return result;
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* Get enabled skills in order
|
|
487
|
-
*/
|
|
488
|
-
async getEnabledSkills(config) {
|
|
489
|
-
if (!config.skills || config.skills.enabled.length === 0) {
|
|
490
|
-
return [];
|
|
491
|
-
}
|
|
492
|
-
const skills = await this.getSkills();
|
|
493
|
-
const enabledIds = new Set(config.skills.enabled);
|
|
494
|
-
const order = config.skills.order || [];
|
|
495
|
-
// Filter and sort by order
|
|
496
|
-
const enabledSkills = skills.filter((s) => enabledIds.has(s.id));
|
|
497
|
-
enabledSkills.sort((a, b) => {
|
|
498
|
-
const indexA = order.indexOf(a.id);
|
|
499
|
-
const indexB = order.indexOf(b.id);
|
|
500
|
-
if (indexA === -1 && indexB === -1)
|
|
501
|
-
return 0;
|
|
502
|
-
if (indexA === -1)
|
|
503
|
-
return 1;
|
|
504
|
-
if (indexB === -1)
|
|
505
|
-
return -1;
|
|
506
|
-
return indexA - indexB;
|
|
507
|
-
});
|
|
508
|
-
return enabledSkills.map((s) => ({ ...s, enabled: true }));
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Merge enabled skills into single content for AGENTS.md
|
|
512
|
-
*/
|
|
513
|
-
async mergeSkillsContent(config) {
|
|
514
|
-
const enabledSkills = await this.getEnabledSkills(config);
|
|
515
|
-
if (enabledSkills.length === 0) {
|
|
516
|
-
return '';
|
|
517
|
-
}
|
|
518
|
-
const sections = [];
|
|
519
|
-
// Add skills index header
|
|
520
|
-
sections.push('<!-- RULEBOOK:SKILLS_INDEX:START -->');
|
|
521
|
-
sections.push('## Installed Skills\n');
|
|
522
|
-
sections.push('| Category | Skill | Description |');
|
|
523
|
-
sections.push('|----------|-------|-------------|');
|
|
524
|
-
for (const skill of enabledSkills) {
|
|
525
|
-
const category = skill.category.charAt(0).toUpperCase() + skill.category.slice(1);
|
|
526
|
-
sections.push(`| ${category} | ${skill.metadata.name} | ${skill.metadata.description} |`);
|
|
527
|
-
}
|
|
528
|
-
sections.push('\n<!-- RULEBOOK:SKILLS_INDEX:END -->\n');
|
|
529
|
-
// Add each skill's content
|
|
530
|
-
for (const skill of enabledSkills) {
|
|
531
|
-
sections.push(`<!-- RULEBOOK:SKILL:${skill.id}:START -->`);
|
|
532
|
-
sections.push(skill.content);
|
|
533
|
-
sections.push(`<!-- RULEBOOK:SKILL:${skill.id}:END -->\n`);
|
|
534
|
-
}
|
|
535
|
-
return sections.join('\n');
|
|
536
|
-
}
|
|
537
|
-
/**
|
|
538
|
-
* Auto-detect skills based on project configuration
|
|
539
|
-
*/
|
|
540
|
-
async autoDetectSkills(config) {
|
|
541
|
-
const detectedSkills = [];
|
|
542
|
-
// Detect language skills
|
|
543
|
-
if (config.languages) {
|
|
544
|
-
for (const lang of config.languages) {
|
|
545
|
-
const skillId = `languages/${lang.toLowerCase()}`;
|
|
546
|
-
const skill = await this.getSkillById(skillId);
|
|
547
|
-
if (skill) {
|
|
548
|
-
detectedSkills.push(skillId);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
// Detect framework skills
|
|
553
|
-
if (config.frameworks) {
|
|
554
|
-
for (const framework of config.frameworks) {
|
|
555
|
-
const skillId = `frameworks/${framework.toLowerCase()}`;
|
|
556
|
-
const skill = await this.getSkillById(skillId);
|
|
557
|
-
if (skill) {
|
|
558
|
-
detectedSkills.push(skillId);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
// Detect module skills
|
|
563
|
-
if (config.modules) {
|
|
564
|
-
for (const module of config.modules) {
|
|
565
|
-
const skillId = `modules/${module.toLowerCase()}`;
|
|
566
|
-
const skill = await this.getSkillById(skillId);
|
|
567
|
-
if (skill) {
|
|
568
|
-
detectedSkills.push(skillId);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
// Detect service skills
|
|
573
|
-
if (config.services) {
|
|
574
|
-
for (const service of config.services) {
|
|
575
|
-
const skillId = `services/${service.toLowerCase()}`;
|
|
576
|
-
const skill = await this.getSkillById(skillId);
|
|
577
|
-
if (skill) {
|
|
578
|
-
detectedSkills.push(skillId);
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
// Always include core skills
|
|
583
|
-
const coreSkills = await this.getSkillsByCategory('core');
|
|
584
|
-
for (const skill of coreSkills) {
|
|
585
|
-
if (!detectedSkills.includes(skill.id)) {
|
|
586
|
-
detectedSkills.push(skill.id);
|
|
587
|
-
}
|
|
588
|
-
}
|
|
589
|
-
return detectedSkills;
|
|
590
|
-
}
|
|
591
|
-
/**
|
|
592
|
-
* Create a new skill from template
|
|
593
|
-
*/
|
|
594
|
-
async createSkill(name, description, category, content = '') {
|
|
595
|
-
const metadata = {
|
|
596
|
-
name,
|
|
597
|
-
description,
|
|
598
|
-
version: '1.0.0',
|
|
599
|
-
category,
|
|
600
|
-
tags: [category],
|
|
601
|
-
};
|
|
602
|
-
const skillId = this.generateSkillId(name, category);
|
|
603
|
-
const skillDir = join(this.skillsPath, category, skillId.split('/')[1]);
|
|
604
|
-
const skillFile = join(skillDir, SKILL_FILE_NAME);
|
|
605
|
-
// Generate SKILL.md content
|
|
606
|
-
const frontmatter = generateSkillFrontmatter(metadata);
|
|
607
|
-
const fullContent = `${frontmatter}\n\n${content || `# ${name}\n\n${description}`}`;
|
|
608
|
-
// Write skill file
|
|
609
|
-
await writeFile(skillFile, fullContent);
|
|
610
|
-
return {
|
|
611
|
-
id: skillId,
|
|
612
|
-
path: skillFile,
|
|
613
|
-
metadata,
|
|
614
|
-
content: content || `# ${name}\n\n${description}`,
|
|
615
|
-
category,
|
|
616
|
-
enabled: false,
|
|
617
|
-
};
|
|
618
|
-
}
|
|
619
|
-
/**
|
|
620
|
-
* Get skills summary for display
|
|
621
|
-
*/
|
|
622
|
-
async getSkillsSummary() {
|
|
623
|
-
const index = await this.discoverSkills();
|
|
624
|
-
const byCategory = {};
|
|
625
|
-
const categories = [];
|
|
626
|
-
for (const [cat, skills] of Object.entries(index.categories)) {
|
|
627
|
-
if (skills.length > 0) {
|
|
628
|
-
byCategory[cat] = skills.length;
|
|
629
|
-
categories.push(cat);
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
return {
|
|
633
|
-
total: index.skills.length,
|
|
634
|
-
byCategory,
|
|
635
|
-
categories,
|
|
636
|
-
};
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
/**
|
|
640
|
-
* Create a new SkillsManager instance
|
|
641
|
-
*/
|
|
642
|
-
export function createSkillsManager(templatesPath, projectPath) {
|
|
643
|
-
return new SkillsManager(templatesPath, projectPath);
|
|
644
|
-
}
|
|
645
|
-
/**
|
|
646
|
-
* Get the default templates path
|
|
647
|
-
*/
|
|
648
|
-
export function getDefaultTemplatesPath() {
|
|
649
|
-
// In production, templates are in the package's templates directory
|
|
650
|
-
// In development, they're in the project root
|
|
651
|
-
const packagePath = dirname(dirname(dirname(import.meta.url.replace('file:///', ''))));
|
|
652
|
-
return join(packagePath, 'templates');
|
|
653
|
-
}
|
|
654
|
-
//# sourceMappingURL=skills-manager.js.map
|