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
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Skill mirror for IDEs that discover skills from a dotdir.
|
|
3
3
|
*
|
|
4
4
|
* Plugin skills are sourced under `apps/cli/content/plugins/<id>/skills/<skill-id>/`
|
|
5
|
-
* and copied into
|
|
6
|
-
* sync engine. But Claude Code discovers skills from `.claude/skills/<skill-id>/`,
|
|
7
|
-
* so this module mirrors enabled plugin skills to that canonical
|
|
8
|
-
* location and prunes orphaned skills when plugins are disabled.
|
|
9
|
-
*
|
|
5
|
+
* and copied into the target IDE's skill directory by the installer.
|
|
10
6
|
* We use copy (not symlink) for portability — Windows symlink behavior
|
|
11
|
-
* is inconsistent and
|
|
12
|
-
* cost is negligible at v4-alpha skill counts.
|
|
7
|
+
* is inconsistent and the supported IDEs run on mixed platforms.
|
|
8
|
+
* The duplication cost is negligible at v4-alpha skill counts.
|
|
13
9
|
*/
|
|
14
|
-
const fs = require(
|
|
15
|
-
const path = require(
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
const { renderSkillForTarget } = require("./babysit-skill.js");
|
|
16
13
|
|
|
17
14
|
/**
|
|
18
15
|
* @typedef {import('../plugins/registry.js').PluginManifest} PluginManifest
|
|
19
16
|
*
|
|
20
17
|
* @typedef {Object} MirrorResult
|
|
21
|
-
* @property {string[]} mirrored - skill ids written to
|
|
22
|
-
* @property {string[]} pruned - skill ids removed from
|
|
18
|
+
* @property {string[]} mirrored - skill ids written to the target skills dir
|
|
19
|
+
* @property {string[]} pruned - skill ids removed from the target skills dir (orphans)
|
|
23
20
|
* @property {Array<{ skillId: string, error: string }>} skipped - skills whose source was missing
|
|
24
21
|
*/
|
|
25
22
|
|
|
@@ -28,7 +25,7 @@ const path = require('path');
|
|
|
28
25
|
* @param {string} src
|
|
29
26
|
* @param {string} dest
|
|
30
27
|
*/
|
|
31
|
-
async function copyDir(src, dest) {
|
|
28
|
+
async function copyDir(src, dest, context = {}) {
|
|
32
29
|
// Read the source listing FIRST. If src is missing (ENOENT), the
|
|
33
30
|
// error propagates BEFORE we create dest, so a missing source can't
|
|
34
31
|
// leave behind an empty destination dir for the caller to mistake
|
|
@@ -39,9 +36,19 @@ async function copyDir(src, dest) {
|
|
|
39
36
|
const s = path.join(src, e.name);
|
|
40
37
|
const d = path.join(dest, e.name);
|
|
41
38
|
if (e.isDirectory()) {
|
|
42
|
-
await copyDir(s, d);
|
|
39
|
+
await copyDir(s, d, context);
|
|
43
40
|
} else if (e.isFile()) {
|
|
44
|
-
|
|
41
|
+
if (e.name === "SKILL.md" && context.skillId) {
|
|
42
|
+
const sourceText = await fs.promises.readFile(s, "utf8");
|
|
43
|
+
const rendered = renderSkillForTarget(
|
|
44
|
+
context.skillId,
|
|
45
|
+
sourceText,
|
|
46
|
+
context,
|
|
47
|
+
);
|
|
48
|
+
await fs.promises.writeFile(d, rendered, "utf8");
|
|
49
|
+
} else {
|
|
50
|
+
await fs.promises.copyFile(s, d);
|
|
51
|
+
}
|
|
45
52
|
}
|
|
46
53
|
}
|
|
47
54
|
}
|
|
@@ -75,9 +82,9 @@ function collectPluginSkills(orderedPlugins) {
|
|
|
75
82
|
// the plugin root, which is never what the author intended.
|
|
76
83
|
if (
|
|
77
84
|
!s ||
|
|
78
|
-
typeof s.id !==
|
|
85
|
+
typeof s.id !== "string" ||
|
|
79
86
|
!s.id ||
|
|
80
|
-
typeof s.dir !==
|
|
87
|
+
typeof s.dir !== "string" ||
|
|
81
88
|
!s.dir
|
|
82
89
|
) {
|
|
83
90
|
continue;
|
|
@@ -92,8 +99,8 @@ function collectPluginSkills(orderedPlugins) {
|
|
|
92
99
|
}
|
|
93
100
|
|
|
94
101
|
/**
|
|
95
|
-
* Mirror enabled plugin skills into `<projectRoot
|
|
96
|
-
* and remove any
|
|
102
|
+
* Mirror enabled plugin skills into `<projectRoot>/<skillsDirRel>/<skill-id>/`
|
|
103
|
+
* and remove any `<skillsDirRel>/<id>/` whose id is not in the current
|
|
97
104
|
* enabled set.
|
|
98
105
|
*
|
|
99
106
|
* Only AgileFlow-tracked skills are pruned: a skill is "tracked" iff
|
|
@@ -101,7 +108,7 @@ function collectPluginSkills(orderedPlugins) {
|
|
|
101
108
|
* appears in any plugin's `provides.skills` (i.e., we recognize it).
|
|
102
109
|
* To stay safe, we limit pruning to skills we've seen previously by
|
|
103
110
|
* recording the install set in the file index — but for v4-alpha
|
|
104
|
-
* simplicity, we prune every dir under
|
|
111
|
+
* simplicity, we prune every dir under the skills dir whose name
|
|
105
112
|
* matches an `agileflow-*` convention OR is in the previously-mirrored
|
|
106
113
|
* set on disk. Unknown user-placed skill dirs without that prefix are
|
|
107
114
|
* left alone.
|
|
@@ -110,8 +117,13 @@ function collectPluginSkills(orderedPlugins) {
|
|
|
110
117
|
* @param {string} projectRoot
|
|
111
118
|
* @returns {Promise<MirrorResult>}
|
|
112
119
|
*/
|
|
113
|
-
async function mirrorClaudeCodeSkills(
|
|
114
|
-
|
|
120
|
+
async function mirrorClaudeCodeSkills(
|
|
121
|
+
orderedPlugins,
|
|
122
|
+
projectRoot,
|
|
123
|
+
skillsDirRel = ".claude/skills",
|
|
124
|
+
context = {},
|
|
125
|
+
) {
|
|
126
|
+
const claudeSkills = path.join(projectRoot, skillsDirRel);
|
|
115
127
|
await fs.promises.mkdir(claudeSkills, { recursive: true });
|
|
116
128
|
|
|
117
129
|
const want = collectPluginSkills(orderedPlugins);
|
|
@@ -127,13 +139,13 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
|
|
|
127
139
|
// Replace the destination wholesale so removed files in source
|
|
128
140
|
// don't linger in the user's .claude/skills/.
|
|
129
141
|
await rmDir(dest);
|
|
130
|
-
await copyDir(sourceDir, dest);
|
|
142
|
+
await copyDir(sourceDir, dest, { ...context, skillId });
|
|
131
143
|
mirrored.push(skillId);
|
|
132
144
|
} catch (err) {
|
|
133
145
|
// A missing source dir (ENOENT) shouldn't crash the entire
|
|
134
146
|
// install — log and continue so other skills still mirror. A
|
|
135
147
|
// permission error or unrelated failure still propagates.
|
|
136
|
-
if (err && err.code ===
|
|
148
|
+
if (err && err.code === "ENOENT") {
|
|
137
149
|
skipped.push({
|
|
138
150
|
skillId,
|
|
139
151
|
error: `source not found: ${sourceDir}`,
|
|
@@ -150,7 +162,7 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
|
|
|
150
162
|
try {
|
|
151
163
|
entries = await fs.promises.readdir(claudeSkills, { withFileTypes: true });
|
|
152
164
|
} catch (err) {
|
|
153
|
-
if (err.code ===
|
|
165
|
+
if (err.code === "ENOENT") return { mirrored, pruned };
|
|
154
166
|
throw err;
|
|
155
167
|
}
|
|
156
168
|
for (const e of entries) {
|
|
@@ -160,7 +172,7 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
|
|
|
160
172
|
// avoids blasting a user-placed third-party skill whose id we
|
|
161
173
|
// don't manage. A dedicated prune-from-index approach can replace
|
|
162
174
|
// this heuristic in a later phase.
|
|
163
|
-
if (!e.name.startsWith(
|
|
175
|
+
if (!e.name.startsWith("agileflow-")) continue;
|
|
164
176
|
await rmDir(path.join(claudeSkills, e.name));
|
|
165
177
|
pruned.push(e.name);
|
|
166
178
|
}
|
|
@@ -169,26 +181,29 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
|
|
|
169
181
|
}
|
|
170
182
|
|
|
171
183
|
/**
|
|
172
|
-
* Remove all AgileFlow-mirrored skills from
|
|
173
|
-
* when switching to a non-skill IDE.
|
|
184
|
+
* Remove all AgileFlow-mirrored skills from the target skills dir.
|
|
185
|
+
* Used when switching to a non-skill IDE.
|
|
174
186
|
*
|
|
175
187
|
* @param {string} projectRoot
|
|
176
188
|
* @returns {Promise<string[]>} ids that were removed
|
|
177
189
|
*/
|
|
178
|
-
async function unmirrorClaudeCodeSkills(
|
|
179
|
-
|
|
190
|
+
async function unmirrorClaudeCodeSkills(
|
|
191
|
+
projectRoot,
|
|
192
|
+
skillsDirRel = ".claude/skills",
|
|
193
|
+
) {
|
|
194
|
+
const claudeSkills = path.join(projectRoot, skillsDirRel);
|
|
180
195
|
/** @type {string[]} */
|
|
181
196
|
const removed = [];
|
|
182
197
|
let entries;
|
|
183
198
|
try {
|
|
184
199
|
entries = await fs.promises.readdir(claudeSkills, { withFileTypes: true });
|
|
185
200
|
} catch (err) {
|
|
186
|
-
if (err.code ===
|
|
201
|
+
if (err.code === "ENOENT") return removed;
|
|
187
202
|
throw err;
|
|
188
203
|
}
|
|
189
204
|
for (const e of entries) {
|
|
190
205
|
if (!e.isDirectory()) continue;
|
|
191
|
-
if (!e.name.startsWith(
|
|
206
|
+
if (!e.name.startsWith("agileflow-")) continue;
|
|
192
207
|
await rmDir(path.join(claudeSkills, e.name));
|
|
193
208
|
removed.push(e.name);
|
|
194
209
|
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex config.toml writer.
|
|
3
|
+
*
|
|
4
|
+
* Codex hooks require the `[features].hooks = true` flag in config.toml.
|
|
5
|
+
* AgileFlow uses the project-local `config.toml` path because we need both
|
|
6
|
+
* the feature flag and the inline lifecycle hook tables.
|
|
7
|
+
*
|
|
8
|
+
* The writer is non-destructive:
|
|
9
|
+
* - it preserves unrelated top-level Codex config
|
|
10
|
+
* - it preserves user hook entries on the same events
|
|
11
|
+
* - it only manages the AgileFlow hook registrations and the feature flag
|
|
12
|
+
*/
|
|
13
|
+
const fs = require("fs");
|
|
14
|
+
const path = require("path");
|
|
15
|
+
const toml = require("@iarna/toml");
|
|
16
|
+
|
|
17
|
+
const HOOK_COMMAND_MARKER = "agileflow hook";
|
|
18
|
+
const HOOK_TIMEOUT_SECONDS = 30;
|
|
19
|
+
const DEFAULT_APPROVAL_POLICY = "never";
|
|
20
|
+
const DEFAULT_SANDBOX_MODE = "danger-full-access";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Codex hook registrations we own. These map to the Codex lifecycle
|
|
24
|
+
* events that AgileFlow actually uses.
|
|
25
|
+
*/
|
|
26
|
+
const MANAGED_HOOKS = [
|
|
27
|
+
{
|
|
28
|
+
event: "SessionStart",
|
|
29
|
+
matcher: null,
|
|
30
|
+
command: "npx agileflow hook SessionStart",
|
|
31
|
+
statusMessage: "Loading AgileFlow session context",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
event: "PreToolUse",
|
|
35
|
+
matcher: "Bash",
|
|
36
|
+
command: "npx agileflow hook PreToolUse --matcher Bash",
|
|
37
|
+
statusMessage: "Checking Bash command",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
event: "PreToolUse",
|
|
41
|
+
matcher: "Edit",
|
|
42
|
+
command: "npx agileflow hook PreToolUse --matcher Edit",
|
|
43
|
+
statusMessage: "Checking Edit command",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
event: "PreToolUse",
|
|
47
|
+
matcher: "Write",
|
|
48
|
+
command: "npx agileflow hook PreToolUse --matcher Write",
|
|
49
|
+
statusMessage: "Checking Write command",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
event: "Stop",
|
|
53
|
+
matcher: null,
|
|
54
|
+
command: "npx agileflow hook Stop",
|
|
55
|
+
statusMessage: "Saving AgileFlow state",
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @param {{ matcher: string|null, command: string, statusMessage?: string }} hook
|
|
61
|
+
*/
|
|
62
|
+
function buildEntry({ matcher, command, statusMessage }) {
|
|
63
|
+
/** @type {{ matcher?: string, hooks: object[] }} */
|
|
64
|
+
const out = {
|
|
65
|
+
hooks: [
|
|
66
|
+
{
|
|
67
|
+
type: "command",
|
|
68
|
+
command,
|
|
69
|
+
timeout: HOOK_TIMEOUT_SECONDS,
|
|
70
|
+
...(statusMessage ? { statusMessage } : {}),
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
if (matcher) out.matcher = matcher;
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @param {*} entry
|
|
80
|
+
* @returns {boolean}
|
|
81
|
+
*/
|
|
82
|
+
function isAgileflowEntry(entry) {
|
|
83
|
+
if (!entry || typeof entry !== "object" || !Array.isArray(entry.hooks)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
return Array.isArray(entry.hooks)
|
|
87
|
+
? entry.hooks.some(
|
|
88
|
+
(h) =>
|
|
89
|
+
h &&
|
|
90
|
+
typeof h === "object" &&
|
|
91
|
+
h.type === "command" &&
|
|
92
|
+
typeof h.command === "string" &&
|
|
93
|
+
h.command.includes(HOOK_COMMAND_MARKER),
|
|
94
|
+
)
|
|
95
|
+
: false;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* @param {string} configPath
|
|
100
|
+
* @returns {Promise<object>}
|
|
101
|
+
*/
|
|
102
|
+
async function readExisting(configPath) {
|
|
103
|
+
try {
|
|
104
|
+
const raw = await fs.promises.readFile(configPath, "utf8");
|
|
105
|
+
const parsed = toml.parse(raw);
|
|
106
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
107
|
+
return {};
|
|
108
|
+
}
|
|
109
|
+
return parsed;
|
|
110
|
+
} catch (err) {
|
|
111
|
+
if (err.code === "ENOENT") return {};
|
|
112
|
+
if (err instanceof SyntaxError || err.name === "TomlError") return {};
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Merge our managed hook registrations into an existing config object.
|
|
119
|
+
* @param {object} existing
|
|
120
|
+
* @returns {object}
|
|
121
|
+
*/
|
|
122
|
+
function mergeManagedHooks(existing) {
|
|
123
|
+
/** @type {Record<string, any>} */
|
|
124
|
+
const next = {
|
|
125
|
+
...(existing && typeof existing === "object" && !Array.isArray(existing)
|
|
126
|
+
? existing
|
|
127
|
+
: {}),
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const existingFeatures =
|
|
131
|
+
next.features &&
|
|
132
|
+
typeof next.features === "object" &&
|
|
133
|
+
!Array.isArray(next.features)
|
|
134
|
+
? next.features
|
|
135
|
+
: {};
|
|
136
|
+
next.features = {
|
|
137
|
+
...existingFeatures,
|
|
138
|
+
hooks: true,
|
|
139
|
+
collaboration_modes: true,
|
|
140
|
+
};
|
|
141
|
+
next.approval_policy = DEFAULT_APPROVAL_POLICY;
|
|
142
|
+
next.sandbox_mode = DEFAULT_SANDBOX_MODE;
|
|
143
|
+
|
|
144
|
+
const existingHooks =
|
|
145
|
+
next.hooks && typeof next.hooks === "object" && !Array.isArray(next.hooks)
|
|
146
|
+
? next.hooks
|
|
147
|
+
: {};
|
|
148
|
+
const hooks = { ...existingHooks };
|
|
149
|
+
/** @type {Map<string, typeof MANAGED_HOOKS>} */
|
|
150
|
+
const grouped = new Map();
|
|
151
|
+
for (const managed of MANAGED_HOOKS) {
|
|
152
|
+
const list = grouped.get(managed.event);
|
|
153
|
+
if (list) list.push(managed);
|
|
154
|
+
else grouped.set(managed.event, [managed]);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const [event, managedList] of grouped.entries()) {
|
|
158
|
+
const prior = Array.isArray(hooks[event]) ? hooks[event] : [];
|
|
159
|
+
const userEntries = prior.filter((entry) => !isAgileflowEntry(entry));
|
|
160
|
+
hooks[event] = [...managedList.map(buildEntry), ...userEntries];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
next.hooks = hooks;
|
|
164
|
+
return next;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Remove AgileFlow-managed hook registrations from a config object.
|
|
169
|
+
* @param {object} existing
|
|
170
|
+
* @returns {object}
|
|
171
|
+
*/
|
|
172
|
+
function unmanageHooks(existing) {
|
|
173
|
+
/** @type {Record<string, any>} */
|
|
174
|
+
const next = {
|
|
175
|
+
...(existing && typeof existing === "object" && !Array.isArray(existing)
|
|
176
|
+
? existing
|
|
177
|
+
: {}),
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
if (
|
|
181
|
+
next.features &&
|
|
182
|
+
typeof next.features === "object" &&
|
|
183
|
+
!Array.isArray(next.features)
|
|
184
|
+
) {
|
|
185
|
+
const features = { ...next.features };
|
|
186
|
+
delete features.hooks;
|
|
187
|
+
delete features.collaboration_modes;
|
|
188
|
+
if (Object.keys(features).length) next.features = features;
|
|
189
|
+
else delete next.features;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (
|
|
193
|
+
next.hooks &&
|
|
194
|
+
typeof next.hooks === "object" &&
|
|
195
|
+
!Array.isArray(next.hooks)
|
|
196
|
+
) {
|
|
197
|
+
const hooks = { ...next.hooks };
|
|
198
|
+
for (const managed of MANAGED_HOOKS) {
|
|
199
|
+
if (!Array.isArray(hooks[managed.event])) continue;
|
|
200
|
+
const userEntries = hooks[managed.event].filter(
|
|
201
|
+
(entry) => !isAgileflowEntry(entry),
|
|
202
|
+
);
|
|
203
|
+
if (userEntries.length) hooks[managed.event] = userEntries;
|
|
204
|
+
else delete hooks[managed.event];
|
|
205
|
+
}
|
|
206
|
+
if (Object.keys(hooks).length) next.hooks = hooks;
|
|
207
|
+
else delete next.hooks;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return next;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @param {string} configPath
|
|
215
|
+
* @param {object} config
|
|
216
|
+
*/
|
|
217
|
+
async function writeConfigAtomic(configPath, config) {
|
|
218
|
+
await fs.promises.mkdir(path.dirname(configPath), { recursive: true });
|
|
219
|
+
const tmp = path.join(
|
|
220
|
+
path.dirname(configPath),
|
|
221
|
+
`.${path.basename(configPath)}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 10)}`,
|
|
222
|
+
);
|
|
223
|
+
const text = toml.stringify(config);
|
|
224
|
+
try {
|
|
225
|
+
await fs.promises.writeFile(tmp, text, "utf8");
|
|
226
|
+
await fs.promises.rename(tmp, configPath);
|
|
227
|
+
} catch (err) {
|
|
228
|
+
try {
|
|
229
|
+
await fs.promises.unlink(tmp);
|
|
230
|
+
} catch {
|
|
231
|
+
/* swallow */
|
|
232
|
+
}
|
|
233
|
+
throw err;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Register the AgileFlow Codex hooks in `<projectRoot>/.codex/config.toml`.
|
|
239
|
+
*
|
|
240
|
+
* @param {string} projectRoot
|
|
241
|
+
* @returns {Promise<string>} absolute path to the written config
|
|
242
|
+
*/
|
|
243
|
+
async function writeCodexConfig(projectRoot) {
|
|
244
|
+
const configPath = path.join(projectRoot, ".codex", "config.toml");
|
|
245
|
+
const existing = await readExisting(configPath);
|
|
246
|
+
const merged = mergeManagedHooks(existing);
|
|
247
|
+
await writeConfigAtomic(configPath, merged);
|
|
248
|
+
return configPath;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Remove AgileFlow-managed Codex hook registrations.
|
|
253
|
+
*
|
|
254
|
+
* @param {string} projectRoot
|
|
255
|
+
* @returns {Promise<string|null>} path removed/updated, or null when absent
|
|
256
|
+
*/
|
|
257
|
+
async function removeCodexConfig(projectRoot) {
|
|
258
|
+
const configPath = path.join(projectRoot, ".codex", "config.toml");
|
|
259
|
+
let existing;
|
|
260
|
+
try {
|
|
261
|
+
existing = await readExisting(configPath);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
if (err.code === "ENOENT") return null;
|
|
264
|
+
throw err;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const stripped = unmanageHooks(existing);
|
|
268
|
+
if (Object.keys(stripped).length === 0) {
|
|
269
|
+
try {
|
|
270
|
+
await fs.promises.unlink(configPath);
|
|
271
|
+
} catch (err) {
|
|
272
|
+
if (err.code === "ENOENT") return null;
|
|
273
|
+
throw err;
|
|
274
|
+
}
|
|
275
|
+
return configPath;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
await writeConfigAtomic(configPath, stripped);
|
|
279
|
+
return configPath;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
module.exports = {
|
|
283
|
+
DEFAULT_APPROVAL_POLICY,
|
|
284
|
+
DEFAULT_SANDBOX_MODE,
|
|
285
|
+
HOOK_COMMAND_MARKER,
|
|
286
|
+
HOOK_TIMEOUT_SECONDS,
|
|
287
|
+
MANAGED_HOOKS,
|
|
288
|
+
buildEntry,
|
|
289
|
+
isAgileflowEntry,
|
|
290
|
+
mergeManagedHooks,
|
|
291
|
+
unmanageHooks,
|
|
292
|
+
readExisting,
|
|
293
|
+
writeCodexConfig,
|
|
294
|
+
removeCodexConfig,
|
|
295
|
+
};
|