grimoire-framework 1.0.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/CLAUDE.md +318 -0
- package/.claude/hooks/README.md +170 -0
- package/.claude/hooks/enforce-architecture-first.py +198 -0
- package/.claude/hooks/install-hooks.sh +43 -0
- package/.claude/hooks/mind-clone-governance.py +192 -0
- package/.claude/hooks/pre-commit-version-check.sh +157 -0
- package/.claude/hooks/precompact-session-digest.js +47 -0
- package/.claude/hooks/read-protection.py +153 -0
- package/.claude/hooks/slug-validation.py +176 -0
- package/.claude/hooks/sql-governance.py +182 -0
- package/.claude/hooks/synapse-engine.js +77 -0
- package/.claude/hooks/write-path-validation.py +196 -0
- package/.claude/rules/mcp-usage.md +177 -0
- package/.grimoire/cli/commands/config/index.js +609 -0
- package/.grimoire/cli/commands/generate/index.js +222 -0
- package/.grimoire/cli/commands/manifest/index.js +47 -0
- package/.grimoire/cli/commands/manifest/regenerate.js +97 -0
- package/.grimoire/cli/commands/manifest/validate.js +66 -0
- package/.grimoire/cli/commands/mcp/add.js +235 -0
- package/.grimoire/cli/commands/mcp/index.js +77 -0
- package/.grimoire/cli/commands/mcp/link.js +218 -0
- package/.grimoire/cli/commands/mcp/setup.js +165 -0
- package/.grimoire/cli/commands/mcp/status.js +184 -0
- package/.grimoire/cli/commands/metrics/cleanup.js +91 -0
- package/.grimoire/cli/commands/metrics/index.js +66 -0
- package/.grimoire/cli/commands/metrics/record.js +154 -0
- package/.grimoire/cli/commands/metrics/seed.js +127 -0
- package/.grimoire/cli/commands/metrics/show.js +209 -0
- package/.grimoire/cli/commands/migrate/analyze.js +355 -0
- package/.grimoire/cli/commands/migrate/backup.js +354 -0
- package/.grimoire/cli/commands/migrate/execute.js +294 -0
- package/.grimoire/cli/commands/migrate/index.js +443 -0
- package/.grimoire/cli/commands/migrate/rollback.js +325 -0
- package/.grimoire/cli/commands/migrate/update-imports.js +398 -0
- package/.grimoire/cli/commands/migrate/validate.js +454 -0
- package/.grimoire/cli/commands/pro/index.js +705 -0
- package/.grimoire/cli/commands/qa/index.js +57 -0
- package/.grimoire/cli/commands/qa/run.js +163 -0
- package/.grimoire/cli/commands/qa/status.js +195 -0
- package/.grimoire/cli/commands/validate/index.js +431 -0
- package/.grimoire/cli/commands/workers/formatters/info-formatter.js +275 -0
- package/.grimoire/cli/commands/workers/formatters/list-table.js +265 -0
- package/.grimoire/cli/commands/workers/formatters/list-tree.js +160 -0
- package/.grimoire/cli/commands/workers/index.js +57 -0
- package/.grimoire/cli/commands/workers/info.js +195 -0
- package/.grimoire/cli/commands/workers/list.js +215 -0
- package/.grimoire/cli/commands/workers/search-filters.js +185 -0
- package/.grimoire/cli/commands/workers/search-keyword.js +310 -0
- package/.grimoire/cli/commands/workers/search-semantic.js +294 -0
- package/.grimoire/cli/commands/workers/search.js +155 -0
- package/.grimoire/cli/commands/workers/utils/pagination.js +102 -0
- package/.grimoire/cli/index.js +150 -0
- package/.grimoire/cli/utils/output-formatter-cli.js +233 -0
- package/.grimoire/cli/utils/score-calculator.js +221 -0
- package/.grimoire/constitution.md +172 -0
- package/.grimoire/core/README.md +231 -0
- package/.grimoire/core/code-intel/code-intel-client.js +280 -0
- package/.grimoire/core/code-intel/code-intel-enricher.js +160 -0
- package/.grimoire/core/code-intel/index.js +137 -0
- package/.grimoire/core/code-intel/providers/code-graph-provider.js +201 -0
- package/.grimoire/core/code-intel/providers/provider-interface.js +108 -0
- package/.grimoire/core/config/config-cache.js +233 -0
- package/.grimoire/core/config/config-loader.js +281 -0
- package/.grimoire/core/config/config-resolver.js +609 -0
- package/.grimoire/core/config/env-interpolator.js +122 -0
- package/.grimoire/core/config/merge-utils.js +101 -0
- package/.grimoire/core/config/migrate-config.js +293 -0
- package/.grimoire/core/config/schemas/framework-config.schema.json +19 -0
- package/.grimoire/core/config/schemas/local-config.schema.json +20 -0
- package/.grimoire/core/config/schemas/project-config.schema.json +32 -0
- package/.grimoire/core/config/schemas/user-config.schema.json +33 -0
- package/.grimoire/core/config/templates/user-config.yaml +24 -0
- package/.grimoire/core/docs/SHARD-TRANSLATION-GUIDE.md +337 -0
- package/.grimoire/core/docs/component-creation-guide.md +459 -0
- package/.grimoire/core/docs/session-update-pattern.md +316 -0
- package/.grimoire/core/docs/template-syntax.md +267 -0
- package/.grimoire/core/docs/troubleshooting-guide.md +626 -0
- package/.grimoire/core/elicitation/agent-elicitation.js +272 -0
- package/.grimoire/core/elicitation/elicitation-engine.js +486 -0
- package/.grimoire/core/elicitation/session-manager.js +322 -0
- package/.grimoire/core/elicitation/task-elicitation.js +281 -0
- package/.grimoire/core/elicitation/workflow-elicitation.js +349 -0
- package/.grimoire/core/events/dashboard-emitter.js +369 -0
- package/.grimoire/core/events/index.js +17 -0
- package/.grimoire/core/events/types.js +52 -0
- package/.grimoire/core/execution/autonomous-build-loop.js +1068 -0
- package/.grimoire/core/execution/build-orchestrator.js +1055 -0
- package/.grimoire/core/execution/build-state-manager.js +1530 -0
- package/.grimoire/core/execution/context-injector.js +537 -0
- package/.grimoire/core/execution/parallel-executor.js +292 -0
- package/.grimoire/core/execution/parallel-monitor.js +429 -0
- package/.grimoire/core/execution/rate-limit-manager.js +314 -0
- package/.grimoire/core/execution/result-aggregator.js +486 -0
- package/.grimoire/core/execution/semantic-merge-engine.js +1736 -0
- package/.grimoire/core/execution/subagent-dispatcher.js +848 -0
- package/.grimoire/core/execution/wave-executor.js +397 -0
- package/.grimoire/core/health-check/base-check.js +224 -0
- package/.grimoire/core/health-check/check-registry.js +253 -0
- package/.grimoire/core/health-check/checks/deployment/build-config.js +111 -0
- package/.grimoire/core/health-check/checks/deployment/ci-config.js +125 -0
- package/.grimoire/core/health-check/checks/deployment/deployment-readiness.js +152 -0
- package/.grimoire/core/health-check/checks/deployment/docker-config.js +122 -0
- package/.grimoire/core/health-check/checks/deployment/env-file.js +111 -0
- package/.grimoire/core/health-check/checks/deployment/index.js +29 -0
- package/.grimoire/core/health-check/checks/index.js +56 -0
- package/.grimoire/core/health-check/checks/local/disk-space.js +214 -0
- package/.grimoire/core/health-check/checks/local/environment-vars.js +136 -0
- package/.grimoire/core/health-check/checks/local/git-install.js +158 -0
- package/.grimoire/core/health-check/checks/local/ide-detection.js +148 -0
- package/.grimoire/core/health-check/checks/local/index.js +35 -0
- package/.grimoire/core/health-check/checks/local/memory.js +138 -0
- package/.grimoire/core/health-check/checks/local/network.js +170 -0
- package/.grimoire/core/health-check/checks/local/npm-install.js +149 -0
- package/.grimoire/core/health-check/checks/local/shell-environment.js +120 -0
- package/.grimoire/core/health-check/checks/project/agent-config.js +167 -0
- package/.grimoire/core/health-check/checks/project/dependencies.js +150 -0
- package/.grimoire/core/health-check/checks/project/framework-config.js +133 -0
- package/.grimoire/core/health-check/checks/project/grimoire-directory.js +143 -0
- package/.grimoire/core/health-check/checks/project/index.js +35 -0
- package/.grimoire/core/health-check/checks/project/node-version.js +163 -0
- package/.grimoire/core/health-check/checks/project/package-json.js +107 -0
- package/.grimoire/core/health-check/checks/project/task-definitions.js +192 -0
- package/.grimoire/core/health-check/checks/project/workflow-dependencies.js +214 -0
- package/.grimoire/core/health-check/checks/repository/branch-protection.js +107 -0
- package/.grimoire/core/health-check/checks/repository/commit-history.js +144 -0
- package/.grimoire/core/health-check/checks/repository/conflicts.js +152 -0
- package/.grimoire/core/health-check/checks/repository/git-repo.js +159 -0
- package/.grimoire/core/health-check/checks/repository/git-status.js +149 -0
- package/.grimoire/core/health-check/checks/repository/gitignore.js +194 -0
- package/.grimoire/core/health-check/checks/repository/index.js +35 -0
- package/.grimoire/core/health-check/checks/repository/large-files.js +183 -0
- package/.grimoire/core/health-check/checks/repository/lockfile-integrity.js +144 -0
- package/.grimoire/core/health-check/checks/services/api-endpoints.js +168 -0
- package/.grimoire/core/health-check/checks/services/claude-code.js +139 -0
- package/.grimoire/core/health-check/checks/services/gemini-cli.js +241 -0
- package/.grimoire/core/health-check/checks/services/github-cli.js +117 -0
- package/.grimoire/core/health-check/checks/services/index.js +29 -0
- package/.grimoire/core/health-check/checks/services/mcp-integration.js +125 -0
- package/.grimoire/core/health-check/engine.js +407 -0
- package/.grimoire/core/health-check/healers/backup-manager.js +340 -0
- package/.grimoire/core/health-check/healers/index.js +330 -0
- package/.grimoire/core/health-check/index.js +370 -0
- package/.grimoire/core/health-check/reporters/console.js +331 -0
- package/.grimoire/core/health-check/reporters/index.js +117 -0
- package/.grimoire/core/health-check/reporters/json.js +301 -0
- package/.grimoire/core/health-check/reporters/markdown.js +323 -0
- package/.grimoire/core/ideation/ideation-engine.js +834 -0
- package/.grimoire/core/ids/README.md +123 -0
- package/.grimoire/core/ids/circuit-breaker.js +156 -0
- package/.grimoire/core/ids/framework-governor.js +567 -0
- package/.grimoire/core/ids/gates/g1-epic-creation.js +101 -0
- package/.grimoire/core/ids/gates/g2-story-creation.js +133 -0
- package/.grimoire/core/ids/gates/g3-story-validation.js +166 -0
- package/.grimoire/core/ids/gates/g4-dev-context.js +155 -0
- package/.grimoire/core/ids/incremental-decision-engine.js +651 -0
- package/.grimoire/core/ids/index.js +157 -0
- package/.grimoire/core/ids/registry-healer.js +868 -0
- package/.grimoire/core/ids/registry-loader.js +281 -0
- package/.grimoire/core/ids/registry-updater.js +703 -0
- package/.grimoire/core/ids/verification-gate.js +306 -0
- package/.grimoire/core/index.esm.js +44 -0
- package/.grimoire/core/index.js +90 -0
- package/.grimoire/core/manifest/manifest-generator.js +388 -0
- package/.grimoire/core/manifest/manifest-validator.js +431 -0
- package/.grimoire/core/mcp/config-migrator.js +341 -0
- package/.grimoire/core/mcp/global-config-manager.js +370 -0
- package/.grimoire/core/mcp/index.js +34 -0
- package/.grimoire/core/mcp/os-detector.js +189 -0
- package/.grimoire/core/mcp/symlink-manager.js +415 -0
- package/.grimoire/core/memory/__tests__/active-modules.verify.js +254 -0
- package/.grimoire/core/memory/gotchas-memory.js +1154 -0
- package/.grimoire/core/migration/migration-config.yaml +85 -0
- package/.grimoire/core/migration/module-mapping.yaml +91 -0
- package/.grimoire/core/orchestration/agent-invoker.js +612 -0
- package/.grimoire/core/orchestration/bob-orchestrator.js +1032 -0
- package/.grimoire/core/orchestration/bob-status-writer.js +482 -0
- package/.grimoire/core/orchestration/bob-surface-criteria.yaml +272 -0
- package/.grimoire/core/orchestration/brownfield-handler.js +741 -0
- package/.grimoire/core/orchestration/checklist-runner.js +328 -0
- package/.grimoire/core/orchestration/cli-commands.js +581 -0
- package/.grimoire/core/orchestration/condition-evaluator.js +379 -0
- package/.grimoire/core/orchestration/context-manager.js +616 -0
- package/.grimoire/core/orchestration/dashboard-integration.js +520 -0
- package/.grimoire/core/orchestration/data-lifecycle-manager.js +357 -0
- package/.grimoire/core/orchestration/epic-context-accumulator.js +396 -0
- package/.grimoire/core/orchestration/execution-profile-resolver.js +107 -0
- package/.grimoire/core/orchestration/executor-assignment.js +413 -0
- package/.grimoire/core/orchestration/executors/epic-3-executor.js +223 -0
- package/.grimoire/core/orchestration/executors/epic-4-executor.js +269 -0
- package/.grimoire/core/orchestration/executors/epic-5-executor.js +329 -0
- package/.grimoire/core/orchestration/executors/epic-6-executor.js +265 -0
- package/.grimoire/core/orchestration/executors/epic-executor.js +237 -0
- package/.grimoire/core/orchestration/executors/index.js +86 -0
- package/.grimoire/core/orchestration/gate-evaluator.js +495 -0
- package/.grimoire/core/orchestration/gemini-model-selector.js +161 -0
- package/.grimoire/core/orchestration/greenfield-handler.js +890 -0
- package/.grimoire/core/orchestration/index.js +323 -0
- package/.grimoire/core/orchestration/lock-manager.js +327 -0
- package/.grimoire/core/orchestration/master-orchestrator.js +1544 -0
- package/.grimoire/core/orchestration/message-formatter.js +279 -0
- package/.grimoire/core/orchestration/parallel-executor.js +225 -0
- package/.grimoire/core/orchestration/recovery-handler.js +721 -0
- package/.grimoire/core/orchestration/session-state.js +876 -0
- package/.grimoire/core/orchestration/skill-dispatcher.js +364 -0
- package/.grimoire/core/orchestration/subagent-prompt-builder.js +370 -0
- package/.grimoire/core/orchestration/surface-checker.js +403 -0
- package/.grimoire/core/orchestration/task-complexity-classifier.js +123 -0
- package/.grimoire/core/orchestration/tech-stack-detector.js +599 -0
- package/.grimoire/core/orchestration/terminal-spawner.js +1044 -0
- package/.grimoire/core/orchestration/workflow-executor.js +1182 -0
- package/.grimoire/core/orchestration/workflow-orchestrator.js +907 -0
- package/.grimoire/core/permissions/__tests__/permission-mode.test.js +293 -0
- package/.grimoire/core/permissions/index.js +140 -0
- package/.grimoire/core/permissions/operation-guard.js +395 -0
- package/.grimoire/core/permissions/permission-mode.js +271 -0
- package/.grimoire/core/quality-gates/base-layer.js +134 -0
- package/.grimoire/core/quality-gates/checklist-generator.js +329 -0
- package/.grimoire/core/quality-gates/focus-area-recommender.js +361 -0
- package/.grimoire/core/quality-gates/human-review-orchestrator.js +530 -0
- package/.grimoire/core/quality-gates/layer1-precommit.js +336 -0
- package/.grimoire/core/quality-gates/layer2-pr-automation.js +331 -0
- package/.grimoire/core/quality-gates/layer3-human-review.js +350 -0
- package/.grimoire/core/quality-gates/notification-manager.js +551 -0
- package/.grimoire/core/quality-gates/quality-gate-config.yaml +87 -0
- package/.grimoire/core/quality-gates/quality-gate-manager.js +603 -0
- package/.grimoire/core/registry/README.md +181 -0
- package/.grimoire/core/registry/build-registry.js +454 -0
- package/.grimoire/core/registry/registry-loader.js +331 -0
- package/.grimoire/core/registry/registry-schema.json +168 -0
- package/.grimoire/core/registry/service-registry.json +6468 -0
- package/.grimoire/core/registry/validate-registry.js +341 -0
- package/.grimoire/core/session/context-detector.js +233 -0
- package/.grimoire/core/session/context-loader.js +443 -0
- package/.grimoire/core/synapse/context/context-builder.js +34 -0
- package/.grimoire/core/synapse/context/context-tracker.js +190 -0
- package/.grimoire/core/synapse/diagnostics/collectors/consistency-collector.js +168 -0
- package/.grimoire/core/synapse/diagnostics/collectors/hook-collector.js +129 -0
- package/.grimoire/core/synapse/diagnostics/collectors/manifest-collector.js +82 -0
- package/.grimoire/core/synapse/diagnostics/collectors/output-analyzer.js +134 -0
- package/.grimoire/core/synapse/diagnostics/collectors/pipeline-collector.js +75 -0
- package/.grimoire/core/synapse/diagnostics/collectors/quality-collector.js +252 -0
- package/.grimoire/core/synapse/diagnostics/collectors/relevance-matrix.js +174 -0
- package/.grimoire/core/synapse/diagnostics/collectors/safe-read-json.js +31 -0
- package/.grimoire/core/synapse/diagnostics/collectors/session-collector.js +102 -0
- package/.grimoire/core/synapse/diagnostics/collectors/timing-collector.js +126 -0
- package/.grimoire/core/synapse/diagnostics/collectors/uap-collector.js +83 -0
- package/.grimoire/core/synapse/diagnostics/report-formatter.js +485 -0
- package/.grimoire/core/synapse/diagnostics/synapse-diagnostics.js +95 -0
- package/.grimoire/core/synapse/domain/domain-loader.js +322 -0
- package/.grimoire/core/synapse/engine.js +380 -0
- package/.grimoire/core/synapse/layers/l0-constitution.js +80 -0
- package/.grimoire/core/synapse/layers/l1-global.js +102 -0
- package/.grimoire/core/synapse/layers/l2-agent.js +94 -0
- package/.grimoire/core/synapse/layers/l3-workflow.js +94 -0
- package/.grimoire/core/synapse/layers/l4-task.js +83 -0
- package/.grimoire/core/synapse/layers/l5-squad.js +244 -0
- package/.grimoire/core/synapse/layers/l6-keyword.js +154 -0
- package/.grimoire/core/synapse/layers/l7-star-command.js +169 -0
- package/.grimoire/core/synapse/layers/layer-processor.js +82 -0
- package/.grimoire/core/synapse/memory/memory-bridge.js +246 -0
- package/.grimoire/core/synapse/output/formatter.js +561 -0
- package/.grimoire/core/synapse/runtime/hook-runtime.js +61 -0
- package/.grimoire/core/synapse/scripts/generate-constitution.js +205 -0
- package/.grimoire/core/synapse/session/session-manager.js +403 -0
- package/.grimoire/core/synapse/utils/paths.js +57 -0
- package/.grimoire/core/synapse/utils/tokens.js +25 -0
- package/.grimoire/core/ui/index.js +43 -0
- package/.grimoire/core/ui/observability-panel.js +394 -0
- package/.grimoire/core/ui/panel-renderer.js +337 -0
- package/.grimoire/core/utils/output-formatter.js +299 -0
- package/.grimoire/core/utils/security-utils.js +336 -0
- package/.grimoire/core/utils/yaml-validator.js +416 -0
- package/.grimoire/core-config.yaml +357 -0
- package/.grimoire/data/agent-config-requirements.yaml +409 -0
- package/.grimoire/data/entity-registry.yaml +9219 -0
- package/.grimoire/data/grimoire-kb.md +918 -0
- package/.grimoire/data/learned-patterns.yaml +3 -0
- package/.grimoire/data/tech-presets/_template.md +259 -0
- package/.grimoire/data/tech-presets/nextjs-react.md +933 -0
- package/.grimoire/data/technical-preferences.md +85 -0
- package/.grimoire/data/workflow-patterns.yaml +836 -0
- package/.grimoire/data/workflow-state-schema.yaml +203 -0
- package/.grimoire/development/README.md +143 -0
- package/.grimoire/development/agent-teams/team-all.yaml +16 -0
- package/.grimoire/development/agent-teams/team-fullstack.yaml +19 -0
- package/.grimoire/development/agent-teams/team-ide-minimal.yaml +10 -0
- package/.grimoire/development/agent-teams/team-no-ui.yaml +14 -0
- package/.grimoire/development/agent-teams/team-qa-focused.yaml +155 -0
- package/.grimoire/development/agents/analyst.md +261 -0
- package/.grimoire/development/agents/architect.md +461 -0
- package/.grimoire/development/agents/caravaggio.md +31 -0
- package/.grimoire/development/agents/data-engineer.md +482 -0
- package/.grimoire/development/agents/dev.md +548 -0
- package/.grimoire/development/agents/devops.md +500 -0
- package/.grimoire/development/agents/frida.md +31 -0
- package/.grimoire/development/agents/grimoire-master.md +447 -0
- package/.grimoire/development/agents/picasso.md +31 -0
- package/.grimoire/development/agents/pm.md +365 -0
- package/.grimoire/development/agents/po.md +323 -0
- package/.grimoire/development/agents/qa.md +437 -0
- package/.grimoire/development/agents/salvador.md +31 -0
- package/.grimoire/development/agents/sm.md +275 -0
- package/.grimoire/development/agents/squad-creator.md +330 -0
- package/.grimoire/development/agents/tarsila.md +31 -0
- package/.grimoire/development/agents/ux-design-expert.md +482 -0
- package/.grimoire/development/agents/van-gogh.md +31 -0
- package/.grimoire/development/agents/warhol.md +31 -0
- package/.grimoire/development/checklists/agent-quality-gate.md +560 -0
- package/.grimoire/development/checklists/brownfield-compatibility-checklist.md +116 -0
- package/.grimoire/development/checklists/self-critique-checklist.md +274 -0
- package/.grimoire/development/data/decision-heuristics-framework.md +622 -0
- package/.grimoire/development/data/quality-dimensions-framework.md +427 -0
- package/.grimoire/development/data/tier-system-framework.md +476 -0
- package/.grimoire/development/scripts/activation-runtime.js +64 -0
- package/.grimoire/development/scripts/agent-assignment-resolver.js +231 -0
- package/.grimoire/development/scripts/agent-config-loader.js +628 -0
- package/.grimoire/development/scripts/agent-exit-hooks.js +97 -0
- package/.grimoire/development/scripts/apply-inline-greeting-all-agents.js +147 -0
- package/.grimoire/development/scripts/approval-workflow.js +643 -0
- package/.grimoire/development/scripts/audit-agent-config.js +382 -0
- package/.grimoire/development/scripts/backlog-manager.js +409 -0
- package/.grimoire/development/scripts/backup-manager.js +607 -0
- package/.grimoire/development/scripts/batch-update-agents-session-context.js +97 -0
- package/.grimoire/development/scripts/branch-manager.js +390 -0
- package/.grimoire/development/scripts/code-quality-improver.js +1312 -0
- package/.grimoire/development/scripts/commit-message-generator.js +850 -0
- package/.grimoire/development/scripts/conflict-resolver.js +675 -0
- package/.grimoire/development/scripts/decision-context.js +229 -0
- package/.grimoire/development/scripts/decision-log-generator.js +294 -0
- package/.grimoire/development/scripts/decision-log-indexer.js +285 -0
- package/.grimoire/development/scripts/decision-recorder.js +169 -0
- package/.grimoire/development/scripts/dependency-analyzer.js +639 -0
- package/.grimoire/development/scripts/dev-context-loader.js +298 -0
- package/.grimoire/development/scripts/diff-generator.js +352 -0
- package/.grimoire/development/scripts/elicitation-engine.js +385 -0
- package/.grimoire/development/scripts/elicitation-session-manager.js +300 -0
- package/.grimoire/development/scripts/generate-greeting.js +109 -0
- package/.grimoire/development/scripts/git-wrapper.js +462 -0
- package/.grimoire/development/scripts/greeting-builder.js +1406 -0
- package/.grimoire/development/scripts/greeting-config-cli.js +86 -0
- package/.grimoire/development/scripts/greeting-preference-manager.js +170 -0
- package/.grimoire/development/scripts/manifest-preview.js +245 -0
- package/.grimoire/development/scripts/metrics-tracker.js +776 -0
- package/.grimoire/development/scripts/migrate-task-to-v2.js +379 -0
- package/.grimoire/development/scripts/modification-validator.js +555 -0
- package/.grimoire/development/scripts/pattern-learner.js +1225 -0
- package/.grimoire/development/scripts/performance-analyzer.js +758 -0
- package/.grimoire/development/scripts/populate-entity-registry.js +281 -0
- package/.grimoire/development/scripts/refactoring-suggester.js +1139 -0
- package/.grimoire/development/scripts/rollback-handler.js +532 -0
- package/.grimoire/development/scripts/security-checker.js +359 -0
- package/.grimoire/development/scripts/skill-validator.js +343 -0
- package/.grimoire/development/scripts/squad/README.md +114 -0
- package/.grimoire/development/scripts/squad/index.js +124 -0
- package/.grimoire/development/scripts/squad/squad-analyzer.js +638 -0
- package/.grimoire/development/scripts/squad/squad-designer.js +1010 -0
- package/.grimoire/development/scripts/squad/squad-downloader.js +511 -0
- package/.grimoire/development/scripts/squad/squad-extender.js +872 -0
- package/.grimoire/development/scripts/squad/squad-generator.js +1406 -0
- package/.grimoire/development/scripts/squad/squad-loader.js +359 -0
- package/.grimoire/development/scripts/squad/squad-migrator.js +628 -0
- package/.grimoire/development/scripts/squad/squad-publisher.js +630 -0
- package/.grimoire/development/scripts/squad/squad-validator.js +857 -0
- package/.grimoire/development/scripts/story-index-generator.js +339 -0
- package/.grimoire/development/scripts/story-manager.js +375 -0
- package/.grimoire/development/scripts/story-update-hook.js +259 -0
- package/.grimoire/development/scripts/task-identifier-resolver.js +145 -0
- package/.grimoire/development/scripts/template-engine.js +240 -0
- package/.grimoire/development/scripts/template-validator.js +279 -0
- package/.grimoire/development/scripts/test-generator.js +844 -0
- package/.grimoire/development/scripts/test-greeting-system.js +143 -0
- package/.grimoire/development/scripts/transaction-manager.js +591 -0
- package/.grimoire/development/scripts/unified-activation-pipeline.js +796 -0
- package/.grimoire/development/scripts/usage-tracker.js +675 -0
- package/.grimoire/development/scripts/validate-filenames.js +228 -0
- package/.grimoire/development/scripts/validate-task-v2.js +320 -0
- package/.grimoire/development/scripts/verify-workflow-gaps.js +1034 -0
- package/.grimoire/development/scripts/version-tracker.js +527 -0
- package/.grimoire/development/scripts/workflow-navigator.js +328 -0
- package/.grimoire/development/scripts/workflow-state-manager.js +652 -0
- package/.grimoire/development/scripts/workflow-validator.js +697 -0
- package/.grimoire/development/scripts/yaml-validator.js +397 -0
- package/.grimoire/development/tasks/add-mcp.md +437 -0
- package/.grimoire/development/tasks/advanced-elicitation.md +320 -0
- package/.grimoire/development/tasks/analyst-facilitate-brainstorming.md +343 -0
- package/.grimoire/development/tasks/analyze-brownfield.md +458 -0
- package/.grimoire/development/tasks/analyze-cross-artifact.md +358 -0
- package/.grimoire/development/tasks/analyze-framework.md +698 -0
- package/.grimoire/development/tasks/analyze-performance.md +639 -0
- package/.grimoire/development/tasks/analyze-project-structure.md +623 -0
- package/.grimoire/development/tasks/apply-qa-fixes.md +342 -0
- package/.grimoire/development/tasks/architect-analyze-impact.md +828 -0
- package/.grimoire/development/tasks/audit-codebase.md +431 -0
- package/.grimoire/development/tasks/audit-tailwind-config.md +272 -0
- package/.grimoire/development/tasks/audit-utilities.md +360 -0
- package/.grimoire/development/tasks/blocks/README.md +180 -0
- package/.grimoire/development/tasks/blocks/agent-prompt-template.md +117 -0
- package/.grimoire/development/tasks/blocks/context-loading.md +110 -0
- package/.grimoire/development/tasks/blocks/execution-pattern.md +122 -0
- package/.grimoire/development/tasks/blocks/finalization.md +123 -0
- package/.grimoire/development/tasks/bootstrap-shadcn-library.md +288 -0
- package/.grimoire/development/tasks/brownfield-create-epic.md +533 -0
- package/.grimoire/development/tasks/brownfield-create-story.md +358 -0
- package/.grimoire/development/tasks/build-autonomous.md +186 -0
- package/.grimoire/development/tasks/build-component.md +480 -0
- package/.grimoire/development/tasks/build-resume.md +125 -0
- package/.grimoire/development/tasks/build-status.md +155 -0
- package/.grimoire/development/tasks/build.md +142 -0
- package/.grimoire/development/tasks/calculate-roi.md +457 -0
- package/.grimoire/development/tasks/check-docs-links.md +114 -0
- package/.grimoire/development/tasks/ci-cd-configuration.md +766 -0
- package/.grimoire/development/tasks/cleanup-utilities.md +672 -0
- package/.grimoire/development/tasks/cleanup-worktrees.md +39 -0
- package/.grimoire/development/tasks/collaborative-edit.md +1110 -0
- package/.grimoire/development/tasks/compose-molecule.md +286 -0
- package/.grimoire/development/tasks/consolidate-patterns.md +416 -0
- package/.grimoire/development/tasks/correct-course.md +281 -0
- package/.grimoire/development/tasks/create-agent.md +1199 -0
- package/.grimoire/development/tasks/create-brownfield-story.md +728 -0
- package/.grimoire/development/tasks/create-deep-research-prompt.md +500 -0
- package/.grimoire/development/tasks/create-doc.md +318 -0
- package/.grimoire/development/tasks/create-next-story.md +776 -0
- package/.grimoire/development/tasks/create-service.md +393 -0
- package/.grimoire/development/tasks/create-suite.md +285 -0
- package/.grimoire/development/tasks/create-task.md +391 -0
- package/.grimoire/development/tasks/create-workflow.md +429 -0
- package/.grimoire/development/tasks/create-worktree.md +439 -0
- package/.grimoire/development/tasks/db-analyze-hotpaths.md +574 -0
- package/.grimoire/development/tasks/db-apply-migration.md +383 -0
- package/.grimoire/development/tasks/db-bootstrap.md +644 -0
- package/.grimoire/development/tasks/db-domain-modeling.md +695 -0
- package/.grimoire/development/tasks/db-dry-run.md +295 -0
- package/.grimoire/development/tasks/db-env-check.md +262 -0
- package/.grimoire/development/tasks/db-explain.md +633 -0
- package/.grimoire/development/tasks/db-impersonate.md +497 -0
- package/.grimoire/development/tasks/db-load-csv.md +595 -0
- package/.grimoire/development/tasks/db-policy-apply.md +655 -0
- package/.grimoire/development/tasks/db-rls-audit.md +413 -0
- package/.grimoire/development/tasks/db-rollback.md +741 -0
- package/.grimoire/development/tasks/db-run-sql.md +615 -0
- package/.grimoire/development/tasks/db-schema-audit.md +1013 -0
- package/.grimoire/development/tasks/db-seed.md +392 -0
- package/.grimoire/development/tasks/db-smoke-test.md +353 -0
- package/.grimoire/development/tasks/db-snapshot.md +571 -0
- package/.grimoire/development/tasks/db-squad-integration.md +665 -0
- package/.grimoire/development/tasks/db-supabase-setup.md +714 -0
- package/.grimoire/development/tasks/db-verify-order.md +517 -0
- package/.grimoire/development/tasks/deprecate-component.md +958 -0
- package/.grimoire/development/tasks/dev-apply-qa-fixes.md +320 -0
- package/.grimoire/development/tasks/dev-backlog-debt.md +471 -0
- package/.grimoire/development/tasks/dev-develop-story.md +912 -0
- package/.grimoire/development/tasks/dev-improve-code-quality.md +874 -0
- package/.grimoire/development/tasks/dev-optimize-performance.md +1035 -0
- package/.grimoire/development/tasks/dev-suggest-refactoring.md +872 -0
- package/.grimoire/development/tasks/dev-validate-next-story.md +350 -0
- package/.grimoire/development/tasks/document-gotchas.md +479 -0
- package/.grimoire/development/tasks/document-project.md +554 -0
- package/.grimoire/development/tasks/environment-bootstrap.md +1391 -0
- package/.grimoire/development/tasks/execute-checklist.md +303 -0
- package/.grimoire/development/tasks/execute-epic-plan.md +887 -0
- package/.grimoire/development/tasks/export-design-tokens-dtcg.md +276 -0
- package/.grimoire/development/tasks/extend-pattern.md +271 -0
- package/.grimoire/development/tasks/extract-patterns.md +399 -0
- package/.grimoire/development/tasks/extract-tokens.md +469 -0
- package/.grimoire/development/tasks/facilitate-brainstorming-session.md +520 -0
- package/.grimoire/development/tasks/generate-ai-frontend-prompt.md +262 -0
- package/.grimoire/development/tasks/generate-documentation.md +286 -0
- package/.grimoire/development/tasks/generate-migration-strategy.md +524 -0
- package/.grimoire/development/tasks/generate-shock-report.md +503 -0
- package/.grimoire/development/tasks/github-devops-github-pr-automation.md +666 -0
- package/.grimoire/development/tasks/github-devops-pre-push-quality-gate.md +791 -0
- package/.grimoire/development/tasks/github-devops-repository-cleanup.md +376 -0
- package/.grimoire/development/tasks/github-devops-version-management.md +485 -0
- package/.grimoire/development/tasks/gotcha.md +138 -0
- package/.grimoire/development/tasks/gotchas.md +155 -0
- package/.grimoire/development/tasks/health-check.yaml +227 -0
- package/.grimoire/development/tasks/ids-governor.md +96 -0
- package/.grimoire/development/tasks/ids-health.md +91 -0
- package/.grimoire/development/tasks/ids-query.md +156 -0
- package/.grimoire/development/tasks/improve-self.md +824 -0
- package/.grimoire/development/tasks/index-docs.md +389 -0
- package/.grimoire/development/tasks/init-project-status.md +508 -0
- package/.grimoire/development/tasks/integrate-squad.md +316 -0
- package/.grimoire/development/tasks/kb-mode-interaction.md +285 -0
- package/.grimoire/development/tasks/learn-patterns.md +902 -0
- package/.grimoire/development/tasks/list-mcps.md +33 -0
- package/.grimoire/development/tasks/list-worktrees.md +344 -0
- package/.grimoire/development/tasks/mcp-workflow.md +438 -0
- package/.grimoire/development/tasks/merge-worktree.md +42 -0
- package/.grimoire/development/tasks/modify-agent.md +399 -0
- package/.grimoire/development/tasks/modify-task.md +442 -0
- package/.grimoire/development/tasks/modify-workflow.md +511 -0
- package/.grimoire/development/tasks/next.md +327 -0
- package/.grimoire/development/tasks/orchestrate-resume.md +60 -0
- package/.grimoire/development/tasks/orchestrate-status.md +64 -0
- package/.grimoire/development/tasks/orchestrate-stop.md +55 -0
- package/.grimoire/development/tasks/orchestrate.md +66 -0
- package/.grimoire/development/tasks/patterns.md +336 -0
- package/.grimoire/development/tasks/plan-create-context.md +812 -0
- package/.grimoire/development/tasks/plan-create-implementation.md +797 -0
- package/.grimoire/development/tasks/plan-execute-subtask.md +962 -0
- package/.grimoire/development/tasks/po-backlog-add.md +372 -0
- package/.grimoire/development/tasks/po-close-story.md +428 -0
- package/.grimoire/development/tasks/po-manage-story-backlog.md +525 -0
- package/.grimoire/development/tasks/po-pull-story-from-clickup.md +542 -0
- package/.grimoire/development/tasks/po-pull-story.md +318 -0
- package/.grimoire/development/tasks/po-stories-index.md +353 -0
- package/.grimoire/development/tasks/po-sync-story-to-clickup.md +459 -0
- package/.grimoire/development/tasks/po-sync-story.md +305 -0
- package/.grimoire/development/tasks/pr-automation.md +703 -0
- package/.grimoire/development/tasks/propose-modification.md +844 -0
- package/.grimoire/development/tasks/publish-npm.md +259 -0
- package/.grimoire/development/tasks/qa-after-creation.md +519 -0
- package/.grimoire/development/tasks/qa-backlog-add-followup.md +427 -0
- package/.grimoire/development/tasks/qa-browser-console-check.md +343 -0
- package/.grimoire/development/tasks/qa-create-fix-request.md +625 -0
- package/.grimoire/development/tasks/qa-evidence-requirements.md +314 -0
- package/.grimoire/development/tasks/qa-false-positive-detection.md +374 -0
- package/.grimoire/development/tasks/qa-fix-issues.md +686 -0
- package/.grimoire/development/tasks/qa-gate.md +375 -0
- package/.grimoire/development/tasks/qa-generate-tests.md +1176 -0
- package/.grimoire/development/tasks/qa-library-validation.md +497 -0
- package/.grimoire/development/tasks/qa-migration-validation.md +584 -0
- package/.grimoire/development/tasks/qa-nfr-assess.md +559 -0
- package/.grimoire/development/tasks/qa-review-build.md +1225 -0
- package/.grimoire/development/tasks/qa-review-proposal.md +1159 -0
- package/.grimoire/development/tasks/qa-review-story.md +684 -0
- package/.grimoire/development/tasks/qa-risk-profile.md +568 -0
- package/.grimoire/development/tasks/qa-run-tests.md +279 -0
- package/.grimoire/development/tasks/qa-security-checklist.md +552 -0
- package/.grimoire/development/tasks/qa-test-design.md +389 -0
- package/.grimoire/development/tasks/qa-trace-requirements.md +478 -0
- package/.grimoire/development/tasks/release-management.md +754 -0
- package/.grimoire/development/tasks/remove-mcp.md +35 -0
- package/.grimoire/development/tasks/remove-worktree.md +435 -0
- package/.grimoire/development/tasks/run-design-system-pipeline.md +642 -0
- package/.grimoire/development/tasks/run-workflow-engine.md +861 -0
- package/.grimoire/development/tasks/run-workflow.md +389 -0
- package/.grimoire/development/tasks/search-mcp.md +309 -0
- package/.grimoire/development/tasks/security-audit.md +556 -0
- package/.grimoire/development/tasks/security-scan.md +792 -0
- package/.grimoire/development/tasks/session-resume.md +193 -0
- package/.grimoire/development/tasks/setup-database.md +743 -0
- package/.grimoire/development/tasks/setup-design-system.md +464 -0
- package/.grimoire/development/tasks/setup-github.md +876 -0
- package/.grimoire/development/tasks/setup-llm-routing.md +231 -0
- package/.grimoire/development/tasks/setup-mcp-docker.md +628 -0
- package/.grimoire/development/tasks/setup-project-docs.md +442 -0
- package/.grimoire/development/tasks/shard-doc.md +539 -0
- package/.grimoire/development/tasks/sm-create-next-story.md +482 -0
- package/.grimoire/development/tasks/spec-assess-complexity.md +461 -0
- package/.grimoire/development/tasks/spec-critique.md +595 -0
- package/.grimoire/development/tasks/spec-gather-requirements.md +545 -0
- package/.grimoire/development/tasks/spec-research-dependencies.md +446 -0
- package/.grimoire/development/tasks/spec-write-spec.md +531 -0
- package/.grimoire/development/tasks/squad-creator-analyze.md +318 -0
- package/.grimoire/development/tasks/squad-creator-create.md +314 -0
- package/.grimoire/development/tasks/squad-creator-design.md +335 -0
- package/.grimoire/development/tasks/squad-creator-download.md +169 -0
- package/.grimoire/development/tasks/squad-creator-extend.md +413 -0
- package/.grimoire/development/tasks/squad-creator-list.md +226 -0
- package/.grimoire/development/tasks/squad-creator-migrate.md +245 -0
- package/.grimoire/development/tasks/squad-creator-publish.md +231 -0
- package/.grimoire/development/tasks/squad-creator-sync-grimoire.md +317 -0
- package/.grimoire/development/tasks/squad-creator-sync-ide-command.md +403 -0
- package/.grimoire/development/tasks/squad-creator-validate.md +160 -0
- package/.grimoire/development/tasks/story-checkpoint.md +361 -0
- package/.grimoire/development/tasks/sync-documentation.md +866 -0
- package/.grimoire/development/tasks/tailwind-upgrade.md +296 -0
- package/.grimoire/development/tasks/test-as-user.md +623 -0
- package/.grimoire/development/tasks/test-validation-task.md +172 -0
- package/.grimoire/development/tasks/undo-last.md +348 -0
- package/.grimoire/development/tasks/update-grimoire.md +153 -0
- package/.grimoire/development/tasks/update-manifest.md +411 -0
- package/.grimoire/development/tasks/update-source-tree.md +138 -0
- package/.grimoire/development/tasks/ux-create-wireframe.md +619 -0
- package/.grimoire/development/tasks/ux-ds-scan-artifact.md +674 -0
- package/.grimoire/development/tasks/ux-user-research.md +561 -0
- package/.grimoire/development/tasks/validate-agents.md +117 -0
- package/.grimoire/development/tasks/validate-next-story.md +456 -0
- package/.grimoire/development/tasks/validate-tech-preset.md +187 -0
- package/.grimoire/development/tasks/validate-workflow.md +323 -0
- package/.grimoire/development/tasks/verify-subtask.md +237 -0
- package/.grimoire/development/tasks/waves.md +206 -0
- package/.grimoire/development/tasks/yolo-toggle.md +115 -0
- package/.grimoire/development/templates/grimoire-doc-template.md +496 -0
- package/.grimoire/development/templates/research-prompt-tmpl.md +486 -0
- package/.grimoire/development/templates/service-template/README.md.hbs +159 -0
- package/.grimoire/development/templates/service-template/__tests__/index.test.ts.hbs +238 -0
- package/.grimoire/development/templates/service-template/client.ts.hbs +404 -0
- package/.grimoire/development/templates/service-template/errors.ts.hbs +183 -0
- package/.grimoire/development/templates/service-template/index.ts.hbs +121 -0
- package/.grimoire/development/templates/service-template/jest.config.js +89 -0
- package/.grimoire/development/templates/service-template/package.json.hbs +88 -0
- package/.grimoire/development/templates/service-template/tsconfig.json +45 -0
- package/.grimoire/development/templates/service-template/types.ts.hbs +146 -0
- package/.grimoire/development/templates/squad/agent-template.md +69 -0
- package/.grimoire/development/templates/squad/checklist-template.md +82 -0
- package/.grimoire/development/templates/squad/data-template.yaml +105 -0
- package/.grimoire/development/templates/squad/script-template.js +179 -0
- package/.grimoire/development/templates/squad/task-template.md +125 -0
- package/.grimoire/development/templates/squad/template-template.md +98 -0
- package/.grimoire/development/templates/squad/tool-template.js +103 -0
- package/.grimoire/development/templates/squad/workflow-template.yaml +108 -0
- package/.grimoire/development/templates/squad-template/LICENSE +21 -0
- package/.grimoire/development/templates/squad-template/README.md +37 -0
- package/.grimoire/development/templates/squad-template/agents/example-agent.yaml +36 -0
- package/.grimoire/development/templates/squad-template/package.json +20 -0
- package/.grimoire/development/templates/squad-template/squad.yaml +26 -0
- package/.grimoire/development/templates/squad-template/tasks/example-task.yaml +46 -0
- package/.grimoire/development/templates/squad-template/templates/example-template.md +24 -0
- package/.grimoire/development/templates/squad-template/tests/example-agent.test.js +54 -0
- package/.grimoire/development/templates/squad-template/workflows/example-workflow.yaml +54 -0
- package/.grimoire/development/templates/subagent-step-prompt.md +122 -0
- package/.grimoire/development/workflows/README.md +82 -0
- package/.grimoire/development/workflows/auto-worktree.yaml +423 -0
- package/.grimoire/development/workflows/brownfield-discovery.yaml +933 -0
- package/.grimoire/development/workflows/brownfield-fullstack.yaml +369 -0
- package/.grimoire/development/workflows/brownfield-service.yaml +246 -0
- package/.grimoire/development/workflows/brownfield-ui.yaml +260 -0
- package/.grimoire/development/workflows/design-system-build-quality.yaml +228 -0
- package/.grimoire/development/workflows/development-cycle.yaml +427 -0
- package/.grimoire/development/workflows/epic-orchestration.yaml +328 -0
- package/.grimoire/development/workflows/greenfield-fullstack.yaml +386 -0
- package/.grimoire/development/workflows/greenfield-service.yaml +278 -0
- package/.grimoire/development/workflows/greenfield-ui.yaml +284 -0
- package/.grimoire/development/workflows/qa-loop.yaml +444 -0
- package/.grimoire/development/workflows/spec-pipeline.yaml +577 -0
- package/.grimoire/development/workflows/story-development-cycle.yaml +285 -0
- package/.grimoire/docs/standards/AGENT-PERSONALIZATION-STANDARD-V1.md +574 -0
- package/.grimoire/docs/standards/EXECUTOR-DECISION-TREE.md +698 -0
- package/.grimoire/docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md +513 -0
- package/.grimoire/docs/standards/QUALITY-GATES-SPECIFICATION.md +558 -0
- package/.grimoire/docs/standards/STANDARDS-INDEX.md +212 -0
- package/.grimoire/docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md +551 -0
- package/.grimoire/docs/standards/TASK-FORMAT-SPECIFICATION-V1.md +1415 -0
- package/.grimoire/docs/standards/grimoire-COLOR-PALETTE-QUICK-REFERENCE.md +186 -0
- package/.grimoire/docs/standards/grimoire-COLOR-PALETTE-V2.1.md +354 -0
- package/.grimoire/docs/standards/grimoire-LIVRO-DE-OURO-V2.1-COMPLETE.md +839 -0
- package/.grimoire/docs/standards/grimoire-LIVRO-DE-OURO-V2.2-SUMMARY.md +1341 -0
- package/.grimoire/elicitation/agent-elicitation.js +272 -0
- package/.grimoire/elicitation/task-elicitation.js +281 -0
- package/.grimoire/elicitation/workflow-elicitation.js +315 -0
- package/.grimoire/framework-config.yaml +152 -0
- package/.grimoire/hooks/gemini/after-tool.js +78 -0
- package/.grimoire/hooks/gemini/before-agent.js +80 -0
- package/.grimoire/hooks/gemini/before-tool.js +115 -0
- package/.grimoire/hooks/gemini/rewind-handler.js +69 -0
- package/.grimoire/hooks/gemini/session-end.js +91 -0
- package/.grimoire/hooks/gemini/session-start.js +91 -0
- package/.grimoire/hooks/ids-post-commit.js +118 -0
- package/.grimoire/hooks/ids-pre-push.js +125 -0
- package/.grimoire/hooks/unified/README.md +309 -0
- package/.grimoire/hooks/unified/hook-interface.js +161 -0
- package/.grimoire/hooks/unified/hook-registry.js +143 -0
- package/.grimoire/hooks/unified/index.js +36 -0
- package/.grimoire/hooks/unified/runners/precompact-runner.js +98 -0
- package/.grimoire/index.esm.js +17 -0
- package/.grimoire/index.js +17 -0
- package/.grimoire/infrastructure/README.md +128 -0
- package/.grimoire/infrastructure/contracts/compatibility/grimoire-4.0.4.yaml +46 -0
- package/.grimoire/infrastructure/index.js +200 -0
- package/.grimoire/infrastructure/integrations/ai-providers/README.md +103 -0
- package/.grimoire/infrastructure/integrations/ai-providers/ai-provider-factory.js +286 -0
- package/.grimoire/infrastructure/integrations/ai-providers/ai-provider.js +145 -0
- package/.grimoire/infrastructure/integrations/ai-providers/claude-provider.js +170 -0
- package/.grimoire/infrastructure/integrations/ai-providers/gemini-provider.js +365 -0
- package/.grimoire/infrastructure/integrations/ai-providers/index.js +45 -0
- package/.grimoire/infrastructure/integrations/gemini-extensions/cloudrun-adapter.js +129 -0
- package/.grimoire/infrastructure/integrations/gemini-extensions/index.js +41 -0
- package/.grimoire/infrastructure/integrations/gemini-extensions/policy-sync.js +74 -0
- package/.grimoire/infrastructure/integrations/gemini-extensions/security-adapter.js +159 -0
- package/.grimoire/infrastructure/integrations/gemini-extensions/supabase-adapter.js +88 -0
- package/.grimoire/infrastructure/integrations/gemini-extensions/workspace-adapter.js +100 -0
- package/.grimoire/infrastructure/integrations/pm-adapters/README.md +60 -0
- package/.grimoire/infrastructure/integrations/pm-adapters/clickup-adapter.js +345 -0
- package/.grimoire/infrastructure/integrations/pm-adapters/github-adapter.js +393 -0
- package/.grimoire/infrastructure/integrations/pm-adapters/jira-adapter.js +449 -0
- package/.grimoire/infrastructure/integrations/pm-adapters/local-adapter.js +176 -0
- package/.grimoire/infrastructure/schemas/agent-v3-schema.json +160 -0
- package/.grimoire/infrastructure/schemas/build-state.schema.json +158 -0
- package/.grimoire/infrastructure/schemas/task-v3-schema.json +152 -0
- package/.grimoire/infrastructure/scripts/approach-manager.js +1005 -0
- package/.grimoire/infrastructure/scripts/approval-workflow.js +644 -0
- package/.grimoire/infrastructure/scripts/asset-inventory.js +622 -0
- package/.grimoire/infrastructure/scripts/atomic-layer-classifier.js +309 -0
- package/.grimoire/infrastructure/scripts/backup-manager.js +607 -0
- package/.grimoire/infrastructure/scripts/batch-creator.js +609 -0
- package/.grimoire/infrastructure/scripts/branch-manager.js +391 -0
- package/.grimoire/infrastructure/scripts/capability-analyzer.js +535 -0
- package/.grimoire/infrastructure/scripts/changelog-generator.js +554 -0
- package/.grimoire/infrastructure/scripts/cicd-discovery.js +1269 -0
- package/.grimoire/infrastructure/scripts/clickup-helpers.js +227 -0
- package/.grimoire/infrastructure/scripts/code-quality-improver.js +1312 -0
- package/.grimoire/infrastructure/scripts/codebase-mapper.js +1288 -0
- package/.grimoire/infrastructure/scripts/codex-skills-sync/index.js +184 -0
- package/.grimoire/infrastructure/scripts/codex-skills-sync/validate.js +174 -0
- package/.grimoire/infrastructure/scripts/commit-message-generator.js +850 -0
- package/.grimoire/infrastructure/scripts/component-generator.js +738 -0
- package/.grimoire/infrastructure/scripts/component-metadata.js +628 -0
- package/.grimoire/infrastructure/scripts/component-search.js +278 -0
- package/.grimoire/infrastructure/scripts/config-cache.js +322 -0
- package/.grimoire/infrastructure/scripts/config-loader.js +351 -0
- package/.grimoire/infrastructure/scripts/conflict-resolver.js +675 -0
- package/.grimoire/infrastructure/scripts/coverage-analyzer.js +882 -0
- package/.grimoire/infrastructure/scripts/dashboard-status-writer.js +310 -0
- package/.grimoire/infrastructure/scripts/dependency-analyzer.js +639 -0
- package/.grimoire/infrastructure/scripts/dependency-impact-analyzer.js +704 -0
- package/.grimoire/infrastructure/scripts/diff-generator.js +129 -0
- package/.grimoire/infrastructure/scripts/documentation-integrity/brownfield-analyzer.js +502 -0
- package/.grimoire/infrastructure/scripts/documentation-integrity/config-generator.js +369 -0
- package/.grimoire/infrastructure/scripts/documentation-integrity/deployment-config-loader.js +309 -0
- package/.grimoire/infrastructure/scripts/documentation-integrity/doc-generator.js +331 -0
- package/.grimoire/infrastructure/scripts/documentation-integrity/gitignore-generator.js +314 -0
- package/.grimoire/infrastructure/scripts/documentation-integrity/index.js +75 -0
- package/.grimoire/infrastructure/scripts/documentation-integrity/mode-detector.js +391 -0
- package/.grimoire/infrastructure/scripts/documentation-synchronizer.js +1432 -0
- package/.grimoire/infrastructure/scripts/framework-analyzer.js +763 -0
- package/.grimoire/infrastructure/scripts/git-config-detector.js +293 -0
- package/.grimoire/infrastructure/scripts/git-hooks/post-commit.js +75 -0
- package/.grimoire/infrastructure/scripts/git-wrapper.js +444 -0
- package/.grimoire/infrastructure/scripts/gotchas-documenter.js +1296 -0
- package/.grimoire/infrastructure/scripts/grimoire-validator.js +295 -0
- package/.grimoire/infrastructure/scripts/ide-sync/README.md +220 -0
- package/.grimoire/infrastructure/scripts/ide-sync/agent-parser.js +295 -0
- package/.grimoire/infrastructure/scripts/ide-sync/gemini-commands.js +207 -0
- package/.grimoire/infrastructure/scripts/ide-sync/index.js +540 -0
- package/.grimoire/infrastructure/scripts/ide-sync/redirect-generator.js +179 -0
- package/.grimoire/infrastructure/scripts/ide-sync/transformers/antigravity.js +107 -0
- package/.grimoire/infrastructure/scripts/ide-sync/transformers/claude-code.js +86 -0
- package/.grimoire/infrastructure/scripts/ide-sync/transformers/cursor.js +96 -0
- package/.grimoire/infrastructure/scripts/ide-sync/validator.js +273 -0
- package/.grimoire/infrastructure/scripts/improvement-engine.js +758 -0
- package/.grimoire/infrastructure/scripts/improvement-validator.js +710 -0
- package/.grimoire/infrastructure/scripts/llm-routing/install-llm-routing.js +282 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +129 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/claude-free-tracked.sh +108 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/claude-free.cmd +80 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/claude-free.sh +62 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/claude-max.cmd +26 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/claude-max.sh +18 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +73 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/deepseek-proxy.sh +65 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +53 -0
- package/.grimoire/infrastructure/scripts/llm-routing/templates/deepseek-usage.sh +16 -0
- package/.grimoire/infrastructure/scripts/llm-routing/usage-tracker/index.js +551 -0
- package/.grimoire/infrastructure/scripts/migrate-agent.js +528 -0
- package/.grimoire/infrastructure/scripts/modification-risk-assessment.js +970 -0
- package/.grimoire/infrastructure/scripts/modification-validator.js +555 -0
- package/.grimoire/infrastructure/scripts/output-formatter.js +298 -0
- package/.grimoire/infrastructure/scripts/path-analyzer.js +476 -0
- package/.grimoire/infrastructure/scripts/pattern-extractor.js +1563 -0
- package/.grimoire/infrastructure/scripts/performance-analyzer.js +758 -0
- package/.grimoire/infrastructure/scripts/performance-and-error-resolver.js +258 -0
- package/.grimoire/infrastructure/scripts/performance-optimizer.js +1902 -0
- package/.grimoire/infrastructure/scripts/performance-tracker.js +454 -0
- package/.grimoire/infrastructure/scripts/plan-tracker.js +922 -0
- package/.grimoire/infrastructure/scripts/pm-adapter-factory.js +182 -0
- package/.grimoire/infrastructure/scripts/pm-adapter.js +134 -0
- package/.grimoire/infrastructure/scripts/pr-review-ai.js +1062 -0
- package/.grimoire/infrastructure/scripts/project-status-loader.js +850 -0
- package/.grimoire/infrastructure/scripts/qa-loop-orchestrator.js +1264 -0
- package/.grimoire/infrastructure/scripts/qa-report-generator.js +1154 -0
- package/.grimoire/infrastructure/scripts/recovery-tracker.js +965 -0
- package/.grimoire/infrastructure/scripts/refactoring-suggester.js +1139 -0
- package/.grimoire/infrastructure/scripts/repository-detector.js +66 -0
- package/.grimoire/infrastructure/scripts/rollback-manager.js +734 -0
- package/.grimoire/infrastructure/scripts/sandbox-tester.js +618 -0
- package/.grimoire/infrastructure/scripts/security-checker.js +359 -0
- package/.grimoire/infrastructure/scripts/spot-check-validator.js +149 -0
- package/.grimoire/infrastructure/scripts/status-mapper.js +116 -0
- package/.grimoire/infrastructure/scripts/story-worktree-hooks.js +426 -0
- package/.grimoire/infrastructure/scripts/stuck-detector.js +1251 -0
- package/.grimoire/infrastructure/scripts/subtask-verifier.js +793 -0
- package/.grimoire/infrastructure/scripts/template-engine.js +240 -0
- package/.grimoire/infrastructure/scripts/template-validator.js +279 -0
- package/.grimoire/infrastructure/scripts/test-discovery.js +1259 -0
- package/.grimoire/infrastructure/scripts/test-generator.js +845 -0
- package/.grimoire/infrastructure/scripts/test-quality-assessment.js +1082 -0
- package/.grimoire/infrastructure/scripts/test-utilities-fast.js +126 -0
- package/.grimoire/infrastructure/scripts/test-utilities.js +201 -0
- package/.grimoire/infrastructure/scripts/tool-resolver.js +362 -0
- package/.grimoire/infrastructure/scripts/transaction-manager.js +590 -0
- package/.grimoire/infrastructure/scripts/usage-analytics.js +636 -0
- package/.grimoire/infrastructure/scripts/validate-agents.js +527 -0
- package/.grimoire/infrastructure/scripts/validate-claude-integration.js +103 -0
- package/.grimoire/infrastructure/scripts/validate-codex-integration.js +143 -0
- package/.grimoire/infrastructure/scripts/validate-gemini-integration.js +153 -0
- package/.grimoire/infrastructure/scripts/validate-output-pattern.js +213 -0
- package/.grimoire/infrastructure/scripts/validate-parity.js +357 -0
- package/.grimoire/infrastructure/scripts/validate-paths.js +144 -0
- package/.grimoire/infrastructure/scripts/validate-user-profile.js +251 -0
- package/.grimoire/infrastructure/scripts/visual-impact-generator.js +1056 -0
- package/.grimoire/infrastructure/scripts/worktree-manager.js +704 -0
- package/.grimoire/infrastructure/scripts/yaml-validator.js +397 -0
- package/.grimoire/infrastructure/templates/coderabbit.yaml.template +280 -0
- package/.grimoire/infrastructure/templates/core-config/core-config-brownfield.tmpl.yaml +177 -0
- package/.grimoire/infrastructure/templates/core-config/core-config-greenfield.tmpl.yaml +169 -0
- package/.grimoire/infrastructure/templates/github-workflows/README.md +110 -0
- package/.grimoire/infrastructure/templates/github-workflows/ci.yml.template +170 -0
- package/.grimoire/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -0
- package/.grimoire/infrastructure/templates/github-workflows/release.yml.template +197 -0
- package/.grimoire/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +20 -0
- package/.grimoire/infrastructure/templates/gitignore/gitignore-grimoire-base.tmpl +65 -0
- package/.grimoire/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -0
- package/.grimoire/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -0
- package/.grimoire/infrastructure/templates/grimoire-sync.yaml.template +183 -0
- package/.grimoire/infrastructure/templates/project-docs/coding-standards-tmpl.md +347 -0
- package/.grimoire/infrastructure/templates/project-docs/source-tree-tmpl.md +179 -0
- package/.grimoire/infrastructure/templates/project-docs/tech-stack-tmpl.md +269 -0
- package/.grimoire/infrastructure/tests/project-status-loader.test.js +569 -0
- package/.grimoire/infrastructure/tests/regression-suite-v2.md +622 -0
- package/.grimoire/infrastructure/tests/validate-module.js +98 -0
- package/.grimoire/infrastructure/tests/worktree-manager.test.js +620 -0
- package/.grimoire/infrastructure/tools/README.md +224 -0
- package/.grimoire/infrastructure/tools/cli/github-cli.yaml +200 -0
- package/.grimoire/infrastructure/tools/cli/llm-routing.yaml +128 -0
- package/.grimoire/infrastructure/tools/cli/railway-cli.yaml +260 -0
- package/.grimoire/infrastructure/tools/cli/supabase-cli.yaml +224 -0
- package/.grimoire/infrastructure/tools/local/ffmpeg.yaml +261 -0
- package/.grimoire/infrastructure/tools/mcp/21st-dev-magic.yaml +127 -0
- package/.grimoire/infrastructure/tools/mcp/browser.yaml +103 -0
- package/.grimoire/infrastructure/tools/mcp/clickup.yaml +535 -0
- package/.grimoire/infrastructure/tools/mcp/context7.yaml +78 -0
- package/.grimoire/infrastructure/tools/mcp/desktop-commander.yaml +180 -0
- package/.grimoire/infrastructure/tools/mcp/exa.yaml +103 -0
- package/.grimoire/infrastructure/tools/mcp/google-workspace.yaml +930 -0
- package/.grimoire/infrastructure/tools/mcp/n8n.yaml +551 -0
- package/.grimoire/infrastructure/tools/mcp/supabase.yaml +808 -0
- package/.grimoire/install-manifest.yaml +4058 -0
- package/.grimoire/local-config.yaml.template +73 -0
- package/.grimoire/manifests/schema/manifest-schema.json +191 -0
- package/.grimoire/monitor/hooks/lib/__init__.py +2 -0
- package/.grimoire/monitor/hooks/lib/enrich.py +59 -0
- package/.grimoire/monitor/hooks/lib/send_event.py +48 -0
- package/.grimoire/monitor/hooks/notification.py +30 -0
- package/.grimoire/monitor/hooks/post_tool_use.py +46 -0
- package/.grimoire/monitor/hooks/pre_compact.py +30 -0
- package/.grimoire/monitor/hooks/pre_tool_use.py +41 -0
- package/.grimoire/monitor/hooks/stop.py +30 -0
- package/.grimoire/monitor/hooks/subagent_stop.py +30 -0
- package/.grimoire/monitor/hooks/user_prompt_submit.py +39 -0
- package/.grimoire/package.json +104 -0
- package/.grimoire/presets/README.md +359 -0
- package/.grimoire/product/README.md +57 -0
- package/.grimoire/product/checklists/accessibility-wcag-checklist.md +80 -0
- package/.grimoire/product/checklists/architect-checklist.md +444 -0
- package/.grimoire/product/checklists/change-checklist.md +183 -0
- package/.grimoire/product/checklists/component-quality-checklist.md +74 -0
- package/.grimoire/product/checklists/database-design-checklist.md +119 -0
- package/.grimoire/product/checklists/dba-predeploy-checklist.md +97 -0
- package/.grimoire/product/checklists/dba-rollback-checklist.md +99 -0
- package/.grimoire/product/checklists/migration-readiness-checklist.md +75 -0
- package/.grimoire/product/checklists/pattern-audit-checklist.md +88 -0
- package/.grimoire/product/checklists/pm-checklist.md +376 -0
- package/.grimoire/product/checklists/po-master-checklist.md +442 -0
- package/.grimoire/product/checklists/pre-push-checklist.md +108 -0
- package/.grimoire/product/checklists/release-checklist.md +122 -0
- package/.grimoire/product/checklists/self-critique-checklist.md +387 -0
- package/.grimoire/product/checklists/story-dod-checklist.md +102 -0
- package/.grimoire/product/checklists/story-draft-checklist.md +216 -0
- package/.grimoire/product/data/atomic-design-principles.md +108 -0
- package/.grimoire/product/data/brainstorming-techniques.md +37 -0
- package/.grimoire/product/data/consolidation-algorithms.md +142 -0
- package/.grimoire/product/data/database-best-practices.md +182 -0
- package/.grimoire/product/data/design-token-best-practices.md +107 -0
- package/.grimoire/product/data/elicitation-methods.md +135 -0
- package/.grimoire/product/data/integration-patterns.md +207 -0
- package/.grimoire/product/data/migration-safety-guide.md +329 -0
- package/.grimoire/product/data/mode-selection-best-practices.md +471 -0
- package/.grimoire/product/data/postgres-tuning-guide.md +300 -0
- package/.grimoire/product/data/rls-security-patterns.md +333 -0
- package/.grimoire/product/data/roi-calculation-guide.md +142 -0
- package/.grimoire/product/data/supabase-patterns.md +330 -0
- package/.grimoire/product/data/test-levels-framework.md +149 -0
- package/.grimoire/product/data/test-priorities-matrix.md +175 -0
- package/.grimoire/product/data/wcag-compliance-guide.md +267 -0
- package/.grimoire/product/templates/activation-instructions-inline-greeting.yaml +64 -0
- package/.grimoire/product/templates/activation-instructions-template.md +260 -0
- package/.grimoire/product/templates/adr.hbs +126 -0
- package/.grimoire/product/templates/agent-template.yaml +122 -0
- package/.grimoire/product/templates/architecture-tmpl.yaml +651 -0
- package/.grimoire/product/templates/brainstorming-output-tmpl.yaml +156 -0
- package/.grimoire/product/templates/brownfield-architecture-tmpl.yaml +476 -0
- package/.grimoire/product/templates/brownfield-prd-tmpl.yaml +280 -0
- package/.grimoire/product/templates/brownfield-risk-report-tmpl.yaml +278 -0
- package/.grimoire/product/templates/changelog-template.md +134 -0
- package/.grimoire/product/templates/command-rationalization-matrix.md +154 -0
- package/.grimoire/product/templates/competitor-analysis-tmpl.yaml +293 -0
- package/.grimoire/product/templates/component-react-tmpl.tsx +98 -0
- package/.grimoire/product/templates/current-approach-tmpl.md +56 -0
- package/.grimoire/product/templates/dbdr.hbs +242 -0
- package/.grimoire/product/templates/design-story-tmpl.yaml +588 -0
- package/.grimoire/product/templates/ds-artifact-analysis.md +70 -0
- package/.grimoire/product/templates/engine/elicitation.js +298 -0
- package/.grimoire/product/templates/engine/index.js +310 -0
- package/.grimoire/product/templates/engine/loader.js +232 -0
- package/.grimoire/product/templates/engine/renderer.js +343 -0
- package/.grimoire/product/templates/engine/schemas/adr.schema.json +102 -0
- package/.grimoire/product/templates/engine/schemas/dbdr.schema.json +205 -0
- package/.grimoire/product/templates/engine/schemas/epic.schema.json +175 -0
- package/.grimoire/product/templates/engine/schemas/pmdr.schema.json +175 -0
- package/.grimoire/product/templates/engine/schemas/prd-v2.schema.json +300 -0
- package/.grimoire/product/templates/engine/schemas/prd.schema.json +152 -0
- package/.grimoire/product/templates/engine/schemas/story.schema.json +222 -0
- package/.grimoire/product/templates/engine/schemas/task.schema.json +154 -0
- package/.grimoire/product/templates/engine/validator.js +295 -0
- package/.grimoire/product/templates/epic.hbs +213 -0
- package/.grimoire/product/templates/eslintrc-security.json +32 -0
- package/.grimoire/product/templates/front-end-architecture-tmpl.yaml +206 -0
- package/.grimoire/product/templates/front-end-spec-tmpl.yaml +349 -0
- package/.grimoire/product/templates/fullstack-architecture-tmpl.yaml +805 -0
- package/.grimoire/product/templates/gemini/settings.json +81 -0
- package/.grimoire/product/templates/github-actions-cd.yml +213 -0
- package/.grimoire/product/templates/github-actions-ci.yml +173 -0
- package/.grimoire/product/templates/github-pr-template.md +68 -0
- package/.grimoire/product/templates/gordon-mcp.yaml +141 -0
- package/.grimoire/product/templates/grimoire-ai-config.yaml +107 -0
- package/.grimoire/product/templates/ide-rules/antigravity-rules.md +117 -0
- package/.grimoire/product/templates/ide-rules/claude-rules.md +233 -0
- package/.grimoire/product/templates/ide-rules/codex-rules.md +67 -0
- package/.grimoire/product/templates/ide-rules/copilot-rules.md +94 -0
- package/.grimoire/product/templates/ide-rules/cursor-rules.md +116 -0
- package/.grimoire/product/templates/ide-rules/gemini-rules.md +89 -0
- package/.grimoire/product/templates/index-strategy-tmpl.yaml +53 -0
- package/.grimoire/product/templates/market-research-tmpl.yaml +252 -0
- package/.grimoire/product/templates/mcp-workflow.js +273 -0
- package/.grimoire/product/templates/migration-plan-tmpl.yaml +1022 -0
- package/.grimoire/product/templates/migration-strategy-tmpl.md +524 -0
- package/.grimoire/product/templates/personalized-agent-template.md +260 -0
- package/.grimoire/product/templates/personalized-checklist-template.md +341 -0
- package/.grimoire/product/templates/personalized-task-template-v2.md +907 -0
- package/.grimoire/product/templates/personalized-task-template.md +345 -0
- package/.grimoire/product/templates/personalized-template-file.yaml +323 -0
- package/.grimoire/product/templates/personalized-workflow-template.yaml +461 -0
- package/.grimoire/product/templates/pmdr.hbs +187 -0
- package/.grimoire/product/templates/prd-tmpl.yaml +202 -0
- package/.grimoire/product/templates/prd-v2.0.hbs +217 -0
- package/.grimoire/product/templates/prd.hbs +202 -0
- package/.grimoire/product/templates/project-brief-tmpl.yaml +221 -0
- package/.grimoire/product/templates/qa-gate-tmpl.yaml +240 -0
- package/.grimoire/product/templates/qa-report-tmpl.md +235 -0
- package/.grimoire/product/templates/rls-policies-tmpl.yaml +1203 -0
- package/.grimoire/product/templates/schema-design-tmpl.yaml +428 -0
- package/.grimoire/product/templates/shock-report-tmpl.html +502 -0
- package/.grimoire/product/templates/spec-tmpl.md +235 -0
- package/.grimoire/product/templates/state-persistence-tmpl.yaml +219 -0
- package/.grimoire/product/templates/statusline/statusline-script.js +190 -0
- package/.grimoire/product/templates/statusline/track-agent.sh +70 -0
- package/.grimoire/product/templates/story-tmpl.yaml +369 -0
- package/.grimoire/product/templates/story.hbs +264 -0
- package/.grimoire/product/templates/task-execution-report.md +496 -0
- package/.grimoire/product/templates/task-template.md +123 -0
- package/.grimoire/product/templates/task.hbs +171 -0
- package/.grimoire/product/templates/tmpl-comment-on-examples.sql +158 -0
- package/.grimoire/product/templates/tmpl-migration-script.sql +91 -0
- package/.grimoire/product/templates/tmpl-rls-granular-policies.sql +104 -0
- package/.grimoire/product/templates/tmpl-rls-kiss-policy.sql +10 -0
- package/.grimoire/product/templates/tmpl-rls-roles.sql +135 -0
- package/.grimoire/product/templates/tmpl-rls-simple.sql +77 -0
- package/.grimoire/product/templates/tmpl-rls-tenant.sql +152 -0
- package/.grimoire/product/templates/tmpl-rollback-script.sql +77 -0
- package/.grimoire/product/templates/tmpl-seed-data.sql +140 -0
- package/.grimoire/product/templates/tmpl-smoke-test.sql +16 -0
- package/.grimoire/product/templates/tmpl-staging-copy-merge.sql +139 -0
- package/.grimoire/product/templates/tmpl-stored-proc.sql +140 -0
- package/.grimoire/product/templates/tmpl-trigger.sql +152 -0
- package/.grimoire/product/templates/tmpl-view-materialized.sql +133 -0
- package/.grimoire/product/templates/tmpl-view.sql +177 -0
- package/.grimoire/product/templates/token-exports-css-tmpl.css +240 -0
- package/.grimoire/product/templates/token-exports-tailwind-tmpl.js +395 -0
- package/.grimoire/product/templates/tokens-schema-tmpl.yaml +305 -0
- package/.grimoire/product/templates/workflow-template.yaml +152 -0
- package/.grimoire/project-config.yaml +166 -0
- package/.grimoire/quality/metrics-collector.js +601 -0
- package/.grimoire/quality/metrics-hook.js +261 -0
- package/.grimoire/quality/schemas/quality-metrics.schema.json +234 -0
- package/.grimoire/quality/seed-metrics.js +336 -0
- package/.grimoire/schemas/README.md +405 -0
- package/.grimoire/schemas/agent-v3-schema.json +395 -0
- package/.grimoire/schemas/squad-design-schema.json +300 -0
- package/.grimoire/schemas/squad-schema.json +187 -0
- package/.grimoire/schemas/task-v3-schema.json +354 -0
- package/.grimoire/schemas/validate-v3-schema.js +431 -0
- package/.grimoire/scripts/README.md +124 -0
- package/.grimoire/scripts/batch-migrate-phase1.ps1 +37 -0
- package/.grimoire/scripts/batch-migrate-phase2.ps1 +89 -0
- package/.grimoire/scripts/batch-migrate-phase3.ps1 +46 -0
- package/.grimoire/scripts/command-execution-hook.js +202 -0
- package/.grimoire/scripts/diagnostics/diagnose-installation.js +276 -0
- package/.grimoire/scripts/diagnostics/diagnose-npx-issue.ps1 +98 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/README.md +123 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/index.html +14 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/package-lock.json +5262 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/package.json +25 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/public/favicon.svg +10 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/App.jsx +22 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/AutoFixLog.css +122 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/AutoFixLog.jsx +72 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/DomainCard.css +121 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/DomainCard.jsx +116 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/HealthScore.css +80 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/HealthScore.jsx +81 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/IssuesList.css +184 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/IssuesList.jsx +145 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/TechDebtList.css +114 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/TechDebtList.jsx +72 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/index.js +9 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/Card.css +44 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/Card.jsx +25 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/Chart.css +14 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/Chart.jsx +138 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/Header.css +54 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/Header.jsx +22 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/StatusBadge.css +77 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/StatusBadge.jsx +45 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/components/shared/index.js +4 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/hooks/index.js +2 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/hooks/useAutoRefresh.js +89 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/hooks/useHealthData.js +308 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/main.jsx +13 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/pages/Dashboard.css +238 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/pages/Dashboard.jsx +154 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/pages/DomainDetail.css +259 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/pages/DomainDetail.jsx +164 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/pages/index.js +2 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/styles/App.css +19 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/src/styles/index.css +67 -0
- package/.grimoire/scripts/diagnostics/health-dashboard/vite.config.js +23 -0
- package/.grimoire/scripts/diagnostics/quick-diagnose.cmd +86 -0
- package/.grimoire/scripts/diagnostics/quick-diagnose.ps1 +118 -0
- package/.grimoire/scripts/grimoire-doc-template.md +326 -0
- package/.grimoire/scripts/migrate-framework-docs.sh +302 -0
- package/.grimoire/scripts/pm.sh +455 -0
- package/.grimoire/scripts/session-context-loader.js +46 -0
- package/.grimoire/scripts/test-template-system.js +942 -0
- package/.grimoire/scripts/update-grimoire.sh +176 -0
- package/.grimoire/scripts/validate-phase1.ps1 +36 -0
- package/.grimoire/scripts/workflow-management.md +70 -0
- package/.grimoire/user-guide.md +1411 -0
- package/.grimoire/utils/format-duration.js +95 -0
- package/.grimoire/utils/grimoire-validator.js +27 -0
- package/.grimoire/workflow-intelligence/__tests__/confidence-scorer.test.js +334 -0
- package/.grimoire/workflow-intelligence/__tests__/integration.test.js +339 -0
- package/.grimoire/workflow-intelligence/__tests__/suggestion-engine.test.js +437 -0
- package/.grimoire/workflow-intelligence/__tests__/wave-analyzer.test.js +447 -0
- package/.grimoire/workflow-intelligence/__tests__/workflow-registry.test.js +302 -0
- package/.grimoire/workflow-intelligence/engine/confidence-scorer.js +306 -0
- package/.grimoire/workflow-intelligence/engine/output-formatter.js +299 -0
- package/.grimoire/workflow-intelligence/engine/suggestion-engine.js +798 -0
- package/.grimoire/workflow-intelligence/engine/wave-analyzer.js +683 -0
- package/.grimoire/workflow-intelligence/index.js +330 -0
- package/.grimoire/workflow-intelligence/learning/capture-hook.js +148 -0
- package/.grimoire/workflow-intelligence/learning/gotcha-registry.js +654 -0
- package/.grimoire/workflow-intelligence/learning/index.js +306 -0
- package/.grimoire/workflow-intelligence/learning/pattern-capture.js +330 -0
- package/.grimoire/workflow-intelligence/learning/pattern-store.js +497 -0
- package/.grimoire/workflow-intelligence/learning/pattern-validator.js +310 -0
- package/.grimoire/workflow-intelligence/learning/qa-feedback.js +586 -0
- package/.grimoire/workflow-intelligence/learning/semantic-search.js +521 -0
- package/.grimoire/workflow-intelligence/registry/workflow-registry.js +357 -0
- package/.grimoire/working-in-the-brownfield.md +362 -0
- package/LICENSE +25 -0
- package/README.md +59 -0
- package/bin/grimoire-ids.js +560 -0
- package/bin/grimoire-init.js +1232 -0
- package/bin/grimoire-minimal.js +40 -0
- package/bin/grimoire.js +1118 -0
- package/bin/modules/env-config.js +436 -0
- package/bin/modules/mcp-installer.js +384 -0
- package/bin/utils/install-errors.js +340 -0
- package/bin/utils/install-transaction.js +447 -0
- package/bin/utils/pro-detector.js +110 -0
- package/package.json +158 -0
- package/packages/gemini-grimoire-extension/README.md +55 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-agent.js +7 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-agents.js +51 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-analyst.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-architect.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-data-engineer.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-dev.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-devops.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-master.js +7 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-menu.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-pm.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-po.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-qa.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-sm.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-squad-creator.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-status.js +68 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-ux-design-expert.js +6 -0
- package/packages/gemini-grimoire-extension/commands/grimoire-validate.js +35 -0
- package/packages/gemini-grimoire-extension/commands/lib/agent-launcher.js +147 -0
- package/packages/gemini-grimoire-extension/extension.json +149 -0
- package/packages/gemini-grimoire-extension/gemini-extension.json +149 -0
- package/packages/gemini-grimoire-extension/hooks/hooks.json +72 -0
- package/packages/grimoire-install/.releaserc.json +39 -0
- package/packages/grimoire-install/CHANGELOG.md +33 -0
- package/packages/grimoire-install/README.md +119 -0
- package/packages/grimoire-install/bin/edmcp.js +80 -0
- package/packages/grimoire-install/bin/grimoire-install.js +51 -0
- package/packages/grimoire-install/jest.config.js +27 -0
- package/packages/grimoire-install/package.json +68 -0
- package/packages/grimoire-install/src/dep-checker.js +306 -0
- package/packages/grimoire-install/src/edmcp/index.js +382 -0
- package/packages/grimoire-install/src/installer.js +487 -0
- package/packages/grimoire-install/src/os-detector.js +280 -0
- package/packages/grimoire-pro-cli/bin/grimoire-pro.js +233 -0
- package/packages/grimoire-pro-cli/package.json +38 -0
- package/packages/grimoire-pro-cli/src/recover.js +101 -0
- package/packages/installer/package.json +40 -0
- package/packages/installer/src/__tests__/performance-benchmark.js +384 -0
- package/packages/installer/src/config/configure-environment.js +373 -0
- package/packages/installer/src/config/ide-configs.js +161 -0
- package/packages/installer/src/config/templates/core-config-template.js +199 -0
- package/packages/installer/src/config/templates/env-template.js +272 -0
- package/packages/installer/src/config/validation/config-validator.js +244 -0
- package/packages/installer/src/detection/detect-project-type.js +83 -0
- package/packages/installer/src/installer/brownfield-upgrader.js +440 -0
- package/packages/installer/src/installer/dependency-installer.js +335 -0
- package/packages/installer/src/installer/file-hasher.js +234 -0
- package/packages/installer/src/installer/grimoire-core-installer.js +428 -0
- package/packages/installer/src/installer/manifest-signature.js +380 -0
- package/packages/installer/src/installer/post-install-validator.js +1524 -0
- package/packages/installer/src/merger/index.js +72 -0
- package/packages/installer/src/merger/parsers/env-parser.js +153 -0
- package/packages/installer/src/merger/parsers/markdown-section-parser.js +199 -0
- package/packages/installer/src/merger/strategies/base-merger.js +61 -0
- package/packages/installer/src/merger/strategies/env-merger.js +138 -0
- package/packages/installer/src/merger/strategies/index.js +105 -0
- package/packages/installer/src/merger/strategies/markdown-merger.js +208 -0
- package/packages/installer/src/merger/strategies/replace-merger.js +68 -0
- package/packages/installer/src/merger/types.js +72 -0
- package/packages/installer/src/pro/pro-scaffolder.js +387 -0
- package/packages/installer/src/updater/index.js +814 -0
- package/packages/installer/src/utils/grimoire-colors.js +235 -0
- package/packages/installer/src/wizard/feedback.js +232 -0
- package/packages/installer/src/wizard/i18n.js +230 -0
- package/packages/installer/src/wizard/ide-config-generator.js +993 -0
- package/packages/installer/src/wizard/ide-selector.js +86 -0
- package/packages/installer/src/wizard/index.js +831 -0
- package/packages/installer/src/wizard/pro-setup.js +1223 -0
- package/packages/installer/src/wizard/questions.js +336 -0
- package/packages/installer/src/wizard/validation/index.js +121 -0
- package/packages/installer/src/wizard/validation/report-generator.js +254 -0
- package/packages/installer/src/wizard/validation/troubleshooting-system.js +348 -0
- package/packages/installer/src/wizard/validation/validators/config-validator.js +364 -0
- package/packages/installer/src/wizard/validation/validators/dependency-validator.js +333 -0
- package/packages/installer/src/wizard/validation/validators/file-structure-validator.js +175 -0
- package/packages/installer/src/wizard/validation/validators/mcp-health-checker.js +310 -0
- package/packages/installer/src/wizard/validators.js +274 -0
- package/packages/installer/src/wizard/wizard.js +246 -0
- package/packages/installer/tests/integration/environment-configuration.test.js +331 -0
- package/packages/installer/tests/integration/wizard-detection.test.js +353 -0
- package/packages/installer/tests/unit/config-validator.test.js +316 -0
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +403 -0
- package/packages/installer/tests/unit/env-template.test.js +189 -0
- package/packages/installer/tests/unit/merger/env-merger.test.js +192 -0
- package/packages/installer/tests/unit/merger/markdown-merger.test.js +262 -0
- package/packages/installer/tests/unit/merger/strategies.test.js +153 -0
- package/scripts/check-markdown-links.py +353 -0
- package/scripts/code-intel-health-check.js +344 -0
- package/scripts/dashboard-parallel-dev.sh +184 -0
- package/scripts/dashboard-parallel-phase3.sh +130 -0
- package/scripts/dashboard-parallel-phase4.sh +131 -0
- package/scripts/ensure-manifest.js +59 -0
- package/scripts/generate-install-manifest.js +368 -0
- package/scripts/install-monitor-hooks.sh +83 -0
- package/scripts/package-synapse.js +325 -0
- package/scripts/semantic-lint.js +191 -0
- package/scripts/sign-manifest.ps1 +132 -0
- package/scripts/sign-manifest.sh +122 -0
- package/scripts/validate-manifest.js +267 -0
- package/scripts/validate-package-completeness.js +319 -0
|
@@ -0,0 +1,1406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greeting Builder - Context-Aware Agent Greeting System (Core Logic)
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE NOTE:
|
|
5
|
+
* This is the CORE CLASS that contains all greeting logic.
|
|
6
|
+
* It can be used directly by agents OR via the CLI wrapper (generate-greeting.js).
|
|
7
|
+
*
|
|
8
|
+
* - This file: Core GreetingBuilder class
|
|
9
|
+
* - generate-greeting.js: CLI wrapper that orchestrates context loading
|
|
10
|
+
*
|
|
11
|
+
* Builds intelligent greetings based on:
|
|
12
|
+
* - Session type (new/existing/workflow)
|
|
13
|
+
* - Git configuration status
|
|
14
|
+
* - Project status (natural language narrative)
|
|
15
|
+
* - Command visibility metadata
|
|
16
|
+
* - Previous agent handoff context
|
|
17
|
+
* - Current story and branch references
|
|
18
|
+
*
|
|
19
|
+
* Story ACT-7: Context-Aware Greeting Sections
|
|
20
|
+
* - Section builders receive full enriched context from UnifiedActivationPipeline
|
|
21
|
+
* - Presentation adapts: new=full intro, existing=brief, workflow=focused
|
|
22
|
+
* - Role description references current story and branch
|
|
23
|
+
* - Project status uses natural language narrative
|
|
24
|
+
* - Context section references previous agent handoff intelligently
|
|
25
|
+
* - Footer varies by session context
|
|
26
|
+
* - Parallelizable sections executed with Promise.all()
|
|
27
|
+
* - Fallback to static templates if context loading fails (150ms per section)
|
|
28
|
+
*
|
|
29
|
+
* Used by: Most agents (direct invocation in STEP 3)
|
|
30
|
+
* Also used by: generate-greeting.js (CLI wrapper for @devops, @data-engineer, @ux-design-expert)
|
|
31
|
+
*
|
|
32
|
+
* @see docs/architecture/greeting-system.md for full architecture documentation
|
|
33
|
+
* @see generate-greeting.js for CLI wrapper
|
|
34
|
+
*
|
|
35
|
+
* Performance: <200ms total (hard limit with timeout protection)
|
|
36
|
+
* Fallback: Simple greeting on any error
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
const ContextDetector = require('../../core/session/context-detector');
|
|
40
|
+
const GitConfigDetector = require('../../infrastructure/scripts/git-config-detector');
|
|
41
|
+
const WorkflowNavigator = require('./workflow-navigator');
|
|
42
|
+
const GreetingPreferenceManager = require('./greeting-preference-manager');
|
|
43
|
+
const { loadProjectStatus } = require('../../infrastructure/scripts/project-status-loader');
|
|
44
|
+
const { PermissionMode } = require('../../core/permissions');
|
|
45
|
+
const { resolveConfig } = require('../../core/config/config-resolver');
|
|
46
|
+
const { validateUserProfile } = require('../../infrastructure/scripts/validate-user-profile');
|
|
47
|
+
// Story ACT-5: SessionState integration for cross-terminal workflow continuity
|
|
48
|
+
const { SessionState } = require('../../core/orchestration/session-state');
|
|
49
|
+
// Story ACT-5: SurfaceChecker integration for proactive suggestions
|
|
50
|
+
const { SurfaceChecker } = require('../../core/orchestration/surface-checker');
|
|
51
|
+
const fs = require('fs');
|
|
52
|
+
const path = require('path');
|
|
53
|
+
const yaml = require('js-yaml');
|
|
54
|
+
|
|
55
|
+
const GREETING_TIMEOUT = 150; // 150ms hard limit per-section
|
|
56
|
+
const _TOTAL_GREETING_TIMEOUT = 200; // 200ms total pipeline budget (Story ACT-7, documented constant)
|
|
57
|
+
const SECTION_TIMEOUT = 150; // 150ms per section builder (Story ACT-7 AC8)
|
|
58
|
+
|
|
59
|
+
// Story ACT-2: Validation now delegated to validate-user-profile.js
|
|
60
|
+
const DEFAULT_USER_PROFILE = 'advanced';
|
|
61
|
+
|
|
62
|
+
const GIT_WARNING_TEMPLATE = `
|
|
63
|
+
⚠️ **Git Configuration Needed**
|
|
64
|
+
Your project is not connected to a git repository.
|
|
65
|
+
Run \`git init\` and \`git remote add origin <url>\` to enable version control.
|
|
66
|
+
`;
|
|
67
|
+
|
|
68
|
+
class GreetingBuilder {
|
|
69
|
+
constructor() {
|
|
70
|
+
this.contextDetector = new ContextDetector();
|
|
71
|
+
this.gitConfigDetector = new GitConfigDetector();
|
|
72
|
+
this.workflowNavigator = new WorkflowNavigator();
|
|
73
|
+
this.preferenceManager = new GreetingPreferenceManager();
|
|
74
|
+
this.config = this._loadConfig();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Load resolved config once, shared across greeting build.
|
|
79
|
+
* Story ACT-9 QA fix: Eliminates duplicate resolveConfig() calls per greeting build.
|
|
80
|
+
* @returns {Object|null} Resolved config object, or null on failure
|
|
81
|
+
*/
|
|
82
|
+
_loadResolvedConfig() {
|
|
83
|
+
try {
|
|
84
|
+
const result = resolveConfig(process.cwd(), { skipCache: true });
|
|
85
|
+
return result?.config || null;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
console.warn('[GreetingBuilder] Failed to load config:', error.message);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Load user profile via config-resolver (L5 User layer has highest priority).
|
|
94
|
+
* Story 12.1 - AC3: Uses resolveConfig() to read user_profile from layered hierarchy.
|
|
95
|
+
* Story ACT-2 - AC3: Runs validate-user-profile during activation (not just installation).
|
|
96
|
+
* Reads fresh each time (skipCache: true) to reflect toggle changes immediately.
|
|
97
|
+
* @param {Object} [resolvedConfig] - Pre-loaded config to avoid duplicate resolveConfig() call
|
|
98
|
+
* @returns {string} User profile ('bob' | 'advanced'), defaults to 'advanced'
|
|
99
|
+
*/
|
|
100
|
+
loadUserProfile(resolvedConfig) {
|
|
101
|
+
try {
|
|
102
|
+
const config = resolvedConfig || this._loadResolvedConfig();
|
|
103
|
+
const userProfile = config?.user_profile;
|
|
104
|
+
|
|
105
|
+
if (!userProfile) {
|
|
106
|
+
return DEFAULT_USER_PROFILE;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Story ACT-2 - AC3: Run validation during activation pipeline (graceful)
|
|
110
|
+
const validation = validateUserProfile(userProfile);
|
|
111
|
+
if (!validation.valid) {
|
|
112
|
+
console.warn(`[GreetingBuilder] user_profile validation failed: ${validation.error}`);
|
|
113
|
+
return DEFAULT_USER_PROFILE;
|
|
114
|
+
}
|
|
115
|
+
if (validation.warning) {
|
|
116
|
+
console.warn(`[GreetingBuilder] user_profile warning: ${validation.warning}`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return validation.value;
|
|
120
|
+
} catch (error) {
|
|
121
|
+
console.warn('[GreetingBuilder] Failed to load user_profile:', error.message);
|
|
122
|
+
return DEFAULT_USER_PROFILE;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Build contextual greeting for agent
|
|
128
|
+
* @param {Object} agent - Agent definition
|
|
129
|
+
* @param {Object} context - Session context
|
|
130
|
+
* @returns {Promise<string>} Formatted greeting
|
|
131
|
+
*/
|
|
132
|
+
async buildGreeting(agent, context = {}) {
|
|
133
|
+
const fallbackGreeting = this.buildSimpleGreeting(agent);
|
|
134
|
+
|
|
135
|
+
try {
|
|
136
|
+
// ACT-11: Use pre-loaded config from pipeline context to avoid duplicate resolveConfig()
|
|
137
|
+
const resolvedConfig = context._coreConfig || this._loadResolvedConfig();
|
|
138
|
+
// Story ACT-2: Load user profile early so preference manager can account for it
|
|
139
|
+
const userProfile = this.loadUserProfile(resolvedConfig);
|
|
140
|
+
|
|
141
|
+
// Check user preference (Story 6.1.4), now profile-aware (Story ACT-2)
|
|
142
|
+
// Story ACT-2: PM agent bypasses bob mode preference restriction because
|
|
143
|
+
// PM is the primary interface in bob mode and needs the full contextual greeting.
|
|
144
|
+
const preference = (userProfile === 'bob' && agent.id === 'pm')
|
|
145
|
+
? this.preferenceManager.getPreference('advanced')
|
|
146
|
+
: this.preferenceManager.getPreference(userProfile);
|
|
147
|
+
|
|
148
|
+
if (preference !== 'auto') {
|
|
149
|
+
// Override with fixed level
|
|
150
|
+
return this.buildFixedLevelGreeting(agent, preference);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Use session-aware logic (Story 6.1.2.5)
|
|
154
|
+
// Story ACT-2: Pass pre-loaded userProfile to avoid double loadUserProfile() call
|
|
155
|
+
const greetingPromise = this._buildContextualGreeting(agent, context, userProfile);
|
|
156
|
+
const timeoutPromise = new Promise((_, reject) =>
|
|
157
|
+
setTimeout(() => reject(new Error('Greeting timeout')), GREETING_TIMEOUT),
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
return await Promise.race([greetingPromise, timeoutPromise]);
|
|
161
|
+
} catch (error) {
|
|
162
|
+
console.warn('[GreetingBuilder] Fallback to simple greeting:', error.message);
|
|
163
|
+
return fallbackGreeting;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Build contextual greeting (internal implementation)
|
|
169
|
+
* Story 10.3: Profile-aware greeting with conditional agent visibility
|
|
170
|
+
* Story ACT-2: Accepts pre-loaded userProfile to avoid redundant loadUserProfile() calls
|
|
171
|
+
* Story ACT-7: Context-aware sections with parallelization and enriched context
|
|
172
|
+
* Story ACT-12: Language removed — delegated to Claude Code native settings.json
|
|
173
|
+
* @private
|
|
174
|
+
* @param {Object} agent - Agent definition
|
|
175
|
+
* @param {Object} context - Session context (may contain pre-loaded values from pipeline)
|
|
176
|
+
* @param {string} [preloadedUserProfile] - Pre-loaded user profile (avoids double call)
|
|
177
|
+
* @returns {Promise<string>} Contextual greeting
|
|
178
|
+
*/
|
|
179
|
+
async _buildContextualGreeting(agent, context, preloadedUserProfile) {
|
|
180
|
+
// Use pre-loaded values if available, otherwise load
|
|
181
|
+
const sessionType = context.sessionType || (await this._safeDetectSessionType(context));
|
|
182
|
+
|
|
183
|
+
const projectStatus = context.projectStatus || (await this._safeLoadProjectStatus());
|
|
184
|
+
|
|
185
|
+
// gitConfig: use from enriched context if available, otherwise load
|
|
186
|
+
const gitConfig = context.gitConfig || (await this._safeCheckGitConfig());
|
|
187
|
+
|
|
188
|
+
// Story 10.3 - AC7, AC8: Load user profile fresh each time
|
|
189
|
+
// Story ACT-2: Use pre-loaded value if available to avoid double resolveConfig() call
|
|
190
|
+
const userProfile = preloadedUserProfile || this.loadUserProfile();
|
|
191
|
+
|
|
192
|
+
// Story ACT-7 AC1: Build enriched section context for all builders
|
|
193
|
+
const sectionContext = {
|
|
194
|
+
sessionType,
|
|
195
|
+
projectStatus,
|
|
196
|
+
gitConfig,
|
|
197
|
+
userProfile,
|
|
198
|
+
previousAgent: context.previousAgent || null,
|
|
199
|
+
sessionStory: context.sessionStory || null,
|
|
200
|
+
lastCommands: context.lastCommands || [],
|
|
201
|
+
sessionMessage: context.sessionMessage || null,
|
|
202
|
+
workflowState: context.workflowState || null,
|
|
203
|
+
workflowActive: context.workflowActive || null,
|
|
204
|
+
permissions: context.permissions || null,
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
// Permission badge: use from enriched context if available, otherwise load
|
|
208
|
+
const permissionBadge = context.permissions?.badge || (await this._safeGetPermissionBadge());
|
|
209
|
+
|
|
210
|
+
// Build greeting sections based on session type
|
|
211
|
+
const sections = [];
|
|
212
|
+
|
|
213
|
+
// 1. Presentation with permission mode badge (always)
|
|
214
|
+
// Story ACT-7 AC2: Adapts based on session type (new=full, existing=brief, workflow=focused)
|
|
215
|
+
sections.push(this.buildPresentation(agent, sessionType, permissionBadge, sectionContext));
|
|
216
|
+
|
|
217
|
+
// 2. Role description (new session only, but skip in bob mode for non-PM)
|
|
218
|
+
// Story ACT-7 AC3: References current story and branch when available
|
|
219
|
+
if (sessionType === 'new' && !(userProfile === 'bob' && agent.id !== 'pm')) {
|
|
220
|
+
sections.push(this.buildRoleDescription(agent, sectionContext));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// 3. Project status (if git configured, but skip in bob mode for non-PM)
|
|
224
|
+
// Story ACT-7 AC4: Natural language narrative format
|
|
225
|
+
if (gitConfig.configured && projectStatus && !(userProfile === 'bob' && agent.id !== 'pm')) {
|
|
226
|
+
sections.push(this.buildProjectStatus(projectStatus, sessionType, sectionContext));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Story 10.3 - AC1, AC4: Bob mode redirect for non-PM agents
|
|
230
|
+
if (userProfile === 'bob' && agent.id !== 'pm') {
|
|
231
|
+
// Show redirect message instead of normal content
|
|
232
|
+
sections.push(this.buildBobModeRedirect(agent));
|
|
233
|
+
return sections.filter(Boolean).join('\n\n');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Story ACT-7 AC7: Parallel execution of independent sections
|
|
237
|
+
// Context section and workflow suggestions use different data sources
|
|
238
|
+
const [contextSection, workflowSection] = await Promise.all([
|
|
239
|
+
// 4. Context section (intelligent contextualization + recommendations)
|
|
240
|
+
// Story ACT-7 AC5: References previous agent handoff intelligently
|
|
241
|
+
this._safeBuildSection(() =>
|
|
242
|
+
this.buildContextSection(agent, context, sessionType, projectStatus, sectionContext),
|
|
243
|
+
),
|
|
244
|
+
// 5. Workflow suggestions (Story ACT-5: relaxed trigger + fixed method call)
|
|
245
|
+
this._safeBuildSection(() => {
|
|
246
|
+
if (sessionType !== 'new') {
|
|
247
|
+
return this.buildWorkflowSuggestions(context);
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}),
|
|
251
|
+
]);
|
|
252
|
+
|
|
253
|
+
if (contextSection) {
|
|
254
|
+
sections.push(contextSection);
|
|
255
|
+
}
|
|
256
|
+
if (workflowSection) {
|
|
257
|
+
sections.push(workflowSection);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// 7. Commands (filtered by visibility and user profile)
|
|
261
|
+
// Story 10.3 - AC2, AC5: Pass userProfile for profile-aware filtering
|
|
262
|
+
const commands = this.filterCommandsByVisibility(agent, sessionType, userProfile);
|
|
263
|
+
sections.push(this.buildCommands(commands, sessionType));
|
|
264
|
+
|
|
265
|
+
// 8. Footer with signature
|
|
266
|
+
// Story ACT-7 AC6: Footer varies by session context
|
|
267
|
+
sections.push(this.buildFooter(agent, sectionContext));
|
|
268
|
+
|
|
269
|
+
return sections.filter(Boolean).join('\n\n');
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Execute a section builder with timeout protection.
|
|
274
|
+
* Story ACT-7 AC8: Fallback to null if section builder exceeds SECTION_TIMEOUT.
|
|
275
|
+
* @private
|
|
276
|
+
* @param {Function} builderFn - Section builder function (sync or async)
|
|
277
|
+
* @returns {Promise<string|null>} Section result or null on timeout/error
|
|
278
|
+
*/
|
|
279
|
+
async _safeBuildSection(builderFn) {
|
|
280
|
+
try {
|
|
281
|
+
const result = builderFn();
|
|
282
|
+
// If the builder returns a promise, race it against the timeout
|
|
283
|
+
if (result && typeof result.then === 'function') {
|
|
284
|
+
return await Promise.race([
|
|
285
|
+
result,
|
|
286
|
+
new Promise((resolve) => setTimeout(() => resolve(null), SECTION_TIMEOUT)),
|
|
287
|
+
]);
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
} catch (error) {
|
|
291
|
+
console.warn('[GreetingBuilder] Section builder failed:', error.message);
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Build fixed-level greeting (Story 6.1.4)
|
|
298
|
+
* ACT-12: Language removed — Claude Code handles translation natively via settings.json
|
|
299
|
+
* @param {Object} agent - Agent definition
|
|
300
|
+
* @param {string} level - Preference level (minimal|named|archetypal)
|
|
301
|
+
* @returns {string} Fixed-level greeting
|
|
302
|
+
*/
|
|
303
|
+
buildFixedLevelGreeting(agent, level) {
|
|
304
|
+
const profile = agent.persona_profile;
|
|
305
|
+
|
|
306
|
+
if (!profile || !profile.greeting_levels) {
|
|
307
|
+
return this.buildSimpleGreeting(agent);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Select greeting based on preference
|
|
311
|
+
let greetingText;
|
|
312
|
+
switch (level) {
|
|
313
|
+
case 'minimal':
|
|
314
|
+
greetingText = profile.greeting_levels.minimal || `${agent.icon} ${agent.id} Agent ready`;
|
|
315
|
+
break;
|
|
316
|
+
case 'named':
|
|
317
|
+
greetingText = profile.greeting_levels.named || `${agent.icon} ${agent.name} ready`;
|
|
318
|
+
break;
|
|
319
|
+
case 'archetypal':
|
|
320
|
+
greetingText =
|
|
321
|
+
profile.greeting_levels.archetypal ||
|
|
322
|
+
`${agent.icon} ${agent.name} the ${profile.archetype} ready`;
|
|
323
|
+
break;
|
|
324
|
+
default:
|
|
325
|
+
greetingText = profile.greeting_levels.named || `${agent.icon} ${agent.name} ready`;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return `${greetingText}\n\nType \`*help\` to see available commands.`;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Build simple greeting (fallback)
|
|
333
|
+
* ACT-12: Language removed — Claude Code handles translation natively via settings.json
|
|
334
|
+
* @param {Object} agent - Agent definition
|
|
335
|
+
* @returns {string} Simple greeting
|
|
336
|
+
*/
|
|
337
|
+
buildSimpleGreeting(agent) {
|
|
338
|
+
const greetingLevels =
|
|
339
|
+
agent.persona_profile?.communication?.greeting_levels ||
|
|
340
|
+
agent.persona_profile?.greeting_levels;
|
|
341
|
+
const greeting = greetingLevels?.named || `${agent.icon} ${agent.name} ready`;
|
|
342
|
+
return `${greeting}\n\nType \`*help\` to see available commands.`;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Build presentation section
|
|
347
|
+
* Story ACT-7 AC2: Adapts based on session type
|
|
348
|
+
* - new session: full archetypal intro
|
|
349
|
+
* - existing session: brief "Welcome back" with current focus
|
|
350
|
+
* - workflow session: focused on workflow state
|
|
351
|
+
* @param {Object} agent - Agent definition
|
|
352
|
+
* @param {string} sessionType - Session type
|
|
353
|
+
* @param {string} permissionBadge - Permission mode badge (optional)
|
|
354
|
+
* @param {Object} [sectionContext] - Enriched section context (Story ACT-7)
|
|
355
|
+
* @returns {string} Presentation text
|
|
356
|
+
*/
|
|
357
|
+
buildPresentation(agent, sessionType, permissionBadge = '', sectionContext = null) {
|
|
358
|
+
const profile = agent.persona_profile;
|
|
359
|
+
|
|
360
|
+
// Try greeting_levels from communication first, then fall back to top level
|
|
361
|
+
const greetingLevels = profile?.communication?.greeting_levels || profile?.greeting_levels;
|
|
362
|
+
|
|
363
|
+
if (!greetingLevels) {
|
|
364
|
+
const base = `${agent.icon} ${agent.name} ready`;
|
|
365
|
+
return permissionBadge ? `${base} ${permissionBadge}` : base;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Story ACT-7 AC2: Presentation adapts based on session type
|
|
369
|
+
// ACT-12: Language delegated to Claude Code settings.json — hardcoded English phrases
|
|
370
|
+
let greeting;
|
|
371
|
+
|
|
372
|
+
if (sessionType === 'existing' && sectionContext) {
|
|
373
|
+
// Existing session: brief welcome back
|
|
374
|
+
const namedGreeting = greetingLevels.named || `${agent.icon} ${agent.name} ready`;
|
|
375
|
+
const storyRef = sectionContext.sessionStory || sectionContext.projectStatus?.currentStory;
|
|
376
|
+
if (storyRef) {
|
|
377
|
+
greeting = `${namedGreeting} -- continuing ${storyRef}`;
|
|
378
|
+
} else {
|
|
379
|
+
greeting = `${namedGreeting} -- welcome back`;
|
|
380
|
+
}
|
|
381
|
+
} else if (sessionType === 'workflow' && sectionContext) {
|
|
382
|
+
// Workflow session: focused on current workflow
|
|
383
|
+
const namedGreeting = greetingLevels.named || `${agent.icon} ${agent.name} ready`;
|
|
384
|
+
const workflowPhase = sectionContext.workflowState?.currentPhase || sectionContext.workflowActive;
|
|
385
|
+
if (workflowPhase) {
|
|
386
|
+
greeting = `${namedGreeting} -- workflow active`;
|
|
387
|
+
} else {
|
|
388
|
+
greeting = namedGreeting;
|
|
389
|
+
}
|
|
390
|
+
} else {
|
|
391
|
+
// New session or no context: full archetypal greeting
|
|
392
|
+
greeting =
|
|
393
|
+
greetingLevels.archetypal || greetingLevels.named || `${agent.icon} ${agent.name} ready`;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Append permission badge if available
|
|
397
|
+
return permissionBadge ? `${greeting} ${permissionBadge}` : greeting;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Build role description section
|
|
402
|
+
* Story ACT-7 AC3: References current story and branch when available.
|
|
403
|
+
* Skipped entirely for returning sessions (too verbose).
|
|
404
|
+
* @param {Object} agent - Agent definition
|
|
405
|
+
* @param {Object} [sectionContext] - Enriched section context (Story ACT-7)
|
|
406
|
+
* @returns {string} Role description
|
|
407
|
+
*/
|
|
408
|
+
buildRoleDescription(agent, sectionContext = null) {
|
|
409
|
+
if (!agent.persona || !agent.persona.role) {
|
|
410
|
+
return '';
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
let roleText = `**Role:** ${agent.persona.role}`;
|
|
414
|
+
|
|
415
|
+
// Story ACT-7 AC3: Append story/branch references when available
|
|
416
|
+
if (sectionContext) {
|
|
417
|
+
const storyRef = sectionContext.sessionStory || sectionContext.projectStatus?.currentStory;
|
|
418
|
+
const branchRef = sectionContext.projectStatus?.branch || sectionContext.gitConfig?.branch;
|
|
419
|
+
|
|
420
|
+
const refs = [];
|
|
421
|
+
if (storyRef) {
|
|
422
|
+
refs.push(`Story: ${storyRef}`);
|
|
423
|
+
}
|
|
424
|
+
if (branchRef && branchRef !== 'main' && branchRef !== 'master') {
|
|
425
|
+
refs.push(`Branch: \`${branchRef}\``);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (refs.length > 0) {
|
|
429
|
+
roleText += `\n ${refs.join(' | ')}`;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
return roleText;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* Build project status section
|
|
438
|
+
* Story ACT-7 AC4: Natural language narrative format alongside bullet points.
|
|
439
|
+
* @param {Object} projectStatus - Project status data
|
|
440
|
+
* @param {string} sessionType - Session type
|
|
441
|
+
* @param {Object} [sectionContext] - Enriched section context (Story ACT-7)
|
|
442
|
+
* @returns {string} Formatted project status
|
|
443
|
+
*/
|
|
444
|
+
buildProjectStatus(projectStatus, sessionType = 'full', sectionContext = null) {
|
|
445
|
+
if (!projectStatus) {
|
|
446
|
+
return '';
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Story ACT-7 AC4: Use narrative format when enriched context is available
|
|
450
|
+
if (sectionContext) {
|
|
451
|
+
return this._formatProjectStatusNarrative(projectStatus, sessionType);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Legacy: bullet-point format (backward compatible)
|
|
455
|
+
const format = sessionType === 'workflow' ? 'condensed' : 'full';
|
|
456
|
+
return this._formatProjectStatus(projectStatus, format);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Format project status as natural language narrative.
|
|
461
|
+
* Story ACT-7 AC4: Instead of bullet points, produce human-readable sentences.
|
|
462
|
+
* Example: "You're on branch `feat/act-7` with 3 modified files. Story ACT-7 is in progress."
|
|
463
|
+
* @private
|
|
464
|
+
* @param {Object} status - Project status
|
|
465
|
+
* @param {string} sessionType - Session type
|
|
466
|
+
* @returns {string} Narrative status
|
|
467
|
+
*/
|
|
468
|
+
_formatProjectStatusNarrative(status, sessionType) {
|
|
469
|
+
// Workflow sessions get condensed inline format
|
|
470
|
+
if (sessionType === 'workflow') {
|
|
471
|
+
return this._formatProjectStatus(status, 'condensed');
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
const sentences = [];
|
|
475
|
+
|
|
476
|
+
// Branch + modified files as natural sentence
|
|
477
|
+
if (status.branch) {
|
|
478
|
+
let branchSentence = `You're on branch \`${status.branch}\``;
|
|
479
|
+
const fileCount = status.modifiedFilesTotalCount || 0;
|
|
480
|
+
if (fileCount > 0) {
|
|
481
|
+
branchSentence += ` with ${fileCount} modified file${fileCount !== 1 ? 's' : ''}`;
|
|
482
|
+
}
|
|
483
|
+
branchSentence += '.';
|
|
484
|
+
sentences.push(branchSentence);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// Current story as narrative
|
|
488
|
+
if (status.currentStory) {
|
|
489
|
+
sentences.push(`Story **${status.currentStory}** is in progress.`);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// Recent commits as brief reference
|
|
493
|
+
if (status.recentCommits && status.recentCommits.length > 0) {
|
|
494
|
+
const lastCommit = status.recentCommits[0];
|
|
495
|
+
const commitMsg = typeof lastCommit === 'string' ? lastCommit : lastCommit.message || lastCommit;
|
|
496
|
+
const shortMsg = String(commitMsg).length > 60
|
|
497
|
+
? String(commitMsg).substring(0, 57) + '...'
|
|
498
|
+
: String(commitMsg);
|
|
499
|
+
sentences.push(`Last commit: "${shortMsg}"`);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
if (sentences.length === 0) {
|
|
503
|
+
return '';
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
return `📊 **Project Status:** ${sentences.join(' ')}`;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Format project status (legacy bullet-point format)
|
|
511
|
+
* @private
|
|
512
|
+
* @param {Object} status - Project status
|
|
513
|
+
* @param {string} format - 'full' | 'condensed'
|
|
514
|
+
* @returns {string} Formatted status
|
|
515
|
+
*/
|
|
516
|
+
_formatProjectStatus(status, format) {
|
|
517
|
+
if (format === 'condensed') {
|
|
518
|
+
const parts = [];
|
|
519
|
+
|
|
520
|
+
if (status.branch) {
|
|
521
|
+
parts.push(`🌿 ${status.branch}`);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
if (status.modifiedFilesTotalCount > 0) {
|
|
525
|
+
parts.push(`📝 ${status.modifiedFilesTotalCount} modified`);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
if (status.currentStory) {
|
|
529
|
+
parts.push(`📖 ${status.currentStory}`);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return parts.length > 0 ? `📊 ${parts.join(' | ')}` : '';
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// Full format with emojis
|
|
536
|
+
const lines = [];
|
|
537
|
+
|
|
538
|
+
if (status.branch) {
|
|
539
|
+
lines.push(`🌿 **Branch:** ${status.branch}`);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
if (status.modifiedFiles && status.modifiedFiles.length > 0) {
|
|
543
|
+
let filesDisplay = status.modifiedFiles.join(', ');
|
|
544
|
+
const totalCount = status.modifiedFilesTotalCount || status.modifiedFiles.length;
|
|
545
|
+
if (totalCount > status.modifiedFiles.length) {
|
|
546
|
+
const remaining = totalCount - status.modifiedFiles.length;
|
|
547
|
+
filesDisplay += ` ...and ${remaining} more`;
|
|
548
|
+
}
|
|
549
|
+
lines.push(`📝 **Modified:** ${filesDisplay}`);
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
if (status.recentCommits && status.recentCommits.length > 0) {
|
|
553
|
+
lines.push(`📖 **Recent:** ${status.recentCommits.join(', ')}`);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
if (status.currentStory) {
|
|
557
|
+
lines.push(`📌 **Story:** ${status.currentStory}`);
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
if (lines.length === 0) {
|
|
561
|
+
return '';
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return `📊 **Project Status:**\n - ${lines.join('\n - ')}`;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Build intelligent context section with recommendations
|
|
569
|
+
* Story ACT-7 AC5: References previous agent handoff intelligently.
|
|
570
|
+
* @param {Object} agent - Agent definition
|
|
571
|
+
* @param {Object} context - Session context
|
|
572
|
+
* @param {string} sessionType - Session type
|
|
573
|
+
* @param {Object} projectStatus - Project status
|
|
574
|
+
* @param {Object} [sectionContext] - Enriched section context (Story ACT-7)
|
|
575
|
+
* @returns {string|null} Context section with recommendations
|
|
576
|
+
*/
|
|
577
|
+
buildContextSection(agent, context, sessionType, projectStatus, sectionContext = null) {
|
|
578
|
+
// Skip for new sessions
|
|
579
|
+
if (sessionType === 'new') {
|
|
580
|
+
return null;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
const parts = [];
|
|
584
|
+
|
|
585
|
+
// Build intelligent context narrative
|
|
586
|
+
const contextNarrative = this._buildContextNarrative(agent, context, projectStatus);
|
|
587
|
+
|
|
588
|
+
if (contextNarrative.description) {
|
|
589
|
+
parts.push(`💡 **Context:** ${contextNarrative.description}`);
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Story ACT-7 AC5: Add handoff context when previous agent is detected
|
|
593
|
+
if (sectionContext && sectionContext.previousAgent && !contextNarrative.description) {
|
|
594
|
+
const prevName = this._getPreviousAgentName(context);
|
|
595
|
+
if (prevName) {
|
|
596
|
+
parts.push(`💡 **Context:** Picked up from @${prevName}'s session`);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
if (contextNarrative.recommendedCommand) {
|
|
601
|
+
parts.push(` **Recommended:** Use \`${contextNarrative.recommendedCommand}\` to continue`);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
return parts.length > 0 ? parts.join('\n') : null;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Build intelligent context narrative based on previous work
|
|
609
|
+
* Analyzes files, story, and previous agent to create rich context
|
|
610
|
+
* @private
|
|
611
|
+
*/
|
|
612
|
+
_buildContextNarrative(agent, context, projectStatus) {
|
|
613
|
+
const prevAgentId = this._getPreviousAgentId(context);
|
|
614
|
+
const prevAgentName = this._getPreviousAgentName(context);
|
|
615
|
+
|
|
616
|
+
// Priority 1: Agent transition + Story + Modified files (richest context)
|
|
617
|
+
if (prevAgentId && projectStatus?.modifiedFiles) {
|
|
618
|
+
// Use session story if available (more accurate), otherwise use git story
|
|
619
|
+
const sessionStory = context.sessionStory || projectStatus.currentStory;
|
|
620
|
+
const storyContext = this._analyzeStoryContext({
|
|
621
|
+
...projectStatus,
|
|
622
|
+
currentStory: sessionStory,
|
|
623
|
+
});
|
|
624
|
+
const fileContext = this._analyzeModifiedFiles(projectStatus.modifiedFiles, sessionStory);
|
|
625
|
+
|
|
626
|
+
let description = `Vejo que @${prevAgentName} finalizou os ajustes`;
|
|
627
|
+
|
|
628
|
+
if (fileContext.keyFiles.length > 0) {
|
|
629
|
+
description += ` ${fileContext.summary}`;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
if (storyContext.storyFile) {
|
|
633
|
+
description += ` no **\`${storyContext.storyFile}\`**`;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
description += `. Agora podemos ${this._getAgentAction(agent.id, storyContext)}`;
|
|
637
|
+
|
|
638
|
+
const recommendedCommand = this._suggestCommand(agent.id, prevAgentId, storyContext);
|
|
639
|
+
|
|
640
|
+
return { description, recommendedCommand };
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Priority 2: Agent transition + Story (no file details)
|
|
644
|
+
if (
|
|
645
|
+
prevAgentId &&
|
|
646
|
+
projectStatus?.currentStory &&
|
|
647
|
+
projectStatus.currentStory !== 'EPIC-SPLIT-IMPLEMENTATION-COMPLETE'
|
|
648
|
+
) {
|
|
649
|
+
const storyContext = this._analyzeStoryContext(projectStatus);
|
|
650
|
+
const description = `Continuando do trabalho de @${prevAgentName} em ${projectStatus.currentStory}. ${this._getAgentAction(agent.id, storyContext)}`;
|
|
651
|
+
const recommendedCommand = this._suggestCommand(agent.id, prevAgentId, storyContext);
|
|
652
|
+
|
|
653
|
+
return { description, recommendedCommand };
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// Priority 3: Just agent transition
|
|
657
|
+
if (prevAgentId) {
|
|
658
|
+
const description = `Continuing from @${prevAgentName}`;
|
|
659
|
+
const recommendedCommand = this._suggestCommand(agent.id, prevAgentId, {});
|
|
660
|
+
|
|
661
|
+
return { description, recommendedCommand };
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// Priority 4: Story-based context
|
|
665
|
+
if (
|
|
666
|
+
projectStatus?.currentStory &&
|
|
667
|
+
projectStatus.currentStory !== 'EPIC-SPLIT-IMPLEMENTATION-COMPLETE'
|
|
668
|
+
) {
|
|
669
|
+
const storyContext = this._analyzeStoryContext(projectStatus);
|
|
670
|
+
const description = `Working on ${projectStatus.currentStory}`;
|
|
671
|
+
const recommendedCommand = this._suggestCommand(agent.id, null, storyContext);
|
|
672
|
+
|
|
673
|
+
return { description, recommendedCommand };
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// Priority 5: Last command context
|
|
677
|
+
if (context.lastCommands && context.lastCommands.length > 0) {
|
|
678
|
+
const lastCmd = context.lastCommands[context.lastCommands.length - 1];
|
|
679
|
+
const cmdName = typeof lastCmd === 'object' ? lastCmd.command : lastCmd;
|
|
680
|
+
const description = `Last action: *${cmdName}`;
|
|
681
|
+
|
|
682
|
+
return { description, recommendedCommand: null };
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// Priority 6: Session message
|
|
686
|
+
if (context.sessionMessage) {
|
|
687
|
+
return { description: context.sessionMessage, recommendedCommand: null };
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
return { description: null, recommendedCommand: null };
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
_getPreviousAgentId(context) {
|
|
694
|
+
if (!context.previousAgent) return null;
|
|
695
|
+
return typeof context.previousAgent === 'string'
|
|
696
|
+
? context.previousAgent
|
|
697
|
+
: context.previousAgent.agentId;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
_getPreviousAgentName(context) {
|
|
701
|
+
if (!context.previousAgent) return null;
|
|
702
|
+
return typeof context.previousAgent === 'string'
|
|
703
|
+
? context.previousAgent
|
|
704
|
+
: context.previousAgent.agentName || context.previousAgent.agentId;
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
_analyzeStoryContext(projectStatus) {
|
|
708
|
+
const currentStory = projectStatus.currentStory || '';
|
|
709
|
+
const storyFile = currentStory ? `${currentStory}.md` : null;
|
|
710
|
+
|
|
711
|
+
return {
|
|
712
|
+
storyId: currentStory,
|
|
713
|
+
storyFile: storyFile,
|
|
714
|
+
hasStory: !!currentStory && currentStory !== 'EPIC-SPLIT-IMPLEMENTATION-COMPLETE',
|
|
715
|
+
};
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
_analyzeModifiedFiles(modifiedFiles, _currentStory) {
|
|
719
|
+
if (!modifiedFiles || modifiedFiles.length === 0) {
|
|
720
|
+
return { keyFiles: [], summary: '' };
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
const keyFiles = [];
|
|
724
|
+
const patterns = [
|
|
725
|
+
{
|
|
726
|
+
regex: /greeting-builder\.js/,
|
|
727
|
+
priority: 1,
|
|
728
|
+
desc: 'do **`.grimoire/scripts/greeting-builder.js`**',
|
|
729
|
+
category: 'script',
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
regex: /agent-config-loader\.js/,
|
|
733
|
+
priority: 1,
|
|
734
|
+
desc: 'do **`agent-config-loader.js`**',
|
|
735
|
+
category: 'script',
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
regex: /generate-greeting\.js/,
|
|
739
|
+
priority: 1,
|
|
740
|
+
desc: 'do **`generate-greeting.js`**',
|
|
741
|
+
category: 'script',
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
regex: /session-context-loader\.js/,
|
|
745
|
+
priority: 1,
|
|
746
|
+
desc: 'do **`session-context-loader.js`**',
|
|
747
|
+
category: 'script',
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
regex: /agents\/.*\.md/,
|
|
751
|
+
priority: 1,
|
|
752
|
+
desc: 'das definições de agentes',
|
|
753
|
+
category: 'agent',
|
|
754
|
+
},
|
|
755
|
+
{ regex: /\.md$/, priority: 2, desc: 'dos arquivos de documentação', category: 'doc' },
|
|
756
|
+
];
|
|
757
|
+
|
|
758
|
+
// Find matching key files (avoid duplicates)
|
|
759
|
+
const seenCategories = new Set();
|
|
760
|
+
for (const file of modifiedFiles.slice(0, 5)) {
|
|
761
|
+
// Check first 5 files
|
|
762
|
+
for (const pattern of patterns) {
|
|
763
|
+
if (pattern.regex.test(file) && !seenCategories.has(pattern.category)) {
|
|
764
|
+
keyFiles.push({
|
|
765
|
+
file,
|
|
766
|
+
desc: pattern.desc,
|
|
767
|
+
priority: pattern.priority,
|
|
768
|
+
category: pattern.category,
|
|
769
|
+
});
|
|
770
|
+
seenCategories.add(pattern.category);
|
|
771
|
+
break;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
// Sort by priority and take top 2
|
|
777
|
+
keyFiles.sort((a, b) => a.priority - b.priority);
|
|
778
|
+
const topFiles = keyFiles.slice(0, 2);
|
|
779
|
+
|
|
780
|
+
if (topFiles.length === 0) {
|
|
781
|
+
return { keyFiles: [], summary: 'dos arquivos do projeto' };
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
if (topFiles.length === 1) {
|
|
785
|
+
return { keyFiles: topFiles, summary: topFiles[0].desc };
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
return {
|
|
789
|
+
keyFiles: topFiles,
|
|
790
|
+
summary: `${topFiles[0].desc} e ${topFiles[1].desc}`,
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
_getAgentAction(agentId, _storyContext) {
|
|
795
|
+
const actions = {
|
|
796
|
+
qa: 'revisar a qualidade dessa implementação',
|
|
797
|
+
dev: 'implementar as funcionalidades',
|
|
798
|
+
pm: 'sincronizar o progresso',
|
|
799
|
+
po: 'validar os requisitos',
|
|
800
|
+
sm: 'coordenar o desenvolvimento',
|
|
801
|
+
};
|
|
802
|
+
|
|
803
|
+
return actions[agentId] || 'continuar o trabalho';
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
_suggestCommand(agentId, prevAgentId, storyContext) {
|
|
807
|
+
// Agent transition commands
|
|
808
|
+
if (prevAgentId === 'dev' && agentId === 'qa') {
|
|
809
|
+
return storyContext.storyFile ? `*review ${storyContext.storyFile}` : '*review';
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
if (prevAgentId === 'qa' && agentId === 'dev') {
|
|
813
|
+
return '*apply-qa-fixes';
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
if (prevAgentId === 'po' && agentId === 'dev') {
|
|
817
|
+
return '*develop-yolo';
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
// Role-based commands when no previous agent
|
|
821
|
+
if (agentId === 'qa' && storyContext.storyFile) {
|
|
822
|
+
return `*review ${storyContext.storyFile}`;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
if (agentId === 'dev' && storyContext.hasStory) {
|
|
826
|
+
return '*develop-yolo docs/stories/[story-path].md';
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
if (agentId === 'pm' && storyContext.storyId) {
|
|
830
|
+
return `*sync-story ${storyContext.storyId}`;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
return null;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
/**
|
|
837
|
+
* Build current context section (legacy - kept for compatibility)
|
|
838
|
+
* @param {Object} context - Session context
|
|
839
|
+
* @param {string} sessionType - Session type
|
|
840
|
+
* @param {Object} projectStatus - Project status
|
|
841
|
+
* @returns {string} Context description
|
|
842
|
+
*/
|
|
843
|
+
buildCurrentContext(context, sessionType, projectStatus) {
|
|
844
|
+
if (sessionType === 'workflow' && projectStatus?.currentStory) {
|
|
845
|
+
return `📌 **Context:** Working on ${projectStatus.currentStory}`;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
if (context.lastCommand) {
|
|
849
|
+
return `📌 **Last Action:** ${context.lastCommand}`;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
return '';
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
/**
|
|
856
|
+
* Build workflow suggestions section
|
|
857
|
+
* Story ACT-5: Enhanced with SessionState integration for cross-terminal
|
|
858
|
+
* workflow continuity and SurfaceChecker for proactive suggestions.
|
|
859
|
+
*
|
|
860
|
+
* Detection priority:
|
|
861
|
+
* 1. SessionState (cross-terminal persistence from Epic 11 Story 11.5)
|
|
862
|
+
* 2. Command history (pattern-based detection from workflow-patterns.yaml)
|
|
863
|
+
*
|
|
864
|
+
* @param {Object} context - Session context
|
|
865
|
+
* @returns {string|null} Workflow suggestions or null
|
|
866
|
+
*/
|
|
867
|
+
buildWorkflowSuggestions(context) {
|
|
868
|
+
try {
|
|
869
|
+
// Story ACT-5 (AC: 3, 6): Check SessionState first for cross-terminal continuity
|
|
870
|
+
const sessionStateResult = this._detectWorkflowFromSessionState();
|
|
871
|
+
if (sessionStateResult) {
|
|
872
|
+
return sessionStateResult;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
// Fallback: Pattern-based detection from command history
|
|
876
|
+
const commandHistory = context.commandHistory || context.lastCommands || [];
|
|
877
|
+
const workflowState = this.workflowNavigator.detectWorkflowState(commandHistory, context);
|
|
878
|
+
|
|
879
|
+
if (!workflowState) {
|
|
880
|
+
return null;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
const suggestions = this.workflowNavigator.suggestNextCommands(workflowState);
|
|
884
|
+
if (!suggestions || suggestions.length === 0) {
|
|
885
|
+
return null;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
// Story ACT-5 (AC: 4): Enhance suggestions with SurfaceChecker proactive triggers
|
|
889
|
+
const enhancedSuggestions = this._enhanceSuggestionsWithSurface(suggestions, context);
|
|
890
|
+
|
|
891
|
+
const greetingMessage = this.workflowNavigator.getGreetingMessage(workflowState);
|
|
892
|
+
const header = greetingMessage || 'Next steps:';
|
|
893
|
+
|
|
894
|
+
return this.workflowNavigator.formatSuggestions(enhancedSuggestions, header);
|
|
895
|
+
} catch (error) {
|
|
896
|
+
console.warn('[GreetingBuilder] Workflow suggestions failed:', error.message);
|
|
897
|
+
return null;
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/**
|
|
902
|
+
* Detect workflow state from SessionState for cross-terminal continuity.
|
|
903
|
+
* Story ACT-5 (AC: 3, 6): Reads persisted session state to detect
|
|
904
|
+
* active workflows that span terminal sessions.
|
|
905
|
+
* @private
|
|
906
|
+
* @returns {string|null} Formatted workflow section or null
|
|
907
|
+
*/
|
|
908
|
+
_detectWorkflowFromSessionState() {
|
|
909
|
+
try {
|
|
910
|
+
const projectRoot = process.cwd();
|
|
911
|
+
const sessionState = new SessionState(projectRoot);
|
|
912
|
+
|
|
913
|
+
// Use synchronous existence check to stay within perf budget
|
|
914
|
+
const stateFilePath = sessionState.getStateFilePath();
|
|
915
|
+
if (!fs.existsSync(stateFilePath)) {
|
|
916
|
+
return null;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// Read and parse state file synchronously (fast, local file)
|
|
920
|
+
const content = fs.readFileSync(stateFilePath, 'utf8');
|
|
921
|
+
const stateData = yaml.load(content);
|
|
922
|
+
|
|
923
|
+
if (!stateData?.session_state) {
|
|
924
|
+
return null;
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
const ss = stateData.session_state;
|
|
928
|
+
|
|
929
|
+
// Only show if there is an active workflow with a current story
|
|
930
|
+
if (!ss.progress?.current_story || !ss.workflow?.current_phase) {
|
|
931
|
+
return null;
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
// Build suggestions from session state
|
|
935
|
+
const suggestions = [];
|
|
936
|
+
const currentStory = ss.progress.current_story;
|
|
937
|
+
const currentPhase = ss.workflow.current_phase;
|
|
938
|
+
const storiesDone = ss.progress.stories_done?.length || 0;
|
|
939
|
+
const totalStories = ss.epic?.total_stories || 0;
|
|
940
|
+
|
|
941
|
+
suggestions.push({
|
|
942
|
+
command: `*develop-yolo ${currentStory}`,
|
|
943
|
+
description: `Continue ${currentStory} (phase: ${currentPhase})`,
|
|
944
|
+
raw_command: 'develop-yolo',
|
|
945
|
+
args: currentStory,
|
|
946
|
+
});
|
|
947
|
+
|
|
948
|
+
if (storiesDone > 0 && totalStories > 0) {
|
|
949
|
+
suggestions.push({
|
|
950
|
+
command: `*build-status ${currentStory}`,
|
|
951
|
+
description: `Check build status (${storiesDone}/${totalStories} stories done)`,
|
|
952
|
+
raw_command: 'build-status',
|
|
953
|
+
args: currentStory,
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
const header = `Workflow in progress: ${ss.epic?.title || 'Active Epic'} (${storiesDone}/${totalStories})`;
|
|
958
|
+
return this.workflowNavigator.formatSuggestions(suggestions, header);
|
|
959
|
+
} catch (error) {
|
|
960
|
+
// Graceful degradation: if SessionState is unavailable, return null
|
|
961
|
+
console.warn('[GreetingBuilder] SessionState workflow detection failed:', error.message);
|
|
962
|
+
return null;
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
/**
|
|
967
|
+
* Enhance workflow suggestions with SurfaceChecker proactive triggers.
|
|
968
|
+
* Story ACT-5 (AC: 4): Uses surface conditions to add relevant
|
|
969
|
+
* proactive suggestions (e.g., cost warnings, risk alerts).
|
|
970
|
+
* @private
|
|
971
|
+
* @param {Array} suggestions - Base suggestions from WorkflowNavigator
|
|
972
|
+
* @param {Object} context - Session context
|
|
973
|
+
* @returns {Array} Enhanced suggestions array
|
|
974
|
+
*/
|
|
975
|
+
_enhanceSuggestionsWithSurface(suggestions, context) {
|
|
976
|
+
try {
|
|
977
|
+
const checker = new SurfaceChecker();
|
|
978
|
+
if (!checker.load()) {
|
|
979
|
+
return suggestions; // Graceful: criteria file not found
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// Build surface context from session data
|
|
983
|
+
const surfaceContext = {
|
|
984
|
+
risk_level: context.riskLevel || 'LOW',
|
|
985
|
+
errors_in_task: context.errorsInTask || 0,
|
|
986
|
+
action_type: context.actionType || null,
|
|
987
|
+
};
|
|
988
|
+
|
|
989
|
+
const result = checker.shouldSurface(surfaceContext);
|
|
990
|
+
|
|
991
|
+
if (result.should_surface && result.message) {
|
|
992
|
+
// Prepend a proactive warning suggestion
|
|
993
|
+
return [
|
|
994
|
+
{
|
|
995
|
+
command: '*help',
|
|
996
|
+
description: `[${result.severity}] ${result.message}`,
|
|
997
|
+
raw_command: 'help',
|
|
998
|
+
args: '',
|
|
999
|
+
},
|
|
1000
|
+
...suggestions,
|
|
1001
|
+
];
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
return suggestions;
|
|
1005
|
+
} catch (error) {
|
|
1006
|
+
// Graceful degradation: SurfaceChecker unavailable, return original suggestions
|
|
1007
|
+
console.warn('[GreetingBuilder] SurfaceChecker enhancement failed:', error.message);
|
|
1008
|
+
return suggestions;
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
/**
|
|
1013
|
+
* Build contextual suggestions based on project state
|
|
1014
|
+
* Analyzes current context and suggests relevant next commands
|
|
1015
|
+
* @param {Object} agent - Agent definition
|
|
1016
|
+
* @param {Object} projectStatus - Project status data
|
|
1017
|
+
* @param {string} sessionType - Session type
|
|
1018
|
+
* @returns {string|null} Contextual suggestions or null
|
|
1019
|
+
*/
|
|
1020
|
+
buildContextualSuggestions(agent, projectStatus, _sessionType) {
|
|
1021
|
+
try {
|
|
1022
|
+
const suggestions = [];
|
|
1023
|
+
const agentId = agent.id;
|
|
1024
|
+
|
|
1025
|
+
// Analyze current story status
|
|
1026
|
+
if (projectStatus.currentStory) {
|
|
1027
|
+
const storyMatch = projectStatus.currentStory.match(/(\d+\.\d+\.\d+(\.\d+)?)/);
|
|
1028
|
+
const storyId = storyMatch ? storyMatch[1] : null;
|
|
1029
|
+
|
|
1030
|
+
// QA agent: suggest validation if story is ready
|
|
1031
|
+
if (
|
|
1032
|
+
agentId === 'qa' &&
|
|
1033
|
+
projectStatus.recentCommits &&
|
|
1034
|
+
projectStatus.recentCommits.length > 0
|
|
1035
|
+
) {
|
|
1036
|
+
const recentCommit = projectStatus.recentCommits[0].message;
|
|
1037
|
+
if (recentCommit.includes('complete') || recentCommit.includes('implement')) {
|
|
1038
|
+
if (storyId) {
|
|
1039
|
+
suggestions.push(`*review ${storyId}`);
|
|
1040
|
+
} else {
|
|
1041
|
+
suggestions.push('*code-review committed');
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
// Dev agent: suggest development tasks
|
|
1047
|
+
if (agentId === 'dev' && storyId) {
|
|
1048
|
+
if (projectStatus.modifiedFilesTotalCount > 0) {
|
|
1049
|
+
suggestions.push('*run-tests');
|
|
1050
|
+
}
|
|
1051
|
+
suggestions.push(`*develop-story ${storyId}`);
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
// PM/PO: suggest story/epic management
|
|
1055
|
+
if ((agentId === 'pm' || agentId === 'po') && storyId) {
|
|
1056
|
+
suggestions.push(`*validate-story-draft ${storyId}`);
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
// Analyze modified files
|
|
1061
|
+
if (projectStatus.modifiedFilesTotalCount > 0) {
|
|
1062
|
+
if (agentId === 'qa') {
|
|
1063
|
+
suggestions.push('*code-review uncommitted');
|
|
1064
|
+
}
|
|
1065
|
+
if (agentId === 'dev' && projectStatus.modifiedFilesTotalCount > 5) {
|
|
1066
|
+
suggestions.push('*commit-changes');
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
// Analyze recent work
|
|
1071
|
+
if (projectStatus.recentCommits && projectStatus.recentCommits.length > 0) {
|
|
1072
|
+
const lastCommit = projectStatus.recentCommits[0].message;
|
|
1073
|
+
|
|
1074
|
+
// If last commit was a test, suggest review
|
|
1075
|
+
if (lastCommit.includes('test') && agentId === 'qa') {
|
|
1076
|
+
suggestions.push('*run-tests');
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
// If last commit was a feature, suggest QA
|
|
1080
|
+
if ((lastCommit.includes('feat:') || lastCommit.includes('feature')) && agentId === 'qa') {
|
|
1081
|
+
suggestions.push('*code-review committed');
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
// No suggestions found
|
|
1086
|
+
if (suggestions.length === 0) {
|
|
1087
|
+
return null;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
// Build suggestion message
|
|
1091
|
+
const contextSummary = this._buildContextSummary(projectStatus);
|
|
1092
|
+
const commandsList = suggestions
|
|
1093
|
+
.slice(0, 2) // Limit to 2 suggestions
|
|
1094
|
+
.map((cmd) => ` - \`${cmd}\``)
|
|
1095
|
+
.join('\n');
|
|
1096
|
+
|
|
1097
|
+
return `💡 **Context:** ${contextSummary}\n\n**Suggested Next Steps:**\n${commandsList}`;
|
|
1098
|
+
} catch (error) {
|
|
1099
|
+
console.warn('[GreetingBuilder] Contextual suggestions failed:', error.message);
|
|
1100
|
+
return null;
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
/**
|
|
1105
|
+
* Build context summary based on project status
|
|
1106
|
+
* @private
|
|
1107
|
+
* @param {Object} projectStatus - Project status data
|
|
1108
|
+
* @returns {string} Context summary
|
|
1109
|
+
*/
|
|
1110
|
+
_buildContextSummary(projectStatus) {
|
|
1111
|
+
const parts = [];
|
|
1112
|
+
|
|
1113
|
+
if (projectStatus.currentStory) {
|
|
1114
|
+
parts.push(`Working on ${projectStatus.currentStory}`);
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
if (projectStatus.modifiedFilesTotalCount > 0) {
|
|
1118
|
+
parts.push(`${projectStatus.modifiedFilesTotalCount} files modified`);
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
if (projectStatus.recentCommits && projectStatus.recentCommits.length > 0) {
|
|
1122
|
+
const lastCommit = projectStatus.recentCommits[0].message;
|
|
1123
|
+
const shortMsg = lastCommit.length > 50 ? lastCommit.substring(0, 47) + '...' : lastCommit;
|
|
1124
|
+
parts.push(`Last: "${shortMsg}"`);
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
return parts.join(', ') || 'Ready to start';
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
/**
|
|
1131
|
+
* Build commands section
|
|
1132
|
+
* @param {Array} commands - Filtered commands
|
|
1133
|
+
* @param {string} sessionType - Session type
|
|
1134
|
+
* @returns {string} Commands list
|
|
1135
|
+
*/
|
|
1136
|
+
buildCommands(commands, sessionType) {
|
|
1137
|
+
if (!commands || commands.length === 0) {
|
|
1138
|
+
return '**Commands:** Type `*help` for available commands';
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
const header = this._getCommandsHeader(sessionType);
|
|
1142
|
+
const commandList = commands
|
|
1143
|
+
.slice(0, 12) // Max 12 commands
|
|
1144
|
+
.map((cmd) => {
|
|
1145
|
+
// Handle both object format and string format
|
|
1146
|
+
if (typeof cmd === 'string') {
|
|
1147
|
+
return ` - \`*${cmd}\``;
|
|
1148
|
+
}
|
|
1149
|
+
if (typeof cmd === 'object' && cmd !== null) {
|
|
1150
|
+
const name = cmd.name || cmd.command || String(cmd);
|
|
1151
|
+
const description = cmd.description || '';
|
|
1152
|
+
return description ? ` - \`*${name}\`: ${description}` : ` - \`*${name}\``;
|
|
1153
|
+
}
|
|
1154
|
+
// Fallback for unexpected formats
|
|
1155
|
+
return ` - \`*${String(cmd)}\``;
|
|
1156
|
+
})
|
|
1157
|
+
.filter((cmd) => !cmd.includes('[object Object]')) // Filter out malformed commands
|
|
1158
|
+
.join('\n');
|
|
1159
|
+
|
|
1160
|
+
return `**${header}:**\n${commandList}`;
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
/**
|
|
1164
|
+
* Get commands header based on session type
|
|
1165
|
+
* @private
|
|
1166
|
+
* @param {string} sessionType - Session type
|
|
1167
|
+
* @returns {string} Header text
|
|
1168
|
+
*/
|
|
1169
|
+
_getCommandsHeader(sessionType) {
|
|
1170
|
+
switch (sessionType) {
|
|
1171
|
+
case 'new':
|
|
1172
|
+
return 'Available Commands';
|
|
1173
|
+
case 'existing':
|
|
1174
|
+
return 'Quick Commands';
|
|
1175
|
+
case 'workflow':
|
|
1176
|
+
return 'Key Commands';
|
|
1177
|
+
default:
|
|
1178
|
+
return 'Commands';
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
/**
|
|
1183
|
+
* Build bob mode redirect message for non-PM agents
|
|
1184
|
+
* Story 10.3 - AC4: Show informative message redirecting to Bob
|
|
1185
|
+
* @param {Object} agent - Agent definition (used for personalization)
|
|
1186
|
+
* @returns {string} Redirect message
|
|
1187
|
+
*/
|
|
1188
|
+
buildBobModeRedirect(agent) {
|
|
1189
|
+
const agentName = agent?.name || 'Este agente';
|
|
1190
|
+
return `💡 **Você está no Modo Assistido.**
|
|
1191
|
+
|
|
1192
|
+
${agentName} não está disponível diretamente no Modo Assistido.
|
|
1193
|
+
Use \`@pm\` (Bob) para todas as interações. Bob vai orquestrar os outros agentes internamente para você.
|
|
1194
|
+
|
|
1195
|
+
**Para interagir com Bob:**
|
|
1196
|
+
- Digite \`@pm\` ou \`/grimoire:agents:pm\`
|
|
1197
|
+
- Use \`*help\` após ativar Bob para ver comandos disponíveis`;
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/**
|
|
1201
|
+
* Build footer section
|
|
1202
|
+
* Story ACT-7 AC6: Footer varies by session context.
|
|
1203
|
+
* - new session: full guide prompt + signature
|
|
1204
|
+
* - existing session: brief tip + signature
|
|
1205
|
+
* - workflow session: progress note + signature
|
|
1206
|
+
* @param {Object} agent - Agent definition
|
|
1207
|
+
* @param {Object} [sectionContext] - Enriched section context (Story ACT-7)
|
|
1208
|
+
* @returns {string} Footer text with signature
|
|
1209
|
+
*/
|
|
1210
|
+
buildFooter(agent, sectionContext = null) {
|
|
1211
|
+
const parts = [];
|
|
1212
|
+
|
|
1213
|
+
// Story ACT-7 AC6: Vary footer content by session context
|
|
1214
|
+
// ACT-12: Language delegated to Claude Code settings.json — hardcoded English phrases
|
|
1215
|
+
const sessionType = sectionContext?.sessionType || 'new';
|
|
1216
|
+
|
|
1217
|
+
if (sessionType === 'workflow') {
|
|
1218
|
+
// Workflow: progress note
|
|
1219
|
+
const storyRef = sectionContext?.sessionStory || sectionContext?.projectStatus?.currentStory;
|
|
1220
|
+
if (storyRef) {
|
|
1221
|
+
parts.push(`Focused on **${storyRef}**. Type \`*help\` to see available commands.`);
|
|
1222
|
+
} else {
|
|
1223
|
+
parts.push('Workflow active. Type `*help` to see available commands.');
|
|
1224
|
+
}
|
|
1225
|
+
} else if (sessionType === 'existing') {
|
|
1226
|
+
// Existing session: brief tip with session-info reference
|
|
1227
|
+
parts.push('Type `*help` for commands or `*session-info` for session details.');
|
|
1228
|
+
} else {
|
|
1229
|
+
// New session: full guide prompt
|
|
1230
|
+
parts.push('Type `*guide` for comprehensive usage instructions.');
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
// Add agent signature if available
|
|
1234
|
+
if (
|
|
1235
|
+
agent &&
|
|
1236
|
+
agent.persona_profile &&
|
|
1237
|
+
agent.persona_profile.communication &&
|
|
1238
|
+
agent.persona_profile.communication.signature_closing
|
|
1239
|
+
) {
|
|
1240
|
+
parts.push('');
|
|
1241
|
+
parts.push(agent.persona_profile.communication.signature_closing);
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
return parts.join('\n');
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
/**
|
|
1248
|
+
* Build git warning section
|
|
1249
|
+
* @returns {string} Git warning message
|
|
1250
|
+
*/
|
|
1251
|
+
buildGitWarning() {
|
|
1252
|
+
return GIT_WARNING_TEMPLATE.trim();
|
|
1253
|
+
}
|
|
1254
|
+
|
|
1255
|
+
/**
|
|
1256
|
+
* Filter commands by visibility metadata and user profile
|
|
1257
|
+
* Story 10.3 - AC1, AC2, AC3: Profile-aware command filtering
|
|
1258
|
+
* @param {Object} agent - Agent definition
|
|
1259
|
+
* @param {string} sessionType - Session type
|
|
1260
|
+
* @param {string} userProfile - User profile ('bob' | 'advanced')
|
|
1261
|
+
* @returns {Array} Filtered commands
|
|
1262
|
+
*/
|
|
1263
|
+
filterCommandsByVisibility(agent, sessionType, userProfile = DEFAULT_USER_PROFILE) {
|
|
1264
|
+
if (!agent.commands || agent.commands.length === 0) {
|
|
1265
|
+
return [];
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
// Story 10.3 - AC1, AC2: Profile-based filtering
|
|
1269
|
+
// If bob mode AND not PM agent: return empty (will show redirect message instead)
|
|
1270
|
+
if (userProfile === 'bob' && agent.id !== 'pm') {
|
|
1271
|
+
return [];
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
// Story 10.3 - AC5: PM agent shows all commands in bob mode
|
|
1275
|
+
// Story 10.3 - AC2: Advanced mode shows commands normally (current behavior)
|
|
1276
|
+
const visibilityFilter = this._getVisibilityFilter(sessionType);
|
|
1277
|
+
|
|
1278
|
+
// Filter commands with visibility metadata
|
|
1279
|
+
const commandsWithMetadata = agent.commands.filter((cmd) => {
|
|
1280
|
+
if (!cmd.visibility || !Array.isArray(cmd.visibility)) {
|
|
1281
|
+
return false; // No metadata, exclude from filtered list
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
return cmd.visibility.includes(visibilityFilter);
|
|
1285
|
+
});
|
|
1286
|
+
|
|
1287
|
+
// If we have metadata-based commands, use them
|
|
1288
|
+
if (commandsWithMetadata.length > 0) {
|
|
1289
|
+
return commandsWithMetadata;
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
// Backwards compatibility: No metadata found, show first 12 commands
|
|
1293
|
+
return agent.commands.slice(0, 12);
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
/**
|
|
1297
|
+
* Get visibility filter for session type
|
|
1298
|
+
* @private
|
|
1299
|
+
* @param {string} sessionType - Session type
|
|
1300
|
+
* @returns {string} Visibility level ('full', 'quick', 'key')
|
|
1301
|
+
*/
|
|
1302
|
+
_getVisibilityFilter(sessionType) {
|
|
1303
|
+
switch (sessionType) {
|
|
1304
|
+
case 'new':
|
|
1305
|
+
return 'full';
|
|
1306
|
+
case 'existing':
|
|
1307
|
+
return 'quick';
|
|
1308
|
+
case 'workflow':
|
|
1309
|
+
return 'key';
|
|
1310
|
+
default:
|
|
1311
|
+
return 'full';
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
/**
|
|
1316
|
+
* Safe session type detection with fallback
|
|
1317
|
+
* @private
|
|
1318
|
+
* @param {Object} context - Session context
|
|
1319
|
+
* @returns {Promise<string>} Session type
|
|
1320
|
+
*/
|
|
1321
|
+
async _safeDetectSessionType(context) {
|
|
1322
|
+
try {
|
|
1323
|
+
const conversationHistory = context.conversationHistory || [];
|
|
1324
|
+
return this.contextDetector.detectSessionType(conversationHistory);
|
|
1325
|
+
} catch (error) {
|
|
1326
|
+
console.warn('[GreetingBuilder] Session detection failed:', error.message);
|
|
1327
|
+
return 'new'; // Conservative default
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
/**
|
|
1332
|
+
* Safe git config check with fallback
|
|
1333
|
+
* @private
|
|
1334
|
+
* @returns {Promise<Object>} Git config result
|
|
1335
|
+
*/
|
|
1336
|
+
async _safeCheckGitConfig() {
|
|
1337
|
+
try {
|
|
1338
|
+
return this.gitConfigDetector.get();
|
|
1339
|
+
} catch (error) {
|
|
1340
|
+
console.warn('[GreetingBuilder] Git config check failed:', error.message);
|
|
1341
|
+
return { configured: false, type: null, branch: null };
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
/**
|
|
1346
|
+
* Safe project status load with fallback
|
|
1347
|
+
* @private
|
|
1348
|
+
* @returns {Promise<Object|null>} Project status or null
|
|
1349
|
+
*/
|
|
1350
|
+
async _safeLoadProjectStatus() {
|
|
1351
|
+
try {
|
|
1352
|
+
return await loadProjectStatus();
|
|
1353
|
+
} catch (error) {
|
|
1354
|
+
console.warn('[GreetingBuilder] Project status load failed:', error.message);
|
|
1355
|
+
return null;
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
/**
|
|
1360
|
+
* Safe permission badge retrieval with fallback
|
|
1361
|
+
* @private
|
|
1362
|
+
* @returns {Promise<string>} Permission mode badge or empty string
|
|
1363
|
+
*/
|
|
1364
|
+
async _safeGetPermissionBadge() {
|
|
1365
|
+
try {
|
|
1366
|
+
const mode = new PermissionMode();
|
|
1367
|
+
await mode.load();
|
|
1368
|
+
return mode.getBadge();
|
|
1369
|
+
} catch (error) {
|
|
1370
|
+
console.warn('[GreetingBuilder] Permission mode load failed:', error.message);
|
|
1371
|
+
return '';
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1375
|
+
/**
|
|
1376
|
+
* Check if git warning should be shown
|
|
1377
|
+
* @private
|
|
1378
|
+
* @returns {boolean} True if should show warning
|
|
1379
|
+
*/
|
|
1380
|
+
_shouldShowGitWarning() {
|
|
1381
|
+
if (!this.config || !this.config.git) {
|
|
1382
|
+
return true; // Default: show warning
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
return this.config.git.showConfigWarning !== false;
|
|
1386
|
+
}
|
|
1387
|
+
|
|
1388
|
+
/**
|
|
1389
|
+
* Load core configuration
|
|
1390
|
+
* @private
|
|
1391
|
+
* @returns {Object|null} Configuration or null
|
|
1392
|
+
*/
|
|
1393
|
+
_loadConfig() {
|
|
1394
|
+
try {
|
|
1395
|
+
const configPath = path.join(process.cwd(), '.grimoire', 'core-config.yaml');
|
|
1396
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
1397
|
+
return yaml.load(content);
|
|
1398
|
+
} catch (_error) {
|
|
1399
|
+
return null;
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
module.exports = GreetingBuilder;
|
|
1405
|
+
|
|
1406
|
+
|