@williambeto/ai-workflow 1.19.1 → 2.2.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/CHANGELOG.md +56 -838
- package/PUBLISH_MANIFEST.json +34 -0
- package/README.md +78 -148
- package/{packages/ai-workflow/bin → bin}/ai-workflow.js +0 -0
- package/dist-assets/AGENTS.md +27 -0
- package/dist-assets/agents/astra.md +63 -0
- package/dist-assets/agents/atlas.md +169 -0
- package/dist-assets/agents/nexus.md +42 -0
- package/dist-assets/agents/orion.md +44 -0
- package/dist-assets/agents/phoenix.md +42 -0
- package/dist-assets/agents/sage.md +54 -0
- package/dist-assets/commands/README.md +14 -0
- package/dist-assets/commands/atlas.md +12 -0
- package/dist-assets/commands/audit.md +10 -0
- package/dist-assets/commands/deploy.md +12 -0
- package/dist-assets/commands/discover.md +10 -0
- package/dist-assets/commands/implement.md +28 -0
- package/dist-assets/commands/optimize-tokens.md +10 -0
- package/dist-assets/commands/plan.md +10 -0
- package/dist-assets/commands/release.md +12 -0
- package/dist-assets/commands/run.md +26 -0
- package/dist-assets/commands/spec-create.md +10 -0
- package/dist-assets/commands/spec-implement.md +10 -0
- package/dist-assets/commands/spec-review.md +10 -0
- package/dist-assets/commands/update-memory.md +10 -0
- package/dist-assets/commands/validate.md +12 -0
- package/dist-assets/docs/INDEX.md +21 -0
- package/dist-assets/docs/QUICKSTART.md +23 -0
- package/dist-assets/docs/adr/ADR-0000.md +19 -0
- package/dist-assets/docs/adr/ADR-0001.md +45 -0
- package/dist-assets/docs/adr/ADR-0002.md +62 -0
- package/dist-assets/docs/adr/ADR-0003.md +60 -0
- package/dist-assets/docs/adr/ADR-0004.md +71 -0
- package/dist-assets/docs/adr/ADR-0005.md +22 -0
- package/dist-assets/docs/adr/ADR-0006.md +82 -0
- package/dist-assets/docs/adr/ADR-0007.md +78 -0
- package/dist-assets/docs/api-engine-reference.md +7 -0
- package/{docs → dist-assets/docs}/architecture-policy.md +1 -1
- package/dist-assets/docs/cli-reference.md +27 -0
- package/dist-assets/docs/compatibility/provider-usage.md +38 -0
- package/dist-assets/docs/compatibility/runtime-matrix.md +30 -0
- package/dist-assets/docs/consumer-onboarding.md +17 -0
- package/dist-assets/docs/contributing-guide.md +11 -0
- package/{docs → dist-assets/docs}/design-patterns-policy.md +2 -2
- package/dist-assets/docs/full-documentation.md +113 -0
- package/{docs → dist-assets/docs}/npm-consumer-quickstart.md +18 -46
- package/dist-assets/docs/opencode-readme.md +8 -0
- package/dist-assets/docs/policies/01-BRANCH_GATE.md +63 -0
- package/dist-assets/docs/policies/02-SDD_METHODOLOGY.md +95 -0
- package/dist-assets/docs/policies/03-QUALITY_GATE.md +22 -0
- package/dist-assets/docs/policies/05-AGENT_CONTRACT.md +7 -0
- package/dist-assets/docs/policies/06-FINAL_EVIDENCE_CONTRACT.md +31 -0
- package/dist-assets/docs/policies/07-RELEASE_GATE.md +47 -0
- package/dist-assets/docs/policies/08-PRODUCT_TRUTHFULNESS_AND_PROJECT_DOCS.md +18 -0
- package/dist-assets/docs/policies/09-SPEC_VISIBILITY_AND_PUBLICATION.md +28 -0
- package/dist-assets/docs/policies/10-BEHAVIORAL_CONTRACT_HARDENING.md +9 -0
- package/dist-assets/docs/policies/11-EXECUTABLE_DELEGATION_AND_TRUTHFULNESS.md +7 -0
- package/dist-assets/docs/policies/ORCHESTRATION_PROTOCOL.md +15 -0
- package/dist-assets/docs/policies/PROCEDURE_DELIVERY_ARTIFACTS.md +21 -0
- package/dist-assets/docs/policies/PROCEDURE_DOCUMENTATION_CHECKLIST.md +24 -0
- package/dist-assets/docs/policies/PROCEDURE_UI_CHECKLIST.md +54 -0
- package/dist-assets/docs/profiles/README.md +19 -0
- package/dist-assets/docs/profiles/backend-api.md +5 -0
- package/dist-assets/docs/profiles/documentation.md +3 -0
- package/dist-assets/docs/profiles/frontend-product.md +19 -0
- package/dist-assets/docs/profiles/frontend-utility.md +19 -0
- package/dist-assets/docs/profiles/refactor.md +3 -0
- package/dist-assets/docs/profiles/security-review.md +3 -0
- package/dist-assets/docs/references/frontend-quality/landing-page-quality-checklist.md +11 -0
- package/dist-assets/docs/references/frontend-quality/product-copy-truthfulness.md +7 -0
- package/dist-assets/docs/references/frontend-quality/quality-failure-examples.md +20 -0
- package/dist-assets/docs/references/frontend-quality/visual-composition-patterns.md +10 -0
- package/dist-assets/docs/specs/runtime-operational-contract.md +39 -0
- package/dist-assets/docs/troubleshooting-guide.md +21 -0
- package/dist-assets/docs/visual-validation-guide.md +76 -0
- package/dist-assets/examples/README.md +10 -0
- package/dist-assets/examples/autopilot-cycle/00-CONTEXT.md +3 -0
- package/dist-assets/examples/autopilot-cycle/01-requirement.md +16 -0
- package/dist-assets/examples/autopilot-cycle/02-gate-a-check.md +23 -0
- package/dist-assets/examples/autopilot-cycle/03-orion-planning.md +20 -0
- package/dist-assets/examples/autopilot-cycle/04-astra-implementation.md +17 -0
- package/dist-assets/examples/autopilot-cycle/05-sage-validation.md +15 -0
- package/dist-assets/examples/autopilot-cycle/06-phoenix-healing.md +12 -0
- package/dist-assets/examples/autopilot-cycle/07-orchestration-report.md +18 -0
- package/dist-assets/examples/backend-api/00-CONTEXT.md +12 -0
- package/dist-assets/examples/backend-api/01-requirement.md +19 -0
- package/dist-assets/examples/backend-api/02-functional-spec.md +20 -0
- package/dist-assets/examples/backend-api/03-technical-plan.md +15 -0
- package/dist-assets/examples/backend-api/04-pr-breakdown.md +10 -0
- package/dist-assets/examples/backend-api/05-execution-handoff.md +13 -0
- package/dist-assets/examples/backend-api/06-validation-report.md +11 -0
- package/dist-assets/examples/backend-api/07-orchestration-report.md +7 -0
- package/dist-assets/examples/blocked-scenarios/00-CONTEXT.md +9 -0
- package/dist-assets/examples/blocked-scenarios/01-branch-gate-block.md +12 -0
- package/dist-assets/examples/blocked-scenarios/02-quality-gate-block.md +13 -0
- package/dist-assets/examples/blocked-scenarios/03-scope-creep-block.md +13 -0
- package/dist-assets/examples/blocked-scenarios/04-unblock-resolution.md +9 -0
- package/dist-assets/examples/blocked-scenarios/05-orchestration-decision-log.md +11 -0
- package/dist-assets/examples/bugfix-critical/00-CONTEXT.md +12 -0
- package/dist-assets/examples/bugfix-critical/01-bug-report.md +11 -0
- package/dist-assets/examples/bugfix-critical/02-diagnosis-hypothesis.md +11 -0
- package/dist-assets/examples/bugfix-critical/03-technical-plan.md +12 -0
- package/dist-assets/examples/bugfix-critical/04-implementation-handoff.md +8 -0
- package/dist-assets/examples/bugfix-critical/05-validation-report.md +10 -0
- package/dist-assets/examples/bugfix-critical/06-orchestration-report.md +7 -0
- package/dist-assets/examples/cli-package/00-CONTEXT.md +9 -0
- package/dist-assets/examples/cli-package/01-requirement.md +14 -0
- package/dist-assets/examples/cli-package/02-technical-spec.md +16 -0
- package/dist-assets/examples/cli-package/03-technical-plan.md +12 -0
- package/dist-assets/examples/cli-package/04-pr-breakdown.md +9 -0
- package/dist-assets/examples/cli-package/05-release-report.md +15 -0
- package/dist-assets/examples/docs-only-repo/01-requirement.md +31 -0
- package/dist-assets/examples/docs-only-repo/02-functional-spec.md +25 -0
- package/dist-assets/examples/docs-only-repo/03-technical-plan.md +21 -0
- package/dist-assets/examples/docs-only-repo/04-pr-breakdown.md +13 -0
- package/dist-assets/examples/docs-only-repo/05-execution-handoff.md +17 -0
- package/dist-assets/examples/docs-only-repo/06-validation-report.md +16 -0
- package/dist-assets/examples/docs-only-repo/README.md +26 -0
- package/dist-assets/examples/full-stack-checkout/00-CONTEXT.md +9 -0
- package/dist-assets/examples/full-stack-checkout/01-requirement.md +12 -0
- package/dist-assets/examples/full-stack-checkout/02-functional-spec.md +15 -0
- package/dist-assets/examples/full-stack-checkout/03-technical-plan.md +15 -0
- package/dist-assets/examples/full-stack-checkout/04-pr-breakdown.md +8 -0
- package/dist-assets/examples/full-stack-checkout/05-execution-handoff.md +14 -0
- package/dist-assets/examples/full-stack-checkout/06-validation-report.md +12 -0
- package/dist-assets/examples/healing-cycle/00-CONTEXT.md +15 -0
- package/dist-assets/examples/healing-cycle/01-broken-implementation.md +10 -0
- package/dist-assets/examples/healing-cycle/02-sage-fails.md +14 -0
- package/dist-assets/examples/healing-cycle/03-phoenix-diagnosis.md +17 -0
- package/dist-assets/examples/healing-cycle/04-phoenix-fix.md +18 -0
- package/dist-assets/examples/healing-cycle/05-sage-revalidation.md +12 -0
- package/dist-assets/examples/healing-cycle/06-orchestration-log.md +14 -0
- package/dist-assets/examples/infra-deploy/00-CONTEXT.md +9 -0
- package/dist-assets/examples/infra-deploy/01-operational-goal.md +12 -0
- package/dist-assets/examples/infra-deploy/02-architecture-specs.md +15 -0
- package/dist-assets/examples/infra-deploy/03-implementation-plan.md +14 -0
- package/dist-assets/examples/infra-deploy/04-step-breakdown.md +9 -0
- package/dist-assets/examples/infra-deploy/05-execution-handoff.md +13 -0
- package/dist-assets/examples/infra-deploy/06-operational-report.md +11 -0
- package/dist-assets/examples/multi-pr-release/00-CONTEXT.md +9 -0
- package/dist-assets/examples/multi-pr-release/01-requirement.md +13 -0
- package/dist-assets/examples/multi-pr-release/02-strategic-plan.md +13 -0
- package/dist-assets/examples/multi-pr-release/03-pr-breakdown.md +14 -0
- package/dist-assets/examples/multi-pr-release/04-release-plan.md +12 -0
- package/dist-assets/examples/multi-pr-release/05-orchestration-report.md +7 -0
- package/dist-assets/examples/nuxt-dashboard/01-requirement.md +81 -0
- package/dist-assets/examples/nuxt-dashboard/02-functional-spec.md +88 -0
- package/dist-assets/examples/nuxt-dashboard/03-technical-plan.md +76 -0
- package/dist-assets/examples/nuxt-dashboard/04-pr-breakdown.md +219 -0
- package/dist-assets/examples/nuxt-dashboard/05-execution-handoff.md +88 -0
- package/dist-assets/examples/nuxt-dashboard/06-validation-report.md +56 -0
- package/dist-assets/examples/nuxt-dashboard/07-orchestration-report.md +79 -0
- package/dist-assets/examples/nuxt-dashboard/README.md +52 -0
- package/dist-assets/examples/react-dashboard/01-requirement.md +84 -0
- package/dist-assets/examples/react-dashboard/02-functional-spec.md +88 -0
- package/dist-assets/examples/react-dashboard/03-technical-plan.md +76 -0
- package/dist-assets/examples/react-dashboard/04-pr-breakdown.md +218 -0
- package/dist-assets/examples/react-dashboard/05-execution-handoff.md +13 -0
- package/dist-assets/examples/react-dashboard/06-validation-report.md +12 -0
- package/dist-assets/examples/react-dashboard/07-orchestration-report.md +7 -0
- package/dist-assets/examples/react-dashboard/README.md +70 -0
- package/dist-assets/examples/refactoring-service/00-CONTEXT.md +9 -0
- package/dist-assets/examples/refactoring-service/01-debt-report.md +12 -0
- package/dist-assets/examples/refactoring-service/02-behavior-spec.md +11 -0
- package/dist-assets/examples/refactoring-service/03-technical-plan.md +13 -0
- package/dist-assets/examples/refactoring-service/04-pr-breakdown.md +9 -0
- package/dist-assets/examples/refactoring-service/05-execution-handoff.md +14 -0
- package/dist-assets/examples/refactoring-service/06-stability-report.md +12 -0
- package/dist-assets/examples/sdd-cycle/00-CONTEXT.md +12 -0
- package/dist-assets/examples/sdd-cycle/01-raw-request.md +13 -0
- package/dist-assets/examples/sdd-cycle/02-spec-creation.md +18 -0
- package/dist-assets/examples/sdd-cycle/03-spec-review.md +12 -0
- package/dist-assets/examples/sdd-cycle/04-technical-plan.md +16 -0
- package/dist-assets/examples/sdd-cycle/05-pr-breakdown.md +9 -0
- package/dist-assets/examples/sdd-cycle/06-spec-implement.md +13 -0
- package/dist-assets/examples/sdd-cycle/07-validation-against-spec.md +13 -0
- package/dist-assets/examples/wordpress-theme/01-requirement.md +29 -0
- package/dist-assets/examples/wordpress-theme/02-functional-spec.md +22 -0
- package/dist-assets/examples/wordpress-theme/03-technical-plan.md +22 -0
- package/dist-assets/examples/wordpress-theme/04-pr-breakdown.md +14 -0
- package/dist-assets/examples/wordpress-theme/05-execution-handoff.md +17 -0
- package/dist-assets/examples/wordpress-theme/06-validation-report.md +16 -0
- package/dist-assets/examples/wordpress-theme/README.md +32 -0
- package/{harness → dist-assets/harness}/handoffs/HANDOFF.template.md +2 -2
- package/{harness → dist-assets/harness}/workflows/agent-evaluation-checklist.md +5 -5
- package/{harness → dist-assets/harness}/workflows/implement-review-validate.md +24 -0
- package/{harness → dist-assets/harness}/workflows/multi-agent-handoff.md +4 -4
- package/{harness → dist-assets/harness}/workflows/planner-executor-workflow.md +5 -5
- package/{harness → dist-assets/harness}/workflows/requirement-to-pr.md +1 -1
- package/dist-assets/runbooks/agent-delegation-workflow.md +50 -0
- package/dist-assets/runbooks/apply-starter-to-real-project.md +45 -0
- package/dist-assets/runbooks/commands-cheatsheet.md +44 -0
- package/dist-assets/runbooks/how-to-use-skills.md +44 -0
- package/dist-assets/runbooks/private-spec-publication-safety.md +35 -0
- package/{runbooks → dist-assets/runbooks}/spec-driven-development.md +3 -6
- package/dist-assets/runbooks/tutorial-walkthroughs.md +23 -0
- package/dist-assets/runbooks/use-linear-for-operational-planning.md +45 -0
- package/dist-assets/runbooks/use-napkin-project-memory.md +33 -0
- package/dist-assets/skills/architecture/SKILL.md +166 -0
- package/dist-assets/skills/backend-development/SKILL.md +166 -0
- package/dist-assets/skills/deployment/SKILL.md +166 -0
- package/dist-assets/skills/design-principles/SKILL.md +166 -0
- package/dist-assets/skills/documentation/SKILL.md +171 -0
- package/dist-assets/skills/frontend-development/SKILL.md +225 -0
- package/dist-assets/skills/full-stack-development/SKILL.md +166 -0
- package/dist-assets/skills/optimize-tokens/SKILL.md +166 -0
- package/dist-assets/skills/pr-workflow/SKILL.md +166 -0
- package/dist-assets/skills/product-discovery/SKILL.md +166 -0
- package/dist-assets/skills/product-planning/SKILL.md +166 -0
- package/dist-assets/skills/project-memory/SKILL.md +166 -0
- package/dist-assets/skills/prompt-engineer/SKILL.md +166 -0
- package/dist-assets/skills/qa-workflow/SKILL.md +186 -0
- package/dist-assets/skills/refactoring/SKILL.md +166 -0
- package/dist-assets/skills/release-workflow/SKILL.md +166 -0
- package/dist-assets/skills/spec-driven-development/SKILL.md +166 -0
- package/dist-assets/skills/technical-leadership/SKILL.md +166 -0
- package/dist-assets/skills/ui-ux-design/SKILL.md +202 -0
- package/dist-assets/templates/.geminiignore.template +8 -0
- package/dist-assets/templates/CLAUDE.md.template +20 -0
- package/dist-assets/templates/CODEX.md.template +20 -0
- package/dist-assets/templates/GEMINI.md.template +20 -0
- package/dist-assets/templates/HANDOFF.template.md +45 -0
- package/dist-assets/templates/SPEC.template.md +38 -0
- package/dist-assets/templates/change-proposal.template.md +14 -0
- package/dist-assets/templates/owner-evidence/astra-implementation.json +10 -0
- package/dist-assets/templates/owner-evidence/phoenix-remediation.json +8 -0
- package/dist-assets/templates/owner-evidence/sage-revalidation.json +8 -0
- package/dist-assets/templates/owner-evidence/sage-validation.json +8 -0
- package/dist-assets/templates/specs/deep.md +48 -0
- package/dist-assets/templates/specs/standard.md +38 -0
- package/dist-assets/templates/specs/tiny.md +19 -0
- package/package.json +43 -47
- package/src/adapters/index.js +3 -0
- package/src/adapters/platforms/claude.js +126 -0
- package/src/adapters/platforms/codex.js +100 -0
- package/src/adapters/platforms/gemini.js +232 -0
- package/src/cli.js +114 -0
- package/src/commands/collect-evidence.js +61 -0
- package/src/commands/doctor.js +186 -0
- package/src/commands/execute.js +172 -0
- package/{packages/ai-workflow/src → src}/commands/init.js +119 -20
- package/src/commands/run.js +112 -0
- package/src/core/completion-contract.js +35 -0
- package/src/core/execution-planner.js +59 -0
- package/src/core/gates/branch-gate.js +146 -0
- package/src/core/handoff/handoff-engine.js +104 -0
- package/src/core/healing/cli-remediation-executor.js +151 -0
- package/src/core/healing/healer-engine.js +179 -0
- package/src/core/identity.js +43 -0
- package/{packages/ai-workflow/src → src}/core/install-plan.js +3 -3
- package/src/core/opencode-merge.js +149 -0
- package/{packages/ai-workflow/src → src}/core/package-assets.js +29 -10
- package/src/core/request-classifier.js +58 -0
- package/src/core/runtime/opencode-adapter.js +94 -0
- package/src/core/sdd/validator.js +67 -0
- package/src/core/statuses.js +29 -0
- package/src/core/symlink-layout.js +93 -0
- package/src/core/templates.js +221 -0
- package/src/core/validation/canonical-finalization.js +43 -0
- package/src/core/validation/evidence-collector.js +109 -0
- package/src/core/validation/quality-guard.js +243 -0
- package/src/core/workflow-profiles.js +107 -0
- package/src/core/workflow-state-machine.js +46 -0
- package/.agents/napkin.md +0 -89
- package/.agents/skills/backend-implementer/SKILL.md +0 -490
- package/.agents/skills/build-and-validate/SKILL.md +0 -442
- package/.agents/skills/deploy-engineer/SKILL.md +0 -541
- package/.agents/skills/docs-writer/SKILL.md +0 -430
- package/.agents/skills/frontend-implementer/SKILL.md +0 -488
- package/.agents/skills/interface-design/SKILL.md +0 -428
- package/.agents/skills/interface-design/references/critique.md +0 -67
- package/.agents/skills/interface-design/references/example.md +0 -86
- package/.agents/skills/interface-design/references/principles.md +0 -235
- package/.agents/skills/interface-design/references/validation.md +0 -48
- package/.agents/skills/minimal-context/SKILL.md +0 -177
- package/.agents/skills/napkin/SKILL.md +0 -84
- package/.agents/skills/opencode-agent-design/SKILL.md +0 -77
- package/.agents/skills/playwright-cli/SKILL.md +0 -62
- package/.agents/skills/pr-orchestrator/SKILL.md +0 -366
- package/.agents/skills/product-manager/SKILL.md +0 -519
- package/.agents/skills/seo-audit/SKILL.md +0 -176
- package/.agents/skills/stack-variant-creator/SKILL.md +0 -265
- package/.agents/skills/tech-lead/SKILL.md +0 -453
- package/.agents/skills/tester/SKILL.md +0 -399
- package/.agents/skills/token-economy/SKILL.md +0 -137
- package/.agents/skills/vue-nuxt/SKILL.md +0 -102
- package/.agents/skills/wordpress-engineer/SKILL.md +0 -75
- package/.codex/prompts/README.md +0 -44
- package/.codex/prompts/autopilot.md +0 -50
- package/.codex/prompts/deploy.md +0 -33
- package/.codex/prompts/execute-selected-pr.md +0 -35
- package/.codex/prompts/fix-issue.md +0 -34
- package/.codex/prompts/minimal-context-mode.md +0 -55
- package/.codex/prompts/orchestrate-next.md +0 -33
- package/.codex/prompts/plan-from-requirement.md +0 -37
- package/.codex/prompts/review-implementation.md +0 -33
- package/.codex/prompts/roadmap-audit.md +0 -22
- package/.codex/prompts/specs/create-spec-from-requirement.md +0 -26
- package/.codex/prompts/specs/review-spec.md +0 -29
- package/.codex/prompts/specs/spec-to-pr-breakdown.md +0 -23
- package/.codex/prompts/specs/spec-to-technical-plan.md +0 -28
- package/.codex/prompts/start-project.md +0 -29
- package/.codex/prompts/token-economy-mode.md +0 -48
- package/.codex/prompts/validate-work.md +0 -28
- package/checklists/change-spec-readiness-checklist.md +0 -34
- package/docs/full-documentation.md +0 -661
- package/docs/setup-codex-opencode.md +0 -313
- package/harness/README.md +0 -106
- package/opencode/README.md +0 -84
- package/opencode/agents/README.md +0 -113
- package/opencode/agents/atlas.md +0 -127
- package/opencode/agents/discovery.md +0 -61
- package/opencode/agents/fixer.md +0 -51
- package/opencode/agents/implementer.md +0 -61
- package/opencode/agents/orchestrator.md +0 -145
- package/opencode/agents/planner.md +0 -60
- package/opencode/agents/prompt-engineer.md +0 -50
- package/opencode/agents/release-manager.md +0 -50
- package/opencode/agents/reviewer.md +0 -51
- package/opencode/agents/spec-engineer.md +0 -85
- package/opencode/agents/validator.md +0 -50
- package/opencode/agents/wordpress-engineer.md +0 -49
- package/opencode/commands/README.md +0 -48
- package/opencode/commands/autopilot.md +0 -50
- package/opencode/commands/deploy.md +0 -35
- package/opencode/commands/execute.md +0 -47
- package/opencode/commands/orchestrate.md +0 -37
- package/opencode/commands/plan.md +0 -39
- package/opencode/commands/review.md +0 -33
- package/opencode/commands/roadmap-audit.md +0 -30
- package/opencode/commands/ship.md +0 -48
- package/opencode/commands/specs/create-spec-from-request.md +0 -27
- package/opencode/commands/specs/create-spec-from-requirement.md +0 -25
- package/opencode/commands/specs/review-spec.md +0 -26
- package/opencode/commands/specs/spec-to-pr-breakdown.md +0 -19
- package/opencode/commands/specs/spec-to-tasks.md +0 -26
- package/opencode/commands/specs/spec-to-technical-plan.md +0 -27
- package/opencode/commands/start.md +0 -45
- package/opencode/commands/token-economy.md +0 -29
- package/opencode/commands/validate.md +0 -33
- package/opencode.jsonc +0 -235
- package/packages/ai-workflow/README.md +0 -82
- package/packages/ai-workflow/src/cli.js +0 -70
- package/packages/ai-workflow/src/commands/codex.js +0 -37
- package/packages/ai-workflow/src/commands/doctor.js +0 -168
- package/packages/ai-workflow/src/commands/guide.js +0 -194
- package/packages/ai-workflow/src/core/opencode-merge.js +0 -172
- package/packages/ai-workflow/src/core/symlink-layout.js +0 -54
- package/packages/ai-workflow/src/core/templates.js +0 -276
- package/runbooks/agent-delegation-workflow.md +0 -111
- package/runbooks/apply-starter-to-real-project.md +0 -445
- package/runbooks/commands-cheatsheet.md +0 -71
- package/runbooks/how-to-use-skills.md +0 -713
- package/runbooks/quick-start-guide.md +0 -213
- package/runbooks/tutorial-walkthroughs.md +0 -416
- package/runbooks/use-linear-for-operational-planning.md +0 -185
- package/runbooks/use-napkin-project-memory.md +0 -77
- package/templates/AGENTS.template.md +0 -397
- package/templates/DESIGN.template.md +0 -484
- package/templates/PR-PLAN.template.md +0 -172
- package/templates/README.template.md +0 -293
- package/templates/REQUIREMENT.template.md +0 -165
- package/templates/SPEC.template.md +0 -397
- package/templates/TECH-PLAN.template.md +0 -244
- package/templates/change-proposal.template.md +0 -97
- /package/{checklists/spec-readiness-checklist.md → dist-assets/docs/policies/SPEC_READINESS.md} +0 -0
- /package/{prompts → dist-assets/prompts}/00-bootstrap-project.md +0 -0
- /package/{prompts → dist-assets/prompts}/01-create-requirement.md +0 -0
- /package/{prompts → dist-assets/prompts}/02-create-spec.md +0 -0
- /package/{prompts → dist-assets/prompts}/03-create-tech-plan.md +0 -0
- /package/{prompts → dist-assets/prompts}/04-breakdown-prs.md +0 -0
- /package/{prompts → dist-assets/prompts}/05-implement-pr.md +0 -0
- /package/{prompts → dist-assets/prompts}/06-review-and-fix.md +0 -0
- /package/{prompts → dist-assets/prompts}/07-apply-design.md +0 -0
- /package/{prompts → dist-assets/prompts}/08-validate.md +0 -0
- /package/{prompts → dist-assets/prompts}/09-deploy.md +0 -0
- /package/{prompts → dist-assets/prompts}/commands/implement.md +0 -0
- /package/{prompts → dist-assets/prompts}/commands/requirement.md +0 -0
- /package/{prompts → dist-assets/prompts}/commands/spec.md +0 -0
- /package/{prompts → dist-assets/prompts}/commands/tech-plan.md +0 -0
- /package/{prompts → dist-assets/prompts}/commands/validate.md +0 -0
- /package/{runbooks → dist-assets/runbooks}/branch-cleanup.md +0 -0
- /package/{runbooks → dist-assets/runbooks}/deploy-checklist.md +0 -0
- /package/{runbooks → dist-assets/runbooks}/publication-readiness-checklist.md +0 -0
- /package/{runbooks → dist-assets/runbooks}/publish-package-checklist.md +0 -0
- /package/{runbooks → dist-assets/runbooks}/team-governance-pr-readiness.md +0 -0
- /package/{runbooks → dist-assets/runbooks}/validate-starter-in-real-project.md +0 -0
- /package/{runbooks → dist-assets/runbooks}/validation-checklist.md +0 -0
- /package/{schemas → dist-assets/schemas}/README.md +0 -0
- /package/{schemas → dist-assets/schemas}/functional-spec.schema.json +0 -0
- /package/{schemas → dist-assets/schemas}/handoff.schema.json +0 -0
- /package/{schemas → dist-assets/schemas}/pr-breakdown.schema.json +0 -0
- /package/{schemas → dist-assets/schemas}/requirement.schema.json +0 -0
- /package/{schemas → dist-assets/schemas}/technical-plan.schema.json +0 -0
- /package/{schemas → dist-assets/schemas}/validation-report.schema.json +0 -0
- /package/{packages/ai-workflow/src → src}/core/backup.js +0 -0
- /package/{packages/ai-workflow/src → src}/core/filesystem.js +0 -0
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { exists, readJson, readJsonc } from "../core/filesystem.js";
|
|
4
|
-
|
|
5
|
-
const REQUIRED_FILES = [
|
|
6
|
-
".ai-workflow.json",
|
|
7
|
-
".ai-workflow",
|
|
8
|
-
"README.workflow.md",
|
|
9
|
-
".codex/prompts/README.md",
|
|
10
|
-
"opencode/README.md"
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
async function isSymlink(filePath) {
|
|
14
|
-
try {
|
|
15
|
-
const stat = await fs.lstat(filePath);
|
|
16
|
-
return stat.isSymbolicLink();
|
|
17
|
-
} catch {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function runDoctor({ cwd }) {
|
|
23
|
-
let hasFailure = false;
|
|
24
|
-
let hasWarning = false;
|
|
25
|
-
let profile = "full";
|
|
26
|
-
let managedBlocks = [];
|
|
27
|
-
|
|
28
|
-
console.log("Doctor report:");
|
|
29
|
-
|
|
30
|
-
for (const relativePath of REQUIRED_FILES) {
|
|
31
|
-
const ok = await exists(path.join(cwd, relativePath));
|
|
32
|
-
|
|
33
|
-
if (ok) {
|
|
34
|
-
console.log(`PASS ${relativePath}`);
|
|
35
|
-
} else {
|
|
36
|
-
hasFailure = true;
|
|
37
|
-
console.log(`FAIL ${relativePath} missing`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const configPath = path.join(cwd, ".ai-workflow.json");
|
|
42
|
-
if (await exists(configPath)) {
|
|
43
|
-
try {
|
|
44
|
-
const config = await readJson(configPath);
|
|
45
|
-
|
|
46
|
-
if (config.mode === "standalone") {
|
|
47
|
-
console.log("PASS standalone mode enabled");
|
|
48
|
-
} else {
|
|
49
|
-
hasWarning = true;
|
|
50
|
-
console.log("WARN mode is not standalone in .ai-workflow.json");
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (typeof config.profile === "string") {
|
|
54
|
-
profile = config.profile;
|
|
55
|
-
console.log(`PASS profile detected: ${profile}`);
|
|
56
|
-
} else {
|
|
57
|
-
hasWarning = true;
|
|
58
|
-
console.log("WARN profile is missing in .ai-workflow.json");
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (Array.isArray(config.managedBlocks)) {
|
|
62
|
-
managedBlocks = config.managedBlocks;
|
|
63
|
-
} else {
|
|
64
|
-
hasWarning = true;
|
|
65
|
-
console.log("WARN managedBlocks is missing or invalid in .ai-workflow.json");
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (config.compatibility?.codex && (config.compatibility?.opencode || config.compatibility?.claude)) {
|
|
69
|
-
console.log("PASS compatibility codex+opencode enabled");
|
|
70
|
-
} else {
|
|
71
|
-
hasWarning = true;
|
|
72
|
-
console.log("WARN compatibility flags are incomplete in .ai-workflow.json");
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (Array.isArray(config.managedFiles)) {
|
|
76
|
-
for (const relativePath of config.managedFiles) {
|
|
77
|
-
const fileExists = await exists(path.join(cwd, relativePath));
|
|
78
|
-
if (!fileExists) {
|
|
79
|
-
hasWarning = true;
|
|
80
|
-
console.log(`WARN managed file missing: ${relativePath}`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
} else {
|
|
84
|
-
hasWarning = true;
|
|
85
|
-
console.log("WARN managedFiles is missing or invalid in .ai-workflow.json");
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (Array.isArray(config.managedLinks)) {
|
|
89
|
-
for (const relativePath of config.managedLinks) {
|
|
90
|
-
const absolutePath = path.join(cwd, relativePath);
|
|
91
|
-
const linkExists = await exists(absolutePath);
|
|
92
|
-
if (!linkExists) {
|
|
93
|
-
hasWarning = true;
|
|
94
|
-
console.log(`WARN managed link missing: ${relativePath}`);
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const isLink = await isSymlink(absolutePath);
|
|
99
|
-
if (!isLink) {
|
|
100
|
-
hasWarning = true;
|
|
101
|
-
console.log(`WARN managed link is not a symlink: ${relativePath}`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
} else {
|
|
105
|
-
hasWarning = true;
|
|
106
|
-
console.log("WARN managedLinks is missing or invalid in .ai-workflow.json");
|
|
107
|
-
}
|
|
108
|
-
} catch {
|
|
109
|
-
hasFailure = true;
|
|
110
|
-
console.log("FAIL .ai-workflow.json is not valid JSON");
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (profile !== "minimal") {
|
|
115
|
-
const opencodePath = path.join(cwd, "opencode.jsonc");
|
|
116
|
-
if (!(await exists(opencodePath))) {
|
|
117
|
-
hasFailure = true;
|
|
118
|
-
console.log("FAIL opencode.jsonc missing for operational/full profile");
|
|
119
|
-
} else {
|
|
120
|
-
try {
|
|
121
|
-
const opencodeConfig = await readJsonc(opencodePath);
|
|
122
|
-
console.log("PASS opencode.jsonc is valid JSONC");
|
|
123
|
-
|
|
124
|
-
const needsAgentDefault = managedBlocks.includes("opencode.jsonc:agent.default");
|
|
125
|
-
if (!needsAgentDefault || opencodeConfig.agent?.default) {
|
|
126
|
-
console.log("PASS opencode agent.default available");
|
|
127
|
-
} else {
|
|
128
|
-
hasFailure = true;
|
|
129
|
-
console.log("FAIL opencode agent.default missing");
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const needsStart = managedBlocks.includes("opencode.jsonc:command.start");
|
|
133
|
-
if (!needsStart || opencodeConfig.command?.start) {
|
|
134
|
-
console.log("PASS opencode command.start available");
|
|
135
|
-
} else {
|
|
136
|
-
hasFailure = true;
|
|
137
|
-
console.log("FAIL opencode command.start missing");
|
|
138
|
-
}
|
|
139
|
-
} catch {
|
|
140
|
-
hasFailure = true;
|
|
141
|
-
console.log("FAIL opencode.jsonc is not valid JSONC");
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const packageJsonPath = path.join(cwd, "package.json");
|
|
147
|
-
if (await exists(packageJsonPath)) {
|
|
148
|
-
try {
|
|
149
|
-
const packageJson = await readJson(packageJsonPath);
|
|
150
|
-
const scripts = packageJson.scripts ?? {};
|
|
151
|
-
|
|
152
|
-
if (!scripts.validate) {
|
|
153
|
-
hasWarning = true;
|
|
154
|
-
console.log("WARN package.json has no validate script");
|
|
155
|
-
}
|
|
156
|
-
} catch {
|
|
157
|
-
hasFailure = true;
|
|
158
|
-
console.log("FAIL package.json is not valid JSON");
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
const finalStatus = hasFailure ? "FAIL" : hasWarning ? "PASS_WITH_NOTES" : "PASS";
|
|
163
|
-
console.log(`Final status: ${finalStatus}`);
|
|
164
|
-
|
|
165
|
-
if (hasFailure) {
|
|
166
|
-
process.exitCode = 1;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import readline from "readline";
|
|
2
|
-
|
|
3
|
-
function ask(rl, question) {
|
|
4
|
-
return new Promise((resolve) => {
|
|
5
|
-
rl.question(question, (answer) => resolve(answer.trim()));
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function sleep(ms) {
|
|
10
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const TOOLS = [
|
|
14
|
-
{
|
|
15
|
-
tool: "OpenCode",
|
|
16
|
-
icon: "⚡",
|
|
17
|
-
description: "Best integrated experience — commands, agents, routing built-in",
|
|
18
|
-
commands: ["/start", "/plan", "/execute", "/review", "/validate", "/ship"],
|
|
19
|
-
next: "Run `opencode` in your project, then try `/start` to begin.",
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
tool: "Codex",
|
|
23
|
-
icon: "📋",
|
|
24
|
-
description: "Prompt-driven workflow with explicit manual orchestration",
|
|
25
|
-
commands: ["codex:start", "codex:plan", "codex:execute", "codex:review", "codex:validate"],
|
|
26
|
-
next: "Run `codex` in your project, then use the command prompts from `.codex/prompts/`.",
|
|
27
|
-
},
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
const WORKFLOW_GOALS = [
|
|
31
|
-
{
|
|
32
|
-
id: "new-project",
|
|
33
|
-
label: "Start a new project",
|
|
34
|
-
icon: "🆕",
|
|
35
|
-
hint: "You have a new or empty repository and want to apply the workflow.",
|
|
36
|
-
steps: [
|
|
37
|
-
"1. Run `npx @williambeto/ai-workflow init --yes` to install workflow assets",
|
|
38
|
-
"2. Run `npx @williambeto/ai-workflow doctor` to verify installation",
|
|
39
|
-
"3. Define the project goal and constraints",
|
|
40
|
-
"4. Create the first requirement using prompts/01-create-requirement.md",
|
|
41
|
-
"5. Follow the workflow: spec → plan → PR breakdown → implement → validate",
|
|
42
|
-
],
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: "feature-pr",
|
|
46
|
-
label: "Deliver a feature or fix",
|
|
47
|
-
icon: "🔧",
|
|
48
|
-
hint: "You have a specific feature or bug fix to implement.",
|
|
49
|
-
steps: [
|
|
50
|
-
"1. Clarify the requirement: what, who, scope, acceptance criteria",
|
|
51
|
-
"2. Use /plan (OpenCode) or plan-from-requirement.md (Codex) to create the plan",
|
|
52
|
-
"3. Break into small PRs with prompts/04-breakdown-prs.md",
|
|
53
|
-
"4. Implement only PR 1",
|
|
54
|
-
"5. Review, validate, then continue to next PR",
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: "audit",
|
|
59
|
-
label: "Audit existing work",
|
|
60
|
-
icon: "🔍",
|
|
61
|
-
hint: "You want to review, validate, or audit an existing implementation.",
|
|
62
|
-
steps: [
|
|
63
|
-
"1. Use /review (OpenCode) or review-implementation.md (Codex)",
|
|
64
|
-
"2. Validate with /validate (OpenCode) or validate-work.md (Codex)",
|
|
65
|
-
"3. Check: lint, typecheck, test, build",
|
|
66
|
-
"4. Review PR scope and evidence",
|
|
67
|
-
"5. Approve or request changes",
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
id: "deploy",
|
|
72
|
-
label: "Prepare for deployment",
|
|
73
|
-
icon: "🚀",
|
|
74
|
-
hint: "You need to review deployment readiness and create a rollback plan.",
|
|
75
|
-
steps: [
|
|
76
|
-
"1. Use /deploy (OpenCode) or deploy.md (Codex)",
|
|
77
|
-
"2. Review environment assumptions",
|
|
78
|
-
"3. Define smoke tests and rollback plan",
|
|
79
|
-
"4. Validate pre-deploy checks",
|
|
80
|
-
"5. Execute with monitoring",
|
|
81
|
-
],
|
|
82
|
-
},
|
|
83
|
-
];
|
|
84
|
-
|
|
85
|
-
async function printBanner() {
|
|
86
|
-
console.log("\n⚙️ AI Workflow Kit — Quick Guide\n");
|
|
87
|
-
console.log("This guide helps you find the right next step based on your goal.");
|
|
88
|
-
await sleep(200);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async function detectInstalledAssets(cwd) {
|
|
92
|
-
const fs = await import("node:fs");
|
|
93
|
-
const checks = [
|
|
94
|
-
{ path: ".codex/prompts/start-project.md", label: "Codex prompts" },
|
|
95
|
-
{ path: "opencode.jsonc", label: "OpenCode config" },
|
|
96
|
-
{ path: ".ai-workflow.json", label: "ai-workflow config" },
|
|
97
|
-
{ path: "AGENTS.md", label: "AGENTS.md" },
|
|
98
|
-
];
|
|
99
|
-
const found = checks.filter((c) => fs.existsSync(c.path));
|
|
100
|
-
return { found, total: checks.length };
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function printGoal(goal) {
|
|
104
|
-
console.log(`\n${goal.icon} Goal: ${goal.label}`);
|
|
105
|
-
console.log(` ${goal.hint}\n`);
|
|
106
|
-
for (const step of goal.steps) {
|
|
107
|
-
console.log(` ${step}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function printTool(tool) {
|
|
112
|
-
console.log(`\n${tool.icon} Recommended for ${tool.tool}`);
|
|
113
|
-
console.log(` ${tool.description}\n`);
|
|
114
|
-
console.log(" Key commands:");
|
|
115
|
-
for (const cmd of tool.commands) {
|
|
116
|
-
console.log(` - ${cmd}`);
|
|
117
|
-
}
|
|
118
|
-
console.log(`\n → ${tool.next}`);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
async function runGuideSession({ cwd, rl }) {
|
|
122
|
-
await printBanner();
|
|
123
|
-
|
|
124
|
-
const { found, total } = await detectInstalledAssets(cwd);
|
|
125
|
-
|
|
126
|
-
if (found.length === 0) {
|
|
127
|
-
console.log("📦 No workflow assets detected. Starting from scratch.\n");
|
|
128
|
-
console.log(" Run `npx @williambeto/ai-workflow init --yes` first to install assets.\n");
|
|
129
|
-
} else {
|
|
130
|
-
console.log(`📋 Detected ${found.length}/${total} workflow assets installed.\n`);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
console.log("What do you want to do?\n");
|
|
134
|
-
for (let i = 0; i < WORKFLOW_GOALS.length; i++) {
|
|
135
|
-
const goal = WORKFLOW_GOALS[i];
|
|
136
|
-
console.log(` [${i + 1}] ${goal.icon} ${goal.label}`);
|
|
137
|
-
}
|
|
138
|
-
console.log(" [q] Quit guide\n");
|
|
139
|
-
|
|
140
|
-
const goalAnswer = await ask(rl, "Choose an option (1-4) or 'q': ");
|
|
141
|
-
const goalIndex = parseInt(goalAnswer, 10) - 1;
|
|
142
|
-
|
|
143
|
-
if (goalAnswer.toLowerCase() === "q") {
|
|
144
|
-
console.log("\n👍 Run `npx @williambeto/ai-workflow guide` anytime to return here.\n");
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const selectedGoal = WORKFLOW_GOALS[goalIndex];
|
|
149
|
-
if (!selectedGoal) {
|
|
150
|
-
console.log("\n⚠️ Invalid option. Run `npx @williambeto/ai-workflow guide` to restart.\n");
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
printGoal(selectedGoal);
|
|
155
|
-
|
|
156
|
-
console.log("Which tool are you using?\n");
|
|
157
|
-
for (let i = 0; i < TOOLS.length; i++) {
|
|
158
|
-
const tool = TOOLS[i];
|
|
159
|
-
console.log(` [${i + 1}] ${tool.icon} ${tool.tool}`);
|
|
160
|
-
}
|
|
161
|
-
console.log(" [b] Back to goals\n");
|
|
162
|
-
|
|
163
|
-
const toolAnswer = await ask(rl, "Choose an option (1-2) or 'b': ");
|
|
164
|
-
if (toolAnswer.toLowerCase() === "b") {
|
|
165
|
-
await runGuideSession({ cwd, rl });
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const toolIndex = parseInt(toolAnswer, 10) - 1;
|
|
170
|
-
const selectedTool = TOOLS[toolIndex];
|
|
171
|
-
if (!selectedTool) {
|
|
172
|
-
console.log("\n⚠️ Invalid option. Run `npx @williambeto/ai-workflow guide` to restart.\n");
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
printTool(selectedTool);
|
|
177
|
-
|
|
178
|
-
console.log("\n📚 Full documentation: docs/npm-consumer-quickstart.md");
|
|
179
|
-
console.log(" Quick reference: runbooks/quick-start-guide.md\n");
|
|
180
|
-
console.log("👍 Run `npx @williambeto/ai-workflow guide` anytime to return here.\n");
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
export async function runGuide({ cwd }) {
|
|
184
|
-
const rl = readline.createInterface({
|
|
185
|
-
input: process.stdin,
|
|
186
|
-
output: process.stdout,
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
await runGuideSession({ cwd, rl });
|
|
191
|
-
} finally {
|
|
192
|
-
rl.close();
|
|
193
|
-
}
|
|
194
|
-
}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { exists, readJsonc, writeFileSafe } from "./filesystem.js";
|
|
3
|
-
import { createManagedBackup } from "./backup.js";
|
|
4
|
-
import { readPackageFile } from "./package-assets.js";
|
|
5
|
-
|
|
6
|
-
const LEGACY_MARKER = "_aiWorkflowManaged";
|
|
7
|
-
|
|
8
|
-
function loadCanonicalFullConfig() {
|
|
9
|
-
try {
|
|
10
|
-
const raw = readPackageFile("opencode.jsonc");
|
|
11
|
-
if (!raw) return null;
|
|
12
|
-
const parsed = JSON.parse(raw);
|
|
13
|
-
|
|
14
|
-
if (!parsed || typeof parsed !== "object") return null;
|
|
15
|
-
if (!parsed.agent || !parsed.command) return null;
|
|
16
|
-
|
|
17
|
-
if (!parsed.agent.default) {
|
|
18
|
-
parsed.agent.default = {
|
|
19
|
-
mode: "primary",
|
|
20
|
-
description: "Default OpenCode agent for this project",
|
|
21
|
-
prompt:
|
|
22
|
-
"You are the default OpenCode agent for this repository. Follow local project docs and validation commands."
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return parsed;
|
|
27
|
-
} catch {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function buildManagedConfig(profile = "full") {
|
|
33
|
-
const canonicalFull = profile === "full" ? loadCanonicalFullConfig() : null;
|
|
34
|
-
if (canonicalFull) {
|
|
35
|
-
return canonicalFull;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const fullPrimaryAgents =
|
|
39
|
-
profile === "full"
|
|
40
|
-
? {
|
|
41
|
-
discovery: { mode: "primary", description: "Explore repository context", prompt: "{file:./opencode/agents/discovery.md}" },
|
|
42
|
-
planner: { mode: "primary", description: "Plan requirement-to-PR flow", prompt: "{file:./opencode/agents/planner.md}" },
|
|
43
|
-
implementer: { mode: "primary", description: "Implement scoped changes", prompt: "{file:./opencode/agents/implementer.md}" },
|
|
44
|
-
fixer: { mode: "primary", description: "Fix issues and regressions", prompt: "{file:./opencode/agents/fixer.md}" },
|
|
45
|
-
reviewer: { mode: "primary", description: "Review implementation quality", prompt: "{file:./opencode/agents/reviewer.md}" },
|
|
46
|
-
validator: { mode: "primary", description: "Validate with evidence", prompt: "{file:./opencode/agents/validator.md}" },
|
|
47
|
-
"release-manager": { mode: "primary", description: "Prepare release/deploy steps", prompt: "{file:./opencode/agents/release-manager.md}" },
|
|
48
|
-
"wordpress-engineer": { mode: "primary", description: "WordPress specialist role", prompt: "{file:./opencode/agents/wordpress-engineer.md}" },
|
|
49
|
-
"prompt-engineer": { mode: "primary", description: "Prompt/system design role", prompt: "{file:./opencode/agents/prompt-engineer.md}" },
|
|
50
|
-
"spec-engineer": { mode: "primary", description: "Create and review functional specifications", prompt: "{file:./opencode/agents/spec-engineer.md}" },
|
|
51
|
-
orchestrator: {
|
|
52
|
-
mode: "primary",
|
|
53
|
-
description: "Route work by safe workflow gates",
|
|
54
|
-
prompt: "{file:./opencode/agents/orchestrator.md}"
|
|
55
|
-
},
|
|
56
|
-
}
|
|
57
|
-
: {};
|
|
58
|
-
|
|
59
|
-
const fullSkills =
|
|
60
|
-
profile === "full"
|
|
61
|
-
? {
|
|
62
|
-
"backend-implementer": { mode: "subagent", description: "Backend implementation specialist", prompt: "{file:./.agents/skills/backend-implementer/SKILL.md}" },
|
|
63
|
-
"build-and-validate": { mode: "subagent", description: "Build and validation specialist", prompt: "{file:./.agents/skills/build-and-validate/SKILL.md}" },
|
|
64
|
-
"pr-orchestrator": { mode: "subagent", description: "PR breakdown and flow specialist", prompt: "{file:./.agents/skills/pr-orchestrator/SKILL.md}" },
|
|
65
|
-
"deploy-engineer": { mode: "subagent", description: "Deploy and release specialist", prompt: "{file:./.agents/skills/deploy-engineer/SKILL.md}" },
|
|
66
|
-
"docs-writer": { mode: "subagent", description: "Documentation specialist", prompt: "{file:./.agents/skills/docs-writer/SKILL.md}" },
|
|
67
|
-
"frontend-implementer": { mode: "subagent", description: "Frontend implementation specialist", prompt: "{file:./.agents/skills/frontend-implementer/SKILL.md}" },
|
|
68
|
-
"interface-design": { mode: "subagent", description: "Interface design specialist", prompt: "{file:./.agents/skills/interface-design/SKILL.md}" },
|
|
69
|
-
"minimal-context": { mode: "subagent", description: "Minimal-context specialist", prompt: "{file:./.agents/skills/minimal-context/SKILL.md}" },
|
|
70
|
-
napkin: { mode: "subagent", description: "Project memory specialist", prompt: "{file:./.agents/skills/napkin/SKILL.md}" },
|
|
71
|
-
"opencode-agent-design": { mode: "subagent", description: "OpenCode agent design specialist", prompt: "{file:./.agents/skills/opencode-agent-design/SKILL.md}" },
|
|
72
|
-
"playwright-cli": { mode: "subagent", description: "Playwright specialist", prompt: "{file:./.agents/skills/playwright-cli/SKILL.md}" },
|
|
73
|
-
"product-manager": { mode: "subagent", description: "Product scope specialist", prompt: "{file:./.agents/skills/product-manager/SKILL.md}" },
|
|
74
|
-
"seo-audit": { mode: "subagent", description: "SEO audit specialist", prompt: "{file:./.agents/skills/seo-audit/SKILL.md}" },
|
|
75
|
-
"stack-variant-creator": { mode: "subagent", description: "Stack variant specialist", prompt: "{file:./.agents/skills/stack-variant-creator/SKILL.md}" },
|
|
76
|
-
"tech-lead": { mode: "subagent", description: "Technical lead specialist", prompt: "{file:./.agents/skills/tech-lead/SKILL.md}" },
|
|
77
|
-
tester: { mode: "subagent", description: "Testing specialist", prompt: "{file:./.agents/skills/tester/SKILL.md}" },
|
|
78
|
-
"token-economy": { mode: "subagent", description: "Token economy specialist", prompt: "{file:./.agents/skills/token-economy/SKILL.md}" },
|
|
79
|
-
"vue-nuxt": { mode: "subagent", description: "Vue/Nuxt architecture specialist", prompt: "{file:./.agents/skills/vue-nuxt/SKILL.md}" },
|
|
80
|
-
"wordpress-engineer": { mode: "subagent", description: "WordPress specialist", prompt: "{file:./.agents/skills/wordpress-engineer/SKILL.md}" }
|
|
81
|
-
}
|
|
82
|
-
: {};
|
|
83
|
-
|
|
84
|
-
const startAgent = profile === "full" ? "orchestrator" : "default";
|
|
85
|
-
return {
|
|
86
|
-
$schema: "https://opencode.ai/config.json",
|
|
87
|
-
agent: {
|
|
88
|
-
default: {
|
|
89
|
-
mode: "primary",
|
|
90
|
-
description: "Default OpenCode agent for this project",
|
|
91
|
-
prompt:
|
|
92
|
-
"You are the default OpenCode agent for this repository. Follow local project docs and validation commands."
|
|
93
|
-
},
|
|
94
|
-
...fullPrimaryAgents,
|
|
95
|
-
...fullSkills
|
|
96
|
-
},
|
|
97
|
-
command: {
|
|
98
|
-
start: {
|
|
99
|
-
description: "Start the local workflow",
|
|
100
|
-
agent: startAgent,
|
|
101
|
-
template:
|
|
102
|
-
"Use repository workflow docs as source of truth and ask for missing context before changes."
|
|
103
|
-
},
|
|
104
|
-
...(profile === "full"
|
|
105
|
-
? {
|
|
106
|
-
ship: { description: "Run end-to-end workflow", agent: "orchestrator", template: "Use orchestrator for gated workflow execution." },
|
|
107
|
-
plan: { description: "Plan from requirement to PR", agent: "planner", template: "Create requirement/spec/plan outputs with acceptance criteria." },
|
|
108
|
-
execute: { description: "Implement selected PR", agent: "implementer", template: "Implement one scoped PR with validation evidence." },
|
|
109
|
-
review: { description: "Review implementation", agent: "reviewer", template: "Review for regressions and acceptance criteria coverage." },
|
|
110
|
-
validate: { description: "Validate before merge", agent: "validator", template: "Run checks and report evidence-based readiness." }
|
|
111
|
-
}
|
|
112
|
-
: {})
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export async function mergeOpencodeConfig(cwd, { force = false, backupRoot = ".ai-workflow-backups", profile = "full" } = {}) {
|
|
118
|
-
const targetPath = path.join(cwd, "opencode.jsonc");
|
|
119
|
-
const managed = buildManagedConfig(profile);
|
|
120
|
-
|
|
121
|
-
if (!(await exists(targetPath))) {
|
|
122
|
-
await writeFileSafe(targetPath, `${JSON.stringify(managed, null, 2)}\n`);
|
|
123
|
-
return { changed: true, reason: "created" };
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
let current;
|
|
127
|
-
try {
|
|
128
|
-
current = await readJsonc(targetPath);
|
|
129
|
-
} catch {
|
|
130
|
-
if (!force) {
|
|
131
|
-
return { changed: false, reason: "invalid-json (skipped)" };
|
|
132
|
-
}
|
|
133
|
-
await createManagedBackup(targetPath, {
|
|
134
|
-
cwd,
|
|
135
|
-
backupRoot,
|
|
136
|
-
maxPerFile: 20
|
|
137
|
-
});
|
|
138
|
-
await writeFileSafe(targetPath, `${JSON.stringify(managed, null, 2)}\n`);
|
|
139
|
-
return { changed: true, reason: "invalid-json (replaced with --force)" };
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const { [LEGACY_MARKER]: _legacyManaged, ...currentWithoutLegacy } = current;
|
|
143
|
-
|
|
144
|
-
const next = {
|
|
145
|
-
...currentWithoutLegacy,
|
|
146
|
-
$schema: current.$schema ?? managed.$schema,
|
|
147
|
-
...(managed.mcp
|
|
148
|
-
? {
|
|
149
|
-
mcp: {
|
|
150
|
-
...(current.mcp ?? {}),
|
|
151
|
-
...managed.mcp
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
: {}),
|
|
155
|
-
agent: {
|
|
156
|
-
...(current.agent ?? {}),
|
|
157
|
-
...managed.agent
|
|
158
|
-
},
|
|
159
|
-
command: {
|
|
160
|
-
...(current.command ?? {}),
|
|
161
|
-
...managed.command
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
|
|
165
|
-
const changed = JSON.stringify(current) !== JSON.stringify(next);
|
|
166
|
-
if (!changed) {
|
|
167
|
-
return { changed: false, reason: "already-up-to-date" };
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
await writeFileSafe(targetPath, `${JSON.stringify(next, null, 2)}\n`);
|
|
171
|
-
return { changed: true, reason: "merged-managed-sections" };
|
|
172
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
|
|
4
|
-
function normalize(p) {
|
|
5
|
-
return p.split(path.sep).join("/");
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const LINKABLE_ROOTS = new Set([
|
|
9
|
-
".codex",
|
|
10
|
-
".agents",
|
|
11
|
-
"opencode",
|
|
12
|
-
"prompts",
|
|
13
|
-
"templates",
|
|
14
|
-
"schemas",
|
|
15
|
-
"harness",
|
|
16
|
-
"checklists",
|
|
17
|
-
"runbooks"
|
|
18
|
-
]);
|
|
19
|
-
|
|
20
|
-
const LINKABLE_FILES = new Set(["README.workflow.md"]);
|
|
21
|
-
|
|
22
|
-
export function buildSymlinkEntries({ templateFiles, installRoot = ".ai-workflow" }) {
|
|
23
|
-
const entries = new Map();
|
|
24
|
-
|
|
25
|
-
for (const relativePath of Object.keys(templateFiles)) {
|
|
26
|
-
if (relativePath === "opencode.jsonc") continue;
|
|
27
|
-
|
|
28
|
-
const normalized = normalize(relativePath);
|
|
29
|
-
|
|
30
|
-
if (LINKABLE_FILES.has(normalized)) {
|
|
31
|
-
entries.set(normalized, `${installRoot}/${normalized}`);
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const first = normalized.split("/")[0];
|
|
36
|
-
if (LINKABLE_ROOTS.has(first)) {
|
|
37
|
-
entries.set(first, `${installRoot}/${first}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return Array.from(entries.entries()).map(([linkPath, targetPath]) => ({ linkPath, targetPath }));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function isSymlinkTo(absoluteLinkPath, absoluteTargetPath) {
|
|
45
|
-
try {
|
|
46
|
-
const stat = await fs.lstat(absoluteLinkPath);
|
|
47
|
-
if (!stat.isSymbolicLink()) return false;
|
|
48
|
-
const currentTarget = await fs.readlink(absoluteLinkPath);
|
|
49
|
-
const resolved = path.resolve(path.dirname(absoluteLinkPath), currentTarget);
|
|
50
|
-
return resolved === absoluteTargetPath;
|
|
51
|
-
} catch {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
}
|