@xulthekl/team-flow 0.22.4
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/.agents/skills +1 -0
- package/.claude/always/phase-guard.md +3 -0
- package/.claude-plugin/marketplace.json +20 -0
- package/.claude-plugin/plugin.json +31 -0
- package/.codex-plugin/plugin.json +45 -0
- package/.codexignore +6 -0
- package/.cursor-plugin/marketplace.json +17 -0
- package/.cursor-plugin/plugin.json +31 -0
- package/.github/copilot-instructions.md +15 -0
- package/.github/dependabot.yml +10 -0
- package/.github/plugin/marketplace.json +42 -0
- package/.github/workflows/ci.yml +98 -0
- package/.github/workflows/hol-plugin-scanner.yml +17 -0
- package/.opencode/INSTALL.md +61 -0
- package/.opencode/plugins/team-flow.js +70 -0
- package/AGENTS.md +280 -0
- package/CHANGELOG.md +635 -0
- package/CONTRIBUTING.md +115 -0
- package/GEMINI.md +14 -0
- package/HANDOFF.md +219 -0
- package/INSTALL.md +810 -0
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/SECURITY.md +37 -0
- package/agents/bug-investigator.md +180 -0
- package/agents/change-split-auditor.md +257 -0
- package/agents/code-reviewer.md +171 -0
- package/agents/cross-change-consistency-checker.md +215 -0
- package/agents/prd-completeness-reviewer.md +197 -0
- package/agents/prototype-builder.md +230 -0
- package/agents/prototype-env-scout.md +156 -0
- package/agents/prototype-reviewer.md +226 -0
- package/assets/icon.svg +6 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +5 -0
- package/dist/parsing/change-parser.d.ts +12 -0
- package/dist/parsing/change-parser.js +54 -0
- package/dist/parsing/requirement-blocks.d.ts +31 -0
- package/dist/parsing/requirement-blocks.js +192 -0
- package/dist/schema/base.d.ts +7 -0
- package/dist/schema/base.js +1 -0
- package/dist/schema/change.d.ts +25 -0
- package/dist/schema/change.js +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.js +1 -0
- package/dist/schema/spec.d.ts +11 -0
- package/dist/schema/spec.js +1 -0
- package/dist/validation/constants.d.ts +42 -0
- package/dist/validation/constants.js +42 -0
- package/dist/validation/tokenizer.d.ts +17 -0
- package/dist/validation/tokenizer.js +173 -0
- package/dist/validation/types.d.ts +40 -0
- package/dist/validation/types.js +1 -0
- package/dist/validation/validator.d.ts +21 -0
- package/dist/validation/validator.js +489 -0
- package/docs/README_en.md +358 -0
- package/docs/artifact-contract.md +96 -0
- package/docs/decision-points.md +88 -0
- package/docs/e2e-integration-design.md +207 -0
- package/docs/examples/README.md +25 -0
- package/docs/examples/add-dark-mode/README.md +13 -0
- package/docs/examples/add-dark-mode/design.md +49 -0
- package/docs/examples/add-dark-mode/execution-contract.md +56 -0
- package/docs/examples/add-dark-mode/proposal.md +46 -0
- package/docs/examples/add-dark-mode/specs/ui-theme/spec.md +35 -0
- package/docs/examples/add-dark-mode/tasks.md +26 -0
- package/docs/examples/refactor-auth-boundary/README.md +15 -0
- package/docs/examples/refactor-auth-boundary/design.md +41 -0
- package/docs/examples/refactor-auth-boundary/execution-contract.md +61 -0
- package/docs/examples/refactor-auth-boundary/proposal.md +47 -0
- package/docs/examples/refactor-auth-boundary/specs/auth-boundary/spec.md +45 -0
- package/docs/examples/refactor-auth-boundary/tasks.md +25 -0
- package/docs/plans/2026-07-07-fix-batch-design.md +68 -0
- package/docs/plans/2026-07-20-001-refactor-skill-collaboration-protocol-plan.md +128 -0
- package/docs/platform-matrix.md +45 -0
- package/docs/prototype-design-research.md +206 -0
- package/docs/release-checklist.md +96 -0
- package/docs/showcase.html +699 -0
- package/docs/skill-rename-v0.8.0.md +49 -0
- package/docs/state-machine.md +162 -0
- package/gemini-extension.json +6 -0
- package/hooks/hooks-cursor.json +8 -0
- package/hooks/hooks.json +26 -0
- package/hooks/pre-tool-use-guard +116 -0
- package/hooks/session-start +14 -0
- package/llms.txt +51 -0
- package/package.json +48 -0
- package/plugin.json +27 -0
- package/prd/v1/plan.md +443 -0
- package/prd/v1/prd.md +580 -0
- package/scripts/check-update.mjs +91 -0
- package/scripts/check-version-consistency.mjs +345 -0
- package/scripts/ensure-branch.mjs +71 -0
- package/scripts/get-config +31 -0
- package/scripts/guard/checks/artifacts-exist.mjs +36 -0
- package/scripts/guard/checks/contract-current.mjs +33 -0
- package/scripts/guard/checks/contract-fresh.mjs +17 -0
- package/scripts/guard/checks/dp-gate-passed.mjs +35 -0
- package/scripts/guard/checks/dp3-approved.mjs +22 -0
- package/scripts/guard/checks/execution-plan-ready.mjs +40 -0
- package/scripts/guard/checks/execution-reviews-passed.mjs +36 -0
- package/scripts/guard/checks/schema-valid.mjs +63 -0
- package/scripts/guard/checks/specs-merged.mjs +51 -0
- package/scripts/guard/checks/tasks-complete.mjs +31 -0
- package/scripts/guard/checks/tests-passing.mjs +31 -0
- package/scripts/guard/design-token-guard.mjs +237 -0
- package/scripts/guard/guard.mjs +205 -0
- package/scripts/infer-workflow.mjs +136 -0
- package/scripts/install-amazon-q.mjs +9 -0
- package/scripts/install-cline.mjs +9 -0
- package/scripts/install-continue.mjs +9 -0
- package/scripts/install-cursor.mjs +265 -0
- package/scripts/install-git-hooks.mjs +82 -0
- package/scripts/install-kiro.mjs +9 -0
- package/scripts/install-pi.mjs +9 -0
- package/scripts/install-qoder.mjs +9 -0
- package/scripts/install-qwen.mjs +9 -0
- package/scripts/install-roocode.mjs +9 -0
- package/scripts/install-windsurf.mjs +9 -0
- package/scripts/install-zcode.mjs +265 -0
- package/scripts/lib/cmd-audit.mjs +127 -0
- package/scripts/lib/cmd-checkpoint.mjs +118 -0
- package/scripts/lib/cmd-config.mjs +88 -0
- package/scripts/lib/cmd-doctor.mjs +267 -0
- package/scripts/lib/cmd-execution.mjs +206 -0
- package/scripts/lib/cmd-handoff.mjs +94 -0
- package/scripts/lib/cmd-inject.mjs +310 -0
- package/scripts/lib/cmd-install-amazon-q.mjs +11 -0
- package/scripts/lib/cmd-install-cline.mjs +11 -0
- package/scripts/lib/cmd-install-continue.mjs +11 -0
- package/scripts/lib/cmd-install-cursor.mjs +14 -0
- package/scripts/lib/cmd-install-kiro.mjs +11 -0
- package/scripts/lib/cmd-install-pi.mjs +11 -0
- package/scripts/lib/cmd-install-qoder.mjs +11 -0
- package/scripts/lib/cmd-install-qwen.mjs +11 -0
- package/scripts/lib/cmd-install-roocode.mjs +11 -0
- package/scripts/lib/cmd-install-windsurf.mjs +11 -0
- package/scripts/lib/cmd-install-workbuddy.mjs +359 -0
- package/scripts/lib/cmd-install-zcode.mjs +14 -0
- package/scripts/lib/cmd-isolate.mjs +37 -0
- package/scripts/lib/cmd-list.mjs +71 -0
- package/scripts/lib/cmd-runtime.mjs +85 -0
- package/scripts/lib/cmd-solutions.mjs +71 -0
- package/scripts/lib/cmd-state.mjs +231 -0
- package/scripts/lib/cmd-sync.mjs +102 -0
- package/scripts/lib/cmd-validate.mjs +105 -0
- package/scripts/lib/cmd-version.mjs +148 -0
- package/scripts/lib/config-loader.mjs +107 -0
- package/scripts/lib/execution-plan.mjs +492 -0
- package/scripts/lib/execution-recommendation.mjs +221 -0
- package/scripts/lib/hash.mjs +74 -0
- package/scripts/lib/install.mjs +267 -0
- package/scripts/lib/platform-runtime-inventory.mjs +27 -0
- package/scripts/lib/platforms.mjs +165 -0
- package/scripts/lib/prototype-sync.mjs +192 -0
- package/scripts/lib/sdd-overlay.mjs +262 -0
- package/scripts/lib/shell-quote.mjs +4 -0
- package/scripts/lib/solutions-capture.mjs +102 -0
- package/scripts/lib/solutions-index-gen.mjs +112 -0
- package/scripts/lib/solutions-inject.mjs +77 -0
- package/scripts/lib/solutions-promote.mjs +145 -0
- package/scripts/lib/spec-paths.mjs +85 -0
- package/scripts/lib/state-loader.mjs +154 -0
- package/scripts/lint/lint-skills.mjs +149 -0
- package/scripts/lint/rules/behavior-consistency.mjs +56 -0
- package/scripts/lint/rules/dp-trigger-points.mjs +60 -0
- package/scripts/lint/rules/exception-handling.mjs +59 -0
- package/scripts/lint/rules/no-contradictory-instructions.mjs +67 -0
- package/scripts/lint/rules/no-redundant-checks.mjs +50 -0
- package/scripts/lint/rules/token-rules.mjs +122 -0
- package/scripts/review-package +44 -0
- package/scripts/task-brief +40 -0
- package/scripts/team-flow.mjs +164 -0
- package/scripts/token-baseline.mjs +158 -0
- package/scripts/validate-artifacts +96 -0
- package/scripts/verify-marketplace-release.mjs +59 -0
- package/skills/architecture-design/SKILL.md +140 -0
- package/skills/architecture-design/chapters/ch01-4a-domains.md +27 -0
- package/skills/architecture-design/chapters/ch02-change-cascade.md +27 -0
- package/skills/architecture-design/chapters/ch03-architecture-outputs.md +25 -0
- package/skills/architecture-design/chapters/ch04-entity-to-aggregate.md +27 -0
- package/skills/architecture-design/chapters/ch05-cqrs.md +32 -0
- package/skills/architecture-design/chapters/ch06-integration.md +54 -0
- package/skills/architecture-design/cheatsheet.md +51 -0
- package/skills/architecture-design/glossary.md +23 -0
- package/skills/architecture-design/patterns.md +32 -0
- package/skills/bug-investigator/SKILL.md +77 -0
- package/skills/build-executor/SKILL.md +163 -0
- package/skills/build-executor/implementer-prompt.md +162 -0
- package/skills/build-executor/references/execution-modes.md +86 -0
- package/skills/build-executor/task-reviewer-prompt.md +195 -0
- package/skills/ce-brainstorm/SKILL.md +415 -0
- package/skills/ce-brainstorm/references/agents/slack-researcher.md +127 -0
- package/skills/ce-brainstorm/references/blindspot-pass.md +70 -0
- package/skills/ce-brainstorm/references/brainstorm-sections.md +285 -0
- package/skills/ce-brainstorm/references/handoff.md +168 -0
- package/skills/ce-brainstorm/references/html-rendering.md +634 -0
- package/skills/ce-brainstorm/references/markdown-rendering.md +241 -0
- package/skills/ce-brainstorm/references/model-tiers.md +9 -0
- package/skills/ce-brainstorm/references/prd-mapping.md +71 -0
- package/skills/ce-brainstorm/references/product-pressure-test.md +42 -0
- package/skills/ce-brainstorm/references/reasoning-elevation.md +63 -0
- package/skills/ce-brainstorm/references/settled-decisions.md +45 -0
- package/skills/ce-brainstorm/references/synthesis-summary.md +282 -0
- package/skills/ce-brainstorm/references/universal-brainstorming.md +73 -0
- package/skills/ce-brainstorm/references/verdict-routing.md +26 -0
- package/skills/ce-brainstorm/references/visual-probes.md +158 -0
- package/skills/ce-brainstorm/scripts/visual-probe-server.js +418 -0
- package/skills/ce-compound/SKILL.md +114 -0
- package/skills/ce-compound/assets/resolution-template.md +94 -0
- package/skills/ce-compound/references/agents/best-practices-researcher.md +115 -0
- package/skills/ce-compound/references/agents/data-integrity-guardian.md +68 -0
- package/skills/ce-compound/references/agents/framework-docs-researcher.md +93 -0
- package/skills/ce-compound/references/agents/pattern-recognition-specialist.md +55 -0
- package/skills/ce-compound/references/agents/performance-oracle.md +108 -0
- package/skills/ce-compound/references/agents/security-sentinel.md +91 -0
- package/skills/ce-compound/references/agents/session-historian.md +83 -0
- package/skills/ce-compound/references/concepts-vocabulary.md +78 -0
- package/skills/ce-compound/references/full-mode-workflow.md +413 -0
- package/skills/ce-compound/references/grounding-validation.md +84 -0
- package/skills/ce-compound/references/lightweight-mode.md +53 -0
- package/skills/ce-compound/references/output-standards.md +182 -0
- package/skills/ce-compound/references/promotion-rules.md +38 -0
- package/skills/ce-compound/references/schema.yaml +231 -0
- package/skills/ce-compound/references/three-tier-index.md +55 -0
- package/skills/ce-compound/references/v0.5-upgrade.md +32 -0
- package/skills/ce-compound/references/write-flow.md +36 -0
- package/skills/ce-compound/references/yaml-schema.md +118 -0
- package/skills/ce-compound/scripts/session-history/discover-sessions.sh +130 -0
- package/skills/ce-compound/scripts/session-history/extract-errors.py +254 -0
- package/skills/ce-compound/scripts/session-history/extract-metadata.py +456 -0
- package/skills/ce-compound/scripts/session-history/extract-skeleton.py +575 -0
- package/skills/ce-compound/scripts/validate-doc-claims.py +346 -0
- package/skills/ce-compound/scripts/validate-frontmatter.py +137 -0
- package/skills/ce-ideate/SKILL.md +402 -0
- package/skills/ce-ideate/references/agents/issue-intelligence-analyst.md +200 -0
- package/skills/ce-ideate/references/agents/learnings-researcher.md +247 -0
- package/skills/ce-ideate/references/agents/slack-researcher.md +127 -0
- package/skills/ce-ideate/references/agents/web-researcher.md +121 -0
- package/skills/ce-ideate/references/divergent-ideation.md +89 -0
- package/skills/ce-ideate/references/html-rendering.md +634 -0
- package/skills/ce-ideate/references/ideation-sections.md +191 -0
- package/skills/ce-ideate/references/markdown-rendering.md +238 -0
- package/skills/ce-ideate/references/post-ideation-workflow.md +167 -0
- package/skills/ce-ideate/references/universal-ideation.md +107 -0
- package/skills/ce-ideate/references/web-research-cache.md +56 -0
- package/skills/ce-plan/SKILL.md +137 -0
- package/skills/ce-plan/references/agents/agent-native-planning-strategist.md +62 -0
- package/skills/ce-plan/references/agents/architecture-strategist.md +46 -0
- package/skills/ce-plan/references/agents/best-practices-researcher.md +114 -0
- package/skills/ce-plan/references/agents/data-integrity-guardian.md +68 -0
- package/skills/ce-plan/references/agents/data-migration-reviewer.md +103 -0
- package/skills/ce-plan/references/agents/deployment-verification-agent.md +157 -0
- package/skills/ce-plan/references/agents/framework-docs-researcher.md +93 -0
- package/skills/ce-plan/references/agents/git-history-analyzer.md +40 -0
- package/skills/ce-plan/references/agents/learnings-researcher.md +247 -0
- package/skills/ce-plan/references/agents/pattern-recognition-specialist.md +55 -0
- package/skills/ce-plan/references/agents/performance-oracle.md +108 -0
- package/skills/ce-plan/references/agents/repo-research-analyst.md +258 -0
- package/skills/ce-plan/references/agents/security-sentinel.md +91 -0
- package/skills/ce-plan/references/agents/slack-researcher.md +127 -0
- package/skills/ce-plan/references/agents/spec-flow-analyzer.md +80 -0
- package/skills/ce-plan/references/agents/web-researcher.md +121 -0
- package/skills/ce-plan/references/approach-altitude.md +55 -0
- package/skills/ce-plan/references/change-splitting.md +65 -0
- package/skills/ce-plan/references/completion-contract.md +33 -0
- package/skills/ce-plan/references/core-principles.md +40 -0
- package/skills/ce-plan/references/deepening-workflow.md +263 -0
- package/skills/ce-plan/references/dependency-graph.md +36 -0
- package/skills/ce-plan/references/html-rendering.md +634 -0
- package/skills/ce-plan/references/intake-routing.md +189 -0
- package/skills/ce-plan/references/markdown-rendering.md +238 -0
- package/skills/ce-plan/references/plan-handoff.md +150 -0
- package/skills/ce-plan/references/plan-sections.md +427 -0
- package/skills/ce-plan/references/plan-structure.md +120 -0
- package/skills/ce-plan/references/planning-modes.md +69 -0
- package/skills/ce-plan/references/reasoning-elevation.md +63 -0
- package/skills/ce-plan/references/research-workflow.md +165 -0
- package/skills/ce-plan/references/review-and-write.md +127 -0
- package/skills/ce-plan/references/settled-decisions.md +45 -0
- package/skills/ce-plan/references/synthesis-summary.md +418 -0
- package/skills/ce-plan/references/universal-planning.md +168 -0
- package/skills/ce-proof/SKILL.md +346 -0
- package/skills/ce-strategy/SKILL.md +97 -0
- package/skills/ce-strategy/references/interview.md +143 -0
- package/skills/ce-strategy/references/strategy-template.md +89 -0
- package/skills/code-reviewer/SKILL.md +84 -0
- package/skills/code-reviewer/code-reviewer-prompt.md +195 -0
- package/skills/contract-builder/SKILL.md +72 -0
- package/skills/design-system/SKILL.md +75 -0
- package/skills/design-system/references/agents/design-system-architect.md +138 -0
- package/skills/design-system/references/creation-flow.md +170 -0
- package/skills/design-system/references/preview-template.html +319 -0
- package/skills/design-system/references/token-derivation.md +115 -0
- package/skills/design-system/references/variant-schema.md +60 -0
- package/skills/e2e/SKILL.md +56 -0
- package/skills/e2e/references/test-verifier.md +40 -0
- package/skills/need-explorer/SKILL.md +79 -0
- package/skills/prototype/SKILL.md +98 -0
- package/skills/prototype/references/agents/design-system-architect.md +122 -0
- package/skills/prototype/references/checklist.md +82 -0
- package/skills/prototype/references/craft/accessibility-baseline.md +71 -0
- package/skills/prototype/references/craft/anti-ai-slop.md +87 -0
- package/skills/prototype/references/craft/laws-of-ux.md +60 -0
- package/skills/prototype/references/craft/state-coverage.md +81 -0
- package/skills/prototype/references/craft/typography-hierarchy.md +50 -0
- package/skills/prototype/references/layouts.md +223 -0
- package/skills/prototype/references/orchestration-flow.md +101 -0
- package/skills/prototype/references/prototype-scaffold/assets/design-tokens.css +19 -0
- package/skills/prototype/references/prototype-scaffold/components/button.html +3 -0
- package/skills/prototype/references/prototype-scaffold/design-system.md +7 -0
- package/skills/prototype/references/prototype-scaffold/flow.md +11 -0
- package/skills/prototype/references/prototype-scaffold/index.html +20 -0
- package/skills/prototype/references/prototype-scaffold/pages/index.html +11 -0
- package/skills/prototype/references/template.html +396 -0
- package/skills/release-archivist/SKILL.md +166 -0
- package/skills/release-archivist/references/closing-procedures.md +81 -0
- package/skills/session-handoff/SKILL.md +110 -0
- package/skills/session-handoff/references/context-extraction.md +70 -0
- package/skills/session-handoff/references/handoff-template.md +90 -0
- package/skills/session-handoff/references/skill-recommendation.md +43 -0
- package/skills/spec-merger/SKILL.md +66 -0
- package/skills/spec-writer/SKILL.md +149 -0
- package/skills/workflow-bootstrap/SKILL.md +148 -0
- package/skills/workflow-bootstrap/references/agents/codebase-recon-analyst.md +121 -0
- package/skills/workflow-bootstrap/references/b1-reconnaissance.md +80 -0
- package/skills/workflow-bootstrap/scripts/recon-probe.sh +328 -0
- package/skills/workflow-feedback/SKILL.md +120 -0
- package/skills/workflow-feedback/references/category-guide.md +121 -0
- package/skills/workflow-feedback/references/feedback-template.md +73 -0
- package/skills/workflow-feedback/references/review-mode.md +92 -0
- package/skills/workflow-orchestrator/SKILL.md +94 -0
- package/skills/workflow-orchestrator/references/feedback-loops.md +56 -0
- package/skills/workflow-orchestrator/references/s1-path-router.md +81 -0
- package/skills/workflow-orchestrator/references/s2-prd-prototype-loop.md +96 -0
- package/skills/workflow-orchestrator/references/s3-plan-pipeline.md +50 -0
- package/skills/workflow-orchestrator/references/s4-split-validate.md +108 -0
- package/skills/workflow-orchestrator/references/s5-monitoring.md +61 -0
- package/skills/workflow-orchestrator/references/state-model.md +185 -0
- package/skills/workflow-start/SKILL.md +147 -0
- package/skills/workflow-start/references/routing-rules.md +155 -0
- package/src/index.ts +16 -0
- package/src/parsing/change-parser.ts +79 -0
- package/src/parsing/requirement-blocks.ts +244 -0
- package/src/schema/base.ts +8 -0
- package/src/schema/change.ts +29 -0
- package/src/schema/index.ts +3 -0
- package/src/schema/spec.ts +12 -0
- package/src/validation/constants.ts +53 -0
- package/src/validation/tokenizer.ts +180 -0
- package/src/validation/types.ts +47 -0
- package/src/validation/validator.ts +552 -0
- package/templates/abandonment-summary.md +29 -0
- package/templates/design.md +37 -0
- package/templates/execution-contract.md +99 -0
- package/templates/plan.md +86 -0
- package/templates/prd.md +468 -0
- package/templates/proposal.md +37 -0
- package/templates/spec.md +31 -0
- package/templates/tasks.md +47 -0
- package/tests/e2e.test.mjs +266 -0
- package/tests/lib/cmd-audit.test.mjs +202 -0
- package/tests/lib/cmd-checkpoint.test.mjs +98 -0
- package/tests/lib/cmd-config.test.mjs +101 -0
- package/tests/lib/cmd-doctor.test.mjs +450 -0
- package/tests/lib/cmd-execution.test.mjs +647 -0
- package/tests/lib/cmd-handoff.test.mjs +137 -0
- package/tests/lib/cmd-inject.test.mjs +218 -0
- package/tests/lib/cmd-install-workbuddy.test.mjs +113 -0
- package/tests/lib/cmd-install-zcode.test.mjs +42 -0
- package/tests/lib/cmd-isolate.test.mjs +68 -0
- package/tests/lib/cmd-list.test.mjs +127 -0
- package/tests/lib/cmd-runtime.test.mjs +83 -0
- package/tests/lib/cmd-state-missing.test.mjs +65 -0
- package/tests/lib/cmd-state.test.mjs +365 -0
- package/tests/lib/cmd-sync-paths.test.mjs +84 -0
- package/tests/lib/cmd-validate-paths.test.mjs +90 -0
- package/tests/lib/config-loader.test.mjs +175 -0
- package/tests/lib/ensure-branch.test.mjs +59 -0
- package/tests/lib/execution-control-plane.test.mjs +168 -0
- package/tests/lib/execution-plan.test.mjs +474 -0
- package/tests/lib/guard-specs-merged.test.mjs +108 -0
- package/tests/lib/guard-tests-passing.test.mjs +112 -0
- package/tests/lib/guard-transitions.test.mjs +262 -0
- package/tests/lib/guard.test.mjs +611 -0
- package/tests/lib/hash.test.mjs +138 -0
- package/tests/lib/infer-workflow.test.mjs +161 -0
- package/tests/lib/install-git-hooks.test.mjs +20 -0
- package/tests/lib/marketplace-release-docs.test.mjs +31 -0
- package/tests/lib/minimality-discipline.test.mjs +37 -0
- package/tests/lib/model-profiles-docs.test.mjs +33 -0
- package/tests/lib/node20-compatibility.test.mjs +73 -0
- package/tests/lib/node20-test-entry.test.mjs +17 -0
- package/tests/lib/platform-runtime-distribution.test.mjs +150 -0
- package/tests/lib/raw-mode-smoke.test.mjs +42 -0
- package/tests/lib/sdd-overlay.test.mjs +118 -0
- package/tests/lib/spec-paths.test.mjs +80 -0
- package/tests/lib/state-loader.test.mjs +251 -0
- package/tests/lib/token-baseline.test.mjs +72 -0
- package/tests/lib/token-rules.test.mjs +94 -0
- package/tests/lib/verify-marketplace-release.test.mjs +128 -0
- package/tests/tsconfig.json +12 -0
- package/token-baseline.json +95 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/infer-workflow.mjs — infer hotfix/tweak/full from change artifacts
|
|
3
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { readState } from './lib/state-loader.mjs';
|
|
6
|
+
|
|
7
|
+
const CODE_EXTS = [
|
|
8
|
+
'mjs', 'js', 'ts', 'jsx', 'tsx', 'cjs',
|
|
9
|
+
'java', 'go', 'py', 'pyw', 'rb', 'php',
|
|
10
|
+
'rs', 'kt', 'kts', 'swift',
|
|
11
|
+
'c', 'h', 'cc', 'cpp', 'cxx', 'hpp',
|
|
12
|
+
'cs', 'fs', 'fsx', 'vb',
|
|
13
|
+
'scala', 'sc', 'clj', 'cljs', 'ex', 'exs',
|
|
14
|
+
'dart', 'lua', 'r', 'pl', 'pm', 'sh', 'bash', 'zsh', 'fish',
|
|
15
|
+
];
|
|
16
|
+
const CONFIG_DOC_EXTS = [
|
|
17
|
+
'md', 'json', 'yaml', 'yml', 'toml', 'ini',
|
|
18
|
+
'txt', 'html', 'css',
|
|
19
|
+
];
|
|
20
|
+
const CODE_EXT_SET = new Set(CODE_EXTS);
|
|
21
|
+
const CONFIG_DOC_EXT_SET = new Set(CONFIG_DOC_EXTS);
|
|
22
|
+
const FILE_EXT_PATTERN = [...CODE_EXTS, ...CONFIG_DOC_EXTS]
|
|
23
|
+
.sort((a, b) => b.length - a.length)
|
|
24
|
+
.join('|');
|
|
25
|
+
|
|
26
|
+
const FILE_RE = new RegExp(`\\b/?(?:[\\w-]+/)*[\\w-]+\\.(${FILE_EXT_PATTERN})\\b`, 'gi');
|
|
27
|
+
|
|
28
|
+
function readText(dir, name) {
|
|
29
|
+
const p = join(dir, name);
|
|
30
|
+
return existsSync(p) ? readFileSync(p, 'utf-8') : '';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function countTasks(tasks) {
|
|
34
|
+
return (tasks.match(/^- \[([ x])\]/gm) || []).length;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function collectFiles(text) {
|
|
38
|
+
const matches = text.match(FILE_RE) || [];
|
|
39
|
+
return [...new Set(matches.map(m => m.trim()))];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function hasKeyword(text, patterns) {
|
|
43
|
+
const lower = text.toLowerCase();
|
|
44
|
+
return patterns.some(p => lower.includes(p.toLowerCase()));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function inferMode(changeDir) {
|
|
48
|
+
const state = readState(changeDir);
|
|
49
|
+
|
|
50
|
+
// Explicit override: honor any non-auto, non-null workflow value
|
|
51
|
+
if (state.workflow && state.workflow !== 'auto') {
|
|
52
|
+
const valid = ['hotfix', 'tweak', 'full'];
|
|
53
|
+
if (valid.includes(state.workflow)) {
|
|
54
|
+
return {
|
|
55
|
+
mode: state.workflow,
|
|
56
|
+
explicit: true,
|
|
57
|
+
reason: `workflow explicitly set to '${state.workflow}' in .team-flow.yaml; skipping auto-detection`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const proposal = readText(changeDir, 'proposal.md');
|
|
63
|
+
const tasks = readText(changeDir, 'tasks.md');
|
|
64
|
+
const combined = `${proposal}\n${tasks}`;
|
|
65
|
+
|
|
66
|
+
const taskCount = countTasks(tasks);
|
|
67
|
+
const files = collectFiles(combined);
|
|
68
|
+
const fileCount = files.length;
|
|
69
|
+
|
|
70
|
+
const hasSchemaChange = hasKeyword(combined, [
|
|
71
|
+
'schema', 'api', 'interface', '接口', 'validator', '类型',
|
|
72
|
+
'type definition', 'protobuf', 'openapi', 'json schema',
|
|
73
|
+
]);
|
|
74
|
+
const hasNewModule = hasKeyword(combined, [
|
|
75
|
+
'new module', '新增模块', '新模块', '新增 skill', '新目录',
|
|
76
|
+
'新增 capability', 'new capability',
|
|
77
|
+
]);
|
|
78
|
+
|
|
79
|
+
const allExts = files.map(f => {
|
|
80
|
+
const parts = f.split('.');
|
|
81
|
+
return parts[parts.length - 1].toLowerCase();
|
|
82
|
+
});
|
|
83
|
+
const codeFileCount = allExts.filter(e => CODE_EXT_SET.has(e)).length;
|
|
84
|
+
const configDocOnly = codeFileCount === 0 && allExts.every(e => CONFIG_DOC_EXT_SET.has(e));
|
|
85
|
+
|
|
86
|
+
// No artifacts → safe default to full
|
|
87
|
+
if (taskCount === 0 && fileCount === 0) {
|
|
88
|
+
return {
|
|
89
|
+
mode: 'full',
|
|
90
|
+
explicit: false,
|
|
91
|
+
reason: 'no planning artifacts detected → full (safe default)',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Hotfix: very small, no schema/api, no new module
|
|
96
|
+
if (taskCount <= 2 && fileCount <= 2 && !hasSchemaChange && !hasNewModule) {
|
|
97
|
+
return {
|
|
98
|
+
mode: 'hotfix',
|
|
99
|
+
explicit: false,
|
|
100
|
+
reason: `≤2 tasks, ≤2 files, no schema/API/new-module keywords → hotfix`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Tweak: small config/doc change
|
|
105
|
+
if (taskCount <= 4 && configDocOnly && !hasSchemaChange && !hasNewModule) {
|
|
106
|
+
return {
|
|
107
|
+
mode: 'tweak',
|
|
108
|
+
explicit: false,
|
|
109
|
+
reason: `≤4 tasks, only config/doc files, no schema/API/new-module keywords → tweak`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Default
|
|
114
|
+
return {
|
|
115
|
+
mode: 'full',
|
|
116
|
+
explicit: false,
|
|
117
|
+
reason: `${taskCount} tasks, ${fileCount} files${codeFileCount > 0 ? ` (${codeFileCount} code files)` : ''}${hasSchemaChange ? ', schema/API change detected' : ''}${hasNewModule ? ', new module detected' : ''} → full`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function main() {
|
|
122
|
+
const changeDir = process.argv[2];
|
|
123
|
+
if (!changeDir) {
|
|
124
|
+
console.error('Usage: node scripts/infer-workflow.mjs <change-dir>');
|
|
125
|
+
process.exit(2);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const result = inferMode(changeDir);
|
|
129
|
+
console.log(JSON.stringify(result, null, 2));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export { inferMode };
|
|
133
|
+
|
|
134
|
+
if (import.meta.filename === process.argv[1] || import.meta.url === `file://${process.argv[1]}`) {
|
|
135
|
+
main();
|
|
136
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-amazon-q.mjs — deploy team-flow for Amazon Q Developer CLI
|
|
3
|
+
// Skills → .amazonq/skills/, phase-guard rule → .amazonq/rules/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('amazon-q').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-cline.mjs — deploy team-flow for Cline
|
|
3
|
+
// Skills → .cline/skills/, phase-guard rule → .clinerules/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('cline').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-continue.mjs — deploy team-flow for Continue
|
|
3
|
+
// Skills → .continue/skills/, phase-guard rule → .continue/rules/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('continue').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-cursor.mjs — deploy team-flow for Cursor Agent
|
|
3
|
+
//
|
|
4
|
+
// Copies the full plugin tree (skills + scripts + docs + templates + dist + hooks)
|
|
5
|
+
// to .cursor/team-flow/ so that skill instructions referencing
|
|
6
|
+
// ${CLAUDE_PLUGIN_ROOT}/scripts/... and ${CLAUDE_PLUGIN_ROOT}/docs/... resolve
|
|
7
|
+
// correctly. Also copies skills to .cursor/skills/ (where Cursor reads them).
|
|
8
|
+
//
|
|
9
|
+
// Defaults to the latest GitHub release; use --local <path> to deploy from a local repo.
|
|
10
|
+
import { existsSync, mkdirSync, readdirSync, statSync, rmSync, readFileSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { cp, writeFile, mkdtemp } from 'node:fs/promises';
|
|
12
|
+
import { dirname, join, resolve } from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
import { execFileSync } from 'node:child_process';
|
|
15
|
+
import { parseArgs } from 'node:util';
|
|
16
|
+
import { shellQuote } from './lib/shell-quote.mjs';
|
|
17
|
+
|
|
18
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const defaultPluginRoot = dirname(__dirname); // repository root when running from clone
|
|
20
|
+
const targetRoot = process.cwd();
|
|
21
|
+
|
|
22
|
+
const GITHUB_REPO = 'MageByte-Zero/team-flow';
|
|
23
|
+
const GITHUB_API_URL = `https://api.github.com/repos/${GITHUB_REPO}/releases/latest`;
|
|
24
|
+
|
|
25
|
+
// Directories needed by local installer-rewritten runtime commands.
|
|
26
|
+
const RUNTIME_DIRS = ['scripts', 'docs', 'templates', 'dist', 'hooks'];
|
|
27
|
+
|
|
28
|
+
function ensureDir(dir) {
|
|
29
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function fetchLatestTag() {
|
|
33
|
+
const res = await fetch(GITHUB_API_URL);
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
throw new Error(`GitHub API failed: ${res.status} ${res.statusText}`);
|
|
36
|
+
}
|
|
37
|
+
const data = await res.json();
|
|
38
|
+
if (!data.tag_name) {
|
|
39
|
+
throw new Error('GitHub API response missing tag_name');
|
|
40
|
+
}
|
|
41
|
+
return data.tag_name;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function cloneRelease(tag) {
|
|
45
|
+
const tmpDir = await mkdtemp(join('/tmp', 'team-flow-'));
|
|
46
|
+
const url = `https://github.com/${GITHUB_REPO}.git`;
|
|
47
|
+
console.log(`📥 Cloning ${tag} into ${tmpDir} ...`);
|
|
48
|
+
execFileSync('git', ['clone', '--depth', '1', '--branch', tag, url, tmpDir], {
|
|
49
|
+
stdio: 'inherit',
|
|
50
|
+
});
|
|
51
|
+
return tmpDir;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Recursively copy a directory.
|
|
56
|
+
*/
|
|
57
|
+
async function copyDir(src, dst) {
|
|
58
|
+
if (!existsSync(src)) return 0;
|
|
59
|
+
ensureDir(dst);
|
|
60
|
+
const entries = readdirSync(src);
|
|
61
|
+
for (const name of entries) {
|
|
62
|
+
const srcPath = join(src, name);
|
|
63
|
+
const dstPath = join(dst, name);
|
|
64
|
+
const st = statSync(srcPath);
|
|
65
|
+
if (st.isDirectory()) {
|
|
66
|
+
await copyDir(srcPath, dstPath);
|
|
67
|
+
} else {
|
|
68
|
+
await cp(srcPath, dstPath, { force: true });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return entries.length;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Copy skills to target, replacing ${CLAUDE_PLUGIN_ROOT} with the actual
|
|
76
|
+
* plugin root path so skill instructions work in Cursor's environment.
|
|
77
|
+
*/
|
|
78
|
+
async function copySkillsWithRoot(sourceSkills, targetSkills, pluginRootAbs) {
|
|
79
|
+
// Clean old skill directories before copying
|
|
80
|
+
if (existsSync(targetSkills)) {
|
|
81
|
+
const oldEntries = readdirSync(targetSkills).filter(name => {
|
|
82
|
+
const full = join(targetSkills, name);
|
|
83
|
+
try { return statSync(full).isDirectory(); } catch { return false; }
|
|
84
|
+
});
|
|
85
|
+
for (const name of oldEntries) {
|
|
86
|
+
rmSync(join(targetSkills, name), { recursive: true, force: true });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
ensureDir(targetSkills);
|
|
90
|
+
const entries = readdirSync(sourceSkills).filter(name => {
|
|
91
|
+
const full = join(sourceSkills, name);
|
|
92
|
+
try { return statSync(full).isDirectory(); } catch { return false; }
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
for (const name of entries) {
|
|
96
|
+
const src = join(sourceSkills, name);
|
|
97
|
+
const dst = join(targetSkills, name);
|
|
98
|
+
await cp(src, dst, { recursive: true, force: true });
|
|
99
|
+
|
|
100
|
+
// Replace ${CLAUDE_PLUGIN_ROOT} with the absolute path so commands work
|
|
101
|
+
const skillMd = join(dst, 'SKILL.md');
|
|
102
|
+
if (existsSync(skillMd)) {
|
|
103
|
+
let content = readFileSync(skillMd, 'utf-8');
|
|
104
|
+
if (content.includes('${CLAUDE_PLUGIN_ROOT}')) {
|
|
105
|
+
content = content.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, pluginRootAbs);
|
|
106
|
+
}
|
|
107
|
+
content = content.replace(
|
|
108
|
+
/npx --yes --package @xulthekl\/team-flow@\d+\.\d+\.\d+ tf/g,
|
|
109
|
+
`node ${shellQuote(join(pluginRootAbs, 'scripts', 'team-flow.mjs'))}`,
|
|
110
|
+
);
|
|
111
|
+
writeFileSync(skillMd, content, 'utf-8');
|
|
112
|
+
}
|
|
113
|
+
// Also fix sub-prompt files (implementer-prompt.md, etc.)
|
|
114
|
+
const subFiles = readdirSync(dst).filter(f => f.endsWith('.md') && f !== 'SKILL.md');
|
|
115
|
+
for (const sub of subFiles) {
|
|
116
|
+
const subPath = join(dst, sub);
|
|
117
|
+
let content = readFileSync(subPath, 'utf-8');
|
|
118
|
+
if (content.includes('${CLAUDE_PLUGIN_ROOT}')) {
|
|
119
|
+
content = content.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, pluginRootAbs);
|
|
120
|
+
}
|
|
121
|
+
content = content.replace(
|
|
122
|
+
/npx --yes --package @xulthekl\/team-flow@\d+\.\d+\.\d+ tf/g,
|
|
123
|
+
`node ${shellQuote(join(pluginRootAbs, 'scripts', 'team-flow.mjs'))}`,
|
|
124
|
+
);
|
|
125
|
+
writeFileSync(subPath, content, 'utf-8');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return entries.length;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async function writePhaseGuard(targetRules) {
|
|
133
|
+
ensureDir(targetRules);
|
|
134
|
+
const content = `---
|
|
135
|
+
description: team-flow phase guard — 防止阶段漂移和未授权实现
|
|
136
|
+
alwaysApply: true
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
# Phase Guard
|
|
140
|
+
|
|
141
|
+
## 入口规则
|
|
142
|
+
|
|
143
|
+
- 所有工作必须从 "/workflow-start" 入口开始。
|
|
144
|
+
- 在 .team-flow.yaml 中确认当前 state 和 workflow 模式之前,不要开始写代码。
|
|
145
|
+
|
|
146
|
+
## 全局禁止
|
|
147
|
+
|
|
148
|
+
- 没有 execution-contract.md 或未经用户明确批准,不得进入实现。
|
|
149
|
+
- full/hotfix 必须先运行 tf execution plan <change-dir> ...;没有 current execution plan 不得开始实现。
|
|
150
|
+
- 只有 all pass review receipts 后才可 closing;不得把未审查的 wave 当作完成。
|
|
151
|
+
- 上述 plan/receipt gates 仅适用于 full/hotfix;tweak 免除这些 gates (tweak exempt)。
|
|
152
|
+
- 执行过程中如果发现需求/范围变化,必须回退到 specifying 或 bridging,而不是直接改代码。
|
|
153
|
+
- 不要直接调用执行类 skill(如 "/build-executor"),必须通过入口路由。
|
|
154
|
+
|
|
155
|
+
## 决策点协议
|
|
156
|
+
|
|
157
|
+
- DP-0:设计前确认
|
|
158
|
+
- DP-1:需求确认
|
|
159
|
+
- DP-2:工件审查
|
|
160
|
+
- DP-3:是否批准 execution contract?
|
|
161
|
+
- DP-4:先运行 tf execution recommend,展示可用模式与推荐;用户用 --confirm 确认,非推荐选择额外使用 --acknowledge-recommendation
|
|
162
|
+
- DP-5:调试升级
|
|
163
|
+
- DP-6:验证失败
|
|
164
|
+
- DP-7:是否收口归档?
|
|
165
|
+
|
|
166
|
+
> 本文件由 scripts/install-cursor.mjs 生成;对具体变更的 guard 内容请运行 tf inject <change-dir> 更新。
|
|
167
|
+
`;
|
|
168
|
+
await writeFile(join(targetRules, 'phase-guard.mdc'), content, 'utf-8');
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function writeCursorHooks(hooksDir) {
|
|
172
|
+
ensureDir(join(targetRoot, '.cursor'));
|
|
173
|
+
const hooksJson = {
|
|
174
|
+
hooks: [
|
|
175
|
+
{
|
|
176
|
+
event: 'sessionStart',
|
|
177
|
+
command: `bash ${join(hooksDir, 'session-start')}`,
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
};
|
|
181
|
+
await writeFile(
|
|
182
|
+
join(targetRoot, '.cursor', 'hooks.json'),
|
|
183
|
+
JSON.stringify(hooksJson, null, 2) + '\n',
|
|
184
|
+
'utf-8',
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function main() {
|
|
189
|
+
const { values } = parseArgs({
|
|
190
|
+
options: {
|
|
191
|
+
local: { type: 'string' },
|
|
192
|
+
tag: { type: 'string' },
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
let pluginRoot = defaultPluginRoot;
|
|
197
|
+
let isTemp = false;
|
|
198
|
+
let installedTag = null;
|
|
199
|
+
|
|
200
|
+
if (values.local) {
|
|
201
|
+
pluginRoot = resolve(values.local);
|
|
202
|
+
console.log(`📁 Using local repo: ${pluginRoot}`);
|
|
203
|
+
} else {
|
|
204
|
+
installedTag = values.tag || await fetchLatestTag();
|
|
205
|
+
console.log(`⬆️ Installing team-flow ${installedTag} ...`);
|
|
206
|
+
pluginRoot = await cloneRelease(installedTag);
|
|
207
|
+
isTemp = true;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const sourceSkills = join(pluginRoot, 'skills');
|
|
211
|
+
if (!existsSync(sourceSkills)) {
|
|
212
|
+
console.error(`❌ skills/ directory not found at ${pluginRoot}`);
|
|
213
|
+
if (isTemp) rmSync(pluginRoot, { recursive: true, force: true });
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Target paths
|
|
218
|
+
const targetPluginDir = join(targetRoot, '.cursor', 'team-flow');
|
|
219
|
+
const targetSkills = join(targetRoot, '.cursor', 'skills');
|
|
220
|
+
const targetRules = join(targetRoot, '.cursor', 'rules');
|
|
221
|
+
const pluginRootAbs = resolve(targetPluginDir);
|
|
222
|
+
|
|
223
|
+
try {
|
|
224
|
+
// 1. Copy runtime dependencies to .cursor/team-flow/
|
|
225
|
+
console.log('📋 Copying runtime dependencies...');
|
|
226
|
+
for (const dir of RUNTIME_DIRS) {
|
|
227
|
+
const src = join(pluginRoot, dir);
|
|
228
|
+
const dst = join(targetPluginDir, dir);
|
|
229
|
+
if (existsSync(src)) {
|
|
230
|
+
const count = await copyDir(src, dst);
|
|
231
|
+
console.log(` ${dir}/ → ${dst} (${count} entries)`);
|
|
232
|
+
} else {
|
|
233
|
+
console.log(` ${dir}/ — skipped (not found)`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// 2. Copy skills to .cursor/skills/ with CLAUDE_PLUGIN_ROOT replaced
|
|
238
|
+
const count = await copySkillsWithRoot(sourceSkills, targetSkills, pluginRootAbs);
|
|
239
|
+
console.log(` skills/ → ${targetSkills} (${count} skills, paths rewritten)`);
|
|
240
|
+
|
|
241
|
+
// 3. Write phase guard rule
|
|
242
|
+
await writePhaseGuard(targetRules);
|
|
243
|
+
console.log(` phase guard → ${join(targetRules, 'phase-guard.mdc')}`);
|
|
244
|
+
|
|
245
|
+
// 4. Write .cursor/hooks.json for session-start
|
|
246
|
+
await writeCursorHooks(join(targetPluginDir, 'hooks'));
|
|
247
|
+
console.log(` hooks.json → ${join(targetRoot, '.cursor', 'hooks.json')}`);
|
|
248
|
+
|
|
249
|
+
console.log(`\n✅ Cursor install complete:`);
|
|
250
|
+
console.log(` Plugin root: ${pluginRootAbs}`);
|
|
251
|
+
if (installedTag) {
|
|
252
|
+
console.log(` Version: ${installedTag}`);
|
|
253
|
+
}
|
|
254
|
+
console.log(`\nNext: open Cursor Agent and try "/workflow-start".`);
|
|
255
|
+
} finally {
|
|
256
|
+
if (isTemp) {
|
|
257
|
+
rmSync(pluginRoot, { recursive: true, force: true });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
main().catch(err => {
|
|
263
|
+
console.error(`❌ ${err.message}`);
|
|
264
|
+
process.exit(1);
|
|
265
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// install-git-hooks.mjs — install git hooks for team-flow repo
|
|
3
|
+
// Run with: npm run setup-hooks (or node scripts/install-git-hooks.mjs)
|
|
4
|
+
//
|
|
5
|
+
// Installs a pre-commit hook that checks version consistency.
|
|
6
|
+
// Automatically run post-install so every contributor gets the guard.
|
|
7
|
+
|
|
8
|
+
import { writeFileSync, existsSync, chmodSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { join, dirname, resolve } from 'node:path';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { execFileSync } from 'node:child_process';
|
|
12
|
+
|
|
13
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const ROOT = join(__dirname, '..');
|
|
15
|
+
// Ask Git for the common hooks directory so linked worktrees install correctly.
|
|
16
|
+
// `git rev-parse --git-path hooks` may be relative in a normal checkout.
|
|
17
|
+
const HOOKS_DIR = resolve(ROOT, execFileSync('git', ['rev-parse', '--git-path', 'hooks'], {
|
|
18
|
+
cwd: ROOT,
|
|
19
|
+
encoding: 'utf8',
|
|
20
|
+
}).trim());
|
|
21
|
+
const HOOK_PATH = join(HOOKS_DIR, 'pre-commit');
|
|
22
|
+
|
|
23
|
+
const HOOK_SCRIPT = `#!/bin/sh
|
|
24
|
+
# team-flow pre-commit hook — auto-check and fix version consistency
|
|
25
|
+
# Installed by: npm run setup-hooks
|
|
26
|
+
# Features:
|
|
27
|
+
# 1. Run check-version-consistency (blocking on version mismatch)
|
|
28
|
+
# 2. Auto-fix skill count and npx references (--fix mode)
|
|
29
|
+
# 3. Re-stage fixed files so they're included in the commit
|
|
30
|
+
# To bypass: git commit --no-verify
|
|
31
|
+
|
|
32
|
+
set -e
|
|
33
|
+
|
|
34
|
+
echo "🔍 Running pre-commit version consistency check..."
|
|
35
|
+
|
|
36
|
+
REPO_ROOT="$(git rev-parse --show-toplevel)"
|
|
37
|
+
|
|
38
|
+
cd "$REPO_ROOT"
|
|
39
|
+
|
|
40
|
+
# Run check-versions with auto-fix
|
|
41
|
+
if node scripts/check-version-consistency.mjs --fix; then
|
|
42
|
+
# Check if any files were modified by auto-fix
|
|
43
|
+
MODIFIED=$(git diff --name-only)
|
|
44
|
+
if [ -n "$MODIFIED" ]; then
|
|
45
|
+
echo "📝 Auto-fixed files detected, re-staging..."
|
|
46
|
+
echo "$MODIFIED" | xargs git add
|
|
47
|
+
echo "✅ Fixed files staged for commit"
|
|
48
|
+
fi
|
|
49
|
+
exit 0
|
|
50
|
+
else
|
|
51
|
+
echo ""
|
|
52
|
+
echo "❌ Pre-commit check failed: version consistency issues found"
|
|
53
|
+
echo " Fix the issues above and try again"
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
if (!existsSync(HOOKS_DIR)) {
|
|
59
|
+
console.error('❌ Not inside a git repository (no .git/hooks/).');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Preserve an unrelated hook, but upgrade an older team-flow hook.
|
|
64
|
+
const MARKER = '# team-flow pre-commit hook';
|
|
65
|
+
if (existsSync(HOOK_PATH)) {
|
|
66
|
+
const existing = readFileSync(HOOK_PATH, 'utf-8');
|
|
67
|
+
if (existing.includes(MARKER)) {
|
|
68
|
+
if (existing === HOOK_SCRIPT) {
|
|
69
|
+
console.log('✅ Pre-commit hook already installed (team-flow).');
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
console.log('♻️ Updating existing pre-commit hook (team-flow).');
|
|
73
|
+
} else {
|
|
74
|
+
console.log('⚠️ Existing pre-commit hook found. Backing up to pre-commit.backup ...');
|
|
75
|
+
writeFileSync(`${HOOK_PATH}.backup`, existing);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
writeFileSync(HOOK_PATH, HOOK_SCRIPT);
|
|
80
|
+
chmodSync(HOOK_PATH, 0o755);
|
|
81
|
+
console.log('✅ Pre-commit hook installed — version consistency checked before every commit.');
|
|
82
|
+
console.log(' To bypass: git commit --no-verify');
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-kiro.mjs — deploy team-flow for Kiro
|
|
3
|
+
// Skills → .kiro/skills/, phase-guard rule → .kiro/steering/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('kiro').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-pi.mjs — deploy team-flow for Pi agent
|
|
3
|
+
// Skills → .pi/skills/ (global: .pi/agent/skills/). No rules dir — invoke "/workflow-start" manually.
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('pi').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-qoder.mjs — deploy team-flow for Qoder
|
|
3
|
+
// Skills → .qoder/skills/, phase-guard rule → .qoder/rules/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('qoder').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-qwen.mjs — deploy team-flow for Qwen Code
|
|
3
|
+
// Skills → .qwen/skills/, phase-guard rule → .qwen/rules/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('qwen').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-roocode.mjs — deploy team-flow for Roo Code
|
|
3
|
+
// Skills → .roo/skills/, phase-guard rule → .roo/rules/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('roocode').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/install-windsurf.mjs — deploy team-flow for Windsurf
|
|
3
|
+
// Skills → .windsurf/skills/, phase-guard rule → .windsurf/rules/phase-guard.md
|
|
4
|
+
import { installPlatform } from './lib/install.mjs';
|
|
5
|
+
|
|
6
|
+
installPlatform('windsurf').catch(err => {
|
|
7
|
+
console.error(`❌ ${err.message}`);
|
|
8
|
+
process.exit(1);
|
|
9
|
+
});
|