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
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `af` alias picker for `agileflow launch setup`.
|
|
3
|
+
*
|
|
4
|
+
* Asks whether to install the short `af` alias as a symlink at
|
|
5
|
+
* `~/.local/bin/af` → `agileflow`. The picker only captures the user's
|
|
6
|
+
* preference; the actual symlink is created by `installAfAlias()` after
|
|
7
|
+
* prefs are written, so failure modes (permission errors, PATH warnings)
|
|
8
|
+
* are surfaced cleanly through the existing outro path.
|
|
9
|
+
*
|
|
10
|
+
* Windows users see the option but the side-effect step reports
|
|
11
|
+
* "unsupported" and prints a PowerShell function snippet instead.
|
|
12
|
+
*/
|
|
13
|
+
const prompts = require("@clack/prompts");
|
|
14
|
+
const { questionMessage } = require("../../lib/brand.js");
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {{ aliases: { af: { enabled: boolean } } }} currentPrefs
|
|
18
|
+
* @returns {Promise<{ af: { enabled: boolean } }>}
|
|
19
|
+
*/
|
|
20
|
+
async function pickAliases(currentPrefs) {
|
|
21
|
+
const initial =
|
|
22
|
+
currentPrefs &&
|
|
23
|
+
currentPrefs.aliases &&
|
|
24
|
+
currentPrefs.aliases.af &&
|
|
25
|
+
typeof currentPrefs.aliases.af.enabled === "boolean"
|
|
26
|
+
? currentPrefs.aliases.af.enabled
|
|
27
|
+
: false;
|
|
28
|
+
|
|
29
|
+
const detail =
|
|
30
|
+
process.platform === "win32"
|
|
31
|
+
? "On Windows the symlink can't be auto-created; we'll print a PowerShell snippet instead."
|
|
32
|
+
: "Creates ~/.local/bin/af → agileflow. No sudo needed.";
|
|
33
|
+
|
|
34
|
+
const choice = await prompts.confirm({
|
|
35
|
+
message: questionMessage(
|
|
36
|
+
"Install `af` as a short alias for `agileflow launch`?",
|
|
37
|
+
detail,
|
|
38
|
+
),
|
|
39
|
+
initialValue: initial,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (prompts.isCancel(choice)) {
|
|
43
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return { af: { enabled: /** @type {boolean} */ (choice) } };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
module.exports = { pickAliases };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI CLI picker for `agileflow launch setup`.
|
|
3
|
+
*
|
|
4
|
+
* Two-step flow:
|
|
5
|
+
* 1. multiselect — which detected CLIs to include in the fallback order
|
|
6
|
+
* 2. select — which of those is the preferred / default
|
|
7
|
+
*
|
|
8
|
+
* Only CLIs actually present on PATH are offered. If zero are detected
|
|
9
|
+
* the picker still surfaces the known set so the user can configure
|
|
10
|
+
* AgileFlow before they install the underlying CLI (with a warning).
|
|
11
|
+
*/
|
|
12
|
+
const prompts = require("@clack/prompts");
|
|
13
|
+
const { questionMessage } = require("../../lib/brand.js");
|
|
14
|
+
const {
|
|
15
|
+
KNOWN_CLIS,
|
|
16
|
+
availableClis,
|
|
17
|
+
} = require("../../runtime/launch/detect-clis.js");
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Pure helper extracted for unit testing: decide what to offer in the
|
|
21
|
+
* multiselect given a list of detected descriptors and the user's current
|
|
22
|
+
* fallbackOrder.
|
|
23
|
+
*
|
|
24
|
+
* @param {import('../../runtime/launch/detect-clis.js').CliDescriptor[]} detected
|
|
25
|
+
* @param {string[]} currentFallback
|
|
26
|
+
* @returns {{
|
|
27
|
+
* choices: import('../../runtime/launch/detect-clis.js').CliDescriptor[],
|
|
28
|
+
* initial: string[],
|
|
29
|
+
* noneDetected: boolean,
|
|
30
|
+
* }}
|
|
31
|
+
*/
|
|
32
|
+
function buildCliChoices(detected, currentFallback) {
|
|
33
|
+
const noneDetected = detected.length === 0;
|
|
34
|
+
const choices = noneDetected ? KNOWN_CLIS : detected;
|
|
35
|
+
const choiceIds = new Set(choices.map((c) => c.id));
|
|
36
|
+
const initial = (currentFallback || []).filter((id) => choiceIds.has(id));
|
|
37
|
+
return { choices, initial, noneDetected };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Pure helper: pick the default for the "preferred CLI" select. Prefers
|
|
42
|
+
* the user's existing preference if it's still in the selected set,
|
|
43
|
+
* otherwise the first selected id.
|
|
44
|
+
*
|
|
45
|
+
* @param {string[]} selected
|
|
46
|
+
* @param {string} currentPreferred
|
|
47
|
+
* @returns {string}
|
|
48
|
+
*/
|
|
49
|
+
function pickInitialPreferred(selected, currentPreferred) {
|
|
50
|
+
if (selected.includes(currentPreferred)) return currentPreferred;
|
|
51
|
+
return selected[0];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Run the picker.
|
|
56
|
+
*
|
|
57
|
+
* @param {{
|
|
58
|
+
* cli: { preferred: string, fallbackOrder: string[] },
|
|
59
|
+
* }} currentPrefs
|
|
60
|
+
* @param {(name: string) => boolean} [exists] - injectable for tests; defaults to PATH probe
|
|
61
|
+
* @returns {Promise<{ preferred: string, fallbackOrder: string[] }>}
|
|
62
|
+
*/
|
|
63
|
+
async function pickCli(currentPrefs, exists) {
|
|
64
|
+
const detected = availableClis(exists);
|
|
65
|
+
const { choices, initial, noneDetected } = buildCliChoices(
|
|
66
|
+
detected,
|
|
67
|
+
currentPrefs.cli.fallbackOrder,
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
if (noneDetected) {
|
|
71
|
+
prompts.log.warn(
|
|
72
|
+
"No supported AI CLIs detected on PATH (claude, codex, cursor-agent, aider). " +
|
|
73
|
+
"You can still pick which CLIs `agileflow launch` should target — install them later.",
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const selectedRaw = await prompts.multiselect({
|
|
78
|
+
message: questionMessage(
|
|
79
|
+
"Which AI CLIs should `agileflow launch` know about?",
|
|
80
|
+
"Order is preserved as fallback order if your preferred CLI is missing.",
|
|
81
|
+
),
|
|
82
|
+
options: choices.map((c) => ({
|
|
83
|
+
value: c.id,
|
|
84
|
+
label: c.label,
|
|
85
|
+
hint: c.hint,
|
|
86
|
+
})),
|
|
87
|
+
initialValues: initial.length ? initial : choices.map((c) => c.id),
|
|
88
|
+
required: true,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
if (prompts.isCancel(selectedRaw)) {
|
|
92
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const selected = /** @type {string[]} */ (selectedRaw);
|
|
97
|
+
|
|
98
|
+
const preferredRaw = await prompts.select({
|
|
99
|
+
message: questionMessage(
|
|
100
|
+
"Which CLI should `agileflow launch` use by default?",
|
|
101
|
+
),
|
|
102
|
+
options: selected.map((id) => {
|
|
103
|
+
const desc = choices.find((c) => c.id === id);
|
|
104
|
+
return {
|
|
105
|
+
value: id,
|
|
106
|
+
label: desc ? desc.label : id,
|
|
107
|
+
hint: desc && desc.hint,
|
|
108
|
+
};
|
|
109
|
+
}),
|
|
110
|
+
initialValue: pickInitialPreferred(selected, currentPrefs.cli.preferred),
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
if (prompts.isCancel(preferredRaw)) {
|
|
114
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const preferred = /** @type {string} */ (preferredRaw);
|
|
119
|
+
|
|
120
|
+
// Fallback order = preferred first, then the rest in user's multiselect order.
|
|
121
|
+
const fallbackOrder = [
|
|
122
|
+
preferred,
|
|
123
|
+
...selected.filter((id) => id !== preferred),
|
|
124
|
+
];
|
|
125
|
+
|
|
126
|
+
return { preferred, fallbackOrder };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
module.exports = { pickCli, buildCliChoices, pickInitialPreferred };
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tmux preferences picker for `agileflow launch setup`.
|
|
3
|
+
*
|
|
4
|
+
* Asks:
|
|
5
|
+
* 1. tmux on/off (confirm)
|
|
6
|
+
* 2. if on: status bar position (top/bottom)
|
|
7
|
+
* 3. if on: keybind preset (default/minimal/none)
|
|
8
|
+
*
|
|
9
|
+
* Left/right status positions are NOT offered in slice 1 — tmux doesn't
|
|
10
|
+
* have a native left/right status; faking it requires pane layout
|
|
11
|
+
* hackery, which is a slice 2+ concern.
|
|
12
|
+
*
|
|
13
|
+
* Returned shape is exactly the `tmux` + `keybinds` blocks of LaunchPrefs.
|
|
14
|
+
*/
|
|
15
|
+
const prompts = require("@clack/prompts");
|
|
16
|
+
const { questionMessage } = require("../../lib/brand.js");
|
|
17
|
+
const {
|
|
18
|
+
STATUS_POSITIONS,
|
|
19
|
+
KEYBIND_PRESETS,
|
|
20
|
+
} = require("../../runtime/launch/defaults.js");
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Pure helper: build the status-position select options. Extracted for
|
|
24
|
+
* unit testing — the labels need to stay aligned with STATUS_POSITIONS.
|
|
25
|
+
*
|
|
26
|
+
* @param {string} current
|
|
27
|
+
* @returns {{ options: { value: string, label: string }[], initialValue: string }}
|
|
28
|
+
*/
|
|
29
|
+
function buildStatusOptions(current) {
|
|
30
|
+
const options = STATUS_POSITIONS.map((id) => ({
|
|
31
|
+
value: id,
|
|
32
|
+
label: id === "top" ? "Top of terminal" : "Bottom of terminal",
|
|
33
|
+
}));
|
|
34
|
+
const initialValue = STATUS_POSITIONS.includes(current) ? current : "bottom";
|
|
35
|
+
return { options, initialValue };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Pure helper: keybind preset options.
|
|
40
|
+
*
|
|
41
|
+
* @param {string} current
|
|
42
|
+
* @returns {{ options: { value: string, label: string, hint?: string }[], initialValue: string }}
|
|
43
|
+
*/
|
|
44
|
+
function buildKeybindOptions(current) {
|
|
45
|
+
const options = [
|
|
46
|
+
{
|
|
47
|
+
value: "default",
|
|
48
|
+
label: "Default",
|
|
49
|
+
hint: "Worktree (Alt+N), same-dir (Alt+S), freeze recovery (Alt+k/K/R), detach (Alt+q)",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
value: "minimal",
|
|
53
|
+
label: "Minimal",
|
|
54
|
+
hint: "Only detach (Alt+q). Lets your existing tmux config shine.",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
value: "none",
|
|
58
|
+
label: "None",
|
|
59
|
+
hint: "No keybinds installed. You wire your own.",
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
const initialValue = KEYBIND_PRESETS.includes(current) ? current : "default";
|
|
63
|
+
return { options, initialValue };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* @param {{ tmux: { enabled: boolean, statusPosition: string }, keybinds: { preset: string } }} currentPrefs
|
|
68
|
+
* @returns {Promise<{ tmux: { enabled: boolean, statusPosition: 'top' | 'bottom' }, keybinds: { preset: string } }>}
|
|
69
|
+
*/
|
|
70
|
+
async function pickTmux(currentPrefs) {
|
|
71
|
+
const enabledRaw = await prompts.confirm({
|
|
72
|
+
message: questionMessage(
|
|
73
|
+
"Run sessions inside tmux?",
|
|
74
|
+
"tmux gives you persistent sessions, parallel panes, and freeze recovery. " +
|
|
75
|
+
"Disable if you're on Windows or prefer plain shell.",
|
|
76
|
+
),
|
|
77
|
+
initialValue:
|
|
78
|
+
typeof currentPrefs.tmux.enabled === "boolean"
|
|
79
|
+
? currentPrefs.tmux.enabled
|
|
80
|
+
: true,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
if (prompts.isCancel(enabledRaw)) {
|
|
84
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const enabled = /** @type {boolean} */ (enabledRaw);
|
|
89
|
+
|
|
90
|
+
if (!enabled) {
|
|
91
|
+
return {
|
|
92
|
+
tmux: {
|
|
93
|
+
enabled: false,
|
|
94
|
+
statusPosition: /** @type {'bottom'} */ ("bottom"),
|
|
95
|
+
},
|
|
96
|
+
keybinds: { preset: "none" },
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const statusOpts = buildStatusOptions(currentPrefs.tmux.statusPosition);
|
|
101
|
+
const statusRaw = await prompts.select({
|
|
102
|
+
message: questionMessage("Where should the tmux status bar live?"),
|
|
103
|
+
options: statusOpts.options,
|
|
104
|
+
initialValue: statusOpts.initialValue,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
if (prompts.isCancel(statusRaw)) {
|
|
108
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const keybindOpts = buildKeybindOptions(currentPrefs.keybinds.preset);
|
|
113
|
+
const presetRaw = await prompts.select({
|
|
114
|
+
message: questionMessage("Which keybind preset?"),
|
|
115
|
+
options: keybindOpts.options,
|
|
116
|
+
initialValue: keybindOpts.initialValue,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
if (prompts.isCancel(presetRaw)) {
|
|
120
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
tmux: {
|
|
126
|
+
enabled: true,
|
|
127
|
+
statusPosition: /** @type {'top' | 'bottom'} */ (statusRaw),
|
|
128
|
+
},
|
|
129
|
+
keybinds: { preset: /** @type {string} */ (presetRaw) },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
module.exports = { pickTmux, buildStatusOptions, buildKeybindOptions };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learnings picker — single confirm prompt for the global on/off toggle.
|
|
3
|
+
*
|
|
4
|
+
* When enabled:
|
|
5
|
+
* - install-time scaffolds `_learnings/<file>.yaml` for every skill
|
|
6
|
+
* that opts in via `learns.enabled: true` in its frontmatter
|
|
7
|
+
* - the SessionStart context-loader injects a one-line hint telling
|
|
8
|
+
* Claude to call `agileflow learn append …` on user corrections
|
|
9
|
+
*
|
|
10
|
+
* When disabled, neither happens. The `agileflow learn` CLI still works
|
|
11
|
+
* for users who want to manage signals manually.
|
|
12
|
+
*/
|
|
13
|
+
const prompts = require("@clack/prompts");
|
|
14
|
+
const { questionMessage } = require("../../lib/brand.js");
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {{ enabled?: boolean }} [current]
|
|
18
|
+
* @returns {Promise<{ enabled: boolean }>}
|
|
19
|
+
*/
|
|
20
|
+
async function pickLearnings(current) {
|
|
21
|
+
const initialValue =
|
|
22
|
+
current && typeof current.enabled === "boolean" ? current.enabled : true;
|
|
23
|
+
|
|
24
|
+
const choice = await prompts.confirm({
|
|
25
|
+
message: questionMessage(
|
|
26
|
+
"Enable skill learnings?",
|
|
27
|
+
"Skills can remember your corrections for next time.",
|
|
28
|
+
),
|
|
29
|
+
initialValue,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
if (prompts.isCancel(choice)) {
|
|
33
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return { enabled: Boolean(choice) };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
module.exports = { pickLearnings };
|
|
@@ -12,8 +12,9 @@
|
|
|
12
12
|
* Cancellation (Ctrl+C / Esc) exits with code 1 (not 0) so CI can tell
|
|
13
13
|
* the difference between success and user abort.
|
|
14
14
|
*/
|
|
15
|
-
const prompts = require(
|
|
16
|
-
const { discoverPlugins } = require(
|
|
15
|
+
const prompts = require("@clack/prompts");
|
|
16
|
+
const { discoverPlugins } = require("../../runtime/plugins/registry.js");
|
|
17
|
+
const { questionMessage } = require("../../lib/brand.js");
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* @param {Array<{id:string, cannotDisable?:boolean}>} discovered
|
|
@@ -21,7 +22,11 @@ const { discoverPlugins } = require('../../runtime/plugins/registry.js');
|
|
|
21
22
|
* @param {Record<string, {enabled:boolean, settings?:any}>} [existingPluginsMap]
|
|
22
23
|
* @returns {Record<string, { enabled: boolean, settings?: any }>}
|
|
23
24
|
*/
|
|
24
|
-
function buildPluginsMap(
|
|
25
|
+
function buildPluginsMap(
|
|
26
|
+
discovered,
|
|
27
|
+
selectedOptionalIds,
|
|
28
|
+
existingPluginsMap = {},
|
|
29
|
+
) {
|
|
25
30
|
/** @type {Record<string, { enabled: boolean, settings?: any }>} */
|
|
26
31
|
const result = {};
|
|
27
32
|
for (const p of discovered) {
|
|
@@ -36,7 +41,7 @@ function buildPluginsMap(discovered, selectedOptionalIds, existingPluginsMap = {
|
|
|
36
41
|
const existing = (existingPluginsMap || {})[p.id];
|
|
37
42
|
if (
|
|
38
43
|
existing &&
|
|
39
|
-
typeof existing ===
|
|
44
|
+
typeof existing === "object" &&
|
|
40
45
|
!Array.isArray(existing) &&
|
|
41
46
|
existing.settings
|
|
42
47
|
) {
|
|
@@ -51,7 +56,7 @@ function buildPluginsMap(discovered, selectedOptionalIds, existingPluginsMap = {
|
|
|
51
56
|
if (
|
|
52
57
|
!(id in result) &&
|
|
53
58
|
entry &&
|
|
54
|
-
typeof entry ===
|
|
59
|
+
typeof entry === "object" &&
|
|
55
60
|
!Array.isArray(entry)
|
|
56
61
|
) {
|
|
57
62
|
result[id] = entry;
|
|
@@ -60,6 +65,18 @@ function buildPluginsMap(discovered, selectedOptionalIds, existingPluginsMap = {
|
|
|
60
65
|
return result;
|
|
61
66
|
}
|
|
62
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Keep plugin rows compact. AgileFlow exposes these as skill packs in
|
|
70
|
+
* the wizard, even when the plugin carries legacy command/agent source
|
|
71
|
+
* files internally for IDE compatibility.
|
|
72
|
+
*
|
|
73
|
+
* @param {import('../../runtime/plugins/registry.js').PluginManifest} p
|
|
74
|
+
* @returns {string}
|
|
75
|
+
*/
|
|
76
|
+
function pluginHint(p) {
|
|
77
|
+
return p.description || "Skill pack";
|
|
78
|
+
}
|
|
79
|
+
|
|
63
80
|
/**
|
|
64
81
|
* @param {import('../../runtime/config/defaults.js').AgileflowConfig} currentConfig
|
|
65
82
|
* @returns {Promise<Record<string, { enabled: boolean }>>}
|
|
@@ -71,36 +88,50 @@ async function pickPlugins(currentConfig) {
|
|
|
71
88
|
|
|
72
89
|
if (required.length) {
|
|
73
90
|
prompts.log.info(
|
|
74
|
-
`Always on: ${required.map((p) => `${p.name} (${p.id})`).join(
|
|
91
|
+
`Always on: ${required.map((p) => `${p.name} (${p.id})`).join(", ")}`,
|
|
75
92
|
);
|
|
76
93
|
}
|
|
77
94
|
|
|
78
95
|
const initialValues = optional
|
|
79
96
|
.filter((p) => {
|
|
80
97
|
const existing = (currentConfig.plugins || {})[p.id];
|
|
81
|
-
if (existing && typeof existing.enabled ===
|
|
98
|
+
if (existing && typeof existing.enabled === "boolean")
|
|
99
|
+
return existing.enabled;
|
|
82
100
|
return Boolean(p.enabledByDefault);
|
|
83
101
|
})
|
|
84
102
|
.map((p) => p.id);
|
|
85
103
|
|
|
104
|
+
const SELECT_ALL = "__select_all__";
|
|
105
|
+
|
|
86
106
|
const picked = await prompts.multiselect({
|
|
87
|
-
message:
|
|
88
|
-
options:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
107
|
+
message: questionMessage("Choose optional skill packs:"),
|
|
108
|
+
options: [
|
|
109
|
+
{
|
|
110
|
+
value: SELECT_ALL,
|
|
111
|
+
label: "Enable all",
|
|
112
|
+
hint: "Turn on every skill pack at once.",
|
|
113
|
+
},
|
|
114
|
+
...optional.map((p) => ({
|
|
115
|
+
value: p.id,
|
|
116
|
+
label: p.name,
|
|
117
|
+
hint: pluginHint(p),
|
|
118
|
+
})),
|
|
119
|
+
],
|
|
93
120
|
initialValues,
|
|
94
121
|
required: false,
|
|
95
122
|
});
|
|
96
123
|
|
|
97
124
|
if (prompts.isCancel(picked)) {
|
|
98
|
-
prompts.cancel(
|
|
125
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
99
126
|
process.exit(1);
|
|
100
127
|
}
|
|
101
128
|
|
|
102
|
-
const
|
|
129
|
+
const pickedSet = new Set(/** @type {string[]} */ (picked));
|
|
130
|
+
const selectedOptionalIds = pickedSet.has(SELECT_ALL)
|
|
131
|
+
? new Set(optional.map((p) => p.id))
|
|
132
|
+
: new Set([...pickedSet].filter((id) => id !== SELECT_ALL));
|
|
133
|
+
|
|
103
134
|
return buildPluginsMap(all, selectedOptionalIds, currentConfig.plugins || {});
|
|
104
135
|
}
|
|
105
136
|
|
|
106
|
-
module.exports = { pickPlugins, buildPluginsMap };
|
|
137
|
+
module.exports = { pickPlugins, buildPluginsMap, pluginHint };
|
package/src/lib/brand.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brand styling helpers for the CLI wizard.
|
|
3
|
+
*
|
|
4
|
+
* BRAND_COLOR (#e8683a, burnt orange) is AgileFlow's identity color —
|
|
5
|
+
* used for the logo banner and option labels in setup prompts so users
|
|
6
|
+
* can visually parse "label vs. description" without squinting.
|
|
7
|
+
*/
|
|
8
|
+
const chalk = require("chalk");
|
|
9
|
+
|
|
10
|
+
const BRAND_COLOR = "#e8683a";
|
|
11
|
+
const brand = chalk.hex(BRAND_COLOR);
|
|
12
|
+
|
|
13
|
+
// Recolor Clack's frame symbols to the brand color. Clack reads
|
|
14
|
+
// `picocolors.cyan` (left-side bar │, corners └, active diamond ◆) and
|
|
15
|
+
// `picocolors.green` (submit diamond ◇, success bullet) at render time,
|
|
16
|
+
// so replacing those two functions on the picocolors module is enough
|
|
17
|
+
// to retheme the entire wizard without forking @clack/prompts.
|
|
18
|
+
//
|
|
19
|
+
// We leave red (error), yellow (warn), gray (dim), and blue (info)
|
|
20
|
+
// alone — those convey state and shouldn't all collapse into brand
|
|
21
|
+
// orange. Text content stays default white; only the structural symbols
|
|
22
|
+
// change.
|
|
23
|
+
let themed = false;
|
|
24
|
+
function applyClackTheme() {
|
|
25
|
+
if (themed) return;
|
|
26
|
+
themed = true;
|
|
27
|
+
try {
|
|
28
|
+
const pc = require("picocolors");
|
|
29
|
+
const wrap = (s) => `\x1b[38;2;232;104;58m${s}\x1b[39m`;
|
|
30
|
+
pc.cyan = wrap;
|
|
31
|
+
pc.green = wrap;
|
|
32
|
+
|
|
33
|
+
// Make `dim` ALSO strip bold escapes from its input, so a label that
|
|
34
|
+
// contains `\x1b[1m...\x1b[22m` (chalk.bold) renders bold only when
|
|
35
|
+
// it's the active row (Clack doesn't wrap active labels), and renders
|
|
36
|
+
// plain when Clack wraps the inactive label in `dim()`. This is the
|
|
37
|
+
// only way to get "bold on active, normal on inactive" without
|
|
38
|
+
// forking @clack/prompts.
|
|
39
|
+
const BOLD_RE = /\x1b\[(?:1|22)m/g;
|
|
40
|
+
const origDim = pc.dim;
|
|
41
|
+
pc.dim = (s) => origDim(String(s).replace(BOLD_RE, ""));
|
|
42
|
+
} catch {
|
|
43
|
+
// picocolors not installed (shouldn't happen — clack depends on it).
|
|
44
|
+
// Silently skip; the wizard still works, just with default colors.
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
applyClackTheme();
|
|
48
|
+
|
|
49
|
+
// Canonical AgileFlow wordmark — kept in sync with apps/website/lib/logo.ts.
|
|
50
|
+
const LOGO = [
|
|
51
|
+
" █████╗ ██████╗ ██╗██╗ ███████╗███████╗██╗ ██████╗ ██╗ ██╗",
|
|
52
|
+
"██╔══██╗██╔════╝ ██║██║ ██╔════╝██╔════╝██║ ██╔═══██╗██║ ██║",
|
|
53
|
+
"███████║██║ ███╗██║██║ █████╗ █████╗ ██║ ██║ ██║██║ █╗ ██║",
|
|
54
|
+
"██╔══██║██║ ██║██║██║ ██╔══╝ ██╔══╝ ██║ ██║ ██║██║███╗██║",
|
|
55
|
+
"██║ ██║╚██████╔╝██║███████╗███████╗██║ ███████╗╚██████╔╝╚███╔███╔╝",
|
|
56
|
+
"╚═╝ ╚═╝ ╚═════╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚══════╝ ╚═════╝ ╚══╝╚══╝",
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Render the brand logo as a single string, brand-colored. Caller is
|
|
61
|
+
* responsible for printing it (typically before `prompts.intro`).
|
|
62
|
+
*
|
|
63
|
+
* @param {string} [version]
|
|
64
|
+
* @returns {string}
|
|
65
|
+
*/
|
|
66
|
+
function logoBanner(version) {
|
|
67
|
+
const lines = LOGO.map((l) => brand(l));
|
|
68
|
+
if (version) {
|
|
69
|
+
lines.push("");
|
|
70
|
+
lines.push(brand.bold(`v${version}`));
|
|
71
|
+
}
|
|
72
|
+
return lines.join("\n");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Build a Clack option label that visually separates name and description:
|
|
77
|
+
* bold brand-color label
|
|
78
|
+
* dim description on a second line
|
|
79
|
+
*
|
|
80
|
+
* Clack renders `label` verbatim, so embedded newlines work and produce
|
|
81
|
+
* a clean two-line option that's much easier to read than label+hint
|
|
82
|
+
* sharing one line in the same color.
|
|
83
|
+
*
|
|
84
|
+
* @param {string} title
|
|
85
|
+
* @param {string} [description]
|
|
86
|
+
* @returns {string}
|
|
87
|
+
*/
|
|
88
|
+
function optionLabel(title, description) {
|
|
89
|
+
// Bold the title; the picocolors.dim() patch above strips bold from
|
|
90
|
+
// dimmed rows, so this only renders bold on the active row.
|
|
91
|
+
const head = chalk.bold(title);
|
|
92
|
+
if (!description) return head;
|
|
93
|
+
return `${head}\n ${chalk.ansi256(245)(description)}`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Build a Clack prompt message with a bold question and optional muted
|
|
98
|
+
* supporting sentence on the next line.
|
|
99
|
+
*
|
|
100
|
+
* @param {string} title
|
|
101
|
+
* @param {string} [description]
|
|
102
|
+
* @returns {string}
|
|
103
|
+
*/
|
|
104
|
+
function questionMessage(title, description) {
|
|
105
|
+
const head = chalk.bold(title);
|
|
106
|
+
if (!description) return head;
|
|
107
|
+
return `${head}\n${chalk.ansi256(245)(description)}`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = {
|
|
111
|
+
BRAND_COLOR,
|
|
112
|
+
brand,
|
|
113
|
+
logoBanner,
|
|
114
|
+
optionLabel,
|
|
115
|
+
questionMessage,
|
|
116
|
+
};
|