@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,555 +0,0 @@
|
|
|
1
|
-
import { mkdir, readdir, writeFile, appendFile, readFile, unlink } from 'fs/promises';
|
|
2
|
-
import { existsSync } from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
export class RalphManager {
|
|
5
|
-
projectRoot;
|
|
6
|
-
ralphDir;
|
|
7
|
-
historyDir;
|
|
8
|
-
lockPath;
|
|
9
|
-
loopState = null;
|
|
10
|
-
logger;
|
|
11
|
-
memoryAdapter = null;
|
|
12
|
-
constructor(projectRoot, logger) {
|
|
13
|
-
this.logger = logger;
|
|
14
|
-
this.projectRoot = projectRoot;
|
|
15
|
-
this.ralphDir = path.join(projectRoot, '.rulebook', 'ralph');
|
|
16
|
-
this.historyDir = path.join(this.ralphDir, 'history');
|
|
17
|
-
this.lockPath = path.join(this.ralphDir, 'ralph.lock');
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Attach a memory adapter for auto-saving iteration learnings.
|
|
21
|
-
* Call before running the loop. Safe to skip — all memory ops are fire-and-forget.
|
|
22
|
-
*/
|
|
23
|
-
setMemoryAdapter(adapter) {
|
|
24
|
-
this.memoryAdapter = adapter;
|
|
25
|
-
}
|
|
26
|
-
// ─── Lock Management ───
|
|
27
|
-
/**
|
|
28
|
-
* Acquire an exclusive lock for Ralph execution.
|
|
29
|
-
* Returns true if lock was acquired, false if another process holds it.
|
|
30
|
-
*/
|
|
31
|
-
async acquireLock(tool) {
|
|
32
|
-
await mkdir(this.ralphDir, { recursive: true });
|
|
33
|
-
// Check if lock already exists
|
|
34
|
-
const existing = await this.getLockInfo();
|
|
35
|
-
if (existing) {
|
|
36
|
-
// Check if the PID is still alive
|
|
37
|
-
if (this.isPidAlive(existing.pid)) {
|
|
38
|
-
this.logger.warn(`Ralph lock held by PID ${existing.pid} (started ${existing.startedAt})`);
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
// Stale lock — PID is dead, clean it up
|
|
42
|
-
this.logger.info(`Cleaning stale Ralph lock (PID ${existing.pid} is dead)`);
|
|
43
|
-
await this.releaseLock();
|
|
44
|
-
}
|
|
45
|
-
const lockInfo = {
|
|
46
|
-
pid: process.pid,
|
|
47
|
-
startedAt: new Date().toISOString(),
|
|
48
|
-
tool,
|
|
49
|
-
};
|
|
50
|
-
await writeFile(this.lockPath, JSON.stringify(lockInfo, null, 2));
|
|
51
|
-
this.logger.info(`Ralph lock acquired (PID ${process.pid})`);
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Release the Ralph execution lock.
|
|
56
|
-
*/
|
|
57
|
-
async releaseLock() {
|
|
58
|
-
try {
|
|
59
|
-
if (existsSync(this.lockPath)) {
|
|
60
|
-
await unlink(this.lockPath);
|
|
61
|
-
this.logger.info('Ralph lock released');
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (err) {
|
|
65
|
-
this.logger.warn(`Failed to release Ralph lock: ${err}`);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Update lock with current progress info.
|
|
70
|
-
*/
|
|
71
|
-
async updateLockProgress(iteration, currentTask) {
|
|
72
|
-
const existing = await this.getLockInfo();
|
|
73
|
-
if (!existing)
|
|
74
|
-
return;
|
|
75
|
-
existing.iteration = iteration;
|
|
76
|
-
existing.currentTask = currentTask;
|
|
77
|
-
try {
|
|
78
|
-
await writeFile(this.lockPath, JSON.stringify(existing, null, 2));
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
// Non-critical — best effort
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Read current lock info. Returns null if no lock exists.
|
|
86
|
-
*/
|
|
87
|
-
async getLockInfo() {
|
|
88
|
-
if (!existsSync(this.lockPath)) {
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
try {
|
|
92
|
-
const content = await this.readFileAsync(this.lockPath);
|
|
93
|
-
return JSON.parse(content);
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return null;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Check if a Ralph loop is currently running (lock held by alive process).
|
|
101
|
-
*/
|
|
102
|
-
async isRunning() {
|
|
103
|
-
const lock = await this.getLockInfo();
|
|
104
|
-
if (!lock)
|
|
105
|
-
return false;
|
|
106
|
-
return this.isPidAlive(lock.pid);
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Check if a PID is alive.
|
|
110
|
-
*/
|
|
111
|
-
isPidAlive(pid) {
|
|
112
|
-
try {
|
|
113
|
-
process.kill(pid, 0); // Signal 0 = check existence only
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Initialize Ralph loop state and directory structure
|
|
122
|
-
*/
|
|
123
|
-
async initialize(maxIterations, tool) {
|
|
124
|
-
this.logger.info('Initializing Ralph autonomous loop...');
|
|
125
|
-
// Create .rulebook/ralph directory structure
|
|
126
|
-
await mkdir(this.ralphDir, { recursive: true });
|
|
127
|
-
await mkdir(this.historyDir, { recursive: true });
|
|
128
|
-
// Initialize loop state
|
|
129
|
-
this.loopState = {
|
|
130
|
-
enabled: true,
|
|
131
|
-
current_iteration: 0,
|
|
132
|
-
max_iterations: maxIterations,
|
|
133
|
-
total_iterations: 0,
|
|
134
|
-
completed_tasks: 0,
|
|
135
|
-
total_tasks: 0,
|
|
136
|
-
paused: false,
|
|
137
|
-
started_at: new Date().toISOString(),
|
|
138
|
-
last_updated: new Date().toISOString(),
|
|
139
|
-
tool,
|
|
140
|
-
};
|
|
141
|
-
// Load PRD and update task count
|
|
142
|
-
const prd = await this.loadPRD();
|
|
143
|
-
if (prd && prd.userStories) {
|
|
144
|
-
this.loopState.total_tasks = prd.userStories.length;
|
|
145
|
-
}
|
|
146
|
-
// Save initial state
|
|
147
|
-
await this.saveLoopState();
|
|
148
|
-
this.logger.info(`Ralph initialized: max iterations=${maxIterations}, tool=${tool}`);
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Load PRD from .rulebook/ralph/prd.json
|
|
152
|
-
*/
|
|
153
|
-
async loadPRD() {
|
|
154
|
-
const prdPath = path.join(this.ralphDir, 'prd.json');
|
|
155
|
-
if (!existsSync(prdPath)) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
try {
|
|
159
|
-
const content = await this.readFileAsync(prdPath);
|
|
160
|
-
return JSON.parse(content);
|
|
161
|
-
}
|
|
162
|
-
catch (err) {
|
|
163
|
-
this.logger.error(`Failed to load PRD: ${err}`);
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Get the next task to execute
|
|
169
|
-
* Returns a pending task or null if all tasks are completed
|
|
170
|
-
*/
|
|
171
|
-
async getNextTask() {
|
|
172
|
-
const prd = await this.loadPRD();
|
|
173
|
-
if (!prd || !prd.userStories) {
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
// Find first unfinished story (passes: false)
|
|
177
|
-
const nextTask = prd.userStories.find((story) => !story.passes);
|
|
178
|
-
return nextTask || null;
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Mark a user story as complete and sync tasks.md checkboxes
|
|
182
|
-
*/
|
|
183
|
-
async markStoryComplete(storyId) {
|
|
184
|
-
const prd = await this.loadPRD();
|
|
185
|
-
if (!prd || !prd.userStories) {
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
const story = prd.userStories.find((s) => s.id === storyId);
|
|
189
|
-
if (story) {
|
|
190
|
-
story.passes = true;
|
|
191
|
-
await writeFile(path.join(this.ralphDir, 'prd.json'), JSON.stringify(prd, null, 2));
|
|
192
|
-
// Sync tasks.md checkboxes for acceptance criteria
|
|
193
|
-
if (story.sourceTaskId) {
|
|
194
|
-
await this.syncTasksCheckboxes(story.sourceTaskId, story.acceptanceCriteria);
|
|
195
|
-
}
|
|
196
|
-
// v5.3.0 F3: refresh STATE.md after Ralph marks a story as passing
|
|
197
|
-
try {
|
|
198
|
-
const { writeState } = await import('./state-writer.js');
|
|
199
|
-
const completed = prd.userStories.filter((s) => s.passes).length;
|
|
200
|
-
const total = prd.userStories.length;
|
|
201
|
-
await writeState(this.projectRoot, {
|
|
202
|
-
activeTask: story.sourceTaskId
|
|
203
|
-
? { id: story.sourceTaskId, phase: 'ralph', progress: `${completed}/${total} stories` }
|
|
204
|
-
: null,
|
|
205
|
-
lastRalphIteration: this.loopState?.current_iteration ?? null,
|
|
206
|
-
lastQualityGate: 'passed',
|
|
207
|
-
updatedAt: new Date().toISOString(),
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
catch {
|
|
211
|
-
// Non-fatal
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Mark matching checkboxes in tasks.md as completed
|
|
217
|
-
*/
|
|
218
|
-
async syncTasksCheckboxes(sourceTaskId, acceptanceCriteria) {
|
|
219
|
-
// Look in .rulebook/tasks/<sourceTaskId>/tasks.md
|
|
220
|
-
const tasksPath = path.join(this.projectRoot, '.rulebook', 'tasks', sourceTaskId, 'tasks.md');
|
|
221
|
-
if (!existsSync(tasksPath)) {
|
|
222
|
-
return;
|
|
223
|
-
}
|
|
224
|
-
try {
|
|
225
|
-
let content = await readFile(tasksPath, 'utf-8');
|
|
226
|
-
// For each acceptance criterion, find matching checkbox and mark it
|
|
227
|
-
for (const criterion of acceptanceCriteria) {
|
|
228
|
-
// Extract the task number prefix (e.g., "1.1", "2.3") from criterion
|
|
229
|
-
const numMatch = criterion.match(/^(\d+\.\d+)\s/);
|
|
230
|
-
if (numMatch) {
|
|
231
|
-
// Match checkbox line containing the same number prefix
|
|
232
|
-
const escapedNum = numMatch[1].replace('.', '\\.');
|
|
233
|
-
const regex = new RegExp(`^(- \\[) (\\] ${escapedNum}\\s)`, 'm');
|
|
234
|
-
content = content.replace(regex, '$1x$2');
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
// Fuzzy match: find checkbox whose text starts similarly (first 40 chars)
|
|
238
|
-
const needle = criterion.slice(0, 40).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
239
|
-
const regex = new RegExp(`^(- \\[) (\\] .*${needle})`, 'm');
|
|
240
|
-
content = content.replace(regex, '$1x$2');
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
await writeFile(tasksPath, content);
|
|
244
|
-
this.logger.info(`Synced tasks.md checkboxes for ${sourceTaskId}`);
|
|
245
|
-
}
|
|
246
|
-
catch (err) {
|
|
247
|
-
this.logger.warn(`Failed to sync tasks.md for ${sourceTaskId}: ${err}`);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Record iteration result to history
|
|
252
|
-
*/
|
|
253
|
-
async recordIteration(result) {
|
|
254
|
-
if (!this.loopState) {
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
this.loopState.current_iteration = result.iteration;
|
|
258
|
-
this.loopState.last_updated = new Date().toISOString();
|
|
259
|
-
// Sync completed_tasks from PRD truth (not just increment) for consistency
|
|
260
|
-
const prd = await this.loadPRD();
|
|
261
|
-
if (prd && prd.userStories) {
|
|
262
|
-
this.loopState.completed_tasks = prd.userStories.filter((s) => s.passes).length;
|
|
263
|
-
this.loopState.total_tasks = prd.userStories.length;
|
|
264
|
-
}
|
|
265
|
-
else if (result.status === 'success') {
|
|
266
|
-
this.loopState.completed_tasks++;
|
|
267
|
-
}
|
|
268
|
-
// Create iteration metadata file
|
|
269
|
-
const metadata = {
|
|
270
|
-
iteration: result.iteration,
|
|
271
|
-
started_at: result.timestamp,
|
|
272
|
-
completed_at: new Date().toISOString(),
|
|
273
|
-
task_id: result.task_id,
|
|
274
|
-
task_title: result.task_title,
|
|
275
|
-
duration_ms: result.execution_time_ms,
|
|
276
|
-
status: result.status,
|
|
277
|
-
git_commit: result.git_commit,
|
|
278
|
-
quality_checks: result.quality_checks,
|
|
279
|
-
};
|
|
280
|
-
const iterationFile = path.join(this.historyDir, `iteration-${result.iteration}.json`);
|
|
281
|
-
await writeFile(iterationFile, JSON.stringify(metadata, null, 2));
|
|
282
|
-
// Append to progress.txt
|
|
283
|
-
await this.appendProgress(result);
|
|
284
|
-
// Save updated loop state
|
|
285
|
-
await this.saveLoopState();
|
|
286
|
-
// Auto-save to memory system (fire-and-forget — never blocks or fails the iteration)
|
|
287
|
-
this.saveIterationToMemory(result).catch(() => {
|
|
288
|
-
// Memory failures are non-blocking
|
|
289
|
-
});
|
|
290
|
-
this.logger.info(`Recorded iteration ${result.iteration}: ${result.task_id} - ${result.status}`);
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Save iteration data to the memory system for cross-session learning.
|
|
294
|
-
* Runs fire-and-forget — failures are silently ignored.
|
|
295
|
-
*/
|
|
296
|
-
async saveIterationToMemory(result) {
|
|
297
|
-
if (!this.memoryAdapter)
|
|
298
|
-
return;
|
|
299
|
-
const tags = ['ralph', 'autonomous-loop', result.task_id, result.ai_tool];
|
|
300
|
-
// Save learnings
|
|
301
|
-
if (result.learnings && result.learnings.length > 0) {
|
|
302
|
-
await this.memoryAdapter.saveMemory({
|
|
303
|
-
type: 'learning',
|
|
304
|
-
title: `Ralph: ${result.task_id} iteration ${result.iteration}`,
|
|
305
|
-
content: result.learnings.join('\n'),
|
|
306
|
-
tags,
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
// Save quality gate failures as bugs
|
|
310
|
-
const failedGates = Object.entries(result.quality_checks)
|
|
311
|
-
.filter(([, passed]) => !passed)
|
|
312
|
-
.map(([gate]) => gate);
|
|
313
|
-
if (failedGates.length > 0) {
|
|
314
|
-
const errorContent = [
|
|
315
|
-
`Failed gates: ${failedGates.join(', ')}`,
|
|
316
|
-
...(result.errors ?? []),
|
|
317
|
-
].join('\n');
|
|
318
|
-
await this.memoryAdapter.saveMemory({
|
|
319
|
-
type: 'bug',
|
|
320
|
-
title: `Ralph: ${result.task_id} gate failures (iteration ${result.iteration})`,
|
|
321
|
-
content: errorContent,
|
|
322
|
-
tags: [...tags, 'quality-gate-failure'],
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
// Save story completion summary
|
|
326
|
-
if (result.status === 'success') {
|
|
327
|
-
await this.memoryAdapter.saveMemory({
|
|
328
|
-
type: 'observation',
|
|
329
|
-
title: `Ralph: ${result.task_title} completed`,
|
|
330
|
-
content: result.output_summary || `Story ${result.task_id} passed all quality gates.`,
|
|
331
|
-
tags: [...tags, 'story-complete'],
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Append iteration result to progress.txt log
|
|
337
|
-
*/
|
|
338
|
-
async appendProgress(result) {
|
|
339
|
-
const progressPath = path.join(this.ralphDir, 'progress.txt');
|
|
340
|
-
const line = [
|
|
341
|
-
`[Iteration ${result.iteration}] ${new Date(result.timestamp).toISOString()}`,
|
|
342
|
-
`Task: ${result.task_id} (${result.task_title})`,
|
|
343
|
-
`Status: ${result.status}`,
|
|
344
|
-
`Tool: ${result.ai_tool}`,
|
|
345
|
-
`Duration: ${result.execution_time_ms}ms`,
|
|
346
|
-
`Quality: type=${result.quality_checks.type_check ? 'pass' : 'fail'}, ` +
|
|
347
|
-
`lint=${result.quality_checks.lint ? 'pass' : 'fail'}, ` +
|
|
348
|
-
`tests=${result.quality_checks.tests ? 'pass' : 'fail'}, ` +
|
|
349
|
-
`coverage=${result.quality_checks.coverage_met ? 'pass' : 'fail'}`,
|
|
350
|
-
result.git_commit ? `Commit: ${result.git_commit}` : '',
|
|
351
|
-
result.output_summary ? `Summary: ${result.output_summary}` : '',
|
|
352
|
-
result.learnings && result.learnings.length > 0
|
|
353
|
-
? `Learnings: ${result.learnings.join('; ')}`
|
|
354
|
-
: '',
|
|
355
|
-
result.errors && result.errors.length > 0 ? `Errors: ${result.errors.join('; ')}` : '',
|
|
356
|
-
'---',
|
|
357
|
-
]
|
|
358
|
-
.filter(Boolean)
|
|
359
|
-
.join('\n');
|
|
360
|
-
await appendFile(progressPath, line + '\n\n');
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Refresh total_tasks from PRD (call after PRD is saved)
|
|
364
|
-
*/
|
|
365
|
-
async refreshTaskCount() {
|
|
366
|
-
if (!this.loopState) {
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
const prd = await this.loadPRD();
|
|
370
|
-
if (prd && prd.userStories) {
|
|
371
|
-
this.loopState.total_tasks = prd.userStories.length;
|
|
372
|
-
this.loopState.completed_tasks = prd.userStories.filter((s) => s.passes).length;
|
|
373
|
-
await this.saveLoopState();
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Check if loop should continue
|
|
378
|
-
*/
|
|
379
|
-
canContinue() {
|
|
380
|
-
if (!this.loopState) {
|
|
381
|
-
return false;
|
|
382
|
-
}
|
|
383
|
-
if (this.loopState.paused) {
|
|
384
|
-
return false;
|
|
385
|
-
}
|
|
386
|
-
if (this.loopState.current_iteration >= this.loopState.max_iterations) {
|
|
387
|
-
return false;
|
|
388
|
-
}
|
|
389
|
-
return this.loopState.completed_tasks < this.loopState.total_tasks;
|
|
390
|
-
}
|
|
391
|
-
/**
|
|
392
|
-
* Pause the loop
|
|
393
|
-
*/
|
|
394
|
-
async pause() {
|
|
395
|
-
if (!this.loopState) {
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
this.loopState.paused = true;
|
|
399
|
-
this.loopState.paused_at = new Date().toISOString();
|
|
400
|
-
this.loopState.last_updated = new Date().toISOString();
|
|
401
|
-
await this.saveLoopState();
|
|
402
|
-
this.logger.info('Ralph loop paused');
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Resume the loop
|
|
406
|
-
*/
|
|
407
|
-
async resume() {
|
|
408
|
-
if (!this.loopState) {
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
this.loopState.paused = false;
|
|
412
|
-
this.loopState.paused_at = undefined;
|
|
413
|
-
this.loopState.last_updated = new Date().toISOString();
|
|
414
|
-
await this.saveLoopState();
|
|
415
|
-
this.logger.info('Ralph loop resumed');
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Get current loop status
|
|
419
|
-
*/
|
|
420
|
-
async getStatus() {
|
|
421
|
-
if (!this.loopState) {
|
|
422
|
-
this.loopState = await this.loadLoopState();
|
|
423
|
-
}
|
|
424
|
-
return this.loopState;
|
|
425
|
-
}
|
|
426
|
-
/**
|
|
427
|
-
* Get iteration history
|
|
428
|
-
*/
|
|
429
|
-
async getIterationHistory(limit) {
|
|
430
|
-
if (!existsSync(this.historyDir)) {
|
|
431
|
-
return [];
|
|
432
|
-
}
|
|
433
|
-
const files = await readdir(this.historyDir);
|
|
434
|
-
const iterations = [];
|
|
435
|
-
for (const file of files.sort().reverse()) {
|
|
436
|
-
if (!file.startsWith('iteration-') || !file.endsWith('.json')) {
|
|
437
|
-
continue;
|
|
438
|
-
}
|
|
439
|
-
try {
|
|
440
|
-
const content = await this.readFileAsync(path.join(this.historyDir, file));
|
|
441
|
-
iterations.push(JSON.parse(content));
|
|
442
|
-
if (limit && iterations.length >= limit) {
|
|
443
|
-
break;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
catch (err) {
|
|
447
|
-
this.logger.warn(`Failed to read iteration file ${file}: ${err}`);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
return iterations;
|
|
451
|
-
}
|
|
452
|
-
/**
|
|
453
|
-
* Save loop state to .rulebook/ralph/state.json
|
|
454
|
-
*/
|
|
455
|
-
async saveLoopState() {
|
|
456
|
-
if (!this.loopState) {
|
|
457
|
-
return;
|
|
458
|
-
}
|
|
459
|
-
const statePath = path.join(this.ralphDir, 'state.json');
|
|
460
|
-
await writeFile(statePath, JSON.stringify(this.loopState, null, 2));
|
|
461
|
-
}
|
|
462
|
-
/**
|
|
463
|
-
* Load loop state from .rulebook/ralph/state.json
|
|
464
|
-
*/
|
|
465
|
-
async loadLoopState() {
|
|
466
|
-
const statePath = path.join(this.ralphDir, 'state.json');
|
|
467
|
-
if (!existsSync(statePath)) {
|
|
468
|
-
return null;
|
|
469
|
-
}
|
|
470
|
-
try {
|
|
471
|
-
const content = await this.readFileAsync(statePath);
|
|
472
|
-
return JSON.parse(content);
|
|
473
|
-
}
|
|
474
|
-
catch (err) {
|
|
475
|
-
this.logger.error(`Failed to load loop state: ${err}`);
|
|
476
|
-
return null;
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
/**
|
|
480
|
-
* Get total completed and pending tasks
|
|
481
|
-
*/
|
|
482
|
-
async getTaskStats() {
|
|
483
|
-
const prd = await this.loadPRD();
|
|
484
|
-
if (!prd || !prd.userStories) {
|
|
485
|
-
return { completed: 0, pending: 0, total: 0 };
|
|
486
|
-
}
|
|
487
|
-
const completed = prd.userStories.filter((story) => story.passes).length;
|
|
488
|
-
const pending = prd.userStories.filter((story) => !story.passes).length;
|
|
489
|
-
return {
|
|
490
|
-
completed,
|
|
491
|
-
pending,
|
|
492
|
-
total: prd.userStories.length,
|
|
493
|
-
};
|
|
494
|
-
}
|
|
495
|
-
/**
|
|
496
|
-
* Build parallel execution batches for pending stories.
|
|
497
|
-
*
|
|
498
|
-
* Uses dependency analysis and file-conflict detection to produce
|
|
499
|
-
* batches where each batch can be executed concurrently.
|
|
500
|
-
*
|
|
501
|
-
* @param maxWorkers - Maximum number of concurrent stories per batch
|
|
502
|
-
* @returns Array of batches (each batch is an array of stories)
|
|
503
|
-
*/
|
|
504
|
-
async getParallelBatches(maxWorkers) {
|
|
505
|
-
const prd = await this.loadPRD();
|
|
506
|
-
if (!prd || !prd.userStories) {
|
|
507
|
-
return [];
|
|
508
|
-
}
|
|
509
|
-
const pendingStories = prd.userStories.filter((s) => !s.passes);
|
|
510
|
-
if (pendingStories.length === 0) {
|
|
511
|
-
return [];
|
|
512
|
-
}
|
|
513
|
-
const { buildParallelBatches } = await import('./ralph-parallel.js');
|
|
514
|
-
return buildParallelBatches(pendingStories, maxWorkers);
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Run a plan checkpoint for the given story.
|
|
518
|
-
*
|
|
519
|
-
* Generates an implementation plan via the AI CLI tool and requests
|
|
520
|
-
* interactive approval from the user. Returns whether to proceed with
|
|
521
|
-
* implementation and any feedback from the reviewer.
|
|
522
|
-
*
|
|
523
|
-
* @param story - The user story to plan for
|
|
524
|
-
* @param tool - AI CLI tool to use for plan generation
|
|
525
|
-
* @param checkpointConfig - Plan checkpoint configuration
|
|
526
|
-
* @returns Object with `proceed` (boolean) and optional `feedback` string
|
|
527
|
-
*/
|
|
528
|
-
async runCheckpoint(story, tool, checkpointConfig) {
|
|
529
|
-
const { shouldRunCheckpoint, generateIterationPlan, requestPlanApproval } = await import('./ralph-plan-checkpoint.js');
|
|
530
|
-
if (!shouldRunCheckpoint(checkpointConfig, story, false)) {
|
|
531
|
-
return { proceed: true };
|
|
532
|
-
}
|
|
533
|
-
this.logger.info(`Running plan checkpoint for story ${story.id}: ${story.title}`);
|
|
534
|
-
const plan = await generateIterationPlan(story, tool, this.projectRoot);
|
|
535
|
-
if (!plan) {
|
|
536
|
-
this.logger.warn('Plan generation returned empty output — skipping checkpoint');
|
|
537
|
-
return { proceed: true };
|
|
538
|
-
}
|
|
539
|
-
const approval = await requestPlanApproval(plan, story, checkpointConfig.autoApproveAfterSeconds);
|
|
540
|
-
if (approval.approved) {
|
|
541
|
-
this.logger.info(`Plan approved for story ${story.id}`);
|
|
542
|
-
return { proceed: true };
|
|
543
|
-
}
|
|
544
|
-
this.logger.info(`Plan rejected for story ${story.id}: ${approval.feedback ?? '(no reason)'}`);
|
|
545
|
-
return { proceed: false, feedback: approval.feedback };
|
|
546
|
-
}
|
|
547
|
-
/**
|
|
548
|
-
* Helper to read file
|
|
549
|
-
*/
|
|
550
|
-
async readFileAsync(filepath) {
|
|
551
|
-
const fs_module = await import('fs/promises');
|
|
552
|
-
return fs_module.readFile(filepath, 'utf-8');
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
//# sourceMappingURL=ralph-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ralph-manager.js","sourceRoot":"","sources":["../../src/core/ralph-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure functions for Ralph parallel story execution.
|
|
3
|
-
*
|
|
4
|
-
* Provides dependency analysis, batch partitioning, file-conflict detection,
|
|
5
|
-
* and orchestration logic for running multiple user stories concurrently.
|
|
6
|
-
*
|
|
7
|
-
* All functions are side-effect-free and fully testable without mocks.
|
|
8
|
-
*/
|
|
9
|
-
import type { PRDUserStory } from '../types.js';
|
|
10
|
-
/**
|
|
11
|
-
* Analyze inter-story dependencies by scanning each story's text for references
|
|
12
|
-
* to other stories' IDs.
|
|
13
|
-
*
|
|
14
|
-
* @param stories - The list of user stories to analyze
|
|
15
|
-
* @returns A map from story ID to the list of story IDs it depends on
|
|
16
|
-
*/
|
|
17
|
-
export declare function analyzeDependencies(stories: PRDUserStory[]): Map<string, string[]>;
|
|
18
|
-
/**
|
|
19
|
-
* Partition stories into batches that can run concurrently, respecting
|
|
20
|
-
* dependency ordering and a maximum worker count per batch.
|
|
21
|
-
*
|
|
22
|
-
* Algorithm:
|
|
23
|
-
* 1. Stories with no unresolved dependencies go into the current batch (up to maxWorkers).
|
|
24
|
-
* 2. Once a batch is full or no more ready stories remain, finalize the batch.
|
|
25
|
-
* 3. Stories whose dependencies are all in previous batches become eligible.
|
|
26
|
-
* 4. Circular or unresolvable dependencies are placed in the final batch.
|
|
27
|
-
*
|
|
28
|
-
* @param stories - The stories to partition
|
|
29
|
-
* @param maxWorkers - Maximum number of stories per batch
|
|
30
|
-
* @param deps - Dependency map from analyzeDependencies()
|
|
31
|
-
* @returns Array of batches, each batch is an array of stories to run concurrently
|
|
32
|
-
*/
|
|
33
|
-
export declare function partitionForParallel(stories: PRDUserStory[], maxWorkers: number, deps: Map<string, string[]>): PRDUserStory[][];
|
|
34
|
-
/**
|
|
35
|
-
* Detect whether two stories likely touch the same files, using a simple
|
|
36
|
-
* heuristic: extract file-path-like patterns from each story's text and
|
|
37
|
-
* check for meaningful overlap (more than 1 file in common).
|
|
38
|
-
*
|
|
39
|
-
* @param story1 - First user story
|
|
40
|
-
* @param story2 - Second user story
|
|
41
|
-
* @returns true if there is meaningful file overlap between the two stories
|
|
42
|
-
*/
|
|
43
|
-
export declare function detectFileConflicts(story1: PRDUserStory, story2: PRDUserStory): boolean;
|
|
44
|
-
/**
|
|
45
|
-
* Build the final parallel execution batches by:
|
|
46
|
-
* 1. Analyzing inter-story dependencies
|
|
47
|
-
* 2. Partitioning into dependency-ordered batches
|
|
48
|
-
* 3. Splitting batches that contain file-conflicting stories
|
|
49
|
-
*
|
|
50
|
-
* @param stories - All pending user stories to execute
|
|
51
|
-
* @param maxWorkers - Maximum concurrent workers
|
|
52
|
-
* @returns Array of batches, each batch safe to run concurrently
|
|
53
|
-
*/
|
|
54
|
-
export declare function buildParallelBatches(stories: PRDUserStory[], maxWorkers: number): PRDUserStory[][];
|
|
55
|
-
//# sourceMappingURL=ralph-parallel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ralph-parallel.d.ts","sourceRoot":"","sources":["../../src/core/ralph-parallel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmDhD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAelF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC1B,YAAY,EAAE,EAAE,CAgDlB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAYvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,MAAM,GACjB,YAAY,EAAE,EAAE,CAsDlB"}
|