@josstei/maestro 1.6.4-nightly.20260430
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/.agents/plugins/marketplace.json +20 -0
- package/CHANGELOG.md +486 -0
- package/EXAMPLES.md +255 -0
- package/GEMINI.md +251 -0
- package/LICENSE +201 -0
- package/QWEN.md +274 -0
- package/README.md +220 -0
- package/agents/accessibility_specialist.md +20 -0
- package/agents/analytics_engineer.md +22 -0
- package/agents/api_designer.md +19 -0
- package/agents/architect.md +19 -0
- package/agents/cloud_architect.md +19 -0
- package/agents/cobol_engineer.md +22 -0
- package/agents/code_reviewer.md +17 -0
- package/agents/coder.md +22 -0
- package/agents/compliance_reviewer.md +19 -0
- package/agents/content_strategist.md +19 -0
- package/agents/copywriter.md +19 -0
- package/agents/data_engineer.md +22 -0
- package/agents/database_administrator.md +21 -0
- package/agents/db2_dba.md +21 -0
- package/agents/debugger.md +19 -0
- package/agents/design_system_engineer.md +22 -0
- package/agents/devops_engineer.md +23 -0
- package/agents/hlasm_assembler_specialist.md +22 -0
- package/agents/i18n_specialist.md +21 -0
- package/agents/ibm_i_specialist.md +22 -0
- package/agents/integration_engineer.md +23 -0
- package/agents/ml_engineer.md +23 -0
- package/agents/mlops_engineer.md +23 -0
- package/agents/mobile_engineer.md +23 -0
- package/agents/observability_engineer.md +23 -0
- package/agents/performance_engineer.md +21 -0
- package/agents/platform_engineer.md +24 -0
- package/agents/product_manager.md +20 -0
- package/agents/prompt_engineer.md +22 -0
- package/agents/refactor.md +22 -0
- package/agents/release_manager.md +22 -0
- package/agents/security_engineer.md +21 -0
- package/agents/seo_specialist.md +21 -0
- package/agents/site_reliability_engineer.md +21 -0
- package/agents/solutions_architect.md +19 -0
- package/agents/technical_writer.md +21 -0
- package/agents/tester.md +23 -0
- package/agents/ux_designer.md +20 -0
- package/agents/zos_sysprog.md +21 -0
- package/bin/maestro-mcp-server.js +10 -0
- package/claude/.claude-plugin/plugin.json +21 -0
- package/claude/.mcp.json +11 -0
- package/claude/README.md +191 -0
- package/claude/agents/accessibility-specialist.md +36 -0
- package/claude/agents/analytics-engineer.md +38 -0
- package/claude/agents/api-designer.md +33 -0
- package/claude/agents/architect.md +33 -0
- package/claude/agents/cloud-architect.md +33 -0
- package/claude/agents/cobol-engineer.md +38 -0
- package/claude/agents/code-reviewer.md +31 -0
- package/claude/agents/coder.md +38 -0
- package/claude/agents/compliance-reviewer.md +33 -0
- package/claude/agents/content-strategist.md +33 -0
- package/claude/agents/copywriter.md +33 -0
- package/claude/agents/data-engineer.md +37 -0
- package/claude/agents/database-administrator.md +37 -0
- package/claude/agents/db2-dba.md +37 -0
- package/claude/agents/debugger.md +32 -0
- package/claude/agents/design-system-engineer.md +38 -0
- package/claude/agents/devops-engineer.md +39 -0
- package/claude/agents/hlasm-assembler-specialist.md +38 -0
- package/claude/agents/i18n-specialist.md +37 -0
- package/claude/agents/ibm-i-specialist.md +38 -0
- package/claude/agents/integration-engineer.md +39 -0
- package/claude/agents/ml-engineer.md +39 -0
- package/claude/agents/mlops-engineer.md +39 -0
- package/claude/agents/mobile-engineer.md +39 -0
- package/claude/agents/observability-engineer.md +39 -0
- package/claude/agents/performance-engineer.md +34 -0
- package/claude/agents/platform-engineer.md +40 -0
- package/claude/agents/product-manager.md +34 -0
- package/claude/agents/prompt-engineer.md +38 -0
- package/claude/agents/refactor.md +38 -0
- package/claude/agents/release-manager.md +38 -0
- package/claude/agents/security-engineer.md +37 -0
- package/claude/agents/seo-specialist.md +37 -0
- package/claude/agents/site-reliability-engineer.md +37 -0
- package/claude/agents/solutions-architect.md +33 -0
- package/claude/agents/technical-writer.md +37 -0
- package/claude/agents/tester.md +39 -0
- package/claude/agents/ux-designer.md +34 -0
- package/claude/agents/zos-sysprog.md +37 -0
- package/claude/hooks/claude-hooks.json +48 -0
- package/claude/mcp/maestro-server.js +9 -0
- package/claude/mcp-config.example.json +9 -0
- package/claude/scripts/adapters/claude-adapter.js +7 -0
- package/claude/scripts/hook-runner.js +8 -0
- package/claude/scripts/policy-enforcer.js +294 -0
- package/claude/skills/a11y-audit/SKILL.md +26 -0
- package/claude/skills/archive/SKILL.md +24 -0
- package/claude/skills/code-review/SKILL.md +7 -0
- package/claude/skills/compliance-check/SKILL.md +26 -0
- package/claude/skills/debug-workflow/SKILL.md +27 -0
- package/claude/skills/delegation/SKILL.md +7 -0
- package/claude/skills/design-dialogue/SKILL.md +7 -0
- package/claude/skills/execute/SKILL.md +38 -0
- package/claude/skills/execution/SKILL.md +7 -0
- package/claude/skills/implementation-planning/SKILL.md +7 -0
- package/claude/skills/orchestrate/SKILL.md +38 -0
- package/claude/skills/perf-check/SKILL.md +26 -0
- package/claude/skills/resume-session/SKILL.md +38 -0
- package/claude/skills/review-code/SKILL.md +27 -0
- package/claude/skills/security-audit/SKILL.md +28 -0
- package/claude/skills/seo-audit/SKILL.md +26 -0
- package/claude/skills/session-management/SKILL.md +7 -0
- package/claude/skills/status/SKILL.md +22 -0
- package/claude/skills/validation/SKILL.md +7 -0
- package/claude/src/agents/accessibility-specialist.md +163 -0
- package/claude/src/agents/analytics-engineer.md +182 -0
- package/claude/src/agents/api-designer.md +124 -0
- package/claude/src/agents/architect.md +120 -0
- package/claude/src/agents/cloud-architect.md +134 -0
- package/claude/src/agents/cobol-engineer.md +127 -0
- package/claude/src/agents/code-reviewer.md +123 -0
- package/claude/src/agents/coder.md +132 -0
- package/claude/src/agents/compliance-reviewer.md +219 -0
- package/claude/src/agents/content-strategist.md +111 -0
- package/claude/src/agents/copywriter.md +113 -0
- package/claude/src/agents/data-engineer.md +130 -0
- package/claude/src/agents/database-administrator.md +126 -0
- package/claude/src/agents/db2-dba.md +124 -0
- package/claude/src/agents/debugger.md +133 -0
- package/claude/src/agents/design-system-engineer.md +258 -0
- package/claude/src/agents/devops-engineer.md +138 -0
- package/claude/src/agents/hlasm-assembler-specialist.md +134 -0
- package/claude/src/agents/i18n-specialist.md +241 -0
- package/claude/src/agents/ibm-i-specialist.md +132 -0
- package/claude/src/agents/integration-engineer.md +133 -0
- package/claude/src/agents/ml-engineer.md +115 -0
- package/claude/src/agents/mlops-engineer.md +116 -0
- package/claude/src/agents/mobile-engineer.md +115 -0
- package/claude/src/agents/observability-engineer.md +133 -0
- package/claude/src/agents/performance-engineer.md +139 -0
- package/claude/src/agents/platform-engineer.md +129 -0
- package/claude/src/agents/product-manager.md +170 -0
- package/claude/src/agents/prompt-engineer.md +129 -0
- package/claude/src/agents/refactor.md +138 -0
- package/claude/src/agents/release-manager.md +132 -0
- package/claude/src/agents/security-engineer.md +143 -0
- package/claude/src/agents/seo-specialist.md +129 -0
- package/claude/src/agents/site-reliability-engineer.md +131 -0
- package/claude/src/agents/solutions-architect.md +137 -0
- package/claude/src/agents/technical-writer.md +129 -0
- package/claude/src/agents/tester.md +135 -0
- package/claude/src/agents/ux-designer.md +168 -0
- package/claude/src/agents/zos-sysprog.md +134 -0
- package/claude/src/config/setting-resolver.js +32 -0
- package/claude/src/core/agent-registry.js +67 -0
- package/claude/src/core/canonical-source.js +39 -0
- package/claude/src/core/env-file-parser.js +82 -0
- package/claude/src/core/feature-blocks.js +34 -0
- package/claude/src/core/logger.js +12 -0
- package/claude/src/core/markdown-state.js +36 -0
- package/claude/src/core/policy-rules.js +32 -0
- package/claude/src/core/project-root-resolver.js +184 -0
- package/claude/src/core/stdin-reader.js +77 -0
- package/claude/src/core/version.js +50 -0
- package/claude/src/entry-points/core-command-registry.js +37 -0
- package/claude/src/entry-points/preamble-builders.js +54 -0
- package/claude/src/entry-points/registry.js +199 -0
- package/claude/src/entry-points/templates/claude-core-command.md.tmpl +38 -0
- package/claude/src/entry-points/templates/claude-skill.md.tmpl +18 -0
- package/claude/src/entry-points/templates/codex-core-command.md.tmpl +16 -0
- package/claude/src/entry-points/templates/codex-skill.md.tmpl +11 -0
- package/claude/src/entry-points/templates/gemini-command.toml.tmpl +17 -0
- package/claude/src/entry-points/templates/gemini-core-command.toml.tmpl +30 -0
- package/claude/src/generated/agent-registry.json +630 -0
- package/claude/src/generated/hook-registry.json +18 -0
- package/claude/src/generated/resource-registry.json +16 -0
- package/claude/src/hooks/logic/after-agent-logic.js +54 -0
- package/claude/src/hooks/logic/before-agent-logic.js +57 -0
- package/claude/src/hooks/logic/hook-state.js +127 -0
- package/claude/src/hooks/logic/session-end-logic.js +17 -0
- package/claude/src/hooks/logic/session-start-logic.js +25 -0
- package/claude/src/lib/discovery/index.js +172 -0
- package/claude/src/lib/errors/index.js +104 -0
- package/claude/src/lib/framework-detection.js +50 -0
- package/claude/src/lib/frontmatter/index.js +262 -0
- package/claude/src/lib/io/index.js +96 -0
- package/claude/src/lib/naming/index.js +94 -0
- package/claude/src/lib/validation/index.js +124 -0
- package/claude/src/lib/yaml-emit.js +38 -0
- package/claude/src/mcp/content/provider.js +68 -0
- package/claude/src/mcp/content/runtime-content.js +188 -0
- package/claude/src/mcp/contracts/cache-path-rejector.js +39 -0
- package/claude/src/mcp/contracts/downstream-context.js +106 -0
- package/claude/src/mcp/contracts/plan-schema.js +148 -0
- package/claude/src/mcp/contracts/workspace-marker.js +61 -0
- package/claude/src/mcp/core/create-server.js +76 -0
- package/claude/src/mcp/core/line-reader.js +35 -0
- package/claude/src/mcp/core/project-root-cache.js +120 -0
- package/claude/src/mcp/core/protocol-dispatcher.js +274 -0
- package/claude/src/mcp/core/recovery-hints.js +43 -0
- package/claude/src/mcp/core/tool-outcome.js +77 -0
- package/claude/src/mcp/core/tool-registry.js +82 -0
- package/claude/src/mcp/handlers/assess-task-complexity.js +108 -0
- package/claude/src/mcp/handlers/blocker-parser.js +34 -0
- package/claude/src/mcp/handlers/design-gate.js +393 -0
- package/claude/src/mcp/handlers/get-agent.js +54 -0
- package/claude/src/mcp/handlers/get-runtime-context.js +49 -0
- package/claude/src/mcp/handlers/get-skill-content.js +51 -0
- package/claude/src/mcp/handlers/initialize-workspace.js +45 -0
- package/claude/src/mcp/handlers/reconciliation.js +224 -0
- package/claude/src/mcp/handlers/resolve-settings.js +39 -0
- package/claude/src/mcp/handlers/session-state-core.js +108 -0
- package/claude/src/mcp/handlers/session-state-tools.js +562 -0
- package/claude/src/mcp/handlers/validate-plan.js +76 -0
- package/claude/src/mcp/maestro-server.js +122 -0
- package/claude/src/mcp/runtime/runtime-config-map.js +70 -0
- package/claude/src/mcp/tool-packs/content/index.js +80 -0
- package/claude/src/mcp/tool-packs/contracts.js +30 -0
- package/claude/src/mcp/tool-packs/index.js +15 -0
- package/claude/src/mcp/tool-packs/session/index.js +243 -0
- package/claude/src/mcp/tool-packs/workspace/index.js +98 -0
- package/claude/src/mcp/utils/extension-root.js +31 -0
- package/claude/src/mcp/validation/agent-checker.js +81 -0
- package/claude/src/mcp/validation/dag-checker.js +214 -0
- package/claude/src/mcp/validation/file-overlap-checker.js +63 -0
- package/claude/src/mcp/validation/schema-checker.js +108 -0
- package/claude/src/platforms/claude/runtime-config.js +60 -0
- package/claude/src/platforms/shared/adapters/claude-adapter.js +36 -0
- package/claude/src/platforms/shared/adapters/conventions.js +29 -0
- package/claude/src/platforms/shared/adapters/exit-codes.js +6 -0
- package/claude/src/platforms/shared/adapters/factory.js +40 -0
- package/claude/src/platforms/shared/agent-names.js +15 -0
- package/claude/src/platforms/shared/hook-runner.js +52 -0
- package/claude/src/references/architecture.md +139 -0
- package/claude/src/references/orchestration-steps.md +193 -0
- package/claude/src/skills/shared/code-review/SKILL.md +145 -0
- package/claude/src/skills/shared/delegation/SKILL.md +387 -0
- package/claude/src/skills/shared/delegation/protocols/agent-base-protocol.md +145 -0
- package/claude/src/skills/shared/delegation/protocols/filesystem-safety-protocol.md +31 -0
- package/claude/src/skills/shared/design-dialogue/SKILL.md +284 -0
- package/claude/src/skills/shared/execution/SKILL.md +258 -0
- package/claude/src/skills/shared/implementation-planning/SKILL.md +307 -0
- package/claude/src/skills/shared/session-management/SKILL.md +314 -0
- package/claude/src/skills/shared/validation/SKILL.md +204 -0
- package/claude/src/state/session-state.js +113 -0
- package/claude/src/templates/design-document.md +95 -0
- package/claude/src/templates/implementation-plan.md +86 -0
- package/claude/src/templates/session-state.md +68 -0
- package/claude/src/version.json +3 -0
- package/commands/maestro/a11y-audit.toml +22 -0
- package/commands/maestro/archive.toml +23 -0
- package/commands/maestro/compliance-check.toml +22 -0
- package/commands/maestro/debug.toml +23 -0
- package/commands/maestro/execute.toml +30 -0
- package/commands/maestro/orchestrate.toml +30 -0
- package/commands/maestro/perf-check.toml +22 -0
- package/commands/maestro/resume.toml +38 -0
- package/commands/maestro/review.toml +23 -0
- package/commands/maestro/security-audit.toml +24 -0
- package/commands/maestro/seo-audit.toml +22 -0
- package/commands/maestro/status.toml +21 -0
- package/docs/architecture.md +323 -0
- package/docs/cicd.md +658 -0
- package/docs/flow.md +266 -0
- package/docs/maestro-cheatsheet.md +207 -0
- package/docs/overview.md +141 -0
- package/docs/runtime-claude.md +190 -0
- package/docs/runtime-codex.md +197 -0
- package/docs/runtime-gemini.md +173 -0
- package/docs/runtime-qwen.md +150 -0
- package/docs/usage.md +315 -0
- package/gemini-extension.json +56 -0
- package/hooks/adapters/gemini-adapter.js +2 -0
- package/hooks/adapters/qwen-adapter.js +2 -0
- package/hooks/hook-runner.js +3 -0
- package/hooks/hooks.json +56 -0
- package/mcp/maestro-server.js +4 -0
- package/package.json +93 -0
- package/plugins/maestro/.app.json +3 -0
- package/plugins/maestro/.codex-plugin/plugin.json +41 -0
- package/plugins/maestro/.mcp.json +16 -0
- package/plugins/maestro/README.md +57 -0
- package/plugins/maestro/references/runtime-guide.md +125 -0
- package/plugins/maestro/skills/a11y-audit/SKILL.md +16 -0
- package/plugins/maestro/skills/archive/SKILL.md +16 -0
- package/plugins/maestro/skills/code-review/SKILL.md +6 -0
- package/plugins/maestro/skills/compliance-check/SKILL.md +16 -0
- package/plugins/maestro/skills/debug-workflow/SKILL.md +16 -0
- package/plugins/maestro/skills/delegation/SKILL.md +6 -0
- package/plugins/maestro/skills/design-dialogue/SKILL.md +6 -0
- package/plugins/maestro/skills/execute/SKILL.md +16 -0
- package/plugins/maestro/skills/execution/SKILL.md +6 -0
- package/plugins/maestro/skills/implementation-planning/SKILL.md +6 -0
- package/plugins/maestro/skills/orchestrate/SKILL.md +16 -0
- package/plugins/maestro/skills/perf-check/SKILL.md +16 -0
- package/plugins/maestro/skills/resume-session/SKILL.md +16 -0
- package/plugins/maestro/skills/review-code/SKILL.md +16 -0
- package/plugins/maestro/skills/security-audit/SKILL.md +16 -0
- package/plugins/maestro/skills/seo-audit/SKILL.md +16 -0
- package/plugins/maestro/skills/session-management/SKILL.md +6 -0
- package/plugins/maestro/skills/status/SKILL.md +14 -0
- package/plugins/maestro/skills/validation/SKILL.md +6 -0
- package/plugins/maestro/src/agents/accessibility-specialist.md +163 -0
- package/plugins/maestro/src/agents/analytics-engineer.md +182 -0
- package/plugins/maestro/src/agents/api-designer.md +124 -0
- package/plugins/maestro/src/agents/architect.md +120 -0
- package/plugins/maestro/src/agents/cloud-architect.md +134 -0
- package/plugins/maestro/src/agents/cobol-engineer.md +127 -0
- package/plugins/maestro/src/agents/code-reviewer.md +123 -0
- package/plugins/maestro/src/agents/coder.md +132 -0
- package/plugins/maestro/src/agents/compliance-reviewer.md +219 -0
- package/plugins/maestro/src/agents/content-strategist.md +111 -0
- package/plugins/maestro/src/agents/copywriter.md +113 -0
- package/plugins/maestro/src/agents/data-engineer.md +130 -0
- package/plugins/maestro/src/agents/database-administrator.md +126 -0
- package/plugins/maestro/src/agents/db2-dba.md +124 -0
- package/plugins/maestro/src/agents/debugger.md +133 -0
- package/plugins/maestro/src/agents/design-system-engineer.md +258 -0
- package/plugins/maestro/src/agents/devops-engineer.md +138 -0
- package/plugins/maestro/src/agents/hlasm-assembler-specialist.md +134 -0
- package/plugins/maestro/src/agents/i18n-specialist.md +241 -0
- package/plugins/maestro/src/agents/ibm-i-specialist.md +132 -0
- package/plugins/maestro/src/agents/integration-engineer.md +133 -0
- package/plugins/maestro/src/agents/ml-engineer.md +115 -0
- package/plugins/maestro/src/agents/mlops-engineer.md +116 -0
- package/plugins/maestro/src/agents/mobile-engineer.md +115 -0
- package/plugins/maestro/src/agents/observability-engineer.md +133 -0
- package/plugins/maestro/src/agents/performance-engineer.md +139 -0
- package/plugins/maestro/src/agents/platform-engineer.md +129 -0
- package/plugins/maestro/src/agents/product-manager.md +170 -0
- package/plugins/maestro/src/agents/prompt-engineer.md +129 -0
- package/plugins/maestro/src/agents/refactor.md +138 -0
- package/plugins/maestro/src/agents/release-manager.md +132 -0
- package/plugins/maestro/src/agents/security-engineer.md +143 -0
- package/plugins/maestro/src/agents/seo-specialist.md +129 -0
- package/plugins/maestro/src/agents/site-reliability-engineer.md +131 -0
- package/plugins/maestro/src/agents/solutions-architect.md +137 -0
- package/plugins/maestro/src/agents/technical-writer.md +129 -0
- package/plugins/maestro/src/agents/tester.md +135 -0
- package/plugins/maestro/src/agents/ux-designer.md +168 -0
- package/plugins/maestro/src/agents/zos-sysprog.md +134 -0
- package/plugins/maestro/src/config/setting-resolver.js +32 -0
- package/plugins/maestro/src/core/agent-registry.js +67 -0
- package/plugins/maestro/src/core/canonical-source.js +39 -0
- package/plugins/maestro/src/core/env-file-parser.js +82 -0
- package/plugins/maestro/src/core/feature-blocks.js +34 -0
- package/plugins/maestro/src/core/logger.js +12 -0
- package/plugins/maestro/src/core/markdown-state.js +36 -0
- package/plugins/maestro/src/core/policy-rules.js +32 -0
- package/plugins/maestro/src/core/project-root-resolver.js +184 -0
- package/plugins/maestro/src/core/stdin-reader.js +77 -0
- package/plugins/maestro/src/core/version.js +50 -0
- package/plugins/maestro/src/entry-points/core-command-registry.js +37 -0
- package/plugins/maestro/src/entry-points/preamble-builders.js +54 -0
- package/plugins/maestro/src/entry-points/registry.js +199 -0
- package/plugins/maestro/src/entry-points/templates/claude-core-command.md.tmpl +38 -0
- package/plugins/maestro/src/entry-points/templates/claude-skill.md.tmpl +18 -0
- package/plugins/maestro/src/entry-points/templates/codex-core-command.md.tmpl +16 -0
- package/plugins/maestro/src/entry-points/templates/codex-skill.md.tmpl +11 -0
- package/plugins/maestro/src/entry-points/templates/gemini-command.toml.tmpl +17 -0
- package/plugins/maestro/src/entry-points/templates/gemini-core-command.toml.tmpl +30 -0
- package/plugins/maestro/src/generated/agent-registry.json +630 -0
- package/plugins/maestro/src/generated/hook-registry.json +18 -0
- package/plugins/maestro/src/generated/resource-registry.json +16 -0
- package/plugins/maestro/src/hooks/logic/after-agent-logic.js +54 -0
- package/plugins/maestro/src/hooks/logic/before-agent-logic.js +57 -0
- package/plugins/maestro/src/hooks/logic/hook-state.js +127 -0
- package/plugins/maestro/src/hooks/logic/session-end-logic.js +17 -0
- package/plugins/maestro/src/hooks/logic/session-start-logic.js +25 -0
- package/plugins/maestro/src/lib/discovery/index.js +172 -0
- package/plugins/maestro/src/lib/errors/index.js +104 -0
- package/plugins/maestro/src/lib/framework-detection.js +50 -0
- package/plugins/maestro/src/lib/frontmatter/index.js +262 -0
- package/plugins/maestro/src/lib/io/index.js +96 -0
- package/plugins/maestro/src/lib/naming/index.js +94 -0
- package/plugins/maestro/src/lib/validation/index.js +124 -0
- package/plugins/maestro/src/lib/yaml-emit.js +38 -0
- package/plugins/maestro/src/mcp/content/provider.js +68 -0
- package/plugins/maestro/src/mcp/content/runtime-content.js +188 -0
- package/plugins/maestro/src/mcp/contracts/cache-path-rejector.js +39 -0
- package/plugins/maestro/src/mcp/contracts/downstream-context.js +106 -0
- package/plugins/maestro/src/mcp/contracts/plan-schema.js +148 -0
- package/plugins/maestro/src/mcp/contracts/workspace-marker.js +61 -0
- package/plugins/maestro/src/mcp/core/create-server.js +76 -0
- package/plugins/maestro/src/mcp/core/line-reader.js +35 -0
- package/plugins/maestro/src/mcp/core/project-root-cache.js +120 -0
- package/plugins/maestro/src/mcp/core/protocol-dispatcher.js +274 -0
- package/plugins/maestro/src/mcp/core/recovery-hints.js +43 -0
- package/plugins/maestro/src/mcp/core/tool-outcome.js +77 -0
- package/plugins/maestro/src/mcp/core/tool-registry.js +82 -0
- package/plugins/maestro/src/mcp/handlers/assess-task-complexity.js +108 -0
- package/plugins/maestro/src/mcp/handlers/blocker-parser.js +34 -0
- package/plugins/maestro/src/mcp/handlers/design-gate.js +393 -0
- package/plugins/maestro/src/mcp/handlers/get-agent.js +54 -0
- package/plugins/maestro/src/mcp/handlers/get-runtime-context.js +49 -0
- package/plugins/maestro/src/mcp/handlers/get-skill-content.js +51 -0
- package/plugins/maestro/src/mcp/handlers/initialize-workspace.js +45 -0
- package/plugins/maestro/src/mcp/handlers/reconciliation.js +224 -0
- package/plugins/maestro/src/mcp/handlers/resolve-settings.js +39 -0
- package/plugins/maestro/src/mcp/handlers/session-state-core.js +108 -0
- package/plugins/maestro/src/mcp/handlers/session-state-tools.js +562 -0
- package/plugins/maestro/src/mcp/handlers/validate-plan.js +76 -0
- package/plugins/maestro/src/mcp/maestro-server.js +122 -0
- package/plugins/maestro/src/mcp/runtime/runtime-config-map.js +70 -0
- package/plugins/maestro/src/mcp/tool-packs/content/index.js +80 -0
- package/plugins/maestro/src/mcp/tool-packs/contracts.js +30 -0
- package/plugins/maestro/src/mcp/tool-packs/index.js +15 -0
- package/plugins/maestro/src/mcp/tool-packs/session/index.js +243 -0
- package/plugins/maestro/src/mcp/tool-packs/workspace/index.js +98 -0
- package/plugins/maestro/src/mcp/utils/extension-root.js +31 -0
- package/plugins/maestro/src/mcp/validation/agent-checker.js +81 -0
- package/plugins/maestro/src/mcp/validation/dag-checker.js +214 -0
- package/plugins/maestro/src/mcp/validation/file-overlap-checker.js +63 -0
- package/plugins/maestro/src/mcp/validation/schema-checker.js +108 -0
- package/plugins/maestro/src/platforms/codex/runtime-config.js +58 -0
- package/plugins/maestro/src/platforms/shared/adapters/conventions.js +29 -0
- package/plugins/maestro/src/platforms/shared/adapters/exit-codes.js +6 -0
- package/plugins/maestro/src/platforms/shared/adapters/factory.js +40 -0
- package/plugins/maestro/src/platforms/shared/agent-names.js +15 -0
- package/plugins/maestro/src/platforms/shared/hook-runner.js +52 -0
- package/plugins/maestro/src/references/architecture.md +139 -0
- package/plugins/maestro/src/references/orchestration-steps.md +193 -0
- package/plugins/maestro/src/skills/shared/code-review/SKILL.md +145 -0
- package/plugins/maestro/src/skills/shared/delegation/SKILL.md +387 -0
- package/plugins/maestro/src/skills/shared/delegation/protocols/agent-base-protocol.md +145 -0
- package/plugins/maestro/src/skills/shared/delegation/protocols/filesystem-safety-protocol.md +31 -0
- package/plugins/maestro/src/skills/shared/design-dialogue/SKILL.md +284 -0
- package/plugins/maestro/src/skills/shared/execution/SKILL.md +258 -0
- package/plugins/maestro/src/skills/shared/implementation-planning/SKILL.md +307 -0
- package/plugins/maestro/src/skills/shared/session-management/SKILL.md +314 -0
- package/plugins/maestro/src/skills/shared/validation/SKILL.md +204 -0
- package/plugins/maestro/src/state/session-state.js +113 -0
- package/plugins/maestro/src/templates/design-document.md +95 -0
- package/plugins/maestro/src/templates/implementation-plan.md +86 -0
- package/plugins/maestro/src/templates/session-state.md +68 -0
- package/plugins/maestro/src/version.json +3 -0
- package/policies/maestro.toml +44 -0
- package/qwen/agents/accessibility_specialist.md +18 -0
- package/qwen/agents/analytics_engineer.md +20 -0
- package/qwen/agents/api_designer.md +17 -0
- package/qwen/agents/architect.md +17 -0
- package/qwen/agents/cloud_architect.md +17 -0
- package/qwen/agents/cobol_engineer.md +20 -0
- package/qwen/agents/code_reviewer.md +15 -0
- package/qwen/agents/coder.md +20 -0
- package/qwen/agents/compliance_reviewer.md +17 -0
- package/qwen/agents/content_strategist.md +17 -0
- package/qwen/agents/copywriter.md +17 -0
- package/qwen/agents/data_engineer.md +20 -0
- package/qwen/agents/database_administrator.md +19 -0
- package/qwen/agents/db2_dba.md +19 -0
- package/qwen/agents/debugger.md +17 -0
- package/qwen/agents/design_system_engineer.md +20 -0
- package/qwen/agents/devops_engineer.md +21 -0
- package/qwen/agents/hlasm_assembler_specialist.md +20 -0
- package/qwen/agents/i18n_specialist.md +19 -0
- package/qwen/agents/ibm_i_specialist.md +20 -0
- package/qwen/agents/integration_engineer.md +21 -0
- package/qwen/agents/ml_engineer.md +21 -0
- package/qwen/agents/mlops_engineer.md +21 -0
- package/qwen/agents/mobile_engineer.md +21 -0
- package/qwen/agents/observability_engineer.md +21 -0
- package/qwen/agents/performance_engineer.md +19 -0
- package/qwen/agents/platform_engineer.md +22 -0
- package/qwen/agents/product_manager.md +18 -0
- package/qwen/agents/prompt_engineer.md +20 -0
- package/qwen/agents/refactor.md +20 -0
- package/qwen/agents/release_manager.md +20 -0
- package/qwen/agents/security_engineer.md +19 -0
- package/qwen/agents/seo_specialist.md +19 -0
- package/qwen/agents/site_reliability_engineer.md +19 -0
- package/qwen/agents/solutions_architect.md +17 -0
- package/qwen/agents/technical_writer.md +19 -0
- package/qwen/agents/tester.md +21 -0
- package/qwen/agents/ux_designer.md +18 -0
- package/qwen/agents/zos_sysprog.md +19 -0
- package/qwen/hooks.json +56 -0
- package/qwen-extension.json +56 -0
- package/scripts/check-layer-boundaries.js +74 -0
- package/scripts/generate.js +155 -0
- package/scripts/install-codex-plugin.js +167 -0
- package/scripts/install-git-hooks.js +43 -0
- package/scripts/npm-publish-idempotent.js +338 -0
- package/scripts/package-release-artifacts.js +156 -0
- package/scripts/release-artifact-manifest.js +378 -0
- package/scripts/release-version-metadata.js +129 -0
- package/scripts/update-versions.js +33 -0
- package/scripts/verify-npm-pack.js +85 -0
- package/scripts/verify-release-artifacts.js +95 -0
- package/src/agents/accessibility-specialist.md +163 -0
- package/src/agents/analytics-engineer.md +182 -0
- package/src/agents/api-designer.md +124 -0
- package/src/agents/architect.md +120 -0
- package/src/agents/cloud-architect.md +134 -0
- package/src/agents/cobol-engineer.md +127 -0
- package/src/agents/code-reviewer.md +123 -0
- package/src/agents/coder.md +132 -0
- package/src/agents/compliance-reviewer.md +219 -0
- package/src/agents/content-strategist.md +111 -0
- package/src/agents/copywriter.md +113 -0
- package/src/agents/data-engineer.md +130 -0
- package/src/agents/database-administrator.md +126 -0
- package/src/agents/db2-dba.md +124 -0
- package/src/agents/debugger.md +133 -0
- package/src/agents/design-system-engineer.md +258 -0
- package/src/agents/devops-engineer.md +138 -0
- package/src/agents/hlasm-assembler-specialist.md +134 -0
- package/src/agents/i18n-specialist.md +241 -0
- package/src/agents/ibm-i-specialist.md +132 -0
- package/src/agents/integration-engineer.md +133 -0
- package/src/agents/ml-engineer.md +115 -0
- package/src/agents/mlops-engineer.md +116 -0
- package/src/agents/mobile-engineer.md +115 -0
- package/src/agents/observability-engineer.md +133 -0
- package/src/agents/performance-engineer.md +139 -0
- package/src/agents/platform-engineer.md +129 -0
- package/src/agents/product-manager.md +170 -0
- package/src/agents/prompt-engineer.md +129 -0
- package/src/agents/refactor.md +138 -0
- package/src/agents/release-manager.md +132 -0
- package/src/agents/security-engineer.md +143 -0
- package/src/agents/seo-specialist.md +129 -0
- package/src/agents/site-reliability-engineer.md +131 -0
- package/src/agents/solutions-architect.md +137 -0
- package/src/agents/technical-writer.md +129 -0
- package/src/agents/tester.md +135 -0
- package/src/agents/ux-designer.md +168 -0
- package/src/agents/zos-sysprog.md +134 -0
- package/src/config/setting-resolver.js +32 -0
- package/src/core/agent-registry.js +67 -0
- package/src/core/canonical-source.js +39 -0
- package/src/core/env-file-parser.js +82 -0
- package/src/core/feature-blocks.js +34 -0
- package/src/core/logger.js +12 -0
- package/src/core/markdown-state.js +36 -0
- package/src/core/policy-rules.js +32 -0
- package/src/core/project-root-resolver.js +184 -0
- package/src/core/stdin-reader.js +77 -0
- package/src/core/version.js +50 -0
- package/src/entry-points/core-command-registry.js +37 -0
- package/src/entry-points/preamble-builders.js +54 -0
- package/src/entry-points/registry.js +199 -0
- package/src/entry-points/templates/claude-core-command.md.tmpl +38 -0
- package/src/entry-points/templates/claude-skill.md.tmpl +18 -0
- package/src/entry-points/templates/codex-core-command.md.tmpl +16 -0
- package/src/entry-points/templates/codex-skill.md.tmpl +11 -0
- package/src/entry-points/templates/gemini-command.toml.tmpl +17 -0
- package/src/entry-points/templates/gemini-core-command.toml.tmpl +30 -0
- package/src/generated/agent-registry.json +630 -0
- package/src/generated/hook-registry.json +18 -0
- package/src/generated/resource-registry.json +16 -0
- package/src/generator/entry-point-expander.js +182 -0
- package/src/generator/file-writer.js +167 -0
- package/src/generator/generation-session.js +62 -0
- package/src/generator/manifest-curator.js +31 -0
- package/src/generator/manifest-expander.js +256 -0
- package/src/generator/payload-builder.js +217 -0
- package/src/generator/registry-scanner.js +130 -0
- package/src/generator/stale-pruner.js +101 -0
- package/src/hooks/logic/after-agent-logic.js +54 -0
- package/src/hooks/logic/before-agent-logic.js +57 -0
- package/src/hooks/logic/hook-state.js +127 -0
- package/src/hooks/logic/session-end-logic.js +17 -0
- package/src/hooks/logic/session-start-logic.js +25 -0
- package/src/lib/discovery/index.js +172 -0
- package/src/lib/errors/index.js +104 -0
- package/src/lib/framework-detection.js +50 -0
- package/src/lib/frontmatter/index.js +262 -0
- package/src/lib/io/index.js +96 -0
- package/src/lib/naming/index.js +94 -0
- package/src/lib/validation/index.js +124 -0
- package/src/lib/yaml-emit.js +38 -0
- package/src/manifest.js +11 -0
- package/src/mcp/content/provider.js +68 -0
- package/src/mcp/content/runtime-content.js +188 -0
- package/src/mcp/contracts/cache-path-rejector.js +39 -0
- package/src/mcp/contracts/downstream-context.js +106 -0
- package/src/mcp/contracts/plan-schema.js +148 -0
- package/src/mcp/contracts/workspace-marker.js +61 -0
- package/src/mcp/core/create-server.js +76 -0
- package/src/mcp/core/line-reader.js +35 -0
- package/src/mcp/core/project-root-cache.js +120 -0
- package/src/mcp/core/protocol-dispatcher.js +274 -0
- package/src/mcp/core/recovery-hints.js +43 -0
- package/src/mcp/core/tool-outcome.js +77 -0
- package/src/mcp/core/tool-registry.js +82 -0
- package/src/mcp/handlers/assess-task-complexity.js +108 -0
- package/src/mcp/handlers/blocker-parser.js +34 -0
- package/src/mcp/handlers/design-gate.js +393 -0
- package/src/mcp/handlers/get-agent.js +54 -0
- package/src/mcp/handlers/get-runtime-context.js +49 -0
- package/src/mcp/handlers/get-skill-content.js +51 -0
- package/src/mcp/handlers/initialize-workspace.js +45 -0
- package/src/mcp/handlers/reconciliation.js +224 -0
- package/src/mcp/handlers/resolve-settings.js +39 -0
- package/src/mcp/handlers/session-state-core.js +108 -0
- package/src/mcp/handlers/session-state-tools.js +562 -0
- package/src/mcp/handlers/validate-plan.js +76 -0
- package/src/mcp/maestro-server.js +122 -0
- package/src/mcp/runtime/runtime-config-map.js +70 -0
- package/src/mcp/tool-packs/content/index.js +80 -0
- package/src/mcp/tool-packs/contracts.js +30 -0
- package/src/mcp/tool-packs/index.js +15 -0
- package/src/mcp/tool-packs/session/index.js +243 -0
- package/src/mcp/tool-packs/workspace/index.js +98 -0
- package/src/mcp/utils/extension-root.js +31 -0
- package/src/mcp/validation/agent-checker.js +81 -0
- package/src/mcp/validation/dag-checker.js +214 -0
- package/src/mcp/validation/file-overlap-checker.js +63 -0
- package/src/mcp/validation/schema-checker.js +108 -0
- package/src/platforms/claude/metadata.js +96 -0
- package/src/platforms/claude/runtime-config.js +60 -0
- package/src/platforms/codex/metadata.js +107 -0
- package/src/platforms/codex/runtime-config.js +58 -0
- package/src/platforms/gemini/metadata.js +27 -0
- package/src/platforms/gemini/runtime-config.js +62 -0
- package/src/platforms/metadata-shared.js +133 -0
- package/src/platforms/metadata.js +29 -0
- package/src/platforms/qwen/metadata.js +27 -0
- package/src/platforms/qwen/runtime-config.js +62 -0
- package/src/platforms/shared/adapters/claude-adapter.js +36 -0
- package/src/platforms/shared/adapters/conventions.js +29 -0
- package/src/platforms/shared/adapters/exit-codes.js +6 -0
- package/src/platforms/shared/adapters/factory.js +40 -0
- package/src/platforms/shared/adapters/gemini-adapter.js +34 -0
- package/src/platforms/shared/adapters/qwen-adapter.js +93 -0
- package/src/platforms/shared/agent-names.js +15 -0
- package/src/platforms/shared/hook-runner.js +52 -0
- package/src/references/architecture.md +139 -0
- package/src/references/orchestration-steps.md +193 -0
- package/src/scripts/ensure-workspace.js +14 -0
- package/src/scripts/read-active-session.js +26 -0
- package/src/scripts/read-setting.js +18 -0
- package/src/scripts/read-state.js +17 -0
- package/src/scripts/write-state.js +22 -0
- package/src/skills/shared/code-review/SKILL.md +145 -0
- package/src/skills/shared/delegation/SKILL.md +387 -0
- package/src/skills/shared/delegation/protocols/agent-base-protocol.md +145 -0
- package/src/skills/shared/delegation/protocols/filesystem-safety-protocol.md +31 -0
- package/src/skills/shared/design-dialogue/SKILL.md +284 -0
- package/src/skills/shared/execution/SKILL.md +258 -0
- package/src/skills/shared/implementation-planning/SKILL.md +307 -0
- package/src/skills/shared/session-management/SKILL.md +314 -0
- package/src/skills/shared/validation/SKILL.md +204 -0
- package/src/state/session-state.js +113 -0
- package/src/templates/design-document.md +95 -0
- package/src/templates/implementation-plan.md +86 -0
- package/src/templates/session-state.md +68 -0
- package/src/transforms/agent-stub.js +29 -0
- package/src/transforms/extract-examples.js +63 -0
- package/src/transforms/index.js +35 -0
- package/src/transforms/parse-frontmatter.js +23 -0
- package/src/transforms/rebuild-frontmatter.js +147 -0
- package/src/transforms/skill-discovery-stub.js +27 -0
- package/src/transforms/skill-metadata.js +14 -0
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: session-management
|
|
3
|
+
description: Manages orchestration session state, tracking, and resumption
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Session Management Skill
|
|
7
|
+
|
|
8
|
+
Activate this skill for all session state operations during Maestro orchestration. This skill defines the protocols for creating, updating, resuming, and archiving orchestration sessions.
|
|
9
|
+
|
|
10
|
+
## State Access Protocol
|
|
11
|
+
|
|
12
|
+
When MCP state tools are available, prefer them for state operations:
|
|
13
|
+
- **Preferred**: MCP tools (`initialize_workspace`, `create_session`, `update_session`, `transition_phase`, `get_session_status`, `archive_session`) — structured I/O, atomic operations.
|
|
14
|
+
- **Fallback**: `write_file`/`replace` directly on state files — when MCP tools are not in the available tool list.
|
|
15
|
+
- **Legacy**: Shell scripts (`write-state.js`, `read-state.js`) — remain available but are not the recommended path.
|
|
16
|
+
|
|
17
|
+
Detection: check whether MCP state tools appear in your available tools. If they do, use them. If they do not, use `write_file`/`replace`.
|
|
18
|
+
|
|
19
|
+
## Hook-Level Session State
|
|
20
|
+
|
|
21
|
+
Maestro hooks maintain a separate, transient state directory under `${MAESTRO_HOOKS_DIR:-<os.tmpdir()>/maestro-hooks-<uid>}/<session-id>/` that is distinct from orchestration state in `<MAESTRO_STATE_DIR>`:
|
|
22
|
+
|
|
23
|
+
| Concern | Orchestration State | Hook State |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| Location | `<MAESTRO_STATE_DIR>/state/` | `${MAESTRO_HOOKS_DIR:-<os.tmpdir()>/maestro-hooks-<uid>}/<session-id>/` |
|
|
26
|
+
| Lifecycle | Created at execution setup, archived in Phase 4 | Directory created by the session-start hook when an active session exists; active-agent file written by the pre-delegation hook and cleared by the post-delegation hook; stale directories pruned by both session-start and pre-delegation hooks |
|
|
27
|
+
| Contents | Session metadata, phase tracking, token usage, file manifests | Active agent tracking file (`active-agent`) |
|
|
28
|
+
| Persistence | Survives session restarts (supports `/maestro:resume`) | Ephemeral — lost on session end or system reboot |
|
|
29
|
+
| Managed by | Orchestrator via session-management skill | The runtime's pre-delegation and post-delegation hooks |
|
|
30
|
+
|
|
31
|
+
The pre-delegation hook prunes stale hook state directories older than 2 hours to prevent accumulation from abnormal session terminations.
|
|
32
|
+
|
|
33
|
+
The orchestrator does not read or write hook-level state directly. It interacts only with `<MAESTRO_STATE_DIR>` paths. The two state systems are independent and serve different concerns.
|
|
34
|
+
|
|
35
|
+
## Session Creation Protocol
|
|
36
|
+
|
|
37
|
+
### When to Create
|
|
38
|
+
For Standard workflow, create a new session at execution setup after the design document and implementation plan are approved and the execution mode gate has resolved. For Express workflow, create a session after the structured brief is approved (see Express Workflow section in the orchestrator template).
|
|
39
|
+
|
|
40
|
+
### Session ID Format
|
|
41
|
+
`YYYY-MM-DD-<topic-slug>`
|
|
42
|
+
|
|
43
|
+
Where:
|
|
44
|
+
- `YYYY-MM-DD` is the orchestration start date
|
|
45
|
+
- `<topic-slug>` is a lowercase, hyphenated summary matching the design document topic
|
|
46
|
+
|
|
47
|
+
### File Location
|
|
48
|
+
`<MAESTRO_STATE_DIR>/state/active-session.md`
|
|
49
|
+
|
|
50
|
+
All state paths in this skill use `<MAESTRO_STATE_DIR>` as their base directory (default: `docs/maestro`). In procedural steps, `<state_dir>` represents the resolved value of this variable.
|
|
51
|
+
|
|
52
|
+
### State File Access
|
|
53
|
+
|
|
54
|
+
Both `read_file` and `write_file` work on state paths inside `<MAESTRO_STATE_DIR>`. The runtime's file-access configuration makes state paths accessible.
|
|
55
|
+
|
|
56
|
+
Use the runtime's bundled `scripts/` directory for these helper commands so they still work when the extension is installed outside the workspace root.
|
|
57
|
+
|
|
58
|
+
**Reading state files:**
|
|
59
|
+
Use `read_file` directly. The `read-state.js` script remains available as an alternative for TOML shell blocks that inject state before the model's first turn:
|
|
60
|
+
|
|
61
|
+
`run_shell_command`: `node <runtime-script-root>/read-state.js <relative-path>`
|
|
62
|
+
|
|
63
|
+
**Writing state files:**
|
|
64
|
+
Use `write_file` directly. When content must be piped from a shell command, use the atomic write script:
|
|
65
|
+
|
|
66
|
+
`run_shell_command`: `echo '...' | node <runtime-script-root>/write-state.js <relative-path>`
|
|
67
|
+
|
|
68
|
+
**Rules:**
|
|
69
|
+
- The `write-state.js` script writes atomically (temp file + rename) to prevent partial writes
|
|
70
|
+
- Both scripts validate against absolute paths and path traversal
|
|
71
|
+
|
|
72
|
+
### Initialization Steps
|
|
73
|
+
1. Resolve state directory from `MAESTRO_STATE_DIR`
|
|
74
|
+
2. Create `<state_dir>/state/` directory if it does not exist (defense-in-depth fallback — workspace readiness startup check is the primary mechanism)
|
|
75
|
+
3. Verify no existing `active-session.md` — if one exists, alert the user and offer to archive or resume
|
|
76
|
+
4. Generate session state using the `session-state` template loaded via `get_skill_content`
|
|
77
|
+
5. Initialize all phases as `pending`
|
|
78
|
+
6. Set overall status to `in_progress`
|
|
79
|
+
7. Set `current_phase` to 1
|
|
80
|
+
8. Record design document and implementation plan paths
|
|
81
|
+
9. Initialize empty token_usage, file manifests, downstream_context, and errors sections
|
|
82
|
+
|
|
83
|
+
### Initial State Template
|
|
84
|
+
|
|
85
|
+
```yaml
|
|
86
|
+
---
|
|
87
|
+
session_id: "<YYYY-MM-DD-topic-slug>"
|
|
88
|
+
task: "<user's original task description>"
|
|
89
|
+
created: "<ISO 8601 timestamp>"
|
|
90
|
+
updated: "<ISO 8601 timestamp>"
|
|
91
|
+
status: "in_progress"
|
|
92
|
+
workflow_mode: "<standard|express>"
|
|
93
|
+
design_document: "<state_dir>/plans/<design-doc-filename>"
|
|
94
|
+
implementation_plan: "<state_dir>/plans/<impl-plan-filename>"
|
|
95
|
+
current_phase: 1
|
|
96
|
+
total_phases: <integer from impl plan>
|
|
97
|
+
execution_mode: null
|
|
98
|
+
execution_backend: null
|
|
99
|
+
task_complexity: null
|
|
100
|
+
|
|
101
|
+
token_usage:
|
|
102
|
+
total_input: 0
|
|
103
|
+
total_output: 0
|
|
104
|
+
total_cached: 0
|
|
105
|
+
by_agent: {}
|
|
106
|
+
|
|
107
|
+
phases:
|
|
108
|
+
- id: 1
|
|
109
|
+
name: "<phase name from impl plan>"
|
|
110
|
+
status: "pending"
|
|
111
|
+
agents: []
|
|
112
|
+
parallel: false
|
|
113
|
+
started: null
|
|
114
|
+
completed: null
|
|
115
|
+
blocked_by: []
|
|
116
|
+
files_created: []
|
|
117
|
+
files_modified: []
|
|
118
|
+
files_deleted: []
|
|
119
|
+
downstream_context:
|
|
120
|
+
key_interfaces_introduced: []
|
|
121
|
+
patterns_established: []
|
|
122
|
+
integration_points: []
|
|
123
|
+
assumptions: []
|
|
124
|
+
warnings: []
|
|
125
|
+
errors: []
|
|
126
|
+
retry_count: 0
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
# <Topic> Orchestration Log
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Include `task_complexity` (from design document frontmatter) in the session state. Place after `execution_backend`, before `token_usage`. Default: `null`.
|
|
133
|
+
|
|
134
|
+
## State Update Protocol
|
|
135
|
+
|
|
136
|
+
### Update Triggers
|
|
137
|
+
Update session state on every meaningful state change:
|
|
138
|
+
- Phase status transitions
|
|
139
|
+
- File manifest changes
|
|
140
|
+
- Downstream context extraction from completed phases
|
|
141
|
+
- Error occurrences
|
|
142
|
+
- Token usage increments
|
|
143
|
+
- Phase completion or failure
|
|
144
|
+
|
|
145
|
+
### Update Rules
|
|
146
|
+
|
|
147
|
+
1. **Timestamp**: Update `updated` field on every state change
|
|
148
|
+
2. **Phase Status**: Transition phase status following valid transitions:
|
|
149
|
+
- `pending` -> `in_progress`
|
|
150
|
+
- `in_progress` -> `completed`
|
|
151
|
+
- `in_progress` -> `failed`
|
|
152
|
+
- `failed` -> `in_progress` (retry)
|
|
153
|
+
- `pending` -> `skipped` (user decision only)
|
|
154
|
+
3. **Current Phase**: Update `current_phase` to the ID of the currently executing phase
|
|
155
|
+
4. **File Manifest**: Append to `files_created`, `files_modified`, or `files_deleted` as subagents report changes
|
|
156
|
+
5. **Downstream Context**: Persist parsed Handoff Report Part 2 fields into phase `downstream_context`
|
|
157
|
+
6. **Token Usage**: Aggregate token counts from subagent responses into both `total_*` and `by_agent` sections
|
|
158
|
+
7. **Error Recording**: Append to phase `errors` array with complete metadata
|
|
159
|
+
|
|
160
|
+
### Error Recording Format
|
|
161
|
+
|
|
162
|
+
```yaml
|
|
163
|
+
errors:
|
|
164
|
+
- agent: "<agent-name>"
|
|
165
|
+
timestamp: "<ISO 8601>"
|
|
166
|
+
type: "<validation|timeout|file_conflict|runtime|dependency>"
|
|
167
|
+
message: "<full error description>"
|
|
168
|
+
resolution: "<what was done to resolve, or 'pending'>"
|
|
169
|
+
resolved: false
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Retry Tracking
|
|
173
|
+
- Increment `retry_count` on each retry attempt
|
|
174
|
+
- Maximum 2 retries per phase before escalating to user
|
|
175
|
+
- Record each retry as a separate error entry with resolution details
|
|
176
|
+
|
|
177
|
+
### Markdown Body Updates
|
|
178
|
+
After updating YAML frontmatter, append to the Markdown body:
|
|
179
|
+
|
|
180
|
+
```markdown
|
|
181
|
+
## Phase N: <Phase Name> <status indicator>
|
|
182
|
+
|
|
183
|
+
### <Agent Name> Output
|
|
184
|
+
[Summary of agent output or full content]
|
|
185
|
+
|
|
186
|
+
### Files Changed
|
|
187
|
+
- Created: [list]
|
|
188
|
+
- Modified: [list]
|
|
189
|
+
|
|
190
|
+
### Downstream Context
|
|
191
|
+
- Key Interfaces Introduced: [list]
|
|
192
|
+
- Patterns Established: [list]
|
|
193
|
+
- Integration Points: [list]
|
|
194
|
+
- Assumptions: [list]
|
|
195
|
+
- Warnings: [list]
|
|
196
|
+
|
|
197
|
+
### Validation Result
|
|
198
|
+
[Pass/Fail with details]
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Status indicators:
|
|
202
|
+
- Completed: checkmark
|
|
203
|
+
- In Progress: circle
|
|
204
|
+
- Failed: cross
|
|
205
|
+
- Pending: square
|
|
206
|
+
- Skipped: dash
|
|
207
|
+
|
|
208
|
+
## Archive Protocol
|
|
209
|
+
|
|
210
|
+
### When to Archive
|
|
211
|
+
Archive session state when:
|
|
212
|
+
- All phases are completed successfully AND `MAESTRO_AUTO_ARCHIVE` is `true` (default)
|
|
213
|
+
- User explicitly requests archival (regardless of `MAESTRO_AUTO_ARCHIVE` setting)
|
|
214
|
+
- User starts a new orchestration (previous session must be archived first, regardless of setting)
|
|
215
|
+
|
|
216
|
+
When `MAESTRO_AUTO_ARCHIVE` is `false`, prompt the user after successful completion: "Session complete. Auto-archive is disabled. Would you like to archive this session?"
|
|
217
|
+
|
|
218
|
+
### Archive Steps
|
|
219
|
+
If `archive_session` appears in your available tools, use it — a single call handles all archival:
|
|
220
|
+
|
|
221
|
+
1. Call `archive_session` with the session ID. The MCP tool atomically:
|
|
222
|
+
- Updates session status to `completed`
|
|
223
|
+
- Moves `active-session.md` to `<state_dir>/state/archive/<session-id>.md`
|
|
224
|
+
- Moves design document to `<state_dir>/plans/archive/` (if it exists and is non-null)
|
|
225
|
+
- Moves implementation plan to `<state_dir>/plans/archive/` (if it exists and is non-null)
|
|
226
|
+
2. Confirm archival to user with summary of what was archived (use the `archived_files` array in the response)
|
|
227
|
+
|
|
228
|
+
If `archive_session` is not available, fall back to manual file operations:
|
|
229
|
+
1. Create `<state_dir>/plans/archive/` directory if it does not exist
|
|
230
|
+
2. Create `<state_dir>/state/archive/` directory if it does not exist
|
|
231
|
+
3. **MOVE** (not copy) design document from `<state_dir>/plans/` to `<state_dir>/plans/archive/` — the original MUST be deleted. Use the shell-command tool from runtime context with `mv` or read+write+delete. Do NOT leave the file in both locations. **Skip this step if `design_document` is `null` (Express sessions).**
|
|
232
|
+
4. **MOVE** (not copy) implementation plan from `<state_dir>/plans/` to `<state_dir>/plans/archive/` — same: delete the original. **Skip this step if `implementation_plan` is `null` (Express sessions).**
|
|
233
|
+
5. Update session state `status` to `completed`
|
|
234
|
+
6. Update `updated` timestamp
|
|
235
|
+
7. **MOVE** (not copy) `active-session.md` from `<state_dir>/state/` to `<state_dir>/state/archive/<session-id>.md` — delete the original.
|
|
236
|
+
8. Confirm archival to user with summary of what was archived
|
|
237
|
+
|
|
238
|
+
### Archive Verification
|
|
239
|
+
After archival, verify ALL of the following (archive is incomplete if any check fails):
|
|
240
|
+
- No `active-session.md` exists in `<state_dir>/state/`
|
|
241
|
+
- No plan files remain in `<state_dir>/plans/` (only the `archive/` subdirectory should be present)
|
|
242
|
+
- Archived files are readable at their new locations in `archive/`
|
|
243
|
+
- If files still exist in the original locations, delete them now — the archive step used copy instead of move
|
|
244
|
+
|
|
245
|
+
## Resume Protocol
|
|
246
|
+
|
|
247
|
+
### When to Resume
|
|
248
|
+
Resume is triggered by the `/maestro:resume` command or when `/maestro:orchestrate` detects an existing active session.
|
|
249
|
+
|
|
250
|
+
### Resume Steps
|
|
251
|
+
|
|
252
|
+
1. **Read State**: If session state was already injected into the prompt (e.g., via `/maestro:resume`), use that injected content instead of calling `get_session_status`. Otherwise, if `get_session_status` appears in your available tools, call it to read the active session. Otherwise, read state via `run_shell_command`: `node <runtime-script-root>/read-active-session.js` (resolves `MAESTRO_STATE_DIR` internally)
|
|
253
|
+
2. **Parse Frontmatter**: Extract YAML frontmatter for session metadata
|
|
254
|
+
3. **Identify Position**: Determine:
|
|
255
|
+
- Last completed phase (highest ID with `status: completed`)
|
|
256
|
+
- Current active phase (first phase with `status: in_progress` or `pending`)
|
|
257
|
+
- Any failed phases with unresolved errors
|
|
258
|
+
4. **Check Errors**: Identify unresolved errors from previous execution
|
|
259
|
+
5. **Present Summary**: Display status summary to user using the resume format defined in the orchestrator instructions
|
|
260
|
+
6. **Handle Errors**: If unresolved errors exist:
|
|
261
|
+
- Present each error with context
|
|
262
|
+
- Offer options: retry, skip, abort, or adjust parameters
|
|
263
|
+
- Wait for user guidance before proceeding
|
|
264
|
+
7. **Continue Execution**: Resume from the first pending or failed phase
|
|
265
|
+
8. **Update State**: Mark resumed phase as `in_progress` and update timestamps
|
|
266
|
+
|
|
267
|
+
### Express Resume Branch
|
|
268
|
+
|
|
269
|
+
When resuming a session with `workflow_mode: "express"` (read from session state via `get_session_status`), follow the Express workflow's resume protocol instead of the standard resume steps above:
|
|
270
|
+
|
|
271
|
+
- If phase status is `pending`: re-generate and present the structured brief for approval. On approval, proceed to delegation.
|
|
272
|
+
- If phase status is `in_progress`: the implementing agent was interrupted. Re-delegate with the same scope. Use the `agents` array to identify which agent was running.
|
|
273
|
+
- If phase status is `completed` but session status is `in_progress`: code review or archival was interrupted. Run the code review step, then archive.
|
|
274
|
+
|
|
275
|
+
Express sessions have a single phase. The phase status combined with the `agents` array contents determines the resume position.
|
|
276
|
+
|
|
277
|
+
### Conflict Detection
|
|
278
|
+
When resuming, check for potential conflicts:
|
|
279
|
+
- Files that were partially modified (phase started but not completed)
|
|
280
|
+
- External modifications to files in the manifest since last session
|
|
281
|
+
- Changes to the implementation plan since last execution
|
|
282
|
+
|
|
283
|
+
Report any detected conflicts to the user before proceeding.
|
|
284
|
+
|
|
285
|
+
## Token Usage Tracking
|
|
286
|
+
|
|
287
|
+
### Collection
|
|
288
|
+
After each subagent invocation, record:
|
|
289
|
+
- Input tokens consumed
|
|
290
|
+
- Output tokens generated
|
|
291
|
+
- Cached tokens used (if available)
|
|
292
|
+
|
|
293
|
+
### Aggregation
|
|
294
|
+
Maintain two levels of aggregation:
|
|
295
|
+
1. **Total**: Sum across all agents and phases
|
|
296
|
+
2. **By Agent**: Per-agent totals across all their invocations
|
|
297
|
+
|
|
298
|
+
### Format
|
|
299
|
+
|
|
300
|
+
```yaml
|
|
301
|
+
token_usage:
|
|
302
|
+
total_input: 15000
|
|
303
|
+
total_output: 8000
|
|
304
|
+
total_cached: 3000
|
|
305
|
+
by_agent:
|
|
306
|
+
coder:
|
|
307
|
+
input: 8000
|
|
308
|
+
output: 4000
|
|
309
|
+
cached: 2000
|
|
310
|
+
tester:
|
|
311
|
+
input: 7000
|
|
312
|
+
output: 4000
|
|
313
|
+
cached: 1000
|
|
314
|
+
```
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: validation
|
|
3
|
+
description: Cross-cutting validation methodology for verifying phase outputs and project integrity
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Validation Skill
|
|
7
|
+
|
|
8
|
+
Activate this skill when validating phase outputs during orchestration execution or when running standalone validation checks. This skill provides the pipeline, heuristics, and interpretation rules for verifying that changes meet quality standards.
|
|
9
|
+
|
|
10
|
+
## Validation Pipeline
|
|
11
|
+
|
|
12
|
+
Execute validation steps in this order. Stop on the first blocking failure unless the user explicitly requests continuing.
|
|
13
|
+
|
|
14
|
+
### Step 1: Build / Compile
|
|
15
|
+
Verify the project compiles without errors.
|
|
16
|
+
|
|
17
|
+
| Project Type | Command |
|
|
18
|
+
|-------------|---------|
|
|
19
|
+
| Node.js (TypeScript) | `npx tsc --noEmit` |
|
|
20
|
+
| Node.js (JavaScript) | N/A (skip) |
|
|
21
|
+
| Rust | `cargo build` |
|
|
22
|
+
| Go | `go build ./...` |
|
|
23
|
+
| Python | `python -m py_compile [files]` |
|
|
24
|
+
| Java (Maven) | `mvn compile` |
|
|
25
|
+
| Java (Gradle) | `./gradlew compileJava` |
|
|
26
|
+
|
|
27
|
+
### Step 2: Lint / Format
|
|
28
|
+
Verify code meets style and quality standards.
|
|
29
|
+
|
|
30
|
+
| Project Type | Command |
|
|
31
|
+
|-------------|---------|
|
|
32
|
+
| Node.js | `npx eslint . && npx prettier --check .` |
|
|
33
|
+
| Rust | `cargo clippy && cargo fmt --check` |
|
|
34
|
+
| Go | `go vet ./... && gofmt -l .` |
|
|
35
|
+
| Python | `ruff check . && ruff format --check .` |
|
|
36
|
+
| Java | `mvn checkstyle:check` or `./gradlew checkstyleMain` |
|
|
37
|
+
|
|
38
|
+
### Step 3: Unit Tests
|
|
39
|
+
Run unit tests to verify behavior preservation.
|
|
40
|
+
|
|
41
|
+
| Project Type | Command |
|
|
42
|
+
|-------------|---------|
|
|
43
|
+
| Node.js (Jest) | `npx jest` |
|
|
44
|
+
| Node.js (Vitest) | `npx vitest run` |
|
|
45
|
+
| Rust | `cargo test` |
|
|
46
|
+
| Go | `go test ./...` |
|
|
47
|
+
| Python (pytest) | `python -m pytest tests/` |
|
|
48
|
+
| Java (Maven) | `mvn test` |
|
|
49
|
+
| Java (Gradle) | `./gradlew test` |
|
|
50
|
+
|
|
51
|
+
### Step 4: Integration Tests
|
|
52
|
+
Run integration tests if available and applicable.
|
|
53
|
+
|
|
54
|
+
Detect integration test presence by looking for:
|
|
55
|
+
- `tests/integration/`, `test/integration/`, or `**/integration_test*` directories/files
|
|
56
|
+
- Test files with `integration` in the name
|
|
57
|
+
- Test scripts in package.json (e.g., `test:integration`)
|
|
58
|
+
|
|
59
|
+
### Step 5: Manual Verification
|
|
60
|
+
For changes that cannot be automatically validated, present a checklist to the user.
|
|
61
|
+
|
|
62
|
+
## Project Type Detection
|
|
63
|
+
|
|
64
|
+
Detect the project type by checking for the presence of these files in the project root:
|
|
65
|
+
|
|
66
|
+
| Indicator File | Project Type |
|
|
67
|
+
|---------------|-------------|
|
|
68
|
+
| `package.json` | Node.js (check for `typescript` dep for TS) |
|
|
69
|
+
| `Cargo.toml` | Rust |
|
|
70
|
+
| `go.mod` | Go |
|
|
71
|
+
| `pyproject.toml` or `setup.py` | Python |
|
|
72
|
+
| `pom.xml` | Java (Maven) |
|
|
73
|
+
| `build.gradle` or `build.gradle.kts` | Java (Gradle) |
|
|
74
|
+
| `Gemfile` | Ruby |
|
|
75
|
+
| `*.csproj` or `*.sln` | .NET |
|
|
76
|
+
|
|
77
|
+
When multiple indicators are present, validate each project type independently.
|
|
78
|
+
|
|
79
|
+
## Validation Result Interpretation
|
|
80
|
+
|
|
81
|
+
### Pass
|
|
82
|
+
All executed validation steps completed with exit code 0. No errors or warnings that indicate broken functionality.
|
|
83
|
+
|
|
84
|
+
### Fail (Blocking)
|
|
85
|
+
Any of the following constitute a blocking failure:
|
|
86
|
+
- Build/compile errors
|
|
87
|
+
- Lint errors (not warnings, unless the project treats warnings as errors)
|
|
88
|
+
- Test failures
|
|
89
|
+
- Type errors
|
|
90
|
+
|
|
91
|
+
### Warn (Non-Blocking)
|
|
92
|
+
The following are recorded but do not block progression:
|
|
93
|
+
- Lint warnings (when not configured as errors)
|
|
94
|
+
- Deprecation notices
|
|
95
|
+
- Coverage decreases (unless coverage threshold is configured)
|
|
96
|
+
- Format-only issues (can be auto-fixed)
|
|
97
|
+
|
|
98
|
+
## Validation Modes
|
|
99
|
+
|
|
100
|
+
The validation strictness is controlled by `MAESTRO_VALIDATION_STRICTNESS` (default: `normal`).
|
|
101
|
+
|
|
102
|
+
| Mode | Behavior |
|
|
103
|
+
|------|----------|
|
|
104
|
+
| `strict` | Warnings are treated as blocking failures. All lint warnings, deprecation notices, and coverage decreases block phase progression. |
|
|
105
|
+
| `normal` | Only errors block. Warnings are recorded but do not prevent phase completion. This is the default behavior described in the Pass/Fail/Warn sections above. |
|
|
106
|
+
| `lenient` | Nothing blocks automatically. All failures and warnings are recorded in session state and reported to the user, but phase progression continues. The user reviews the accumulated report at completion. |
|
|
107
|
+
|
|
108
|
+
### Strictness Application
|
|
109
|
+
|
|
110
|
+
When evaluating each validation step:
|
|
111
|
+
1. Run the validation command and capture the exit code and output
|
|
112
|
+
2. Classify the result as Pass, Fail (Blocking), or Warn (Non-Blocking) using the standard criteria above
|
|
113
|
+
3. Apply the strictness mode:
|
|
114
|
+
- `strict`: Fail (Blocking) AND Warn (Non-Blocking) both stop progression
|
|
115
|
+
- `normal`: Only Fail (Blocking) stops progression
|
|
116
|
+
- `lenient`: Record everything, stop nothing — append all results to session state and continue
|
|
117
|
+
4. If strictness causes a result to be downgraded from blocking to non-blocking, note this in the validation output: "Warning recorded but not blocking (lenient mode)"
|
|
118
|
+
|
|
119
|
+
## Post-Phase Validation
|
|
120
|
+
|
|
121
|
+
### When to Validate
|
|
122
|
+
Run validation after:
|
|
123
|
+
- Every phase that creates or modifies source code
|
|
124
|
+
- Every parallel batch completion (validate the combined result)
|
|
125
|
+
- Before marking any phase as `completed`
|
|
126
|
+
|
|
127
|
+
### When to Skip Validation
|
|
128
|
+
Skip validation when:
|
|
129
|
+
- The phase only modified documentation files
|
|
130
|
+
- The phase only produced read-only analysis (`architect`, `code-reviewer` reports)
|
|
131
|
+
- The user explicitly requests skipping validation
|
|
132
|
+
|
|
133
|
+
Record `skipped` with rationale in the phase validation result.
|
|
134
|
+
|
|
135
|
+
## Manual Verification Checklist
|
|
136
|
+
|
|
137
|
+
For changes that cannot be automatically validated, present this checklist template:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
### Manual Verification Required
|
|
141
|
+
|
|
142
|
+
The following changes require manual verification:
|
|
143
|
+
|
|
144
|
+
- [ ] [Description of what to verify]
|
|
145
|
+
- [ ] [Visual/UI changes look correct]
|
|
146
|
+
- [ ] [Integration with external service works]
|
|
147
|
+
- [ ] [Environment-specific behavior confirmed]
|
|
148
|
+
|
|
149
|
+
Please confirm these items are verified before I mark this phase as complete.
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Use manual verification for:
|
|
153
|
+
- UI/visual changes
|
|
154
|
+
- External service integrations
|
|
155
|
+
- Environment-specific configurations
|
|
156
|
+
- Performance improvements (require load testing)
|
|
157
|
+
- Security remediations (require penetration testing)
|
|
158
|
+
|
|
159
|
+
## Incremental Validation Mode
|
|
160
|
+
|
|
161
|
+
When full pipeline validation is unnecessary, use targeted validation based on the type of changes in the completed phase:
|
|
162
|
+
|
|
163
|
+
### Validation Scope by Change Type
|
|
164
|
+
- **Phase created new files only** (no existing files modified): Run lint + type check on the new files only. This provides fast feedback without running the full test suite against unchanged code.
|
|
165
|
+
- **Phase modified existing files**: Run the full test suite. Existing tests serve as behavior-preservation checks — any failure indicates a potential regression.
|
|
166
|
+
- **Phase touched configuration files** (build config, CI config, environment config, dependency manifests): Run the full pipeline (build + lint + type check + all tests). Configuration changes can have cascading effects across the entire project.
|
|
167
|
+
- **Phase only produced documentation or analysis**: Skip validation (record as `skipped` with rationale).
|
|
168
|
+
|
|
169
|
+
### Scope Detection
|
|
170
|
+
Determine the change type automatically from the completing agent's Task Report:
|
|
171
|
+
1. Parse Files Created and Files Modified lists
|
|
172
|
+
2. Classify each file: source code, test code, configuration, documentation
|
|
173
|
+
3. Apply the most comprehensive validation scope that matches any changed file type (e.g., if one config file and three source files changed, run the full pipeline because config was touched)
|
|
174
|
+
|
|
175
|
+
## Validation Failure Diagnosis
|
|
176
|
+
|
|
177
|
+
When validation fails, provide a structured diagnosis to help the orchestrator decide next steps.
|
|
178
|
+
|
|
179
|
+
### Diagnosis Protocol
|
|
180
|
+
1. **Categorize the failure**: type error, lint error, test failure, build error, runtime error
|
|
181
|
+
2. **Identify involved files**: Which files from the current phase appear in the error output?
|
|
182
|
+
3. **Determine causality**: Is the failure caused by the current phase's changes, or is it a pre-existing issue?
|
|
183
|
+
- Check: Does the failure reference files modified in this phase?
|
|
184
|
+
- Check: Run validation against a clean snapshot while always restoring local state:
|
|
185
|
+
- `git stash push --include-untracked -m "maestro-causality-check"`
|
|
186
|
+
- `[validation command]` (capture exit code as `validation_exit`)
|
|
187
|
+
- `git stash pop` (run regardless of `validation_exit`)
|
|
188
|
+
- If `validation_exit` is non-zero in the clean snapshot, classify the failure as pre-existing.
|
|
189
|
+
- If `git stash pop` fails, mark the diagnosis as inconclusive until restoration conflicts are resolved.
|
|
190
|
+
4. **Classify resolution path**:
|
|
191
|
+
- **Fixable by same agent**: The error is in files the agent owns, the fix is straightforward (missing import, type mismatch, lint violation). Re-delegate to the same agent with the error context.
|
|
192
|
+
- **Requires different agent**: The error is caused by an interface mismatch between phases. Identify which phase introduced the incompatibility.
|
|
193
|
+
- **Requires human input**: The error reveals an ambiguity in the design or plan that cannot be resolved without user guidance. Escalate with full context.
|
|
194
|
+
|
|
195
|
+
### Diagnosis Output Format
|
|
196
|
+
```
|
|
197
|
+
### Validation Diagnosis
|
|
198
|
+
- **Failure Type**: [type error | lint error | test failure | build error]
|
|
199
|
+
- **Failing Files**: [list of files from current phase involved in the failure]
|
|
200
|
+
- **Root Cause**: [brief description of why validation failed]
|
|
201
|
+
- **Pre-existing**: [yes | no — was this failure present before this phase's changes?]
|
|
202
|
+
- **Resolution Path**: [re-delegate to same agent | escalate to user | requires cross-phase fix]
|
|
203
|
+
- **Recommended Action**: [specific next step with context to include in re-delegation or escalation]
|
|
204
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { atomicWriteSync } = require('../lib/io');
|
|
6
|
+
|
|
7
|
+
const DEFAULT_STATE_DIR = 'docs/maestro';
|
|
8
|
+
|
|
9
|
+
function validateRelativePath(filePath) {
|
|
10
|
+
if (path.isAbsolute(filePath)) {
|
|
11
|
+
throw new Error('Path must be relative');
|
|
12
|
+
}
|
|
13
|
+
const segments = filePath.split(/[/\\]/);
|
|
14
|
+
if (segments.includes('..')) {
|
|
15
|
+
throw new Error('Path traversal not allowed');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function validateContainment(absolutePath, rootDir) {
|
|
20
|
+
let resolved = path.resolve(absolutePath);
|
|
21
|
+
let resolvedRoot = path.resolve(rootDir);
|
|
22
|
+
try { resolved = fs.realpathSync(resolved); } catch {}
|
|
23
|
+
try { resolvedRoot = fs.realpathSync(resolvedRoot); } catch {}
|
|
24
|
+
const rootPrefix = resolvedRoot + path.sep;
|
|
25
|
+
if (!resolved.startsWith(rootPrefix) && resolved !== resolvedRoot) {
|
|
26
|
+
throw new Error('state_dir must be within the project root');
|
|
27
|
+
}
|
|
28
|
+
return resolved;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function resolveStateDirPath(cwd, stateDirOverride) {
|
|
32
|
+
const stateDir = stateDirOverride || process.env.MAESTRO_STATE_DIR || DEFAULT_STATE_DIR;
|
|
33
|
+
const base = cwd || process.cwd();
|
|
34
|
+
|
|
35
|
+
if (path.isAbsolute(stateDir)) {
|
|
36
|
+
return validateContainment(stateDir, base);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
validateRelativePath(stateDir);
|
|
40
|
+
return path.join(base, stateDir);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function resolveActiveSessionPath(cwd) {
|
|
44
|
+
return path.join(resolveStateDirPath(cwd), 'state', 'active-session.md');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function hasActiveSession(cwd) {
|
|
48
|
+
try {
|
|
49
|
+
const sessionPath = resolveActiveSessionPath(cwd);
|
|
50
|
+
return fs.existsSync(sessionPath);
|
|
51
|
+
} catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function readState(relativePath, basePath) {
|
|
57
|
+
validateRelativePath(relativePath);
|
|
58
|
+
const fullPath = path.join(basePath, relativePath);
|
|
59
|
+
return fs.readFileSync(fullPath, 'utf8');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function writeState(relativePath, content, basePath) {
|
|
63
|
+
validateRelativePath(relativePath);
|
|
64
|
+
const fullPath = path.join(basePath, relativePath);
|
|
65
|
+
atomicWriteSync(fullPath, content);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function ensureWorkspace(stateDir, basePath) {
|
|
69
|
+
const fullBase = path.isAbsolute(stateDir)
|
|
70
|
+
? validateContainment(stateDir, basePath)
|
|
71
|
+
: (() => {
|
|
72
|
+
validateRelativePath(stateDir);
|
|
73
|
+
return path.join(basePath, stateDir);
|
|
74
|
+
})();
|
|
75
|
+
fs.mkdirSync(fullBase, { recursive: true, mode: 0o700 });
|
|
76
|
+
const stats = fs.lstatSync(fullBase);
|
|
77
|
+
if (stats.isSymbolicLink()) {
|
|
78
|
+
throw new Error('STATE_DIR must not be a symlink');
|
|
79
|
+
}
|
|
80
|
+
const dirs = [
|
|
81
|
+
path.join(fullBase, 'state'),
|
|
82
|
+
path.join(fullBase, 'state', 'archive'),
|
|
83
|
+
path.join(fullBase, 'plans'),
|
|
84
|
+
path.join(fullBase, 'plans', 'archive'),
|
|
85
|
+
];
|
|
86
|
+
for (const dir of dirs) {
|
|
87
|
+
try {
|
|
88
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
89
|
+
} catch {
|
|
90
|
+
throw new Error('Failed to create workspace directory');
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
fs.accessSync(dir, fs.constants.W_OK);
|
|
94
|
+
} catch {
|
|
95
|
+
throw new Error('Workspace directory not writable');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const stateGitignore = path.join(fullBase, 'state', '.gitignore');
|
|
99
|
+
try {
|
|
100
|
+
fs.writeFileSync(stateGitignore, 'active-session.md\narchive/\n', { mode: 0o600, flag: 'wx' });
|
|
101
|
+
} catch {}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = {
|
|
105
|
+
DEFAULT_STATE_DIR,
|
|
106
|
+
validateContainment,
|
|
107
|
+
resolveStateDirPath,
|
|
108
|
+
resolveActiveSessionPath,
|
|
109
|
+
hasActiveSession,
|
|
110
|
+
readState,
|
|
111
|
+
writeState,
|
|
112
|
+
ensureWorkspace,
|
|
113
|
+
};
|