agileflow 4.0.0-alpha.2 → 4.0.0-alpha.21
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 +51 -0
- package/content/plugins/accessibility/plugin.yaml +14 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/SKILL.md +392 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/references/aria-patterns.md +528 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/references/testing-checklist.md +457 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/references/wcag-guide.md +683 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/workflows/audit-page.md +310 -0
- package/content/plugins/accessibility/skills/agileflow-accessibility/workflows/implement-accessible-component.md +479 -0
- package/content/plugins/ads/agents/ads-audit-budget.md +185 -0
- package/content/plugins/ads/agents/ads-audit-compliance.md +171 -0
- package/content/plugins/ads/agents/ads-audit-creative.md +168 -0
- package/content/plugins/ads/agents/ads-audit-google.md +227 -0
- package/content/plugins/ads/agents/ads-audit-meta.md +184 -0
- package/content/plugins/ads/agents/ads-audit-tracking.md +205 -0
- package/content/plugins/ads/agents/ads-consensus.md +410 -0
- package/content/plugins/ads/agents/ads-generate.md +152 -0
- package/content/plugins/ads/agents/ads-performance-tracker.md +212 -0
- package/content/plugins/ads/plugin.yaml +23 -4
- package/content/plugins/ads/skills/agileflow-ads/SKILL.md +218 -0
- package/content/plugins/ads/skills/agileflow-ads/references/ad-copy-formula-guide.md +131 -0
- package/content/plugins/ads/skills/agileflow-ads/references/audience-targeting-guide.md +137 -0
- package/content/plugins/ads/skills/agileflow-ads/references/bid-strategy-guide.md +115 -0
- package/content/plugins/ads/skills/agileflow-ads/references/platform-benchmarks.md +100 -0
- package/content/plugins/ads/skills/agileflow-ads/workflows/audit.md +118 -0
- package/content/plugins/ads/skills/agileflow-ads/workflows/generate.md +84 -0
- package/content/plugins/audit/agents/a11y-analyzer-aria.md +173 -0
- package/content/plugins/audit/agents/a11y-analyzer-forms.md +173 -0
- package/content/plugins/audit/agents/a11y-analyzer-keyboard.md +183 -0
- package/content/plugins/audit/agents/a11y-analyzer-semantic.md +169 -0
- package/content/plugins/audit/agents/a11y-analyzer-visual.md +172 -0
- package/content/plugins/audit/agents/a11y-consensus.md +249 -0
- package/content/plugins/audit/agents/accessibility.md +558 -0
- package/content/plugins/audit/agents/api-quality-analyzer-conventions.md +156 -0
- package/content/plugins/audit/agents/api-quality-analyzer-docs.md +184 -0
- package/content/plugins/audit/agents/api-quality-analyzer-errors.md +191 -0
- package/content/plugins/audit/agents/api-quality-analyzer-pagination.md +179 -0
- package/content/plugins/audit/agents/api-quality-analyzer-versioning.md +150 -0
- package/content/plugins/audit/agents/api-quality-consensus.md +217 -0
- package/content/plugins/audit/agents/api-validator.md +191 -0
- package/content/plugins/audit/agents/arch-analyzer-circular.md +156 -0
- package/content/plugins/audit/agents/arch-analyzer-complexity.md +193 -0
- package/content/plugins/audit/agents/arch-analyzer-coupling.md +152 -0
- package/content/plugins/audit/agents/arch-analyzer-layering.md +160 -0
- package/content/plugins/audit/agents/arch-analyzer-patterns.md +210 -0
- package/content/plugins/audit/agents/arch-consensus.md +228 -0
- package/content/plugins/audit/agents/browser-qa.md +342 -0
- package/content/plugins/audit/agents/code-reviewer.md +298 -0
- package/content/plugins/audit/agents/completeness-analyzer-api.md +199 -0
- package/content/plugins/audit/agents/completeness-analyzer-conditional.md +211 -0
- package/content/plugins/audit/agents/completeness-analyzer-handlers.md +166 -0
- package/content/plugins/audit/agents/completeness-analyzer-imports.md +165 -0
- package/content/plugins/audit/agents/completeness-analyzer-routes.md +190 -0
- package/content/plugins/audit/agents/completeness-analyzer-state.md +196 -0
- package/content/plugins/audit/agents/completeness-analyzer-stubs.md +206 -0
- package/content/plugins/audit/agents/completeness-consensus.md +295 -0
- package/content/plugins/audit/agents/error-analyzer.md +213 -0
- package/content/plugins/audit/agents/flow-analyzer-authorization.md +182 -0
- package/content/plugins/audit/agents/flow-analyzer-discovery.md +174 -0
- package/content/plugins/audit/agents/flow-analyzer-errors.md +186 -0
- package/content/plugins/audit/agents/flow-analyzer-feedback.md +185 -0
- package/content/plugins/audit/agents/flow-analyzer-navigation.md +177 -0
- package/content/plugins/audit/agents/flow-analyzer-persistence.md +193 -0
- package/content/plugins/audit/agents/flow-analyzer-wiring.md +169 -0
- package/content/plugins/audit/agents/flow-consensus.md +237 -0
- package/content/plugins/audit/agents/legal-analyzer-a11y.md +114 -0
- package/content/plugins/audit/agents/legal-analyzer-ai.md +121 -0
- package/content/plugins/audit/agents/legal-analyzer-consumer.md +114 -0
- package/content/plugins/audit/agents/legal-analyzer-content.md +117 -0
- package/content/plugins/audit/agents/legal-analyzer-international.md +119 -0
- package/content/plugins/audit/agents/legal-analyzer-licensing.md +119 -0
- package/content/plugins/audit/agents/legal-analyzer-privacy.md +112 -0
- package/content/plugins/audit/agents/legal-analyzer-security.md +116 -0
- package/content/plugins/audit/agents/legal-analyzer-terms.md +115 -0
- package/content/plugins/audit/agents/legal-consensus.md +250 -0
- package/content/plugins/audit/agents/logic-analyzer-edge.md +179 -0
- package/content/plugins/audit/agents/logic-analyzer-flow.md +264 -0
- package/content/plugins/audit/agents/logic-analyzer-invariant.md +215 -0
- package/content/plugins/audit/agents/logic-analyzer-race.md +280 -0
- package/content/plugins/audit/agents/logic-analyzer-type.md +227 -0
- package/content/plugins/audit/agents/logic-consensus.md +259 -0
- package/content/plugins/audit/agents/perf-analyzer-assets.md +182 -0
- package/content/plugins/audit/agents/perf-analyzer-bundle.md +173 -0
- package/content/plugins/audit/agents/perf-analyzer-caching.md +170 -0
- package/content/plugins/audit/agents/perf-analyzer-compute.md +173 -0
- package/content/plugins/audit/agents/perf-analyzer-memory.md +193 -0
- package/content/plugins/audit/agents/perf-analyzer-network.md +165 -0
- package/content/plugins/audit/agents/perf-analyzer-queries.md +162 -0
- package/content/plugins/audit/agents/perf-analyzer-rendering.md +168 -0
- package/content/plugins/audit/agents/perf-consensus.md +287 -0
- package/content/plugins/audit/agents/qa.md +820 -0
- package/content/plugins/audit/agents/quality-analyzer-comments.md +159 -0
- package/content/plugins/audit/agents/quality-analyzer-duplication.md +184 -0
- package/content/plugins/audit/agents/quality-analyzer-naming.md +160 -0
- package/content/plugins/audit/agents/quality-consensus.md +241 -0
- package/content/plugins/audit/agents/schema-validator.md +473 -0
- package/content/plugins/audit/agents/security-analyzer-api.md +210 -0
- package/content/plugins/audit/agents/security-analyzer-auth.md +169 -0
- package/content/plugins/audit/agents/security-analyzer-authz.md +180 -0
- package/content/plugins/audit/agents/security-analyzer-deps.md +153 -0
- package/content/plugins/audit/agents/security-analyzer-infra.md +184 -0
- package/content/plugins/audit/agents/security-analyzer-injection.md +155 -0
- package/content/plugins/audit/agents/security-analyzer-input.md +201 -0
- package/content/plugins/audit/agents/security-analyzer-secrets.md +183 -0
- package/content/plugins/audit/agents/security-consensus.md +283 -0
- package/content/plugins/audit/agents/test-analyzer-assertions.md +188 -0
- package/content/plugins/audit/agents/test-analyzer-coverage.md +189 -0
- package/content/plugins/audit/agents/test-analyzer-fragility.md +193 -0
- package/content/plugins/audit/agents/test-analyzer-integration.md +161 -0
- package/content/plugins/audit/agents/test-analyzer-maintenance.md +180 -0
- package/content/plugins/audit/agents/test-analyzer-mocking.md +188 -0
- package/content/plugins/audit/agents/test-analyzer-patterns.md +196 -0
- package/content/plugins/audit/agents/test-analyzer-structure.md +184 -0
- package/content/plugins/audit/agents/test-consensus.md +301 -0
- package/content/plugins/audit/agents/testing.md +561 -0
- package/content/plugins/audit/agents/ui-validator.md +344 -0
- package/content/plugins/audit/plugin.yaml +186 -5
- package/content/plugins/audit/skills/agileflow-audit/SKILL.md +113 -0
- package/content/plugins/audit/skills/agileflow-audit/references/audit-depth-guide.md +151 -0
- package/content/plugins/audit/skills/agileflow-audit/references/dependency-risk-guide.md +139 -0
- package/content/plugins/audit/skills/agileflow-audit/references/owasp-top10.md +120 -0
- package/content/plugins/audit/skills/agileflow-audit/references/performance-budget-guide.md +143 -0
- package/content/plugins/audit/skills/agileflow-audit/references/wcag-criteria.md +117 -0
- package/content/plugins/audit/skills/agileflow-audit/workflows/run-audit.md +52 -0
- package/content/plugins/audit/skills/agileflow-audit/workflows/tdd.md +66 -0
- package/content/plugins/core/agents/adr-writer.md +521 -0
- package/content/plugins/core/agents/epic-planner.md +520 -0
- package/content/plugins/core/agents/mentor.md +709 -0
- package/content/plugins/core/agents/orchestrator.md +776 -0
- package/content/plugins/core/agents/team-coordinator.md +334 -0
- package/content/plugins/core/agents/team-lead.md +181 -0
- package/content/plugins/core/agents/workspace-orchestrator.md +146 -0
- package/content/plugins/core/hooks/context-loader.js +31 -4
- package/content/plugins/core/hooks/damage-control-bash.js +10 -2
- package/content/plugins/core/hooks/damage-control-edit.js +4 -1
- package/content/plugins/core/hooks/damage-control-patterns.yaml +1 -1
- package/content/plugins/core/hooks/damage-control-write.js +4 -1
- package/content/plugins/core/hooks/{pre-compact-state.js → post-compact-state.js} +25 -8
- package/content/plugins/core/hooks/preferences-injector.js +352 -0
- package/content/plugins/core/plugin.yaml +24 -28
- package/content/plugins/core/skills/agileflow-adr/SKILL.md +34 -8
- package/content/plugins/core/skills/agileflow-adr/references/madr-format-guide.md +86 -0
- package/content/plugins/core/skills/agileflow-adr/workflows/write-adr.md +57 -0
- package/content/plugins/core/skills/agileflow-babysit-mentor/SKILL.md +94 -27
- package/content/plugins/core/skills/agileflow-babysit-mentor/references/mentor-decision-guide.md +81 -0
- package/content/plugins/core/skills/agileflow-babysit-mentor/workflows/mentor-session.md +79 -0
- package/content/plugins/core/skills/agileflow-epic-planner/SKILL.md +37 -7
- package/content/plugins/core/skills/agileflow-epic-planner/references/epic-sizing-guide.md +81 -0
- package/content/plugins/core/skills/agileflow-epic-planner/workflows/plan-epic.md +55 -0
- package/content/plugins/core/skills/agileflow-status-updater/SKILL.md +36 -20
- package/content/plugins/core/skills/agileflow-status-updater/references/status-transitions.md +89 -0
- package/content/plugins/core/skills/agileflow-status-updater/workflows/update-status.md +56 -0
- package/content/plugins/core/skills/agileflow-story-writer/SKILL.md +39 -114
- package/content/plugins/core/skills/agileflow-story-writer/references/estimation-reference.md +36 -0
- package/content/plugins/core/skills/agileflow-story-writer/references/story-template.md +92 -0
- package/content/plugins/core/skills/agileflow-story-writer/workflows/write-story.md +138 -0
- package/content/plugins/council/agents/council-advocate.md +223 -0
- package/content/plugins/council/agents/council-analyst.md +278 -0
- package/content/plugins/council/agents/council-compounder.md +204 -0
- package/content/plugins/council/agents/council-contrarian.md +217 -0
- package/content/plugins/council/agents/council-moonshot.md +217 -0
- package/content/plugins/council/agents/council-optimist.md +185 -0
- package/content/plugins/council/agents/council-revenue.md +200 -0
- package/content/plugins/council/agents/council-technical.md +218 -0
- package/content/plugins/council/agents/multi-expert.md +334 -0
- package/content/plugins/council/plugin.yaml +23 -4
- package/content/plugins/council/skills/agileflow-council/SKILL.md +102 -0
- package/content/plugins/council/skills/agileflow-council/references/decision-log-template.md +109 -0
- package/content/plugins/council/skills/agileflow-council/references/perspective-guide.md +104 -0
- package/content/plugins/council/skills/agileflow-council/references/when-to-convene-guide.md +112 -0
- package/content/plugins/council/skills/agileflow-council/workflows/convene.md +73 -0
- package/content/plugins/council/skills/agileflow-council/workflows/multi-expert.md +75 -0
- package/content/plugins/database/plugin.yaml +14 -0
- package/content/plugins/database/skills/agileflow-database/SKILL.md +284 -0
- package/content/plugins/database/skills/agileflow-database/references/indexing-guide.md +313 -0
- package/content/plugins/database/skills/agileflow-database/references/migration-guide.md +328 -0
- package/content/plugins/database/skills/agileflow-database/references/schema-design-guide.md +467 -0
- package/content/plugins/database/skills/agileflow-database/workflows/design-schema.md +213 -0
- package/content/plugins/database/skills/agileflow-database/workflows/optimize-query.md +253 -0
- package/content/plugins/debugging/plugin.yaml +14 -0
- package/content/plugins/debugging/skills/agileflow-debug/SKILL.md +236 -0
- package/content/plugins/debugging/skills/agileflow-debug/references/common-patterns.md +350 -0
- package/content/plugins/debugging/skills/agileflow-debug/references/debugging-strategies.md +328 -0
- package/content/plugins/debugging/skills/agileflow-debug/workflows/debug-issue.md +187 -0
- package/content/plugins/debugging/skills/agileflow-debug/workflows/reproduce-bug.md +194 -0
- package/content/plugins/delivery/agents/ci.md +547 -0
- package/content/plugins/delivery/agents/devops.md +789 -0
- package/content/plugins/delivery/plugin.yaml +19 -0
- package/content/plugins/delivery/skills/agileflow-delivery/SKILL.md +111 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/changelog-format-guide.md +133 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/ci-pipeline-guide.md +158 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/pr-checklist-guide.md +133 -0
- package/content/plugins/delivery/skills/agileflow-delivery/references/release-checklist.md +142 -0
- package/content/plugins/delivery/skills/agileflow-delivery/workflows/changelog.md +72 -0
- package/content/plugins/delivery/skills/agileflow-delivery/workflows/deploy.md +74 -0
- package/content/plugins/delivery/skills/agileflow-delivery/workflows/pr.md +75 -0
- package/content/plugins/docs/agents/documentation.md +544 -0
- package/content/plugins/docs/agents/readme-updater.md +640 -0
- package/content/plugins/docs/plugin.yaml +19 -0
- package/content/plugins/docs/skills/agileflow-docs/SKILL.md +106 -0
- package/content/plugins/docs/skills/agileflow-docs/references/api-doc-template.md +167 -0
- package/content/plugins/docs/skills/agileflow-docs/references/doc-types-guide.md +141 -0
- package/content/plugins/docs/skills/agileflow-docs/references/readme-template.md +156 -0
- package/content/plugins/docs/skills/agileflow-docs/workflows/readme-sync.md +57 -0
- package/content/plugins/docs/skills/agileflow-docs/workflows/sync.md +64 -0
- package/content/plugins/engineering/agents/api.md +718 -0
- package/content/plugins/engineering/agents/codebase-query.md +285 -0
- package/content/plugins/engineering/agents/compliance.md +559 -0
- package/content/plugins/engineering/agents/database.md +644 -0
- package/content/plugins/engineering/agents/integrations.md +644 -0
- package/content/plugins/engineering/agents/mobile.md +552 -0
- package/content/plugins/engineering/agents/monitoring.md +585 -0
- package/content/plugins/engineering/agents/performance.md +529 -0
- package/content/plugins/engineering/agents/refactor.md +592 -0
- package/content/plugins/engineering/agents/security.md +524 -0
- package/content/plugins/engineering/agents/ui.md +1336 -0
- package/content/plugins/engineering/plugin.yaml +37 -0
- package/content/plugins/engineering/skills/agileflow-engineering/SKILL.md +127 -0
- package/content/plugins/engineering/skills/agileflow-engineering/references/code-review-guide.md +126 -0
- package/content/plugins/engineering/skills/agileflow-engineering/references/domain-routing-guide.md +89 -0
- package/content/plugins/engineering/skills/agileflow-engineering/references/refactoring-guide.md +136 -0
- package/content/plugins/engineering/skills/agileflow-engineering/workflows/diagnose.md +63 -0
- package/content/plugins/engineering/skills/agileflow-engineering/workflows/impact.md +60 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-features.md +179 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-growth.md +169 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-integration.md +181 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-market.md +150 -0
- package/content/plugins/ideation/agents/brainstorm-analyzer-ux.md +180 -0
- package/content/plugins/ideation/agents/brainstorm-consensus.md +245 -0
- package/content/plugins/ideation/agents/design.md +568 -0
- package/content/plugins/ideation/agents/product.md +582 -0
- package/content/plugins/ideation/plugin.yaml +31 -0
- package/content/plugins/ideation/skills/agileflow-ideation/SKILL.md +109 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/brainstorm-techniques.md +138 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/competitive-analysis-template.md +148 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/feature-prioritization-guide.md +147 -0
- package/content/plugins/ideation/skills/agileflow-ideation/references/user-story-patterns.md +152 -0
- package/content/plugins/ideation/skills/agileflow-ideation/workflows/features.md +65 -0
- package/content/plugins/ideation/skills/agileflow-ideation/workflows/ideate.md +54 -0
- package/content/plugins/migration/agents/datamigration.md +757 -0
- package/content/plugins/migration/plugin.yaml +17 -0
- package/content/plugins/migration/skills/agileflow-migration/SKILL.md +106 -0
- package/content/plugins/migration/skills/agileflow-migration/references/data-validation-checklist.md +154 -0
- package/content/plugins/migration/skills/agileflow-migration/references/migration-patterns.md +209 -0
- package/content/plugins/migration/skills/agileflow-migration/references/rollback-playbook.md +171 -0
- package/content/plugins/migration/skills/agileflow-migration/references/version-compatibility-matrix.md +155 -0
- package/content/plugins/migration/skills/agileflow-migration/workflows/plan.md +73 -0
- package/content/plugins/migration/skills/agileflow-migration/workflows/validate.md +71 -0
- package/content/plugins/performance/plugin.yaml +14 -0
- package/content/plugins/performance/skills/agileflow-performance/SKILL.md +224 -0
- package/content/plugins/performance/skills/agileflow-performance/references/optimization-patterns.md +554 -0
- package/content/plugins/performance/skills/agileflow-performance/references/profiling-guide.md +383 -0
- package/content/plugins/performance/skills/agileflow-performance/references/web-vitals-guide.md +360 -0
- package/content/plugins/performance/skills/agileflow-performance/workflows/improve-web-vitals.md +344 -0
- package/content/plugins/performance/skills/agileflow-performance/workflows/profile-and-fix.md +254 -0
- package/content/plugins/planning/agents/analytics.md +670 -0
- package/content/plugins/planning/agents/rlm-subcore.md +215 -0
- package/content/plugins/planning/plugin.yaml +19 -0
- package/content/plugins/planning/skills/agileflow-planning/SKILL.md +111 -0
- package/content/plugins/planning/skills/agileflow-planning/references/estimation-guide.md +114 -0
- package/content/plugins/planning/skills/agileflow-planning/references/rpi-workflow.md +119 -0
- package/content/plugins/planning/skills/agileflow-planning/references/sprint-planning-guide.md +145 -0
- package/content/plugins/planning/skills/agileflow-planning/workflows/impact.md +63 -0
- package/content/plugins/planning/skills/agileflow-planning/workflows/rpi.md +104 -0
- package/content/plugins/psychology/plugin.yaml +14 -0
- package/content/plugins/psychology/skills/agileflow-retention/SKILL.md +252 -0
- package/content/plugins/psychology/skills/agileflow-retention/references/competitor-analysis.md +240 -0
- package/content/plugins/psychology/skills/agileflow-retention/references/psychology-models.md +349 -0
- package/content/plugins/psychology/skills/agileflow-retention/references/retention-patterns.md +279 -0
- package/content/plugins/psychology/skills/agileflow-retention/workflows/design-retention-feature.md +287 -0
- package/content/plugins/psychology/skills/agileflow-retention/workflows/retention-audit.md +259 -0
- package/content/plugins/refactoring/plugin.yaml +14 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/SKILL.md +235 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/references/refactoring-patterns.md +405 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/references/safety-checks.md +177 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/workflows/extract-module.md +226 -0
- package/content/plugins/refactoring/skills/agileflow-refactor/workflows/safe-refactor.md +169 -0
- package/content/plugins/research/agents/research.md +503 -0
- package/content/plugins/research/plugin.yaml +17 -0
- package/content/plugins/research/skills/agileflow-research/SKILL.md +110 -0
- package/content/plugins/research/skills/agileflow-research/references/knowledge-decay-guide.md +121 -0
- package/content/plugins/research/skills/agileflow-research/references/research-prompt-guide.md +141 -0
- package/content/plugins/research/skills/agileflow-research/references/synthesis-template.md +154 -0
- package/content/plugins/research/skills/agileflow-research/workflows/analyze.md +60 -0
- package/content/plugins/research/skills/agileflow-research/workflows/ask.md +64 -0
- package/content/plugins/research/skills/agileflow-research/workflows/import.md +66 -0
- package/content/plugins/research/skills/agileflow-research/workflows/synthesize.md +66 -0
- package/content/plugins/reviews/plugin.yaml +14 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/SKILL.md +241 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/references/review-checklist.md +200 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/references/security-patterns.md +328 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/workflows/review-pr.md +153 -0
- package/content/plugins/reviews/skills/agileflow-pr-reviewer/workflows/security-review.md +177 -0
- package/content/plugins/seo/agents/seo-analyzer-content.md +169 -0
- package/content/plugins/seo/agents/seo-analyzer-images.md +198 -0
- package/content/plugins/seo/agents/seo-analyzer-performance.md +217 -0
- package/content/plugins/seo/agents/seo-analyzer-schema.md +184 -0
- package/content/plugins/seo/agents/seo-analyzer-sitemap.md +177 -0
- package/content/plugins/seo/agents/seo-analyzer-technical.md +151 -0
- package/content/plugins/seo/agents/seo-consensus.md +304 -0
- package/content/plugins/seo/plugin.yaml +19 -4
- package/content/plugins/seo/skills/agileflow-seo/SKILL.md +188 -0
- package/content/plugins/seo/skills/agileflow-seo/references/cwv-thresholds.md +110 -0
- package/content/plugins/seo/skills/agileflow-seo/references/eeat-framework.md +144 -0
- package/content/plugins/seo/skills/agileflow-seo/references/keyword-research-guide.md +125 -0
- package/content/plugins/seo/skills/agileflow-seo/references/schema-types.md +139 -0
- package/content/plugins/seo/skills/agileflow-seo/references/technical-seo-checklist.md +139 -0
- package/content/plugins/seo/skills/agileflow-seo/workflows/audit.md +98 -0
- package/content/plugins/seo/skills/agileflow-seo/workflows/page.md +118 -0
- package/content/plugins/testing/plugin.yaml +16 -0
- package/content/plugins/testing/skills/agileflow-test-writer/SKILL.md +260 -0
- package/content/plugins/testing/skills/agileflow-test-writer/references/coverage-targets.md +239 -0
- package/content/plugins/testing/skills/agileflow-test-writer/references/test-patterns.md +420 -0
- package/content/plugins/testing/skills/agileflow-test-writer/workflows/add-coverage.md +154 -0
- package/content/plugins/testing/skills/agileflow-test-writer/workflows/write-tests-from-ac.md +225 -0
- package/package.json +2 -2
- package/src/cli/commands/doctor.js +818 -30
- package/src/cli/commands/hook.js +17 -14
- package/src/cli/commands/launch.js +1454 -0
- package/src/cli/commands/learn.js +149 -0
- package/src/cli/commands/plugins.js +113 -0
- package/src/cli/commands/setup.js +455 -110
- package/src/cli/commands/skills.js +324 -0
- package/src/cli/commands/status.js +8 -10
- package/src/cli/commands/update.js +76 -15
- package/src/cli/index.js +90 -26
- package/src/cli/wizard/babysit-mode-picker.js +192 -0
- package/src/cli/wizard/behaviors-picker.js +208 -54
- package/src/cli/wizard/ide-picker.js +40 -28
- package/src/cli/wizard/install-scope-picker.js +57 -0
- package/src/cli/wizard/launch-alias-picker.js +50 -0
- package/src/cli/wizard/launch-cli-picker.js +129 -0
- package/src/cli/wizard/launch-tmux-picker.js +133 -0
- package/src/cli/wizard/learnings-picker.js +40 -0
- package/src/cli/wizard/plugin-picker.js +47 -16
- package/src/lib/brand.js +116 -0
- package/src/lib/errors.js +120 -0
- package/src/lib/path-check.js +39 -0
- package/src/runtime/config/defaults.js +22 -17
- package/src/runtime/config/loader.js +77 -8
- package/src/runtime/config/schema.json +43 -16
- package/src/runtime/config/writer.js +3 -1
- package/src/runtime/ide/babysit-skill.js +202 -0
- package/src/runtime/ide/capabilities.js +84 -29
- package/src/runtime/ide/claude-code-content.js +177 -0
- package/src/runtime/ide/claude-code-settings.js +67 -29
- package/src/runtime/ide/claude-code-skills.js +47 -32
- package/src/runtime/ide/codex-config.js +295 -0
- package/src/runtime/installer/install.js +252 -24
- package/src/runtime/launch/alias-installer.js +191 -0
- package/src/runtime/launch/cli-resume.js +244 -0
- package/src/runtime/launch/closed-windows.js +338 -0
- package/src/runtime/launch/defaults.js +66 -0
- package/src/runtime/launch/detect-clis.js +69 -0
- package/src/runtime/launch/doctor.js +464 -0
- package/src/runtime/launch/exec-wrapper.js +114 -0
- package/src/runtime/launch/parallel-session.js +247 -0
- package/src/runtime/launch/prefs.js +211 -0
- package/src/runtime/launch/project-prefs.js +234 -0
- package/src/runtime/launch/resolve-cli.js +56 -0
- package/src/runtime/launch/restore.js +152 -0
- package/src/runtime/launch/schema.json +75 -0
- package/src/runtime/launch/session-lifecycle.js +313 -0
- package/src/runtime/launch/session-registry.js +401 -0
- package/src/runtime/launch/spawn.js +103 -0
- package/src/runtime/launch/tabs.js +350 -0
- package/src/runtime/launch/tmux.js +764 -0
- package/src/runtime/launch/worktree.js +260 -0
- package/src/runtime/plugins/registry.js +16 -11
- package/src/runtime/plugins/validator.js +57 -43
- package/src/runtime/skills/learnings.js +308 -0
- package/content/plugins/core/hooks/babysit-mentor-injector.js +0 -55
- package/src/cli/wizard/personalization.js +0 -64
|
@@ -3,9 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Different agentic IDEs and CLIs support different subsets of the
|
|
5
5
|
* AgileFlow surface. Claude Code is the full-feature target — hooks,
|
|
6
|
-
* skills,
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* skills, subagents, MCP. Cursor / Windsurf support only a subset
|
|
7
|
+
* (mostly MCP, with no formalized hook system). Codex now supports
|
|
8
|
+
* hooks through its experimental config.toml / hooks.json surface, but
|
|
9
|
+
* with a smaller event set than Claude Code. Antigravity appears to
|
|
10
|
+
* support skills and agent workflows, but we have not verified a hook
|
|
11
|
+
* surface yet, so it stays skill/agent-only for now.
|
|
9
12
|
*
|
|
10
13
|
* The installer reads this map to gate plugin content: a plugin's
|
|
11
14
|
* hooks won't be written into a `cursor` install because Cursor has
|
|
@@ -25,53 +28,88 @@
|
|
|
25
28
|
|
|
26
29
|
/**
|
|
27
30
|
* @typedef {Object} IdeCapabilities
|
|
28
|
-
* @property {boolean} hooks -
|
|
31
|
+
* @property {boolean} hooks - whether this IDE can run any AgileFlow hooks
|
|
32
|
+
* @property {string[]} hookEvents - supported lifecycle events
|
|
29
33
|
* @property {boolean} skills - skill discovery + invocation
|
|
30
|
-
* @property {boolean}
|
|
31
|
-
* @property {boolean}
|
|
32
|
-
* @property {boolean}
|
|
34
|
+
* @property {boolean} agents - subagents (Task tool / multi-agent spawning)
|
|
35
|
+
* @property {boolean} interactivePrompts - AskUserQuestion renders as interactive UI
|
|
36
|
+
* @property {boolean} multiAgent - parallel agent spawning via Task tool
|
|
37
|
+
* @property {boolean} sessionRestore - PostCompact hook fires to re-inject context
|
|
33
38
|
* @property {string} settingsFile - path the installer writes IDE config to
|
|
34
39
|
* (relative to project root)
|
|
40
|
+
* @property {string} skillsDir - path the installer mirrors SKILL.md files
|
|
41
|
+
* into (relative to project root). Convention: <ide-dotdir>/skills.
|
|
35
42
|
* @property {string} description - human-readable label for the picker
|
|
36
43
|
*/
|
|
37
44
|
|
|
38
45
|
/** @type {Record<string, IdeCapabilities>} */
|
|
39
46
|
const IDE_CAPABILITIES = {
|
|
40
|
-
|
|
47
|
+
"claude-code": {
|
|
41
48
|
hooks: true,
|
|
49
|
+
hookEvents: ["SessionStart", "PreToolUse", "PostCompact", "Stop"],
|
|
42
50
|
skills: true,
|
|
43
|
-
commands: true,
|
|
44
51
|
agents: true,
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
52
|
+
interactivePrompts: true,
|
|
53
|
+
multiAgent: true,
|
|
54
|
+
sessionRestore: true,
|
|
55
|
+
settingsFile: ".claude/settings.json",
|
|
56
|
+
skillsDir: ".claude/skills",
|
|
57
|
+
description: "Claude Code",
|
|
48
58
|
},
|
|
49
59
|
cursor: {
|
|
50
60
|
hooks: false,
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
hookEvents: [],
|
|
62
|
+
skills: true,
|
|
53
63
|
agents: false,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
interactivePrompts: false,
|
|
65
|
+
multiAgent: false,
|
|
66
|
+
sessionRestore: false,
|
|
67
|
+
settingsFile: ".cursor/settings.json",
|
|
68
|
+
skillsDir: ".cursor/skills",
|
|
69
|
+
description: "Cursor",
|
|
57
70
|
},
|
|
58
71
|
windsurf: {
|
|
59
72
|
hooks: false,
|
|
60
|
-
|
|
61
|
-
|
|
73
|
+
hookEvents: [],
|
|
74
|
+
skills: true,
|
|
62
75
|
agents: false,
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
76
|
+
interactivePrompts: false,
|
|
77
|
+
multiAgent: false,
|
|
78
|
+
sessionRestore: false,
|
|
79
|
+
settingsFile: ".windsurf/settings.json",
|
|
80
|
+
skillsDir: ".windsurf/skills",
|
|
81
|
+
description: "Windsurf",
|
|
66
82
|
},
|
|
67
83
|
codex: {
|
|
84
|
+
hooks: true,
|
|
85
|
+
hookEvents: [
|
|
86
|
+
"SessionStart",
|
|
87
|
+
"PreToolUse",
|
|
88
|
+
"PermissionRequest",
|
|
89
|
+
"PostToolUse",
|
|
90
|
+
"UserPromptSubmit",
|
|
91
|
+
"Stop",
|
|
92
|
+
],
|
|
93
|
+
skills: true,
|
|
94
|
+
agents: true,
|
|
95
|
+
interactivePrompts: false,
|
|
96
|
+
multiAgent: true,
|
|
97
|
+
sessionRestore: false,
|
|
98
|
+
settingsFile: ".codex/config.toml",
|
|
99
|
+
skillsDir: ".codex/skills",
|
|
100
|
+
description: "Codex",
|
|
101
|
+
},
|
|
102
|
+
antigravity: {
|
|
68
103
|
hooks: false,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
agents:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
104
|
+
hookEvents: [],
|
|
105
|
+
skills: true,
|
|
106
|
+
agents: true,
|
|
107
|
+
interactivePrompts: false,
|
|
108
|
+
multiAgent: true,
|
|
109
|
+
sessionRestore: false,
|
|
110
|
+
settingsFile: ".antigravity/settings.json",
|
|
111
|
+
skillsDir: ".antigravity/skills",
|
|
112
|
+
description: "Antigravity",
|
|
75
113
|
},
|
|
76
114
|
};
|
|
77
115
|
|
|
@@ -86,7 +124,7 @@ function capabilitiesFor(ide) {
|
|
|
86
124
|
const caps = IDE_CAPABILITIES[ide];
|
|
87
125
|
if (!caps) {
|
|
88
126
|
throw new Error(
|
|
89
|
-
`Unknown IDE "${ide}". Supported: ${SUPPORTED_IDES.join(
|
|
127
|
+
`Unknown IDE "${ide}". Supported: ${SUPPORTED_IDES.join(", ")}`,
|
|
90
128
|
);
|
|
91
129
|
}
|
|
92
130
|
return caps;
|
|
@@ -103,9 +141,26 @@ function supports(ide, feature) {
|
|
|
103
141
|
return Boolean(caps[feature]);
|
|
104
142
|
}
|
|
105
143
|
|
|
144
|
+
/**
|
|
145
|
+
* @param {string[]} ides
|
|
146
|
+
* @returns {Set<string>}
|
|
147
|
+
*/
|
|
148
|
+
function hookEventsForIdes(ides) {
|
|
149
|
+
const events = new Set();
|
|
150
|
+
for (const ide of ides || []) {
|
|
151
|
+
const caps = IDE_CAPABILITIES[ide];
|
|
152
|
+
if (!caps || !Array.isArray(caps.hookEvents)) continue;
|
|
153
|
+
for (const event of caps.hookEvents) {
|
|
154
|
+
events.add(event);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return events;
|
|
158
|
+
}
|
|
159
|
+
|
|
106
160
|
module.exports = {
|
|
107
161
|
IDE_CAPABILITIES,
|
|
108
162
|
SUPPORTED_IDES,
|
|
109
163
|
capabilitiesFor,
|
|
110
164
|
supports,
|
|
165
|
+
hookEventsForIdes,
|
|
111
166
|
};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mirrors plugin-provided slash commands and subagents into Claude Code.
|
|
3
|
+
*
|
|
4
|
+
* Plugin source files live under:
|
|
5
|
+
* apps/cli/content/plugins/<id>/commands/...
|
|
6
|
+
* apps/cli/content/plugins/<id>/agents/...
|
|
7
|
+
*
|
|
8
|
+
* Claude Code discovers them from project-local dotdirs:
|
|
9
|
+
* .claude/commands/agileflow/...
|
|
10
|
+
* .claude/agents/agileflow/...
|
|
11
|
+
*/
|
|
12
|
+
const fs = require("fs");
|
|
13
|
+
const path = require("path");
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {import('../plugins/registry.js').PluginManifest} PluginManifest
|
|
17
|
+
*
|
|
18
|
+
* @typedef {Object} MirrorContentResult
|
|
19
|
+
* @property {string[]} mirrored
|
|
20
|
+
* @property {Array<{ id: string, error: string }>} skipped
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {string} p
|
|
25
|
+
* @returns {string}
|
|
26
|
+
*/
|
|
27
|
+
function toPosix(p) {
|
|
28
|
+
return p.split(path.sep).join("/");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {string} filePath
|
|
33
|
+
* @returns {Promise<void>}
|
|
34
|
+
*/
|
|
35
|
+
async function mkdirFor(filePath) {
|
|
36
|
+
await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param {string} dir
|
|
41
|
+
* @returns {Promise<void>}
|
|
42
|
+
*/
|
|
43
|
+
async function rmDir(dir) {
|
|
44
|
+
await fs.promises.rm(dir, { recursive: true, force: true });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @param {PluginManifest[]} orderedPlugins
|
|
49
|
+
* @param {"commands" | "agents"} kind
|
|
50
|
+
* @returns {Array<{ id: string, sourcePath: string, relativePath: string }>}
|
|
51
|
+
*/
|
|
52
|
+
function collectPluginContent(orderedPlugins, kind) {
|
|
53
|
+
/** @type {Array<{ id: string, sourcePath: string, relativePath: string }>} */
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const plugin of orderedPlugins) {
|
|
56
|
+
const entries =
|
|
57
|
+
plugin.provides && Array.isArray(plugin.provides[kind])
|
|
58
|
+
? plugin.provides[kind]
|
|
59
|
+
: [];
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
if (
|
|
62
|
+
!entry ||
|
|
63
|
+
typeof entry.id !== "string" ||
|
|
64
|
+
!entry.id ||
|
|
65
|
+
typeof entry.path !== "string" ||
|
|
66
|
+
!entry.path
|
|
67
|
+
) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const relativePath = entry.path.startsWith(`${kind}/`)
|
|
71
|
+
? entry.path.slice(kind.length + 1)
|
|
72
|
+
: entry.path;
|
|
73
|
+
out.push({
|
|
74
|
+
id: entry.id,
|
|
75
|
+
sourcePath: path.join(plugin.dir, entry.path),
|
|
76
|
+
relativePath: toPosix(relativePath),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @param {PluginManifest[]} orderedPlugins
|
|
85
|
+
* @param {string} projectRoot
|
|
86
|
+
* @param {string} targetDirRel
|
|
87
|
+
* @param {"commands" | "agents"} kind
|
|
88
|
+
* @returns {Promise<MirrorContentResult>}
|
|
89
|
+
*/
|
|
90
|
+
async function mirrorClaudeCodeContent(
|
|
91
|
+
orderedPlugins,
|
|
92
|
+
projectRoot,
|
|
93
|
+
targetDirRel,
|
|
94
|
+
kind,
|
|
95
|
+
) {
|
|
96
|
+
const targetRoot = path.join(projectRoot, targetDirRel);
|
|
97
|
+
await rmDir(targetRoot);
|
|
98
|
+
await fs.promises.mkdir(targetRoot, { recursive: true });
|
|
99
|
+
|
|
100
|
+
const items = collectPluginContent(orderedPlugins, kind);
|
|
101
|
+
/** @type {string[]} */
|
|
102
|
+
const mirrored = [];
|
|
103
|
+
/** @type {Array<{ id: string, error: string }>} */
|
|
104
|
+
const skipped = [];
|
|
105
|
+
|
|
106
|
+
for (const item of items) {
|
|
107
|
+
const dest = path.join(targetRoot, item.relativePath);
|
|
108
|
+
try {
|
|
109
|
+
await mkdirFor(dest);
|
|
110
|
+
await fs.promises.copyFile(item.sourcePath, dest);
|
|
111
|
+
mirrored.push(item.id);
|
|
112
|
+
} catch (err) {
|
|
113
|
+
if (err && err.code === "ENOENT") {
|
|
114
|
+
skipped.push({
|
|
115
|
+
id: item.id,
|
|
116
|
+
error: `source not found: ${item.sourcePath}`,
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return { mirrored, skipped };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @param {PluginManifest[]} orderedPlugins
|
|
129
|
+
* @param {string} projectRoot
|
|
130
|
+
* @returns {Promise<MirrorContentResult>}
|
|
131
|
+
*/
|
|
132
|
+
function mirrorClaudeCodeCommands(orderedPlugins, projectRoot) {
|
|
133
|
+
return mirrorClaudeCodeContent(
|
|
134
|
+
orderedPlugins,
|
|
135
|
+
projectRoot,
|
|
136
|
+
".claude/commands/agileflow",
|
|
137
|
+
"commands",
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* @param {PluginManifest[]} orderedPlugins
|
|
143
|
+
* @param {string} projectRoot
|
|
144
|
+
* @returns {Promise<MirrorContentResult>}
|
|
145
|
+
*/
|
|
146
|
+
function mirrorClaudeCodeAgents(orderedPlugins, projectRoot) {
|
|
147
|
+
return mirrorClaudeCodeContent(
|
|
148
|
+
orderedPlugins,
|
|
149
|
+
projectRoot,
|
|
150
|
+
".claude/agents/agileflow",
|
|
151
|
+
"agents",
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @param {string} projectRoot
|
|
157
|
+
* @returns {Promise<void>}
|
|
158
|
+
*/
|
|
159
|
+
async function unmirrorClaudeCodeCommands(projectRoot) {
|
|
160
|
+
await rmDir(path.join(projectRoot, ".claude/commands/agileflow"));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @param {string} projectRoot
|
|
165
|
+
* @returns {Promise<void>}
|
|
166
|
+
*/
|
|
167
|
+
async function unmirrorClaudeCodeAgents(projectRoot) {
|
|
168
|
+
await rmDir(path.join(projectRoot, ".claude/agents/agileflow"));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
module.exports = {
|
|
172
|
+
collectPluginContent,
|
|
173
|
+
mirrorClaudeCodeCommands,
|
|
174
|
+
mirrorClaudeCodeAgents,
|
|
175
|
+
unmirrorClaudeCodeCommands,
|
|
176
|
+
unmirrorClaudeCodeAgents,
|
|
177
|
+
};
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* When the target IDE is `claude-code`, the installer registers our 6
|
|
5
5
|
* hook entry points in `.claude/settings.json` so Claude Code actually
|
|
6
|
-
* invokes them at runtime. We use
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* invokes them at runtime. We use `npx agileflow hook <event>` so npx
|
|
7
|
+
* resolves the project-local binary from node_modules first. --no-install is
|
|
8
|
+
* intentionally omitted: it skips local node_modules and falls back to the
|
|
9
|
+
* npm cache, which can pick up a stale older version.
|
|
9
10
|
*
|
|
10
11
|
* The writer is **non-destructive**: it merges with any existing
|
|
11
12
|
* settings.json. Only AgileFlow-owned hook entries (identified by the
|
|
@@ -16,10 +17,10 @@
|
|
|
16
17
|
* On a non-claude-code switch, `removeManagedHooks` strips our entries
|
|
17
18
|
* but leaves the rest of the file alone.
|
|
18
19
|
*/
|
|
19
|
-
const fs = require(
|
|
20
|
-
const path = require(
|
|
20
|
+
const fs = require("fs");
|
|
21
|
+
const path = require("path");
|
|
21
22
|
|
|
22
|
-
const HOOK_COMMAND_MARKER =
|
|
23
|
+
const HOOK_COMMAND_MARKER = "agileflow hook";
|
|
23
24
|
const HOOK_TIMEOUT_SECONDS = 30;
|
|
24
25
|
|
|
25
26
|
/**
|
|
@@ -27,28 +28,65 @@ const HOOK_TIMEOUT_SECONDS = 30;
|
|
|
27
28
|
* The `command` is what gets baked into settings.json.
|
|
28
29
|
*/
|
|
29
30
|
const MANAGED_HOOKS = [
|
|
30
|
-
{
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
{
|
|
31
|
+
{
|
|
32
|
+
event: "SessionStart",
|
|
33
|
+
matcher: null,
|
|
34
|
+
command: "npx agileflow hook SessionStart",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
event: "PreToolUse",
|
|
38
|
+
matcher: "Bash",
|
|
39
|
+
command: "npx agileflow hook PreToolUse --matcher Bash",
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
event: "PreToolUse",
|
|
43
|
+
matcher: "Edit",
|
|
44
|
+
command: "npx agileflow hook PreToolUse --matcher Edit",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
event: "PreToolUse",
|
|
48
|
+
matcher: "Write",
|
|
49
|
+
command: "npx agileflow hook PreToolUse --matcher Write",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
event: "PostCompact",
|
|
53
|
+
matcher: null,
|
|
54
|
+
command: "npx agileflow hook PostCompact",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
event: "Stop",
|
|
58
|
+
matcher: null,
|
|
59
|
+
command: "npx agileflow hook Stop",
|
|
60
|
+
},
|
|
36
61
|
];
|
|
37
62
|
|
|
38
63
|
const MANAGED_EVENTS = new Set(MANAGED_HOOKS.map((h) => h.event));
|
|
39
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Events AgileFlow wrote in previous versions but no longer manages.
|
|
67
|
+
* Used by `doctor` to detect stale entries that update wouldn't sweep
|
|
68
|
+
* (mergeManagedHooks only touches MANAGED_EVENTS). Add the OLD name
|
|
69
|
+
* here whenever a hook event is renamed or retired so old installs
|
|
70
|
+
* surface the leftover.
|
|
71
|
+
*
|
|
72
|
+
* - PreCompact → renamed to PostCompact in v4.0.0-alpha.6
|
|
73
|
+
* - PostToolUse → retired in v4 (was v3-era damage-control hook)
|
|
74
|
+
*/
|
|
75
|
+
const LEGACY_MANAGED_EVENTS = new Set(["PreCompact", "PostToolUse"]);
|
|
76
|
+
|
|
40
77
|
/**
|
|
41
78
|
* Detect whether a settings.json hook entry belongs to AgileFlow.
|
|
42
79
|
* @param {*} entry
|
|
43
80
|
*/
|
|
44
81
|
function isAgileflowEntry(entry) {
|
|
45
|
-
if (!entry || typeof entry !==
|
|
82
|
+
if (!entry || typeof entry !== "object" || !Array.isArray(entry.hooks))
|
|
83
|
+
return false;
|
|
46
84
|
return entry.hooks.some(
|
|
47
85
|
(h) =>
|
|
48
86
|
h &&
|
|
49
|
-
typeof h ===
|
|
50
|
-
h.type ===
|
|
51
|
-
typeof h.command ===
|
|
87
|
+
typeof h === "object" &&
|
|
88
|
+
h.type === "command" &&
|
|
89
|
+
typeof h.command === "string" &&
|
|
52
90
|
h.command.includes(HOOK_COMMAND_MARKER),
|
|
53
91
|
);
|
|
54
92
|
}
|
|
@@ -60,9 +98,7 @@ function isAgileflowEntry(entry) {
|
|
|
60
98
|
function buildEntry({ matcher, command }) {
|
|
61
99
|
/** @type {{ matcher?: string, hooks: object[] }} */
|
|
62
100
|
const out = {
|
|
63
|
-
hooks: [
|
|
64
|
-
{ type: 'command', command, timeout: HOOK_TIMEOUT_SECONDS },
|
|
65
|
-
],
|
|
101
|
+
hooks: [{ type: "command", command, timeout: HOOK_TIMEOUT_SECONDS }],
|
|
66
102
|
};
|
|
67
103
|
if (matcher) out.matcher = matcher;
|
|
68
104
|
return out;
|
|
@@ -75,12 +111,13 @@ function buildEntry({ matcher, command }) {
|
|
|
75
111
|
*/
|
|
76
112
|
async function readExisting(settingsPath) {
|
|
77
113
|
try {
|
|
78
|
-
const raw = await fs.promises.readFile(settingsPath,
|
|
114
|
+
const raw = await fs.promises.readFile(settingsPath, "utf8");
|
|
79
115
|
const parsed = JSON.parse(raw);
|
|
80
|
-
if (!parsed || typeof parsed !==
|
|
116
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
117
|
+
return {};
|
|
81
118
|
return parsed;
|
|
82
119
|
} catch (err) {
|
|
83
|
-
if (err.code ===
|
|
120
|
+
if (err.code === "ENOENT") return {};
|
|
84
121
|
if (err instanceof SyntaxError) return {};
|
|
85
122
|
throw err;
|
|
86
123
|
}
|
|
@@ -97,9 +134,9 @@ async function writeMerged(settingsPath, settings) {
|
|
|
97
134
|
path.dirname(settingsPath),
|
|
98
135
|
`.${path.basename(settingsPath)}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 10)}`,
|
|
99
136
|
);
|
|
100
|
-
const text = JSON.stringify(settings, null, 2) +
|
|
137
|
+
const text = JSON.stringify(settings, null, 2) + "\n";
|
|
101
138
|
try {
|
|
102
|
-
await fs.promises.writeFile(tmp, text,
|
|
139
|
+
await fs.promises.writeFile(tmp, text, "utf8");
|
|
103
140
|
await fs.promises.rename(tmp, settingsPath);
|
|
104
141
|
} catch (err) {
|
|
105
142
|
try {
|
|
@@ -125,7 +162,7 @@ function mergeManagedHooks(existing) {
|
|
|
125
162
|
// produces numeric-keyed garbage. Treat it as missing instead.
|
|
126
163
|
const baseHooks =
|
|
127
164
|
existing.hooks &&
|
|
128
|
-
typeof existing.hooks ===
|
|
165
|
+
typeof existing.hooks === "object" &&
|
|
129
166
|
!Array.isArray(existing.hooks)
|
|
130
167
|
? existing.hooks
|
|
131
168
|
: {};
|
|
@@ -154,7 +191,7 @@ function unmanageHooks(existing) {
|
|
|
154
191
|
const next = { ...existing };
|
|
155
192
|
if (
|
|
156
193
|
!existing.hooks ||
|
|
157
|
-
typeof existing.hooks !==
|
|
194
|
+
typeof existing.hooks !== "object" ||
|
|
158
195
|
Array.isArray(existing.hooks)
|
|
159
196
|
) {
|
|
160
197
|
return next;
|
|
@@ -185,7 +222,7 @@ function unmanageHooks(existing) {
|
|
|
185
222
|
* @returns {Promise<string>} absolute path of the written settings file
|
|
186
223
|
*/
|
|
187
224
|
async function writeClaudeCodeSettings(projectRoot) {
|
|
188
|
-
const settingsPath = path.join(projectRoot,
|
|
225
|
+
const settingsPath = path.join(projectRoot, ".claude", "settings.json");
|
|
189
226
|
const existing = await readExisting(settingsPath);
|
|
190
227
|
const merged = mergeManagedHooks(existing);
|
|
191
228
|
await writeMerged(settingsPath, merged);
|
|
@@ -201,7 +238,7 @@ async function writeClaudeCodeSettings(projectRoot) {
|
|
|
201
238
|
* @returns {Promise<{ removed: boolean, settingsPath: string|null }>}
|
|
202
239
|
*/
|
|
203
240
|
async function removeClaudeCodeSettings(projectRoot) {
|
|
204
|
-
const settingsPath = path.join(projectRoot,
|
|
241
|
+
const settingsPath = path.join(projectRoot, ".claude", "settings.json");
|
|
205
242
|
// readExisting already converts ENOENT and SyntaxError to {} — any
|
|
206
243
|
// exception here means a real filesystem problem (EACCES / EIO).
|
|
207
244
|
// Do NOT swallow: a silent success would lie about successfully
|
|
@@ -213,7 +250,7 @@ async function removeClaudeCodeSettings(projectRoot) {
|
|
|
213
250
|
await fs.promises.unlink(settingsPath);
|
|
214
251
|
return { removed: true, settingsPath };
|
|
215
252
|
} catch (err) {
|
|
216
|
-
if (err.code ===
|
|
253
|
+
if (err.code === "ENOENT") return { removed: false, settingsPath: null };
|
|
217
254
|
throw err;
|
|
218
255
|
}
|
|
219
256
|
}
|
|
@@ -229,6 +266,7 @@ module.exports = {
|
|
|
229
266
|
isAgileflowEntry,
|
|
230
267
|
MANAGED_HOOKS,
|
|
231
268
|
MANAGED_EVENTS,
|
|
269
|
+
LEGACY_MANAGED_EVENTS,
|
|
232
270
|
HOOK_COMMAND_MARKER,
|
|
233
271
|
HOOK_TIMEOUT_SECONDS,
|
|
234
272
|
};
|