@hivehub/rulebook 2.1.0 → 3.1.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/LICENSE +0 -0
- package/README.md +840 -661
- package/dist/agents/claude-code.d.ts +0 -0
- package/dist/agents/claude-code.d.ts.map +0 -0
- package/dist/agents/claude-code.js +0 -0
- package/dist/agents/claude-code.js.map +0 -0
- package/dist/agents/cursor-agent.d.ts +0 -0
- package/dist/agents/cursor-agent.d.ts.map +0 -0
- package/dist/agents/cursor-agent.js +0 -0
- package/dist/agents/cursor-agent.js.map +0 -0
- package/dist/agents/gemini-cli.d.ts +0 -0
- package/dist/agents/gemini-cli.d.ts.map +0 -0
- package/dist/agents/gemini-cli.js +0 -0
- package/dist/agents/gemini-cli.js.map +0 -0
- package/dist/agents/ralph-parser.d.ts +52 -0
- package/dist/agents/ralph-parser.d.ts.map +1 -0
- package/dist/agents/ralph-parser.js +246 -0
- package/dist/agents/ralph-parser.js.map +1 -0
- package/dist/cli/commands.d.ts +35 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +669 -28
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/docs-prompts.d.ts +0 -0
- package/dist/cli/docs-prompts.d.ts.map +0 -0
- package/dist/cli/docs-prompts.js +0 -0
- package/dist/cli/docs-prompts.js.map +0 -0
- package/dist/cli/prompts.d.ts +0 -0
- package/dist/cli/prompts.d.ts.map +0 -0
- package/dist/cli/prompts.js +0 -0
- package/dist/cli/prompts.js.map +0 -0
- package/dist/core/agent-manager.d.ts +0 -0
- package/dist/core/agent-manager.d.ts.map +0 -0
- package/dist/core/agent-manager.js +0 -0
- package/dist/core/agent-manager.js.map +0 -0
- package/dist/core/auto-fixer.d.ts +0 -0
- package/dist/core/auto-fixer.d.ts.map +0 -0
- package/dist/core/auto-fixer.js +0 -0
- package/dist/core/auto-fixer.js.map +0 -0
- package/dist/core/changelog-generator.d.ts +0 -0
- package/dist/core/changelog-generator.d.ts.map +0 -0
- package/dist/core/changelog-generator.js +0 -0
- package/dist/core/changelog-generator.js.map +0 -0
- package/dist/core/claude-mcp.d.ts +32 -0
- package/dist/core/claude-mcp.d.ts.map +1 -0
- package/dist/core/claude-mcp.js +92 -0
- package/dist/core/claude-mcp.js.map +1 -0
- package/dist/core/cli-bridge.d.ts +0 -0
- package/dist/core/cli-bridge.d.ts.map +0 -0
- package/dist/core/cli-bridge.js +0 -0
- package/dist/core/cli-bridge.js.map +0 -0
- package/dist/core/config-manager.d.ts +13 -2
- package/dist/core/config-manager.d.ts.map +1 -1
- package/dist/core/config-manager.js +209 -10
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/coverage-checker.d.ts +0 -0
- package/dist/core/coverage-checker.d.ts.map +0 -0
- package/dist/core/coverage-checker.js +0 -0
- package/dist/core/coverage-checker.js.map +0 -0
- package/dist/core/custom-templates.d.ts +0 -0
- package/dist/core/custom-templates.d.ts.map +0 -0
- package/dist/core/custom-templates.js +0 -0
- package/dist/core/custom-templates.js.map +0 -0
- package/dist/core/dependency-checker.d.ts +0 -0
- package/dist/core/dependency-checker.d.ts.map +0 -0
- package/dist/core/dependency-checker.js +0 -0
- package/dist/core/dependency-checker.js.map +0 -0
- package/dist/core/detector.d.ts +0 -0
- package/dist/core/detector.d.ts.map +0 -0
- package/dist/core/detector.js +0 -0
- package/dist/core/detector.js.map +0 -0
- package/dist/core/docs-generator.d.ts +0 -0
- package/dist/core/docs-generator.d.ts.map +0 -0
- package/dist/core/docs-generator.js +0 -0
- package/dist/core/docs-generator.js.map +0 -0
- package/dist/core/generator.d.ts +0 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +181 -49
- package/dist/core/generator.js.map +1 -1
- package/dist/core/gitignore-generator.d.ts +0 -0
- package/dist/core/gitignore-generator.d.ts.map +0 -0
- package/dist/core/gitignore-generator.js +0 -0
- package/dist/core/gitignore-generator.js.map +0 -0
- package/dist/core/health-scorer.d.ts +0 -0
- package/dist/core/health-scorer.d.ts.map +0 -0
- package/dist/core/health-scorer.js +0 -0
- package/dist/core/health-scorer.js.map +0 -0
- package/dist/core/iteration-tracker.d.ts +57 -0
- package/dist/core/iteration-tracker.d.ts.map +1 -0
- package/dist/core/iteration-tracker.js +209 -0
- package/dist/core/iteration-tracker.js.map +1 -0
- package/dist/core/logger.d.ts +0 -0
- package/dist/core/logger.d.ts.map +0 -0
- package/dist/core/logger.js +0 -0
- package/dist/core/logger.js.map +0 -0
- package/dist/core/merger.d.ts +0 -0
- package/dist/core/merger.d.ts.map +0 -0
- package/dist/core/merger.js +0 -0
- package/dist/core/merger.js.map +0 -0
- package/dist/core/migrator.d.ts +13 -0
- package/dist/core/migrator.d.ts.map +1 -1
- package/dist/core/migrator.js +76 -9
- package/dist/core/migrator.js.map +1 -1
- package/dist/core/minimal-scaffolder.d.ts +0 -0
- package/dist/core/minimal-scaffolder.d.ts.map +0 -0
- package/dist/core/minimal-scaffolder.js +0 -0
- package/dist/core/minimal-scaffolder.js.map +0 -0
- package/dist/core/modern-console.d.ts +0 -0
- package/dist/core/modern-console.d.ts.map +0 -0
- package/dist/core/modern-console.js +0 -0
- package/dist/core/modern-console.js.map +0 -0
- package/dist/core/openspec-manager.d.ts +0 -0
- package/dist/core/openspec-manager.d.ts.map +0 -0
- package/dist/core/openspec-manager.js +0 -0
- package/dist/core/openspec-manager.js.map +0 -0
- package/dist/core/openspec-migrator.d.ts +1 -1
- package/dist/core/openspec-migrator.d.ts.map +1 -1
- package/dist/core/openspec-migrator.js +14 -7
- package/dist/core/openspec-migrator.js.map +1 -1
- package/dist/core/prd-generator.d.ts +36 -0
- package/dist/core/prd-generator.d.ts.map +1 -0
- package/dist/core/prd-generator.js +137 -0
- package/dist/core/prd-generator.js.map +1 -0
- package/dist/core/ralph-manager.d.ts +75 -0
- package/dist/core/ralph-manager.d.ts.map +1 -0
- package/dist/core/ralph-manager.js +276 -0
- package/dist/core/ralph-manager.js.map +1 -0
- package/dist/core/skills-manager.d.ts +0 -0
- package/dist/core/skills-manager.d.ts.map +0 -0
- package/dist/core/skills-manager.js +0 -0
- package/dist/core/skills-manager.js.map +0 -0
- package/dist/core/task-manager.d.ts +0 -0
- package/dist/core/task-manager.d.ts.map +0 -0
- package/dist/core/task-manager.js +0 -0
- package/dist/core/task-manager.js.map +0 -0
- package/dist/core/test-task-manager.d.ts +0 -0
- package/dist/core/test-task-manager.d.ts.map +0 -0
- package/dist/core/test-task-manager.js +0 -0
- package/dist/core/test-task-manager.js.map +0 -0
- package/dist/core/validator.d.ts +0 -0
- package/dist/core/validator.d.ts.map +0 -0
- package/dist/core/validator.js +0 -0
- package/dist/core/validator.js.map +0 -0
- package/dist/core/version-bumper.d.ts +0 -0
- package/dist/core/version-bumper.d.ts.map +0 -0
- package/dist/core/version-bumper.js +0 -0
- package/dist/core/version-bumper.js.map +0 -0
- package/dist/core/watcher.d.ts +0 -0
- package/dist/core/watcher.d.ts.map +0 -0
- package/dist/core/watcher.js +0 -0
- package/dist/core/watcher.js.map +0 -0
- package/dist/core/workflow-generator.d.ts +0 -0
- package/dist/core/workflow-generator.d.ts.map +0 -0
- package/dist/core/workflow-generator.js +297 -261
- package/dist/core/workflow-generator.js.map +1 -1
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +85 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts +0 -0
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +484 -74
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/hnsw-index.d.ts +63 -0
- package/dist/memory/hnsw-index.d.ts.map +1 -0
- package/dist/memory/hnsw-index.js +421 -0
- package/dist/memory/hnsw-index.js.map +1 -0
- package/dist/memory/memory-cache.d.ts +33 -0
- package/dist/memory/memory-cache.d.ts.map +1 -0
- package/dist/memory/memory-cache.js +85 -0
- package/dist/memory/memory-cache.js.map +1 -0
- package/dist/memory/memory-hooks.d.ts +48 -0
- package/dist/memory/memory-hooks.d.ts.map +1 -0
- package/dist/memory/memory-hooks.js +250 -0
- package/dist/memory/memory-hooks.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +56 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +216 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/memory/memory-search.d.ts +42 -0
- package/dist/memory/memory-search.d.ts.map +1 -0
- package/dist/memory/memory-search.js +166 -0
- package/dist/memory/memory-search.js.map +1 -0
- package/dist/memory/memory-store.d.ts +59 -0
- package/dist/memory/memory-store.d.ts.map +1 -0
- package/dist/memory/memory-store.js +394 -0
- package/dist/memory/memory-store.js.map +1 -0
- package/dist/memory/memory-types.d.ts +70 -0
- package/dist/memory/memory-types.d.ts.map +1 -0
- package/dist/memory/memory-types.js +7 -0
- package/dist/memory/memory-types.js.map +1 -0
- package/dist/memory/memory-vectorizer.d.ts +29 -0
- package/dist/memory/memory-vectorizer.d.ts.map +1 -0
- package/dist/memory/memory-vectorizer.js +104 -0
- package/dist/memory/memory-vectorizer.js.map +1 -0
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -0
- package/dist/types.js.map +0 -0
- package/dist/utils/file-system.d.ts +0 -0
- package/dist/utils/file-system.d.ts.map +0 -0
- package/dist/utils/file-system.js +0 -0
- package/dist/utils/file-system.js.map +0 -0
- package/dist/utils/git-hooks.d.ts +0 -0
- package/dist/utils/git-hooks.d.ts.map +0 -0
- package/dist/utils/git-hooks.js +0 -0
- package/dist/utils/git-hooks.js.map +0 -0
- package/dist/utils/rulesignore.d.ts +0 -0
- package/dist/utils/rulesignore.d.ts.map +0 -0
- package/dist/utils/rulesignore.js +0 -0
- package/dist/utils/rulesignore.js.map +0 -0
- package/package.json +25 -25
- package/templates/cli/AIDER.md +0 -0
- package/templates/cli/AMAZON_Q.md +0 -0
- package/templates/cli/AUGGIE.md +0 -0
- package/templates/cli/CLAUDE.md +85 -0
- package/templates/cli/CLAUDE_CODE.md +0 -0
- package/templates/cli/CLINE.md +69 -2
- package/templates/cli/CODEBUDDY.md +0 -0
- package/templates/cli/CODEIUM.md +0 -0
- package/templates/cli/CODEX.md +0 -0
- package/templates/cli/CONTINUE.md +0 -0
- package/templates/cli/CURSOR_CLI.md +37 -3
- package/templates/cli/FACTORY.md +0 -0
- package/templates/cli/GEMINI.md +0 -0
- package/templates/cli/KILOCODE.md +0 -0
- package/templates/cli/OPENCODE.md +0 -0
- package/templates/cli/_GENERIC_TEMPLATE.md +0 -0
- package/templates/cli/gemini-extension.json +0 -0
- package/templates/commands/rulebook-memory-save.md +48 -0
- package/templates/commands/rulebook-memory-search.md +47 -0
- package/templates/commands/rulebook-task-apply.md +2 -2
- package/templates/commands/rulebook-task-archive.md +2 -2
- package/templates/commands/rulebook-task-create.md +2 -2
- package/templates/commands/rulebook-task-list.md +2 -2
- package/templates/commands/rulebook-task-show.md +2 -2
- package/templates/commands/rulebook-task-validate.md +2 -2
- package/templates/core/AGENT_AUTOMATION.md +142 -38
- package/templates/core/DAG.md +0 -0
- package/templates/core/DOCUMENTATION_RULES.md +0 -0
- package/templates/core/QUALITY_ENFORCEMENT.md +0 -0
- package/templates/core/RALPH.md +430 -0
- package/templates/core/RULEBOOK.md +20 -1
- package/templates/frameworks/ANGULAR.md +0 -0
- package/templates/frameworks/DJANGO.md +0 -0
- package/templates/frameworks/ELECTRON.md +0 -0
- package/templates/frameworks/FLASK.md +0 -0
- package/templates/frameworks/FLUTTER.md +0 -0
- package/templates/frameworks/JQUERY.md +0 -0
- package/templates/frameworks/LARAVEL.md +0 -0
- package/templates/frameworks/NESTJS.md +0 -0
- package/templates/frameworks/NEXTJS.md +0 -0
- package/templates/frameworks/NUXT.md +0 -0
- package/templates/frameworks/RAILS.md +0 -0
- package/templates/frameworks/REACT.md +0 -0
- package/templates/frameworks/REACT_NATIVE.md +0 -0
- package/templates/frameworks/SPRING.md +0 -0
- package/templates/frameworks/SYMFONY.md +0 -0
- package/templates/frameworks/VUE.md +0 -0
- package/templates/frameworks/ZEND.md +0 -0
- package/templates/git/CI_CD_PATTERNS.md +4 -4
- package/templates/git/GITHUB_ACTIONS.md +3 -3
- package/templates/git/GITLAB_CI.md +4 -4
- package/templates/git/GIT_WORKFLOW.md +0 -0
- package/templates/git/SECRETS_MANAGEMENT.md +4 -4
- package/templates/hooks/COMMIT_MSG.md +4 -4
- package/templates/hooks/POST_CHECKOUT.md +3 -3
- package/templates/hooks/PREPARE_COMMIT_MSG.md +3 -3
- package/templates/hooks/PRE_COMMIT.md +4 -4
- package/templates/hooks/PRE_PUSH.md +4 -4
- package/templates/hooks/csharp-pre-commit.sh +0 -0
- package/templates/hooks/csharp-pre-push.sh +0 -0
- package/templates/hooks/dart-pre-commit.sh +0 -0
- package/templates/hooks/dart-pre-push.sh +0 -0
- package/templates/hooks/elixir-pre-commit.sh +0 -0
- package/templates/hooks/elixir-pre-push.sh +0 -0
- package/templates/hooks/erlang-pre-commit.sh +0 -0
- package/templates/hooks/erlang-pre-push.sh +0 -0
- package/templates/hooks/go-pre-commit.sh +0 -0
- package/templates/hooks/go-pre-push.sh +0 -0
- package/templates/hooks/haskell-pre-commit.sh +0 -0
- package/templates/hooks/haskell-pre-push.sh +0 -0
- package/templates/hooks/java-pre-commit.sh +0 -0
- package/templates/hooks/java-pre-push.sh +0 -0
- package/templates/hooks/kotlin-pre-commit.sh +0 -0
- package/templates/hooks/kotlin-pre-push.sh +0 -0
- package/templates/hooks/php-pre-commit.sh +0 -0
- package/templates/hooks/php-pre-push.sh +0 -0
- package/templates/hooks/python-pre-commit.sh +0 -0
- package/templates/hooks/python-pre-push.sh +0 -0
- package/templates/hooks/ruby-pre-commit.sh +0 -0
- package/templates/hooks/ruby-pre-push.sh +0 -0
- package/templates/hooks/rust-pre-commit.sh +0 -0
- package/templates/hooks/rust-pre-push.sh +0 -0
- package/templates/hooks/scala-pre-commit.sh +0 -0
- package/templates/hooks/scala-pre-push.sh +0 -0
- package/templates/hooks/swift-pre-commit.sh +0 -0
- package/templates/hooks/swift-pre-push.sh +0 -0
- package/templates/hooks/typescript-pre-commit.sh +0 -0
- package/templates/hooks/typescript-pre-push.sh +0 -0
- package/templates/ides/COPILOT.md +0 -0
- package/templates/ides/CURSOR.md +0 -0
- package/templates/ides/JETBRAINS_AI.md +0 -0
- package/templates/ides/REPLIT.md +0 -0
- package/templates/ides/TABNINE.md +0 -0
- package/templates/ides/VSCODE.md +0 -0
- package/templates/ides/WINDSURF.md +0 -0
- package/templates/ides/ZED.md +0 -0
- package/templates/languages/ADA.md +0 -0
- package/templates/languages/C.md +0 -0
- package/templates/languages/CPP.md +0 -0
- package/templates/languages/CSHARP.md +0 -0
- package/templates/languages/DART.md +0 -0
- package/templates/languages/ELIXIR.md +0 -0
- package/templates/languages/ERLANG.md +0 -0
- package/templates/languages/GO.md +0 -0
- package/templates/languages/HASKELL.md +0 -0
- package/templates/languages/JAVA.md +0 -0
- package/templates/languages/JAVASCRIPT.md +0 -0
- package/templates/languages/JULIA.md +0 -0
- package/templates/languages/KOTLIN.md +0 -0
- package/templates/languages/LISP.md +0 -0
- package/templates/languages/LUA.md +0 -0
- package/templates/languages/OBJECTIVEC.md +0 -0
- package/templates/languages/PHP.md +0 -0
- package/templates/languages/PYTHON.md +0 -0
- package/templates/languages/R.md +0 -0
- package/templates/languages/RUBY.md +0 -0
- package/templates/languages/RUST.md +0 -0
- package/templates/languages/SAS.md +0 -0
- package/templates/languages/SCALA.md +0 -0
- package/templates/languages/SOLIDITY.md +0 -0
- package/templates/languages/SQL.md +0 -0
- package/templates/languages/SWIFT.md +0 -0
- package/templates/languages/TYPESCRIPT.md +0 -0
- package/templates/languages/ZIG.md +0 -0
- package/templates/modules/ATLASSIAN.md +0 -0
- package/templates/modules/CONTEXT7.md +0 -0
- package/templates/modules/FIGMA.md +0 -0
- package/templates/modules/GITHUB_MCP.md +0 -0
- package/templates/modules/GRAFANA.md +0 -0
- package/templates/modules/MEMORY.md +126 -0
- package/templates/modules/NOTION.md +0 -0
- package/templates/modules/PLAYWRIGHT.md +0 -0
- package/templates/modules/RULEBOOK_MCP.md +0 -0
- package/templates/modules/SERENA.md +0 -0
- package/templates/modules/SUPABASE.md +0 -0
- package/templates/modules/SYNAP.md +0 -0
- package/templates/modules/VECTORIZER.md +0 -0
- package/templates/services/AZURE_BLOB.md +0 -0
- package/templates/services/CASSANDRA.md +0 -0
- package/templates/services/DYNAMODB.md +0 -0
- package/templates/services/ELASTICSEARCH.md +0 -0
- package/templates/services/GCS.md +0 -0
- package/templates/services/INFLUXDB.md +0 -0
- package/templates/services/KAFKA.md +0 -0
- package/templates/services/MARIADB.md +0 -0
- package/templates/services/MEMCACHED.md +0 -0
- package/templates/services/MINIO.md +0 -0
- package/templates/services/MONGODB.md +0 -0
- package/templates/services/MYSQL.md +0 -0
- package/templates/services/NEO4J.md +0 -0
- package/templates/services/ORACLE.md +0 -0
- package/templates/services/POSTGRESQL.md +0 -0
- package/templates/services/RABBITMQ.md +0 -0
- package/templates/services/REDIS.md +0 -0
- package/templates/services/S3.md +0 -0
- package/templates/services/SQLITE.md +0 -0
- package/templates/services/SQLSERVER.md +0 -0
- package/templates/skills/cli/aider/SKILL.md +59 -0
- package/templates/skills/cli/amazon-q/SKILL.md +35 -0
- package/templates/skills/cli/auggie/SKILL.md +42 -0
- package/templates/skills/cli/claude/SKILL.md +42 -0
- package/templates/skills/cli/claude-code/SKILL.md +146 -0
- package/templates/skills/cli/cline/SKILL.md +42 -0
- package/templates/skills/cli/codebuddy/SKILL.md +30 -0
- package/templates/skills/cli/codeium/SKILL.md +30 -0
- package/templates/skills/cli/codex/SKILL.md +31 -0
- package/templates/skills/cli/continue/SKILL.md +44 -0
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -0
- package/templates/skills/cli/factory/SKILL.md +28 -0
- package/templates/skills/cli/gemini/SKILL.md +45 -0
- package/templates/skills/cli/kilocode/SKILL.md +28 -0
- package/templates/skills/cli/opencode/SKILL.md +28 -0
- package/templates/skills/core/agent-automation/SKILL.md +194 -0
- package/templates/skills/core/dag/SKILL.md +314 -0
- package/templates/skills/core/documentation-rules/SKILL.md +47 -0
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -0
- package/templates/skills/core/rulebook/SKILL.md +0 -0
- package/templates/skills/frameworks/angular/SKILL.md +46 -0
- package/templates/skills/frameworks/django/SKILL.md +93 -0
- package/templates/skills/frameworks/electron/SKILL.md +157 -0
- package/templates/skills/frameworks/flask/SKILL.md +48 -0
- package/templates/skills/frameworks/flutter/SKILL.md +65 -0
- package/templates/skills/frameworks/jquery/SKILL.md +42 -0
- package/templates/skills/frameworks/laravel/SKILL.md +48 -0
- package/templates/skills/frameworks/nestjs/SKILL.md +53 -0
- package/templates/skills/frameworks/nextjs/SKILL.md +137 -0
- package/templates/skills/frameworks/nuxt/SKILL.md +50 -0
- package/templates/skills/frameworks/rails/SKILL.md +76 -0
- package/templates/skills/frameworks/react/SKILL.md +48 -0
- package/templates/skills/frameworks/react-native/SKILL.md +57 -0
- package/templates/skills/frameworks/spring/SKILL.md +49 -0
- package/templates/skills/frameworks/symfony/SKILL.md +46 -0
- package/templates/skills/frameworks/vue/SKILL.md +46 -0
- package/templates/skills/frameworks/zend/SKILL.md +45 -0
- package/templates/skills/ides/copilot/SKILL.md +47 -0
- package/templates/skills/ides/cursor/SKILL.md +53 -0
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -0
- package/templates/skills/ides/replit/SKILL.md +46 -0
- package/templates/skills/ides/tabnine/SKILL.md +39 -0
- package/templates/skills/ides/vscode/SKILL.md +50 -0
- package/templates/skills/ides/windsurf/SKILL.md +46 -0
- package/templates/skills/ides/zed/SKILL.md +42 -0
- package/templates/skills/languages/ada/SKILL.md +68 -0
- package/templates/skills/languages/c/SKILL.md +343 -0
- package/templates/skills/languages/cpp/SKILL.md +753 -0
- package/templates/skills/languages/csharp/SKILL.md +427 -0
- package/templates/skills/languages/dart/SKILL.md +342 -0
- package/templates/skills/languages/elixir/SKILL.md +464 -0
- package/templates/skills/languages/erlang/SKILL.md +371 -0
- package/templates/skills/languages/go/SKILL.md +655 -0
- package/templates/skills/languages/haskell/SKILL.md +187 -0
- package/templates/skills/languages/java/SKILL.md +617 -0
- package/templates/skills/languages/javascript/SKILL.md +641 -0
- package/templates/skills/languages/julia/SKILL.md +107 -0
- package/templates/skills/languages/kotlin/SKILL.md +521 -0
- package/templates/skills/languages/lisp/SKILL.md +110 -0
- package/templates/skills/languages/lua/SKILL.md +84 -0
- package/templates/skills/languages/objectivec/SKILL.md +100 -0
- package/templates/skills/languages/php/SKILL.md +426 -0
- package/templates/skills/languages/python/SKILL.md +692 -0
- package/templates/skills/languages/r/SKILL.md +360 -0
- package/templates/skills/languages/ruby/SKILL.md +431 -0
- package/templates/skills/languages/rust/SKILL.md +487 -0
- package/templates/skills/languages/sas/SKILL.md +83 -0
- package/templates/skills/languages/scala/SKILL.md +358 -0
- package/templates/skills/languages/solidity/SKILL.md +590 -0
- package/templates/skills/languages/sql/SKILL.md +147 -0
- package/templates/skills/languages/swift/SKILL.md +476 -0
- package/templates/skills/languages/typescript/SKILL.md +0 -0
- package/templates/skills/languages/zig/SKILL.md +275 -0
- package/templates/skills/modules/atlassian/SKILL.md +265 -0
- package/templates/skills/modules/context7/SKILL.md +64 -0
- package/templates/skills/modules/figma/SKILL.md +277 -0
- package/templates/skills/modules/github-mcp/SKILL.md +74 -0
- package/templates/skills/modules/grafana/SKILL.md +338 -0
- package/templates/skills/modules/memory/SKILL.md +73 -0
- package/templates/skills/modules/notion/SKILL.md +257 -0
- package/templates/skills/modules/playwright/SKILL.md +100 -0
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -0
- package/templates/skills/modules/serena/SKILL.md +347 -0
- package/templates/skills/modules/supabase/SKILL.md +233 -0
- package/templates/skills/modules/synap/SKILL.md +79 -0
- package/templates/skills/modules/vectorizer/SKILL.md +73 -0
- package/templates/skills/services/azure-blob/SKILL.md +194 -0
- package/templates/skills/services/cassandra/SKILL.md +249 -0
- package/templates/skills/services/dynamodb/SKILL.md +318 -0
- package/templates/skills/services/elasticsearch/SKILL.md +357 -0
- package/templates/skills/services/gcs/SKILL.md +188 -0
- package/templates/skills/services/influxdb/SKILL.md +275 -0
- package/templates/skills/services/kafka/SKILL.md +351 -0
- package/templates/skills/services/mariadb/SKILL.md +193 -0
- package/templates/skills/services/memcached/SKILL.md +252 -0
- package/templates/skills/services/minio/SKILL.md +211 -0
- package/templates/skills/services/mongodb/SKILL.md +278 -0
- package/templates/skills/services/mysql/SKILL.md +368 -0
- package/templates/skills/services/neo4j/SKILL.md +257 -0
- package/templates/skills/services/oracle/SKILL.md +300 -0
- package/templates/skills/services/postgresql/SKILL.md +336 -0
- package/templates/skills/services/rabbitmq/SKILL.md +296 -0
- package/templates/skills/services/redis/SKILL.md +302 -0
- package/templates/skills/services/s3/SKILL.md +308 -0
- package/templates/skills/services/sqlite/SKILL.md +304 -0
- package/templates/skills/services/sqlserver/SKILL.md +304 -0
- package/templates/skills/workflows/ralph/SETUP.md +228 -0
- package/templates/skills/workflows/ralph/SKILL.md +309 -0
- package/templates/skills/workflows/ralph/install.sh +87 -0
- package/templates/skills/workflows/ralph/manifest.json +158 -0
- package/templates/workflows/codespell.yml +0 -0
- package/templates/workflows/cpp-lint.yml +0 -0
- package/templates/workflows/cpp-publish.yml +0 -0
- package/templates/workflows/cpp-test.yml +0 -0
- package/templates/workflows/dotnet-lint.yml +0 -0
- package/templates/workflows/dotnet-publish.yml +0 -0
- package/templates/workflows/dotnet-test.yml +0 -0
- package/templates/workflows/elixir-lint.yml +0 -0
- package/templates/workflows/elixir-publish.yml +0 -0
- package/templates/workflows/elixir-test.yml +0 -0
- package/templates/workflows/erlang-lint.yml +0 -0
- package/templates/workflows/erlang-test.yml +0 -0
- package/templates/workflows/go-lint.yml +0 -0
- package/templates/workflows/go-publish.yml +0 -0
- package/templates/workflows/go-test.yml +0 -0
- package/templates/workflows/java-lint.yml +0 -0
- package/templates/workflows/java-publish.yml +0 -0
- package/templates/workflows/java-test.yml +0 -0
- package/templates/workflows/kotlin-lint.yml +0 -0
- package/templates/workflows/kotlin-publish.yml +0 -0
- package/templates/workflows/kotlin-test.yml +0 -0
- package/templates/workflows/php-lint.yml +0 -0
- package/templates/workflows/php-publish.yml +0 -0
- package/templates/workflows/php-test.yml +0 -0
- package/templates/workflows/python-lint.yml +0 -0
- package/templates/workflows/python-publish.yml +0 -0
- package/templates/workflows/python-test.yml +0 -0
- package/templates/workflows/rust-lint.yml +0 -0
- package/templates/workflows/rust-publish.yml +0 -0
- package/templates/workflows/rust-test.yml +0 -0
- package/templates/workflows/solidity-lint.yml +0 -0
- package/templates/workflows/solidity-test.yml +0 -0
- package/templates/workflows/swift-lint.yml +0 -0
- package/templates/workflows/swift-publish.yml +0 -0
- package/templates/workflows/swift-test.yml +0 -0
- package/templates/workflows/typescript-lint.yml +0 -0
- package/templates/workflows/typescript-publish.yml +0 -0
- package/templates/workflows/typescript-test.yml +0 -0
- package/templates/workflows/zig-lint.yml +0 -0
- package/templates/workflows/zig-test.yml +0 -0
- package/dist/core/modern-console-new.d.ts +0 -81
- package/dist/core/modern-console-new.d.ts.map +0 -1
- package/dist/core/modern-console-new.js +0 -340
- package/dist/core/modern-console-new.js.map +0 -1
- package/dist/mcp/handlers/archive-task.d.ts +0 -17
- package/dist/mcp/handlers/archive-task.d.ts.map +0 -1
- package/dist/mcp/handlers/archive-task.js +0 -36
- package/dist/mcp/handlers/archive-task.js.map +0 -1
- package/dist/mcp/handlers/create-task.d.ts +0 -17
- package/dist/mcp/handlers/create-task.d.ts.map +0 -1
- package/dist/mcp/handlers/create-task.js +0 -56
- package/dist/mcp/handlers/create-task.js.map +0 -1
- package/dist/mcp/handlers/list-tasks.d.ts +0 -22
- package/dist/mcp/handlers/list-tasks.d.ts.map +0 -1
- package/dist/mcp/handlers/list-tasks.js +0 -42
- package/dist/mcp/handlers/list-tasks.js.map +0 -1
- package/dist/mcp/handlers/show-task.d.ts +0 -25
- package/dist/mcp/handlers/show-task.d.ts.map +0 -1
- package/dist/mcp/handlers/show-task.js +0 -43
- package/dist/mcp/handlers/show-task.js.map +0 -1
- package/dist/mcp/handlers/update-task.d.ts +0 -17
- package/dist/mcp/handlers/update-task.d.ts.map +0 -1
- package/dist/mcp/handlers/update-task.js +0 -35
- package/dist/mcp/handlers/update-task.js.map +0 -1
- package/dist/mcp/handlers/validate-task.d.ts +0 -15
- package/dist/mcp/handlers/validate-task.d.ts.map +0 -1
- package/dist/mcp/handlers/validate-task.js +0 -27
- package/dist/mcp/handlers/validate-task.js.map +0 -1
- package/dist/mcp/rulebook-config.d.ts +0 -22
- package/dist/mcp/rulebook-config.d.ts.map +0 -1
- package/dist/mcp/rulebook-config.js +0 -65
- package/dist/mcp/rulebook-config.js.map +0 -1
package/dist/cli/commands.js
CHANGED
|
@@ -5,7 +5,7 @@ import { promptProjectConfig, promptSimplifiedConfig, promptMergeStrategy } from
|
|
|
5
5
|
import { generateFullAgents } from '../core/generator.js';
|
|
6
6
|
import { mergeFullAgents } from '../core/merger.js';
|
|
7
7
|
import { generateWorkflows, generateIDEFiles, generateAICLIFiles, } from '../core/workflow-generator.js';
|
|
8
|
-
import { writeFile, createBackup
|
|
8
|
+
import { writeFile, createBackup } from '../utils/file-system.js';
|
|
9
9
|
import { existsSync } from 'fs';
|
|
10
10
|
import { parseRulesIgnore } from '../utils/rulesignore.js';
|
|
11
11
|
import { installGitHooks } from '../utils/git-hooks.js';
|
|
@@ -179,6 +179,10 @@ export async function initCommand(options) {
|
|
|
179
179
|
// Save project configuration to .rulebook
|
|
180
180
|
const { createConfigManager } = await import('../core/config-manager.js');
|
|
181
181
|
const configManager = createConfigManager(cwd);
|
|
182
|
+
// Migrate old directory structure to new consolidated structure
|
|
183
|
+
const dirMigrationSpinner = ora('Migrating directory structure...').start();
|
|
184
|
+
await configManager.migrateDirectoryStructure(cwd);
|
|
185
|
+
dirMigrationSpinner.succeed('Directory structure migrated');
|
|
182
186
|
// Auto-detect and enable skills based on project detection (v2.0)
|
|
183
187
|
let enabledSkills = [];
|
|
184
188
|
try {
|
|
@@ -202,6 +206,8 @@ export async function initCommand(options) {
|
|
|
202
206
|
catch {
|
|
203
207
|
// Skills system not available or error - continue without skills
|
|
204
208
|
}
|
|
209
|
+
// Load existing config to preserve ralph and memory settings
|
|
210
|
+
const existingConfig = await configManager.loadConfig();
|
|
205
211
|
await configManager.updateConfig({
|
|
206
212
|
languages: config.languages,
|
|
207
213
|
frameworks: config.frameworks,
|
|
@@ -210,11 +216,24 @@ export async function initCommand(options) {
|
|
|
210
216
|
modular: config.modular ?? true,
|
|
211
217
|
rulebookDir: config.rulebookDir || 'rulebook',
|
|
212
218
|
skills: enabledSkills.length > 0 ? { enabled: enabledSkills } : undefined,
|
|
219
|
+
ralph: existingConfig.ralph,
|
|
220
|
+
memory: existingConfig.memory,
|
|
213
221
|
});
|
|
214
222
|
// Generate or merge AGENTS.md
|
|
215
223
|
const agentsPath = path.join(cwd, 'AGENTS.md');
|
|
216
224
|
let finalContent;
|
|
217
225
|
if (detection.existingAgents) {
|
|
226
|
+
// Migrate flat layout to specs/ subdirectory if needed
|
|
227
|
+
{
|
|
228
|
+
const { hasFlatLayout, migrateFlatToSpecs } = await import('../core/migrator.js');
|
|
229
|
+
const rulebookDirForMigration = config.rulebookDir || 'rulebook';
|
|
230
|
+
if (await hasFlatLayout(cwd, rulebookDirForMigration)) {
|
|
231
|
+
const { migratedFiles } = await migrateFlatToSpecs(cwd, rulebookDirForMigration);
|
|
232
|
+
if (migratedFiles.length > 0) {
|
|
233
|
+
console.log(chalk.gray(` Migrated ${migratedFiles.length} file(s) to /${rulebookDirForMigration}/specs/`));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
218
237
|
const strategy = options.yes ? 'merge' : await promptMergeStrategy();
|
|
219
238
|
if (strategy === 'merge') {
|
|
220
239
|
const mergeSpinner = ora('Merging with existing AGENTS.md...').start();
|
|
@@ -292,6 +311,29 @@ export async function initCommand(options) {
|
|
|
292
311
|
cliSpinner.info('AI CLI files already exist (skipped)');
|
|
293
312
|
}
|
|
294
313
|
}
|
|
314
|
+
// Auto-setup Claude Code integration (MCP + skills)
|
|
315
|
+
if (!minimalMode) {
|
|
316
|
+
const claudeSpinner = ora('Checking Claude Code integration...').start();
|
|
317
|
+
try {
|
|
318
|
+
const { setupClaudeCodeIntegration } = await import('../core/claude-mcp.js');
|
|
319
|
+
const result = await setupClaudeCodeIntegration(cwd);
|
|
320
|
+
if (result.detected) {
|
|
321
|
+
claudeSpinner.succeed('Claude Code integration configured');
|
|
322
|
+
if (result.mcpConfigured) {
|
|
323
|
+
console.log(chalk.gray(' • MCP server added to .mcp.json'));
|
|
324
|
+
}
|
|
325
|
+
if (result.skillsInstalled.length > 0) {
|
|
326
|
+
console.log(chalk.gray(` • ${result.skillsInstalled.length} skills installed to .claude/commands/`));
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
claudeSpinner.info('Claude Code not detected (skipped)');
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
claudeSpinner.info('Claude Code integration skipped');
|
|
335
|
+
}
|
|
336
|
+
}
|
|
295
337
|
if (minimalMode && minimalArtifacts.length > 0) {
|
|
296
338
|
console.log(chalk.green('\n✅ Essentials created:'));
|
|
297
339
|
for (const artifact of minimalArtifacts) {
|
|
@@ -1121,22 +1163,18 @@ export async function updateCommand(options) {
|
|
|
1121
1163
|
console.log(chalk.gray('\nℹ Git hooks were not installed during update. Re-run "rulebook update" later or install them manually if you change your mind.'));
|
|
1122
1164
|
}
|
|
1123
1165
|
const agentsPath = path.join(cwd, 'AGENTS.md');
|
|
1124
|
-
|
|
1166
|
+
// Load existing config using ConfigManager
|
|
1167
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
1168
|
+
const configManager = createConfigManager(cwd);
|
|
1169
|
+
const existingConfig = await configManager.loadConfig();
|
|
1125
1170
|
let existingMode;
|
|
1126
1171
|
let existingLightMode;
|
|
1127
|
-
if (
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
if (currentConfig && (currentConfig.mode === 'minimal' || currentConfig.mode === 'full')) {
|
|
1131
|
-
existingMode = currentConfig.mode;
|
|
1132
|
-
}
|
|
1133
|
-
if (currentConfig && currentConfig.lightMode !== undefined) {
|
|
1134
|
-
existingLightMode = currentConfig.lightMode;
|
|
1135
|
-
}
|
|
1172
|
+
if (existingConfig) {
|
|
1173
|
+
if (existingConfig && (existingConfig.mode === 'minimal' || existingConfig.mode === 'full')) {
|
|
1174
|
+
existingMode = existingConfig.mode;
|
|
1136
1175
|
}
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
existingLightMode = undefined;
|
|
1176
|
+
if (existingConfig && existingConfig.lightMode !== undefined) {
|
|
1177
|
+
existingLightMode = existingConfig.lightMode;
|
|
1140
1178
|
}
|
|
1141
1179
|
}
|
|
1142
1180
|
const minimalMode = options.minimal ?? existingMode === 'minimal';
|
|
@@ -1200,10 +1238,10 @@ export async function updateCommand(options) {
|
|
|
1200
1238
|
console.log(chalk.yellow(` - ${error}`));
|
|
1201
1239
|
}
|
|
1202
1240
|
}
|
|
1203
|
-
// Remove /rulebook/OPENSPEC.md if exists
|
|
1241
|
+
// Remove /rulebook/specs/OPENSPEC.md if exists
|
|
1204
1242
|
const removed = await removeOpenSpecRulebookFile(cwd, rulebookDir);
|
|
1205
1243
|
if (removed) {
|
|
1206
|
-
console.log(chalk.gray(' Removed /rulebook/OPENSPEC.md'));
|
|
1244
|
+
console.log(chalk.gray(' Removed /rulebook/specs/OPENSPEC.md'));
|
|
1207
1245
|
}
|
|
1208
1246
|
// Remove OpenSpec commands from .cursor/commands/
|
|
1209
1247
|
const { removeOpenSpecCommands } = await import('../core/openspec-migrator.js');
|
|
@@ -1307,12 +1345,11 @@ export async function updateCommand(options) {
|
|
|
1307
1345
|
}
|
|
1308
1346
|
}
|
|
1309
1347
|
}
|
|
1310
|
-
//
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
// Load existing config to preserve skills
|
|
1314
|
-
const existingConfig = await configManager.loadConfig();
|
|
1348
|
+
// Migration already done via configManager.loadConfig() -> migrateConfig() -> migrateDirectoryStructure()
|
|
1349
|
+
// No need to call it again here
|
|
1350
|
+
// Load existing config to preserve skills and ralph settings (already loaded above)
|
|
1315
1351
|
const existingSkills = existingConfig.skills?.enabled || [];
|
|
1352
|
+
const existingRalph = existingConfig.ralph;
|
|
1316
1353
|
// Auto-detect skills based on project detection (v2.0)
|
|
1317
1354
|
let detectedSkills = [];
|
|
1318
1355
|
try {
|
|
@@ -1351,7 +1388,24 @@ export async function updateCommand(options) {
|
|
|
1351
1388
|
modular: config.modular ?? true,
|
|
1352
1389
|
rulebookDir: config.rulebookDir || 'rulebook',
|
|
1353
1390
|
skills: detectedSkills.length > 0 ? { enabled: detectedSkills } : undefined,
|
|
1391
|
+
ralph: existingRalph,
|
|
1392
|
+
memory: existingConfig.memory,
|
|
1354
1393
|
});
|
|
1394
|
+
// Migrate flat layout to specs/ subdirectory if needed
|
|
1395
|
+
{
|
|
1396
|
+
const { hasFlatLayout, migrateFlatToSpecs } = await import('../core/migrator.js');
|
|
1397
|
+
const rulebookDirForMigration = config.rulebookDir || 'rulebook';
|
|
1398
|
+
if (await hasFlatLayout(cwd, rulebookDirForMigration)) {
|
|
1399
|
+
const migrationSpinner = ora('Migrating rulebook files to specs/ subdirectory...').start();
|
|
1400
|
+
const { migratedFiles } = await migrateFlatToSpecs(cwd, rulebookDirForMigration);
|
|
1401
|
+
if (migratedFiles.length > 0) {
|
|
1402
|
+
migrationSpinner.succeed(`Migrated ${migratedFiles.length} file(s) to /${rulebookDirForMigration}/specs/`);
|
|
1403
|
+
}
|
|
1404
|
+
else {
|
|
1405
|
+
migrationSpinner.info('No files to migrate');
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1355
1409
|
// Merge with existing AGENTS.md (with migration support)
|
|
1356
1410
|
const mergeSpinner = ora('Updating AGENTS.md with latest templates...').start();
|
|
1357
1411
|
config.modular = config.modular ?? true; // Enable modular by default
|
|
@@ -1406,19 +1460,68 @@ export async function updateCommand(options) {
|
|
|
1406
1460
|
projectId: path.basename(cwd),
|
|
1407
1461
|
mode: minimalMode ? 'minimal' : 'full',
|
|
1408
1462
|
features: rulebookFeatures,
|
|
1409
|
-
coverageThreshold: 95,
|
|
1410
|
-
language: 'en',
|
|
1411
|
-
outputLanguage: 'en',
|
|
1412
|
-
cliTools: [],
|
|
1413
|
-
maxParallelTasks: 5,
|
|
1414
|
-
timeouts: {
|
|
1463
|
+
coverageThreshold: existingConfig.coverageThreshold ?? 95,
|
|
1464
|
+
language: existingConfig.language ?? 'en',
|
|
1465
|
+
outputLanguage: existingConfig.outputLanguage ?? 'en',
|
|
1466
|
+
cliTools: existingConfig.cliTools ?? [],
|
|
1467
|
+
maxParallelTasks: existingConfig.maxParallelTasks ?? 5,
|
|
1468
|
+
timeouts: existingConfig.timeouts ?? {
|
|
1415
1469
|
taskExecution: 3600000,
|
|
1416
1470
|
cliResponse: 180000,
|
|
1417
1471
|
testRun: 600000,
|
|
1418
1472
|
},
|
|
1473
|
+
...(existingConfig.memory ? { memory: existingConfig.memory } : {}),
|
|
1474
|
+
...(existingConfig.ralph ? { ralph: existingConfig.ralph } : {}),
|
|
1475
|
+
...(existingConfig.skills ? { skills: existingConfig.skills } : {}),
|
|
1419
1476
|
};
|
|
1420
|
-
await
|
|
1477
|
+
await configManager.saveConfig(rulebookConfig);
|
|
1421
1478
|
configSpinner.succeed('.rulebook configuration updated');
|
|
1479
|
+
// Auto-setup Claude Code integration (MCP + skills)
|
|
1480
|
+
const claudeSpinner = ora('Checking Claude Code integration...').start();
|
|
1481
|
+
try {
|
|
1482
|
+
const { setupClaudeCodeIntegration } = await import('../core/claude-mcp.js');
|
|
1483
|
+
const result = await setupClaudeCodeIntegration(cwd);
|
|
1484
|
+
if (result.detected) {
|
|
1485
|
+
claudeSpinner.succeed('Claude Code integration updated');
|
|
1486
|
+
if (result.mcpConfigured) {
|
|
1487
|
+
console.log(chalk.gray(' • MCP server added to .mcp.json'));
|
|
1488
|
+
}
|
|
1489
|
+
if (result.skillsInstalled.length > 0) {
|
|
1490
|
+
console.log(chalk.gray(` • ${result.skillsInstalled.length} skills updated in .claude/commands/`));
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1493
|
+
else {
|
|
1494
|
+
claudeSpinner.info('Claude Code not detected (skipped)');
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
catch {
|
|
1498
|
+
claudeSpinner.info('Claude Code integration skipped');
|
|
1499
|
+
}
|
|
1500
|
+
// Migrate memory directory if old structure exists
|
|
1501
|
+
try {
|
|
1502
|
+
await migrateMemoryDirectory();
|
|
1503
|
+
}
|
|
1504
|
+
catch {
|
|
1505
|
+
// Silently skip if migration fails
|
|
1506
|
+
}
|
|
1507
|
+
// Install plugin in Claude Code
|
|
1508
|
+
try {
|
|
1509
|
+
await setupClaudeCodePlugin();
|
|
1510
|
+
}
|
|
1511
|
+
catch {
|
|
1512
|
+
// Silently skip if plugin installation fails
|
|
1513
|
+
}
|
|
1514
|
+
// Clean up any accidental duplicate directories
|
|
1515
|
+
try {
|
|
1516
|
+
const fsPromises = await import('fs/promises');
|
|
1517
|
+
const accidentalDir = path.join(cwd, '.rulebook', '.rulebook');
|
|
1518
|
+
if (existsSync(accidentalDir)) {
|
|
1519
|
+
await fsPromises.rm(accidentalDir, { recursive: true, force: true });
|
|
1520
|
+
}
|
|
1521
|
+
}
|
|
1522
|
+
catch {
|
|
1523
|
+
// Ignore cleanup errors
|
|
1524
|
+
}
|
|
1422
1525
|
// Success message
|
|
1423
1526
|
console.log(chalk.bold.green('\n✅ Update complete!\n'));
|
|
1424
1527
|
console.log(chalk.white('Updated components:'));
|
|
@@ -1728,4 +1831,542 @@ export async function skillSearchCommand(query) {
|
|
|
1728
1831
|
process.exit(1);
|
|
1729
1832
|
}
|
|
1730
1833
|
}
|
|
1834
|
+
// ============================================
|
|
1835
|
+
// Memory Commands (v2.2)
|
|
1836
|
+
// ============================================
|
|
1837
|
+
export async function memorySearchCommand(query, options) {
|
|
1838
|
+
const ora = (await import('ora')).default;
|
|
1839
|
+
const chalk = (await import('chalk')).default;
|
|
1840
|
+
const spinner = ora('Searching memories...').start();
|
|
1841
|
+
try {
|
|
1842
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
1843
|
+
const cwd = process.cwd();
|
|
1844
|
+
const configManager = createConfigManager(cwd);
|
|
1845
|
+
const config = await configManager.loadConfig();
|
|
1846
|
+
if (!config.memory?.enabled) {
|
|
1847
|
+
spinner.fail('Memory system is not enabled. Run: rulebook config --set memory.enabled=true');
|
|
1848
|
+
return;
|
|
1849
|
+
}
|
|
1850
|
+
const { createMemoryManager } = await import('../memory/memory-manager.js');
|
|
1851
|
+
const manager = createMemoryManager(cwd, config.memory);
|
|
1852
|
+
const results = await manager.searchMemories({
|
|
1853
|
+
query,
|
|
1854
|
+
mode: options.mode || 'hybrid',
|
|
1855
|
+
type: options.type,
|
|
1856
|
+
limit: options.limit ? parseInt(options.limit) : 20,
|
|
1857
|
+
});
|
|
1858
|
+
spinner.succeed(`Found ${results.length} memories`);
|
|
1859
|
+
if (results.length === 0) {
|
|
1860
|
+
console.log(chalk.yellow('\nNo memories found for that query.'));
|
|
1861
|
+
}
|
|
1862
|
+
else {
|
|
1863
|
+
console.log('');
|
|
1864
|
+
for (const r of results) {
|
|
1865
|
+
const typeColor = r.type === 'bugfix' ? chalk.red : r.type === 'feature' ? chalk.green : chalk.blue;
|
|
1866
|
+
console.log(` ${typeColor(r.type.padEnd(12))} ${chalk.white(r.title)} ${chalk.gray(`[${r.matchType}] ${r.score.toFixed(3)}`)}`);
|
|
1867
|
+
}
|
|
1868
|
+
}
|
|
1869
|
+
await manager.close();
|
|
1870
|
+
}
|
|
1871
|
+
catch (error) {
|
|
1872
|
+
spinner.fail('Search failed');
|
|
1873
|
+
console.error(chalk.red(String(error)));
|
|
1874
|
+
process.exit(1);
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
export async function memorySaveCommand(text, options) {
|
|
1878
|
+
const ora = (await import('ora')).default;
|
|
1879
|
+
const chalk = (await import('chalk')).default;
|
|
1880
|
+
const spinner = ora('Saving memory...').start();
|
|
1881
|
+
try {
|
|
1882
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
1883
|
+
const cwd = process.cwd();
|
|
1884
|
+
const configManager = createConfigManager(cwd);
|
|
1885
|
+
const config = await configManager.loadConfig();
|
|
1886
|
+
if (!config.memory?.enabled) {
|
|
1887
|
+
spinner.fail('Memory system is not enabled. Run: rulebook config --set memory.enabled=true');
|
|
1888
|
+
return;
|
|
1889
|
+
}
|
|
1890
|
+
const { createMemoryManager } = await import('../memory/memory-manager.js');
|
|
1891
|
+
const { classifyMemory } = await import('../memory/memory-hooks.js');
|
|
1892
|
+
const manager = createMemoryManager(cwd, config.memory);
|
|
1893
|
+
const type = (options.type || classifyMemory(text));
|
|
1894
|
+
const title = options.title || text.slice(0, 80);
|
|
1895
|
+
const tags = options.tags ? options.tags.split(',').map((t) => t.trim()) : [];
|
|
1896
|
+
const memory = await manager.saveMemory({ type, title, content: text, tags });
|
|
1897
|
+
spinner.succeed(`Memory saved: ${chalk.cyan(memory.id)}`);
|
|
1898
|
+
console.log(chalk.gray(` Type: ${memory.type} | Title: ${memory.title}`));
|
|
1899
|
+
await manager.close();
|
|
1900
|
+
}
|
|
1901
|
+
catch (error) {
|
|
1902
|
+
spinner.fail('Save failed');
|
|
1903
|
+
console.error(chalk.red(String(error)));
|
|
1904
|
+
process.exit(1);
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
export async function memoryListCommand(options) {
|
|
1908
|
+
const ora = (await import('ora')).default;
|
|
1909
|
+
const chalk = (await import('chalk')).default;
|
|
1910
|
+
const spinner = ora('Loading memories...').start();
|
|
1911
|
+
try {
|
|
1912
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
1913
|
+
const cwd = process.cwd();
|
|
1914
|
+
const configManager = createConfigManager(cwd);
|
|
1915
|
+
const config = await configManager.loadConfig();
|
|
1916
|
+
if (!config.memory?.enabled) {
|
|
1917
|
+
spinner.fail('Memory system is not enabled.');
|
|
1918
|
+
return;
|
|
1919
|
+
}
|
|
1920
|
+
const { createMemoryManager } = await import('../memory/memory-manager.js');
|
|
1921
|
+
const manager = createMemoryManager(cwd, config.memory);
|
|
1922
|
+
const stats = await manager.getStats();
|
|
1923
|
+
const exported = await manager.exportMemories('json');
|
|
1924
|
+
const memories = JSON.parse(exported).slice(0, options.limit ? parseInt(options.limit) : 20);
|
|
1925
|
+
spinner.succeed(`${stats.memoryCount} memories total`);
|
|
1926
|
+
if (memories.length === 0) {
|
|
1927
|
+
console.log(chalk.yellow('\nNo memories stored yet.'));
|
|
1928
|
+
}
|
|
1929
|
+
else {
|
|
1930
|
+
console.log('');
|
|
1931
|
+
for (const m of memories) {
|
|
1932
|
+
const date = new Date(m.createdAt).toLocaleDateString();
|
|
1933
|
+
const typeColor = m.type === 'bugfix' ? chalk.red : m.type === 'feature' ? chalk.green : chalk.blue;
|
|
1934
|
+
console.log(` ${chalk.gray(date)} ${typeColor(m.type.padEnd(12))} ${chalk.white(m.title)}`);
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
await manager.close();
|
|
1938
|
+
}
|
|
1939
|
+
catch (error) {
|
|
1940
|
+
spinner.fail('Failed to list memories');
|
|
1941
|
+
console.error(chalk.red(String(error)));
|
|
1942
|
+
process.exit(1);
|
|
1943
|
+
}
|
|
1944
|
+
}
|
|
1945
|
+
export async function memoryStatsCommand() {
|
|
1946
|
+
const ora = (await import('ora')).default;
|
|
1947
|
+
const chalk = (await import('chalk')).default;
|
|
1948
|
+
const spinner = ora('Loading stats...').start();
|
|
1949
|
+
try {
|
|
1950
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
1951
|
+
const cwd = process.cwd();
|
|
1952
|
+
const configManager = createConfigManager(cwd);
|
|
1953
|
+
const config = await configManager.loadConfig();
|
|
1954
|
+
if (!config.memory?.enabled) {
|
|
1955
|
+
spinner.fail('Memory system is not enabled.');
|
|
1956
|
+
return;
|
|
1957
|
+
}
|
|
1958
|
+
const { createMemoryManager } = await import('../memory/memory-manager.js');
|
|
1959
|
+
const manager = createMemoryManager(cwd, config.memory);
|
|
1960
|
+
const stats = await manager.getStats();
|
|
1961
|
+
spinner.succeed('Memory statistics');
|
|
1962
|
+
const sizeMB = (stats.dbSizeBytes / 1024 / 1024).toFixed(2);
|
|
1963
|
+
const maxMB = (stats.maxSizeBytes / 1024 / 1024).toFixed(0);
|
|
1964
|
+
const usage = stats.usagePercent.toFixed(1);
|
|
1965
|
+
const bar = '█'.repeat(Math.floor(stats.usagePercent / 5)) + '░'.repeat(20 - Math.floor(stats.usagePercent / 5));
|
|
1966
|
+
console.log(`\n Memories: ${chalk.cyan(stats.memoryCount)}`);
|
|
1967
|
+
console.log(` Sessions: ${chalk.cyan(stats.sessionCount)}`);
|
|
1968
|
+
console.log(` DB Size: ${chalk.cyan(sizeMB + ' MB')} / ${maxMB} MB`);
|
|
1969
|
+
console.log(` Usage: [${stats.usagePercent > 80 ? chalk.red(bar) : chalk.green(bar)}] ${usage}%`);
|
|
1970
|
+
console.log(` Health: ${stats.indexHealth === 'good' ? chalk.green(stats.indexHealth) : chalk.yellow(stats.indexHealth)}`);
|
|
1971
|
+
await manager.close();
|
|
1972
|
+
}
|
|
1973
|
+
catch (error) {
|
|
1974
|
+
spinner.fail('Failed to load stats');
|
|
1975
|
+
console.error(chalk.red(String(error)));
|
|
1976
|
+
process.exit(1);
|
|
1977
|
+
}
|
|
1978
|
+
}
|
|
1979
|
+
export async function memoryCleanupCommand(options) {
|
|
1980
|
+
const ora = (await import('ora')).default;
|
|
1981
|
+
const chalk = (await import('chalk')).default;
|
|
1982
|
+
const spinner = ora('Running cleanup...').start();
|
|
1983
|
+
try {
|
|
1984
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
1985
|
+
const cwd = process.cwd();
|
|
1986
|
+
const configManager = createConfigManager(cwd);
|
|
1987
|
+
const config = await configManager.loadConfig();
|
|
1988
|
+
if (!config.memory?.enabled) {
|
|
1989
|
+
spinner.fail('Memory system is not enabled.');
|
|
1990
|
+
return;
|
|
1991
|
+
}
|
|
1992
|
+
const { createMemoryManager } = await import('../memory/memory-manager.js');
|
|
1993
|
+
const manager = createMemoryManager(cwd, config.memory);
|
|
1994
|
+
const result = await manager.cleanup(options.force || false);
|
|
1995
|
+
if (result.evictedCount > 0) {
|
|
1996
|
+
const freedMB = (result.freedBytes / 1024 / 1024).toFixed(2);
|
|
1997
|
+
spinner.succeed(`Cleaned up ${result.evictedCount} memories (freed ${freedMB} MB)`);
|
|
1998
|
+
}
|
|
1999
|
+
else {
|
|
2000
|
+
spinner.succeed('No cleanup needed');
|
|
2001
|
+
}
|
|
2002
|
+
await manager.close();
|
|
2003
|
+
}
|
|
2004
|
+
catch (error) {
|
|
2005
|
+
spinner.fail('Cleanup failed');
|
|
2006
|
+
console.error(chalk.red(String(error)));
|
|
2007
|
+
process.exit(1);
|
|
2008
|
+
}
|
|
2009
|
+
}
|
|
2010
|
+
export async function memoryExportCommand(options) {
|
|
2011
|
+
const ora = (await import('ora')).default;
|
|
2012
|
+
const chalk = (await import('chalk')).default;
|
|
2013
|
+
const spinner = ora('Exporting memories...').start();
|
|
2014
|
+
try {
|
|
2015
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
2016
|
+
const cwd = process.cwd();
|
|
2017
|
+
const configManager = createConfigManager(cwd);
|
|
2018
|
+
const config = await configManager.loadConfig();
|
|
2019
|
+
if (!config.memory?.enabled) {
|
|
2020
|
+
spinner.fail('Memory system is not enabled.');
|
|
2021
|
+
return;
|
|
2022
|
+
}
|
|
2023
|
+
const { createMemoryManager } = await import('../memory/memory-manager.js');
|
|
2024
|
+
const manager = createMemoryManager(cwd, config.memory);
|
|
2025
|
+
const format = (options.format || 'json');
|
|
2026
|
+
const exported = await manager.exportMemories(format);
|
|
2027
|
+
const count = format === 'json' ? JSON.parse(exported).length : exported.split('\n').length - 1;
|
|
2028
|
+
if (options.output) {
|
|
2029
|
+
const { writeFile } = await import('fs/promises');
|
|
2030
|
+
await writeFile(options.output, exported);
|
|
2031
|
+
spinner.succeed(`Exported ${count} memories to ${chalk.cyan(options.output)}`);
|
|
2032
|
+
}
|
|
2033
|
+
else {
|
|
2034
|
+
spinner.succeed(`Exported ${count} memories`);
|
|
2035
|
+
console.log(exported);
|
|
2036
|
+
}
|
|
2037
|
+
await manager.close();
|
|
2038
|
+
}
|
|
2039
|
+
catch (error) {
|
|
2040
|
+
spinner.fail('Export failed');
|
|
2041
|
+
console.error(chalk.red(String(error)));
|
|
2042
|
+
process.exit(1);
|
|
2043
|
+
}
|
|
2044
|
+
}
|
|
2045
|
+
// Ralph Autonomous Loop Commands (v3.0)
|
|
2046
|
+
export async function ralphInitCommand() {
|
|
2047
|
+
const oraModule = await import('ora');
|
|
2048
|
+
const ora = oraModule.default;
|
|
2049
|
+
const spinner = ora('Initializing Ralph autonomous loop...').start();
|
|
2050
|
+
try {
|
|
2051
|
+
const cwd = process.cwd();
|
|
2052
|
+
const { Logger } = await import('../core/logger.js');
|
|
2053
|
+
const { RalphManager } = await import('../core/ralph-manager.js');
|
|
2054
|
+
const { PRDGenerator } = await import('../core/prd-generator.js');
|
|
2055
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
2056
|
+
const logger = new Logger(cwd);
|
|
2057
|
+
const configManager = createConfigManager(cwd);
|
|
2058
|
+
const config = await configManager.loadConfig();
|
|
2059
|
+
// Create managers
|
|
2060
|
+
const ralphManager = new RalphManager(cwd, logger);
|
|
2061
|
+
const prdGenerator = new PRDGenerator(cwd, logger);
|
|
2062
|
+
// Initialize Ralph
|
|
2063
|
+
const maxIterations = config.ralph?.maxIterations || 10;
|
|
2064
|
+
const tool = (config.ralph?.tool || 'claude');
|
|
2065
|
+
await ralphManager.initialize(maxIterations, tool);
|
|
2066
|
+
// Generate PRD from rulebook tasks
|
|
2067
|
+
const prd = await prdGenerator.generatePRD(path.basename(cwd));
|
|
2068
|
+
// Save PRD
|
|
2069
|
+
const prdPath = path.join(cwd, '.rulebook', 'ralph', 'prd.json');
|
|
2070
|
+
await writeFile(prdPath, JSON.stringify(prd, null, 2));
|
|
2071
|
+
spinner.succeed(`Ralph initialized: ${prd.userStories.length} user stories loaded`);
|
|
2072
|
+
console.log(`\n 📋 PRD: ${prdPath}`);
|
|
2073
|
+
console.log(` 🔄 Max iterations: ${maxIterations}`);
|
|
2074
|
+
console.log(` 🤖 AI Tool: ${tool}`);
|
|
2075
|
+
console.log(`\n Run: ${chalk.bold('rulebook ralph run')}\n`);
|
|
2076
|
+
}
|
|
2077
|
+
catch (error) {
|
|
2078
|
+
spinner.fail('Ralph initialization failed');
|
|
2079
|
+
console.error(chalk.red(String(error)));
|
|
2080
|
+
process.exit(1);
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
export async function ralphRunCommand(options) {
|
|
2084
|
+
const oraModule = await import('ora');
|
|
2085
|
+
const ora = oraModule.default;
|
|
2086
|
+
const spinner = ora('Starting Ralph autonomous loop...').start();
|
|
2087
|
+
try {
|
|
2088
|
+
const cwd = process.cwd();
|
|
2089
|
+
const { Logger } = await import('../core/logger.js');
|
|
2090
|
+
const { RalphManager } = await import('../core/ralph-manager.js');
|
|
2091
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
2092
|
+
const logger = new Logger(cwd);
|
|
2093
|
+
const configManager = createConfigManager(cwd);
|
|
2094
|
+
const config = await configManager.loadConfig();
|
|
2095
|
+
const ralphManager = new RalphManager(cwd, logger);
|
|
2096
|
+
const maxIterations = options.maxIterations || config.ralph?.maxIterations || 10;
|
|
2097
|
+
const tool = options.tool || config.ralph?.tool || 'claude';
|
|
2098
|
+
await ralphManager.initialize(maxIterations, tool);
|
|
2099
|
+
spinner.text = 'Ralph loop running (Ctrl+C to pause)...';
|
|
2100
|
+
let iterationCount = 0;
|
|
2101
|
+
while (ralphManager.canContinue()) {
|
|
2102
|
+
iterationCount++;
|
|
2103
|
+
const task = await ralphManager.getNextTask();
|
|
2104
|
+
if (!task) {
|
|
2105
|
+
break;
|
|
2106
|
+
}
|
|
2107
|
+
spinner.text = `Iteration ${iterationCount}: ${task.title}...`;
|
|
2108
|
+
// In production, would execute agent here
|
|
2109
|
+
// For now, just mark story as complete
|
|
2110
|
+
await ralphManager.markStoryComplete(task.id);
|
|
2111
|
+
// Simulate iteration result (placeholder)
|
|
2112
|
+
const result = {
|
|
2113
|
+
iteration: iterationCount,
|
|
2114
|
+
timestamp: new Date().toISOString(),
|
|
2115
|
+
task_id: task.id,
|
|
2116
|
+
task_title: task.title,
|
|
2117
|
+
status: 'success',
|
|
2118
|
+
ai_tool: tool,
|
|
2119
|
+
execution_time_ms: 5000,
|
|
2120
|
+
quality_checks: { type_check: true, lint: true, tests: true, coverage_met: true },
|
|
2121
|
+
output_summary: `Completed ${task.title}`,
|
|
2122
|
+
git_commit: undefined,
|
|
2123
|
+
learnings: [],
|
|
2124
|
+
errors: [],
|
|
2125
|
+
metadata: { context_loss_count: 0, parsed_completion: true },
|
|
2126
|
+
};
|
|
2127
|
+
await ralphManager.recordIteration(result);
|
|
2128
|
+
}
|
|
2129
|
+
const stats = await ralphManager.getTaskStats();
|
|
2130
|
+
spinner.succeed(`Ralph loop complete: ${stats.completed}/${stats.total} tasks completed`);
|
|
2131
|
+
console.log(`\n ✅ Iterations: ${iterationCount}`);
|
|
2132
|
+
console.log(` 📊 Completed: ${stats.completed}/${stats.total}`);
|
|
2133
|
+
console.log(`\n View history: ${chalk.bold('rulebook ralph history')}\n`);
|
|
2134
|
+
}
|
|
2135
|
+
catch (error) {
|
|
2136
|
+
spinner.fail('Ralph loop failed');
|
|
2137
|
+
console.error(chalk.red(String(error)));
|
|
2138
|
+
process.exit(1);
|
|
2139
|
+
}
|
|
2140
|
+
}
|
|
2141
|
+
export async function ralphStatusCommand() {
|
|
2142
|
+
const oraModule = await import('ora');
|
|
2143
|
+
const ora = oraModule.default;
|
|
2144
|
+
const spinner = ora('Loading Ralph status...').start();
|
|
2145
|
+
try {
|
|
2146
|
+
const cwd = process.cwd();
|
|
2147
|
+
const { Logger } = await import('../core/logger.js');
|
|
2148
|
+
const { RalphManager } = await import('../core/ralph-manager.js');
|
|
2149
|
+
const logger = new Logger(cwd);
|
|
2150
|
+
const ralphManager = new RalphManager(cwd, logger);
|
|
2151
|
+
const status = await ralphManager.getStatus();
|
|
2152
|
+
if (!status) {
|
|
2153
|
+
spinner.fail('Ralph not initialized');
|
|
2154
|
+
console.log(`\n Run: ${chalk.bold('rulebook ralph init')}\n`);
|
|
2155
|
+
return;
|
|
2156
|
+
}
|
|
2157
|
+
spinner.stop();
|
|
2158
|
+
console.log(`\n ${chalk.bold('Ralph Loop Status')}`);
|
|
2159
|
+
console.log(` Iteration: ${status.current_iteration}/${status.max_iterations}`);
|
|
2160
|
+
console.log(` Tasks: ${status.completed_tasks}/${status.total_tasks}`);
|
|
2161
|
+
console.log(` Status: ${status.paused ? chalk.yellow('PAUSED') : chalk.green('RUNNING')}`);
|
|
2162
|
+
console.log(` AI Tool: ${status.tool}`);
|
|
2163
|
+
console.log(` Started: ${new Date(status.started_at).toLocaleString()}`);
|
|
2164
|
+
console.log();
|
|
2165
|
+
}
|
|
2166
|
+
catch (error) {
|
|
2167
|
+
spinner.fail('Failed to load status');
|
|
2168
|
+
console.error(chalk.red(String(error)));
|
|
2169
|
+
process.exit(1);
|
|
2170
|
+
}
|
|
2171
|
+
}
|
|
2172
|
+
export async function ralphHistoryCommand(options) {
|
|
2173
|
+
const oraModule = await import('ora');
|
|
2174
|
+
const ora = oraModule.default;
|
|
2175
|
+
const spinner = ora('Loading iteration history...').start();
|
|
2176
|
+
try {
|
|
2177
|
+
const cwd = process.cwd();
|
|
2178
|
+
const { Logger } = await import('../core/logger.js');
|
|
2179
|
+
const { IterationTracker } = await import('../core/iteration-tracker.js');
|
|
2180
|
+
const logger = new Logger(cwd);
|
|
2181
|
+
const tracker = new IterationTracker(cwd, logger);
|
|
2182
|
+
const limit = options.limit || 10;
|
|
2183
|
+
const history = await tracker.getHistory(limit);
|
|
2184
|
+
if (history.length === 0) {
|
|
2185
|
+
spinner.fail('No iteration history found');
|
|
2186
|
+
return;
|
|
2187
|
+
}
|
|
2188
|
+
spinner.stop();
|
|
2189
|
+
console.log(`\n ${chalk.bold('Recent Iterations')} (${history.length})\n`);
|
|
2190
|
+
for (const iter of history) {
|
|
2191
|
+
const statusIcon = iter.status === 'success' ? chalk.green('✓') : iter.status === 'partial' ? chalk.yellow('◐') : chalk.red('✗');
|
|
2192
|
+
console.log(` ${statusIcon} Iteration ${iter.iteration}: ${iter.task_title}`);
|
|
2193
|
+
console.log(` Status: ${iter.status} | Duration: ${(iter.duration_ms || 0) / 1000}s`);
|
|
2194
|
+
console.log(` Checks: type=${iter.quality_checks.type_check ? '✓' : '✗'} lint=${iter.quality_checks.lint ? '✓' : '✗'} tests=${iter.quality_checks.tests ? '✓' : '✗'}`);
|
|
2195
|
+
if (iter.git_commit) {
|
|
2196
|
+
console.log(` Commit: ${iter.git_commit}`);
|
|
2197
|
+
}
|
|
2198
|
+
console.log();
|
|
2199
|
+
}
|
|
2200
|
+
// Show statistics
|
|
2201
|
+
const stats = await tracker.getStatistics();
|
|
2202
|
+
console.log(` ${chalk.bold('Statistics')}`);
|
|
2203
|
+
console.log(` Total: ${stats.total_iterations} | Success: ${stats.successful_iterations} | Failed: ${stats.failed_iterations}`);
|
|
2204
|
+
console.log(` Success rate: ${(stats.success_rate * 100).toFixed(1)}%`);
|
|
2205
|
+
console.log(` Avg duration: ${stats.average_duration_ms}ms\n`);
|
|
2206
|
+
}
|
|
2207
|
+
catch (error) {
|
|
2208
|
+
spinner.fail('Failed to load history');
|
|
2209
|
+
console.error(chalk.red(String(error)));
|
|
2210
|
+
process.exit(1);
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
export async function ralphPauseCommand() {
|
|
2214
|
+
const oraModule = await import('ora');
|
|
2215
|
+
const ora = oraModule.default;
|
|
2216
|
+
const spinner = ora('Pausing Ralph loop...').start();
|
|
2217
|
+
try {
|
|
2218
|
+
const cwd = process.cwd();
|
|
2219
|
+
const { Logger } = await import('../core/logger.js');
|
|
2220
|
+
const { RalphManager } = await import('../core/ralph-manager.js');
|
|
2221
|
+
const logger = new Logger(cwd);
|
|
2222
|
+
const ralphManager = new RalphManager(cwd, logger);
|
|
2223
|
+
await ralphManager.pause();
|
|
2224
|
+
spinner.succeed('Ralph loop paused');
|
|
2225
|
+
console.log(`\n Resume with: ${chalk.bold('rulebook ralph resume')}\n`);
|
|
2226
|
+
}
|
|
2227
|
+
catch (error) {
|
|
2228
|
+
spinner.fail('Failed to pause');
|
|
2229
|
+
console.error(chalk.red(String(error)));
|
|
2230
|
+
process.exit(1);
|
|
2231
|
+
}
|
|
2232
|
+
}
|
|
2233
|
+
export async function ralphResumeCommand() {
|
|
2234
|
+
const oraModule = await import('ora');
|
|
2235
|
+
const ora = oraModule.default;
|
|
2236
|
+
const spinner = ora('Resuming Ralph loop...').start();
|
|
2237
|
+
try {
|
|
2238
|
+
const cwd = process.cwd();
|
|
2239
|
+
const { Logger } = await import('../core/logger.js');
|
|
2240
|
+
const { RalphManager } = await import('../core/ralph-manager.js');
|
|
2241
|
+
const logger = new Logger(cwd);
|
|
2242
|
+
const ralphManager = new RalphManager(cwd, logger);
|
|
2243
|
+
await ralphManager.resume();
|
|
2244
|
+
spinner.succeed('Ralph loop resumed');
|
|
2245
|
+
console.log(`\n Continue loop: ${chalk.bold('rulebook ralph run')}\n`);
|
|
2246
|
+
}
|
|
2247
|
+
catch (error) {
|
|
2248
|
+
spinner.fail('Failed to resume');
|
|
2249
|
+
console.error(chalk.red(String(error)));
|
|
2250
|
+
process.exit(1);
|
|
2251
|
+
}
|
|
2252
|
+
}
|
|
2253
|
+
export async function setupClaudeCodePlugin() {
|
|
2254
|
+
const oraModule = await import('ora');
|
|
2255
|
+
const ora = oraModule.default;
|
|
2256
|
+
const spinner = ora('Setting up Claude Code plugin...').start();
|
|
2257
|
+
try {
|
|
2258
|
+
const { readFile } = await import('../utils/file-system.js');
|
|
2259
|
+
const os = await import('os');
|
|
2260
|
+
const fs = await import('fs/promises');
|
|
2261
|
+
// Get plugin info from .claude-plugin/plugin.json
|
|
2262
|
+
const cwd = process.cwd();
|
|
2263
|
+
const pluginJsonPath = path.join(cwd, '.claude-plugin', 'plugin.json');
|
|
2264
|
+
const pluginJson = JSON.parse(await readFile(pluginJsonPath));
|
|
2265
|
+
// Get Claude Code plugins directory
|
|
2266
|
+
const homeDir = os.homedir();
|
|
2267
|
+
const pluginsDir = path.join(homeDir, '.claude', 'plugins');
|
|
2268
|
+
const installCountsPath = path.join(pluginsDir, 'install-counts-cache.json');
|
|
2269
|
+
const installedPluginsPath = path.join(pluginsDir, 'installed_plugins.json');
|
|
2270
|
+
// Create plugins directory if it doesn't exist
|
|
2271
|
+
await fs.mkdir(pluginsDir, { recursive: true });
|
|
2272
|
+
// Load or create installed_plugins.json
|
|
2273
|
+
let installedPlugins = {
|
|
2274
|
+
version: 2,
|
|
2275
|
+
plugins: {},
|
|
2276
|
+
};
|
|
2277
|
+
if (existsSync(installedPluginsPath)) {
|
|
2278
|
+
const content = await readFile(installedPluginsPath);
|
|
2279
|
+
installedPlugins = JSON.parse(content);
|
|
2280
|
+
}
|
|
2281
|
+
// Add rulebook plugin
|
|
2282
|
+
const pluginKey = `rulebook@hivehub`;
|
|
2283
|
+
const version = pluginJson.version || '3.1.0';
|
|
2284
|
+
const installPath = path.join(pluginsDir, 'cache', 'hivehub', 'rulebook', version);
|
|
2285
|
+
if (!installedPlugins.plugins[pluginKey]) {
|
|
2286
|
+
installedPlugins.plugins[pluginKey] = [];
|
|
2287
|
+
}
|
|
2288
|
+
// Check if already installed
|
|
2289
|
+
const existing = installedPlugins.plugins[pluginKey].find((p) => p.version === version);
|
|
2290
|
+
if (!existing) {
|
|
2291
|
+
installedPlugins.plugins[pluginKey].push({
|
|
2292
|
+
scope: 'user',
|
|
2293
|
+
installPath: installPath,
|
|
2294
|
+
version: version,
|
|
2295
|
+
installedAt: new Date().toISOString(),
|
|
2296
|
+
lastUpdated: new Date().toISOString(),
|
|
2297
|
+
});
|
|
2298
|
+
}
|
|
2299
|
+
// Save installed_plugins.json
|
|
2300
|
+
await fs.writeFile(installedPluginsPath, JSON.stringify(installedPlugins, null, 2));
|
|
2301
|
+
// Update install-counts-cache.json
|
|
2302
|
+
let installCounts = {};
|
|
2303
|
+
if (existsSync(installCountsPath)) {
|
|
2304
|
+
const content = await readFile(installCountsPath);
|
|
2305
|
+
installCounts = JSON.parse(content);
|
|
2306
|
+
}
|
|
2307
|
+
installCounts[pluginKey] = (installCounts[pluginKey] || 0) + 1;
|
|
2308
|
+
await fs.writeFile(installCountsPath, JSON.stringify(installCounts, null, 2));
|
|
2309
|
+
spinner.succeed('Claude Code plugin installed');
|
|
2310
|
+
console.log(`\n ${chalk.green('✓')} Plugin: ${pluginKey} v${version}`);
|
|
2311
|
+
console.log(` ${chalk.gray('Installed to:')} ${installPath}`);
|
|
2312
|
+
console.log(`\n ${chalk.blue('Note:')} Restart Claude Code to load the plugin.\n`);
|
|
2313
|
+
}
|
|
2314
|
+
catch (error) {
|
|
2315
|
+
spinner.fail('Failed to install plugin');
|
|
2316
|
+
console.error(chalk.red(String(error)));
|
|
2317
|
+
process.exit(1);
|
|
2318
|
+
}
|
|
2319
|
+
}
|
|
2320
|
+
export async function migrateMemoryDirectory() {
|
|
2321
|
+
const oraModule = await import('ora');
|
|
2322
|
+
const ora = oraModule.default;
|
|
2323
|
+
const spinner = ora('Migrating memory directory structure...').start();
|
|
2324
|
+
try {
|
|
2325
|
+
const { createConfigManager } = await import('../core/config-manager.js');
|
|
2326
|
+
const fs = await import('fs');
|
|
2327
|
+
const fsPromises = fs.promises;
|
|
2328
|
+
const cwd = process.cwd();
|
|
2329
|
+
const oldDir = path.join(cwd, '.rulebook-memory');
|
|
2330
|
+
const rulebookDir = path.join(cwd, '.rulebook');
|
|
2331
|
+
const newDir = path.join(rulebookDir, 'memory');
|
|
2332
|
+
// Check if old directory exists
|
|
2333
|
+
if (!existsSync(oldDir)) {
|
|
2334
|
+
spinner.info('No old memory directory found (.rulebook-memory)');
|
|
2335
|
+
return;
|
|
2336
|
+
}
|
|
2337
|
+
// Create .rulebook directory if it doesn't exist
|
|
2338
|
+
if (!existsSync(rulebookDir)) {
|
|
2339
|
+
await fsPromises.mkdir(rulebookDir, { recursive: true });
|
|
2340
|
+
}
|
|
2341
|
+
// Create memory subdirectory
|
|
2342
|
+
await fsPromises.mkdir(newDir, { recursive: true });
|
|
2343
|
+
// Copy files from old to new
|
|
2344
|
+
const files = await fsPromises.readdir(oldDir);
|
|
2345
|
+
for (const file of files) {
|
|
2346
|
+
const oldPath = path.join(oldDir, file);
|
|
2347
|
+
const newPath = path.join(newDir, file);
|
|
2348
|
+
await fsPromises.copyFile(oldPath, newPath);
|
|
2349
|
+
}
|
|
2350
|
+
// Remove old directory
|
|
2351
|
+
await fsPromises.rm(oldDir, { recursive: true, force: true });
|
|
2352
|
+
// Update config to use new path
|
|
2353
|
+
const configManager = createConfigManager(cwd);
|
|
2354
|
+
const existingConfig = await configManager.loadConfig();
|
|
2355
|
+
if (existingConfig.memory) {
|
|
2356
|
+
existingConfig.memory.dbPath = '.rulebook/memory/memory.db';
|
|
2357
|
+
}
|
|
2358
|
+
await configManager.updateConfig(existingConfig);
|
|
2359
|
+
spinner.succeed('Memory directory migrated');
|
|
2360
|
+
console.log(`\n ${chalk.green('✓')} Migrated to: ${newDir}`);
|
|
2361
|
+
console.log(` ${chalk.gray('Old directory removed: .rulebook-memory')}\n`);
|
|
2362
|
+
}
|
|
2363
|
+
catch (error) {
|
|
2364
|
+
const oraModule = await import('ora');
|
|
2365
|
+
const ora = oraModule.default;
|
|
2366
|
+
const spinner2 = ora();
|
|
2367
|
+
spinner2.fail('Failed to migrate memory directory');
|
|
2368
|
+
console.error(chalk.red(String(error)));
|
|
2369
|
+
process.exit(1);
|
|
2370
|
+
}
|
|
2371
|
+
}
|
|
1731
2372
|
//# sourceMappingURL=commands.js.map
|