agileflow 3.4.2 → 4.0.0-alpha.1
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 +235 -494
- package/README.md +22 -114
- package/bin/agileflow.js +15 -0
- package/bin/hooks/pre-bash.js +35 -0
- package/bin/hooks/pre-compact.js +34 -0
- package/bin/hooks/pre-edit.js +32 -0
- package/bin/hooks/pre-write.js +32 -0
- package/bin/hooks/session-start.js +42 -0
- package/bin/hooks/stop.js +34 -0
- package/content/plugins/ads/plugin.yaml +14 -0
- package/content/plugins/audit/plugin.yaml +14 -0
- package/content/plugins/core/hooks/session-welcome.js +19 -0
- package/content/plugins/core/plugin.yaml +34 -0
- package/content/plugins/core/skills/agileflow-adr/SKILL.md +179 -0
- package/content/plugins/core/skills/agileflow-babysit-mentor/SKILL.md +144 -0
- package/content/plugins/core/skills/agileflow-epic-planner/SKILL.md +179 -0
- package/content/plugins/core/skills/agileflow-status-updater/SKILL.md +132 -0
- package/content/plugins/core/skills/agileflow-story-writer/SKILL.md +200 -0
- package/content/plugins/council/plugin.yaml +14 -0
- package/content/plugins/seo/plugin.yaml +14 -0
- package/package.json +29 -49
- package/src/cli/commands/doctor.js +159 -0
- package/src/cli/commands/hook.js +80 -0
- package/src/cli/commands/setup.js +254 -0
- package/src/cli/commands/status.js +47 -0
- package/src/cli/commands/update.js +82 -0
- package/src/cli/index.js +73 -0
- package/src/cli/wizard/ide-picker.js +57 -0
- package/src/cli/wizard/personalization.js +64 -0
- package/src/cli/wizard/plugin-picker.js +106 -0
- package/src/lib/hash.js +41 -0
- package/src/runtime/config/defaults.js +45 -0
- package/src/runtime/config/loader.js +118 -0
- package/src/runtime/config/schema.json +76 -0
- package/src/runtime/config/writer.js +54 -0
- package/src/runtime/hooks/aggregator.js +133 -0
- package/src/runtime/hooks/chain.js +93 -0
- package/src/runtime/hooks/logger.js +68 -0
- package/src/runtime/hooks/manifest-loader.js +228 -0
- package/src/runtime/hooks/orchestrator.js +322 -0
- package/src/runtime/ide/capabilities.js +111 -0
- package/src/runtime/ide/claude-code-settings.js +234 -0
- package/src/runtime/ide/claude-code-skills.js +202 -0
- package/src/runtime/installer/file-index.js +112 -0
- package/src/runtime/installer/install.js +306 -0
- package/src/runtime/installer/stash.js +61 -0
- package/src/runtime/installer/sync-engine.js +205 -0
- package/src/runtime/plugins/registry.js +132 -0
- package/src/runtime/plugins/resolver.js +138 -0
- package/src/runtime/plugins/validator.js +196 -0
- package/src/runtime/skills/validator.js +335 -0
- package/lib/README.md +0 -178
- package/lib/api-routes.js +0 -625
- package/lib/api-server.js +0 -278
- package/lib/cache-provider.js +0 -155
- package/lib/claude-cli-bridge.js +0 -215
- package/lib/codebase-indexer.js +0 -819
- package/lib/colors.generated.js +0 -117
- package/lib/colors.js +0 -341
- package/lib/consent.js +0 -232
- package/lib/content-sanitizer.js +0 -464
- package/lib/correlation.js +0 -277
- package/lib/dashboard-automations.js +0 -130
- package/lib/dashboard-git.js +0 -254
- package/lib/dashboard-inbox.js +0 -64
- package/lib/dashboard-protocol.js +0 -605
- package/lib/dashboard-server.js +0 -1296
- package/lib/dashboard-session.js +0 -136
- package/lib/dashboard-status.js +0 -72
- package/lib/dashboard-terminal.js +0 -354
- package/lib/dashboard-websocket.js +0 -88
- package/lib/drivers/claude-driver.ts +0 -312
- package/lib/drivers/codex-driver.ts +0 -464
- package/lib/drivers/driver-manager.ts +0 -159
- package/lib/drivers/gemini-driver.ts +0 -498
- package/lib/drivers/index.ts +0 -17
- package/lib/error-codes.js +0 -590
- package/lib/errors.js +0 -670
- package/lib/feature-flags.js +0 -171
- package/lib/feedback.js +0 -595
- package/lib/file-cache.js +0 -541
- package/lib/flag-detection.js +0 -344
- package/lib/format-error.js +0 -156
- package/lib/gate-runner.js +0 -282
- package/lib/generator-factory.js +0 -333
- package/lib/git-operations.js +0 -266
- package/lib/lazy-require.js +0 -59
- package/lib/lock-file.js +0 -144
- package/lib/logger.js +0 -106
- package/lib/merge-operations.js +0 -1006
- package/lib/path-resolver.js +0 -544
- package/lib/path-utils.js +0 -49
- package/lib/paths.js +0 -291
- package/lib/placeholder-registry.js +0 -822
- package/lib/process-executor.js +0 -214
- package/lib/progress.js +0 -334
- package/lib/protocol/driver.ts +0 -354
- package/lib/protocol/index.ts +0 -12
- package/lib/protocol/ir.ts +0 -271
- package/lib/registry-cache.js +0 -80
- package/lib/registry-di.js +0 -358
- package/lib/result-schema.js +0 -363
- package/lib/result.js +0 -210
- package/lib/session-display.js +0 -331
- package/lib/session-operations.js +0 -611
- package/lib/session-registry.js +0 -484
- package/lib/session-state-machine.js +0 -465
- package/lib/session-switching.js +0 -191
- package/lib/skill-loader.js +0 -213
- package/lib/smart-json-file.js +0 -682
- package/lib/state-machine.js +0 -286
- package/lib/table-formatter.js +0 -519
- package/lib/template-loader.js +0 -143
- package/lib/transient-status.js +0 -374
- package/lib/ui-manager.js +0 -612
- package/lib/validate-args.js +0 -213
- package/lib/validate-commands.js +0 -308
- package/lib/validate-names.js +0 -143
- package/lib/validate-paths.js +0 -434
- package/lib/validate.js +0 -134
- package/lib/worktree-operations.js +0 -201
- package/lib/yaml-utils.js +0 -164
- package/scripts/README.md +0 -267
- package/scripts/af +0 -34
- package/scripts/agent-loop.js +0 -819
- package/scripts/agileflow-configure.js +0 -368
- package/scripts/agileflow-statusline.sh +0 -857
- package/scripts/agileflow-welcome.js +0 -2246
- package/scripts/api-server-runner.js +0 -177
- package/scripts/archive-completed-stories.sh +0 -308
- package/scripts/auto-self-improve.js +0 -326
- package/scripts/automation-run-due.js +0 -128
- package/scripts/babysit-clear-restore.js +0 -154
- package/scripts/babysit-context-restore.js +0 -89
- package/scripts/backfill-ideation-status.js +0 -128
- package/scripts/batch-pmap-loop.js +0 -551
- package/scripts/check-update.js +0 -282
- package/scripts/ci-summary.js +0 -294
- package/scripts/claude-smart.sh +0 -85
- package/scripts/claude-tmux.sh +0 -737
- package/scripts/claude-watchdog.sh +0 -225
- package/scripts/clear-active-command.js +0 -48
- package/scripts/compress-status.sh +0 -116
- package/scripts/context-loader.js +0 -310
- package/scripts/damage-control/bash-tool-damage-control.js +0 -22
- package/scripts/damage-control/edit-tool-damage-control.js +0 -19
- package/scripts/damage-control/patterns.yaml +0 -227
- package/scripts/damage-control/write-tool-damage-control.js +0 -19
- package/scripts/damage-control-bash.js +0 -51
- package/scripts/damage-control-edit.js +0 -48
- package/scripts/damage-control-multi-agent.js +0 -231
- package/scripts/damage-control-write.js +0 -48
- package/scripts/dashboard-serve.js +0 -336
- package/scripts/dependency-check.js +0 -311
- package/scripts/document-repl.js +0 -793
- package/scripts/expertise-metrics.sh +0 -264
- package/scripts/generate-all.sh +0 -77
- package/scripts/generate-colors.js +0 -314
- package/scripts/generators/agent-registry.js +0 -183
- package/scripts/generators/command-registry.js +0 -166
- package/scripts/generators/index.js +0 -85
- package/scripts/generators/inject-babysit.js +0 -191
- package/scripts/generators/inject-help.js +0 -125
- package/scripts/generators/inject-readme.js +0 -166
- package/scripts/generators/skill-registry.js +0 -188
- package/scripts/get-env.js +0 -225
- package/scripts/init.sh +0 -76
- package/scripts/lib/README-portable-tasks.md +0 -424
- package/scripts/lib/ac-test-matcher.js +0 -452
- package/scripts/lib/audit-cleanup.js +0 -250
- package/scripts/lib/audit-registry.js +0 -340
- package/scripts/lib/automation-registry.js +0 -544
- package/scripts/lib/automation-runner.js +0 -476
- package/scripts/lib/browser-qa-evidence.js +0 -409
- package/scripts/lib/browser-qa-status.js +0 -192
- package/scripts/lib/bus-utils.js +0 -473
- package/scripts/lib/colors.generated.sh +0 -82
- package/scripts/lib/colors.sh +0 -46
- package/scripts/lib/command-prereqs.js +0 -280
- package/scripts/lib/concurrency-limiter.js +0 -511
- package/scripts/lib/configure-detect.js +0 -596
- package/scripts/lib/configure-features.js +0 -1927
- package/scripts/lib/configure-repair.js +0 -327
- package/scripts/lib/configure-utils.js +0 -114
- package/scripts/lib/context-formatter.js +0 -1158
- package/scripts/lib/context-loader.js +0 -840
- package/scripts/lib/counter.js +0 -103
- package/scripts/lib/damage-control-utils.js +0 -619
- package/scripts/lib/feature-catalog.js +0 -332
- package/scripts/lib/file-lock.js +0 -392
- package/scripts/lib/file-tracking.js +0 -735
- package/scripts/lib/frontmatter-parser.js +0 -133
- package/scripts/lib/gate-enforcer.js +0 -295
- package/scripts/lib/hook-metrics.js +0 -324
- package/scripts/lib/ideation-index.js +0 -1205
- package/scripts/lib/json-utils.sh +0 -162
- package/scripts/lib/lifecycle-detector.js +0 -125
- package/scripts/lib/model-profiles.js +0 -118
- package/scripts/lib/portable-tasks-cli.js +0 -274
- package/scripts/lib/portable-tasks.js +0 -479
- package/scripts/lib/process-cleanup.js +0 -527
- package/scripts/lib/quality-gates.js +0 -761
- package/scripts/lib/scale-detector.js +0 -396
- package/scripts/lib/sessionRegistry.js +0 -678
- package/scripts/lib/signal-detectors.js +0 -880
- package/scripts/lib/skill-catalog.js +0 -557
- package/scripts/lib/skill-recommender.js +0 -311
- package/scripts/lib/state-migrator.js +0 -353
- package/scripts/lib/status-task-bridge.js +0 -522
- package/scripts/lib/status-writer.js +0 -255
- package/scripts/lib/story-claiming.js +0 -704
- package/scripts/lib/story-state-machine.js +0 -437
- package/scripts/lib/sync-ideation-status.js +0 -291
- package/scripts/lib/task-registry-cache.js +0 -490
- package/scripts/lib/task-registry.js +0 -1191
- package/scripts/lib/task-sync.js +0 -230
- package/scripts/lib/tdd-phase-manager.js +0 -455
- package/scripts/lib/team-events.js +0 -510
- package/scripts/lib/tmux-audit-monitor.js +0 -611
- package/scripts/lib/tmux-group-colors.js +0 -113
- package/scripts/lib/tool-registry.yaml +0 -241
- package/scripts/lib/tool-shed.js +0 -441
- package/scripts/lib/validation-registry.js +0 -177
- package/scripts/messaging-bridge.js +0 -561
- package/scripts/migrate-ideation-index.js +0 -553
- package/scripts/native-team-observer.js +0 -219
- package/scripts/obtain-context.js +0 -272
- package/scripts/pre-push-check.sh +0 -46
- package/scripts/precompact-context.sh +0 -306
- package/scripts/query-codebase.js +0 -543
- package/scripts/ralph-loop.js +0 -1278
- package/scripts/resume-session.sh +0 -121
- package/scripts/screenshot-verifier.js +0 -215
- package/scripts/session-boundary.js +0 -138
- package/scripts/session-coordinator.sh +0 -232
- package/scripts/session-manager.js +0 -546
- package/scripts/smart-detect.js +0 -449
- package/scripts/spawn-audit-sessions.js +0 -877
- package/scripts/spawn-parallel.js +0 -751
- package/scripts/strip-ai-attribution.js +0 -63
- package/scripts/task-completed-gate.js +0 -237
- package/scripts/team-manager.js +0 -596
- package/scripts/team-status-display.js +0 -200
- package/scripts/teammate-idle-gate.js +0 -237
- package/scripts/test-session-boundary.js +0 -80
- package/scripts/tmux-close-windows.sh +0 -180
- package/scripts/tmux-restore-window.sh +0 -67
- package/scripts/tmux-save-closed-window.sh +0 -35
- package/scripts/tui/App.js +0 -151
- package/scripts/tui/Dashboard.js +0 -277
- package/scripts/tui/blessed/data/watcher.js +0 -180
- package/scripts/tui/blessed/index.js +0 -244
- package/scripts/tui/blessed/panels/output.js +0 -101
- package/scripts/tui/blessed/panels/sessions.js +0 -150
- package/scripts/tui/blessed/panels/trace.js +0 -97
- package/scripts/tui/blessed/ui/help.js +0 -77
- package/scripts/tui/blessed/ui/screen.js +0 -52
- package/scripts/tui/blessed/ui/statusbar.js +0 -47
- package/scripts/tui/blessed/ui/tabbar.js +0 -99
- package/scripts/tui/index.js +0 -70
- package/scripts/tui/lib/crashRecovery.js +0 -304
- package/scripts/tui/lib/eventStream.js +0 -309
- package/scripts/tui/lib/keyboard.js +0 -261
- package/scripts/tui/lib/loopControl.js +0 -371
- package/scripts/tui/panels/OutputPanel.js +0 -240
- package/scripts/tui/panels/SessionPanel.js +0 -170
- package/scripts/tui/panels/TracePanel.js +0 -298
- package/scripts/tui/simple-tui.js +0 -510
- package/scripts/validate-expertise.sh +0 -263
- package/scripts/validate-tokens.sh +0 -73
- package/scripts/validators/README.md +0 -143
- package/scripts/validators/component-validator.js +0 -239
- package/scripts/validators/json-schema-validator.js +0 -186
- package/scripts/validators/markdown-validator.js +0 -152
- package/scripts/validators/migration-validator.js +0 -129
- package/scripts/validators/security-validator.js +0 -380
- package/scripts/validators/story-format-validator.js +0 -197
- package/scripts/validators/test-result-validator.js +0 -114
- package/scripts/validators/workflow-validator.js +0 -247
- package/scripts/welcome-deferred.js +0 -437
- package/scripts/worktree-create.sh +0 -111
- package/src/core/agents/a11y-analyzer-aria.md +0 -155
- package/src/core/agents/a11y-analyzer-forms.md +0 -162
- package/src/core/agents/a11y-analyzer-keyboard.md +0 -175
- package/src/core/agents/a11y-analyzer-semantic.md +0 -153
- package/src/core/agents/a11y-analyzer-visual.md +0 -158
- package/src/core/agents/a11y-consensus.md +0 -248
- package/src/core/agents/accessibility.md +0 -515
- package/src/core/agents/adr-writer.md +0 -463
- package/src/core/agents/ads-audit-budget.md +0 -181
- package/src/core/agents/ads-audit-compliance.md +0 -169
- package/src/core/agents/ads-audit-creative.md +0 -164
- package/src/core/agents/ads-audit-google.md +0 -226
- package/src/core/agents/ads-audit-meta.md +0 -183
- package/src/core/agents/ads-audit-tracking.md +0 -197
- package/src/core/agents/ads-consensus.md +0 -396
- package/src/core/agents/ads-generate.md +0 -145
- package/src/core/agents/ads-performance-tracker.md +0 -197
- package/src/core/agents/analytics.md +0 -617
- package/src/core/agents/api-quality-analyzer-conventions.md +0 -148
- package/src/core/agents/api-quality-analyzer-docs.md +0 -176
- package/src/core/agents/api-quality-analyzer-errors.md +0 -183
- package/src/core/agents/api-quality-analyzer-pagination.md +0 -171
- package/src/core/agents/api-quality-analyzer-versioning.md +0 -143
- package/src/core/agents/api-quality-consensus.md +0 -214
- package/src/core/agents/api-validator.md +0 -183
- package/src/core/agents/api.md +0 -665
- package/src/core/agents/arch-analyzer-circular.md +0 -148
- package/src/core/agents/arch-analyzer-complexity.md +0 -171
- package/src/core/agents/arch-analyzer-coupling.md +0 -146
- package/src/core/agents/arch-analyzer-layering.md +0 -151
- package/src/core/agents/arch-analyzer-patterns.md +0 -162
- package/src/core/agents/arch-consensus.md +0 -227
- package/src/core/agents/brainstorm-analyzer-features.md +0 -169
- package/src/core/agents/brainstorm-analyzer-growth.md +0 -161
- package/src/core/agents/brainstorm-analyzer-integration.md +0 -172
- package/src/core/agents/brainstorm-analyzer-market.md +0 -147
- package/src/core/agents/brainstorm-analyzer-ux.md +0 -167
- package/src/core/agents/brainstorm-consensus.md +0 -237
- package/src/core/agents/browser-qa.md +0 -328
- package/src/core/agents/ci.md +0 -511
- package/src/core/agents/code-reviewer.md +0 -288
- package/src/core/agents/codebase-query.md +0 -266
- package/src/core/agents/completeness-analyzer-api.md +0 -190
- package/src/core/agents/completeness-analyzer-conditional.md +0 -201
- package/src/core/agents/completeness-analyzer-handlers.md +0 -159
- package/src/core/agents/completeness-analyzer-imports.md +0 -159
- package/src/core/agents/completeness-analyzer-routes.md +0 -182
- package/src/core/agents/completeness-analyzer-state.md +0 -188
- package/src/core/agents/completeness-analyzer-stubs.md +0 -198
- package/src/core/agents/completeness-consensus.md +0 -286
- package/src/core/agents/compliance.md +0 -509
- package/src/core/agents/council-advocate.md +0 -206
- package/src/core/agents/council-analyst.md +0 -252
- package/src/core/agents/council-optimist.md +0 -170
- package/src/core/agents/database.md +0 -601
- package/src/core/agents/datamigration.md +0 -699
- package/src/core/agents/design.md +0 -525
- package/src/core/agents/devops.md +0 -720
- package/src/core/agents/documentation.md +0 -504
- package/src/core/agents/epic-planner.md +0 -480
- package/src/core/agents/error-analyzer.md +0 -201
- package/src/core/agents/integrations.md +0 -603
- package/src/core/agents/legal-analyzer-a11y.md +0 -110
- package/src/core/agents/legal-analyzer-ai.md +0 -117
- package/src/core/agents/legal-analyzer-consumer.md +0 -108
- package/src/core/agents/legal-analyzer-content.md +0 -113
- package/src/core/agents/legal-analyzer-international.md +0 -115
- package/src/core/agents/legal-analyzer-licensing.md +0 -115
- package/src/core/agents/legal-analyzer-privacy.md +0 -108
- package/src/core/agents/legal-analyzer-security.md +0 -112
- package/src/core/agents/legal-analyzer-terms.md +0 -111
- package/src/core/agents/legal-consensus.md +0 -242
- package/src/core/agents/logic-analyzer-edge.md +0 -170
- package/src/core/agents/logic-analyzer-flow.md +0 -253
- package/src/core/agents/logic-analyzer-invariant.md +0 -206
- package/src/core/agents/logic-analyzer-race.md +0 -266
- package/src/core/agents/logic-analyzer-type.md +0 -217
- package/src/core/agents/logic-consensus.md +0 -253
- package/src/core/agents/mentor.md +0 -654
- package/src/core/agents/mobile.md +0 -501
- package/src/core/agents/monitoring.md +0 -537
- package/src/core/agents/multi-expert.md +0 -311
- package/src/core/agents/orchestrator.md +0 -749
- package/src/core/agents/perf-analyzer-assets.md +0 -174
- package/src/core/agents/perf-analyzer-bundle.md +0 -165
- package/src/core/agents/perf-analyzer-caching.md +0 -160
- package/src/core/agents/perf-analyzer-compute.md +0 -165
- package/src/core/agents/perf-analyzer-memory.md +0 -182
- package/src/core/agents/perf-analyzer-network.md +0 -157
- package/src/core/agents/perf-analyzer-queries.md +0 -155
- package/src/core/agents/perf-analyzer-rendering.md +0 -156
- package/src/core/agents/perf-consensus.md +0 -280
- package/src/core/agents/performance.md +0 -492
- package/src/core/agents/product.md +0 -535
- package/src/core/agents/qa.md +0 -765
- package/src/core/agents/readme-updater.md +0 -579
- package/src/core/agents/refactor.md +0 -558
- package/src/core/agents/research.md +0 -453
- package/src/core/agents/rlm-subcore.md +0 -207
- package/src/core/agents/schema-validator.md +0 -454
- package/src/core/agents/security-analyzer-api.md +0 -199
- package/src/core/agents/security-analyzer-auth.md +0 -160
- package/src/core/agents/security-analyzer-authz.md +0 -168
- package/src/core/agents/security-analyzer-deps.md +0 -147
- package/src/core/agents/security-analyzer-infra.md +0 -176
- package/src/core/agents/security-analyzer-injection.md +0 -148
- package/src/core/agents/security-analyzer-input.md +0 -191
- package/src/core/agents/security-analyzer-secrets.md +0 -175
- package/src/core/agents/security-consensus.md +0 -276
- package/src/core/agents/security.md +0 -486
- package/src/core/agents/seo-analyzer-content.md +0 -167
- package/src/core/agents/seo-analyzer-images.md +0 -187
- package/src/core/agents/seo-analyzer-performance.md +0 -206
- package/src/core/agents/seo-analyzer-schema.md +0 -176
- package/src/core/agents/seo-analyzer-sitemap.md +0 -172
- package/src/core/agents/seo-analyzer-technical.md +0 -144
- package/src/core/agents/seo-consensus.md +0 -289
- package/src/core/agents/team-coordinator.md +0 -333
- package/src/core/agents/team-lead.md +0 -171
- package/src/core/agents/test-analyzer-assertions.md +0 -181
- package/src/core/agents/test-analyzer-coverage.md +0 -183
- package/src/core/agents/test-analyzer-fragility.md +0 -185
- package/src/core/agents/test-analyzer-integration.md +0 -155
- package/src/core/agents/test-analyzer-maintenance.md +0 -173
- package/src/core/agents/test-analyzer-mocking.md +0 -178
- package/src/core/agents/test-analyzer-patterns.md +0 -189
- package/src/core/agents/test-analyzer-structure.md +0 -177
- package/src/core/agents/test-consensus.md +0 -294
- package/src/core/agents/testing.md +0 -527
- package/src/core/agents/ui-validator.md +0 -331
- package/src/core/agents/ui.md +0 -1227
- package/src/core/commands/adr/list.md +0 -191
- package/src/core/commands/adr/update.md +0 -258
- package/src/core/commands/adr/view.md +0 -274
- package/src/core/commands/adr.md +0 -394
- package/src/core/commands/ads/audit.md +0 -437
- package/src/core/commands/ads/budget.md +0 -97
- package/src/core/commands/ads/competitor.md +0 -112
- package/src/core/commands/ads/creative.md +0 -85
- package/src/core/commands/ads/generate.md +0 -238
- package/src/core/commands/ads/google.md +0 -112
- package/src/core/commands/ads/health.md +0 -327
- package/src/core/commands/ads/landing.md +0 -119
- package/src/core/commands/ads/linkedin.md +0 -112
- package/src/core/commands/ads/meta.md +0 -91
- package/src/core/commands/ads/microsoft.md +0 -115
- package/src/core/commands/ads/plan.md +0 -321
- package/src/core/commands/ads/test-plan.md +0 -317
- package/src/core/commands/ads/tiktok.md +0 -129
- package/src/core/commands/ads/track.md +0 -288
- package/src/core/commands/ads/youtube.md +0 -124
- package/src/core/commands/ads.md +0 -140
- package/src/core/commands/agent.md +0 -256
- package/src/core/commands/api.md +0 -267
- package/src/core/commands/assign.md +0 -369
- package/src/core/commands/audit.md +0 -531
- package/src/core/commands/auto.md +0 -556
- package/src/core/commands/automate.md +0 -415
- package/src/core/commands/babysit.md +0 -643
- package/src/core/commands/baseline.md +0 -743
- package/src/core/commands/batch.md +0 -551
- package/src/core/commands/blockers.md +0 -602
- package/src/core/commands/board.md +0 -509
- package/src/core/commands/browser-qa.md +0 -240
- package/src/core/commands/changelog.md +0 -582
- package/src/core/commands/choose.md +0 -430
- package/src/core/commands/ci.md +0 -330
- package/src/core/commands/code/accessibility.md +0 -347
- package/src/core/commands/code/api.md +0 -297
- package/src/core/commands/code/architecture.md +0 -297
- package/src/core/commands/code/completeness.md +0 -503
- package/src/core/commands/code/legal.md +0 -493
- package/src/core/commands/code/logic.md +0 -416
- package/src/core/commands/code/performance.md +0 -490
- package/src/core/commands/code/security.md +0 -493
- package/src/core/commands/code/test.md +0 -489
- package/src/core/commands/compress.md +0 -408
- package/src/core/commands/configure.md +0 -1159
- package/src/core/commands/context/export.md +0 -296
- package/src/core/commands/context/full.md +0 -353
- package/src/core/commands/context/note.md +0 -380
- package/src/core/commands/council.md +0 -592
- package/src/core/commands/debt.md +0 -491
- package/src/core/commands/deploy.md +0 -864
- package/src/core/commands/deps.md +0 -728
- package/src/core/commands/diagnose.md +0 -404
- package/src/core/commands/docs.md +0 -469
- package/src/core/commands/epic/edit.md +0 -213
- package/src/core/commands/epic/list.md +0 -190
- package/src/core/commands/epic/view.md +0 -267
- package/src/core/commands/epic.md +0 -477
- package/src/core/commands/export.md +0 -238
- package/src/core/commands/feedback.md +0 -603
- package/src/core/commands/handoff.md +0 -386
- package/src/core/commands/help.md +0 -194
- package/src/core/commands/ideate/brief.md +0 -363
- package/src/core/commands/ideate/discover.md +0 -399
- package/src/core/commands/ideate/features.md +0 -496
- package/src/core/commands/ideate/history.md +0 -403
- package/src/core/commands/ideate/new.md +0 -899
- package/src/core/commands/impact.md +0 -407
- package/src/core/commands/install.md +0 -529
- package/src/core/commands/learn/explain.md +0 -118
- package/src/core/commands/learn/glossary.md +0 -135
- package/src/core/commands/learn/patterns.md +0 -138
- package/src/core/commands/learn/tour.md +0 -126
- package/src/core/commands/maintain.md +0 -558
- package/src/core/commands/metrics.md +0 -844
- package/src/core/commands/migrate/codemods.md +0 -151
- package/src/core/commands/migrate/plan.md +0 -131
- package/src/core/commands/migrate/scan.md +0 -114
- package/src/core/commands/migrate/validate.md +0 -119
- package/src/core/commands/multi-expert.md +0 -447
- package/src/core/commands/packages.md +0 -535
- package/src/core/commands/pr.md +0 -337
- package/src/core/commands/readme-sync.md +0 -329
- package/src/core/commands/research/analyze.md +0 -798
- package/src/core/commands/research/ask.md +0 -864
- package/src/core/commands/research/import.md +0 -1025
- package/src/core/commands/research/list.md +0 -273
- package/src/core/commands/research/synthesize.md +0 -928
- package/src/core/commands/research/view.md +0 -323
- package/src/core/commands/retro.md +0 -795
- package/src/core/commands/review.md +0 -694
- package/src/core/commands/rlm.md +0 -446
- package/src/core/commands/roadmap/analyze.md +0 -400
- package/src/core/commands/rpi.md +0 -633
- package/src/core/commands/seo/audit.md +0 -428
- package/src/core/commands/seo/competitor.md +0 -174
- package/src/core/commands/seo/content.md +0 -107
- package/src/core/commands/seo/geo.md +0 -229
- package/src/core/commands/seo/hreflang.md +0 -140
- package/src/core/commands/seo/images.md +0 -96
- package/src/core/commands/seo/page.md +0 -198
- package/src/core/commands/seo/plan.md +0 -163
- package/src/core/commands/seo/programmatic.md +0 -131
- package/src/core/commands/seo/references/cwv-thresholds.md +0 -64
- package/src/core/commands/seo/references/eeat-framework.md +0 -110
- package/src/core/commands/seo/references/quality-gates.md +0 -91
- package/src/core/commands/seo/references/schema-types.md +0 -102
- package/src/core/commands/seo/schema.md +0 -183
- package/src/core/commands/seo/sitemap.md +0 -97
- package/src/core/commands/seo/technical.md +0 -100
- package/src/core/commands/seo.md +0 -107
- package/src/core/commands/serve.md +0 -127
- package/src/core/commands/session/cleanup.md +0 -452
- package/src/core/commands/session/end.md +0 -865
- package/src/core/commands/session/history.md +0 -293
- package/src/core/commands/session/init.md +0 -210
- package/src/core/commands/session/new.md +0 -827
- package/src/core/commands/session/resume.md +0 -291
- package/src/core/commands/session/spawn.md +0 -205
- package/src/core/commands/session/status.md +0 -274
- package/src/core/commands/skill/list.md +0 -139
- package/src/core/commands/skill/recommend.md +0 -216
- package/src/core/commands/sprint.md +0 -714
- package/src/core/commands/status/undo.md +0 -191
- package/src/core/commands/status.md +0 -423
- package/src/core/commands/story/edit.md +0 -204
- package/src/core/commands/story/list.md +0 -199
- package/src/core/commands/story/view.md +0 -312
- package/src/core/commands/story-validate.md +0 -491
- package/src/core/commands/story.md +0 -465
- package/src/core/commands/tdd-next.md +0 -238
- package/src/core/commands/tdd.md +0 -211
- package/src/core/commands/team/guide.md +0 -688
- package/src/core/commands/team/list.md +0 -59
- package/src/core/commands/team/start.md +0 -130
- package/src/core/commands/team/status.md +0 -66
- package/src/core/commands/team/stop.md +0 -78
- package/src/core/commands/template.md +0 -644
- package/src/core/commands/tests.md +0 -731
- package/src/core/commands/update.md +0 -591
- package/src/core/commands/validate-expertise.md +0 -305
- package/src/core/commands/velocity.md +0 -630
- package/src/core/commands/verify.md +0 -534
- package/src/core/commands/whats-new.md +0 -201
- package/src/core/commands/workflow.md +0 -449
- package/src/core/council/sessions/.gitkeep +0 -0
- package/src/core/council/shared_reasoning.template.md +0 -106
- package/src/core/experts/README.md +0 -236
- package/src/core/experts/_core-expertise.yaml +0 -105
- package/src/core/experts/accessibility/expertise.yaml +0 -115
- package/src/core/experts/accessibility/question.md +0 -41
- package/src/core/experts/accessibility/self-improve.md +0 -45
- package/src/core/experts/accessibility/workflow.md +0 -59
- package/src/core/experts/adr-writer/expertise.yaml +0 -138
- package/src/core/experts/adr-writer/question.md +0 -56
- package/src/core/experts/adr-writer/self-improve.md +0 -106
- package/src/core/experts/adr-writer/workflow.md +0 -184
- package/src/core/experts/analytics/expertise.yaml +0 -119
- package/src/core/experts/analytics/question.md +0 -74
- package/src/core/experts/analytics/self-improve.md +0 -163
- package/src/core/experts/analytics/workflow.md +0 -272
- package/src/core/experts/api/expertise.yaml +0 -124
- package/src/core/experts/api/question.md +0 -74
- package/src/core/experts/api/self-improve.md +0 -122
- package/src/core/experts/api/workflow.md +0 -248
- package/src/core/experts/ci/expertise.yaml +0 -106
- package/src/core/experts/ci/question.md +0 -69
- package/src/core/experts/ci/self-improve.md +0 -100
- package/src/core/experts/ci/workflow.md +0 -145
- package/src/core/experts/codebase-query/expertise.yaml +0 -121
- package/src/core/experts/codebase-query/question.md +0 -73
- package/src/core/experts/codebase-query/self-improve.md +0 -105
- package/src/core/experts/compliance/expertise.yaml +0 -101
- package/src/core/experts/compliance/question.md +0 -56
- package/src/core/experts/compliance/self-improve.md +0 -106
- package/src/core/experts/compliance/workflow.md +0 -184
- package/src/core/experts/database/expertise.yaml +0 -109
- package/src/core/experts/database/question.md +0 -74
- package/src/core/experts/database/self-improve.md +0 -121
- package/src/core/experts/database/workflow.md +0 -234
- package/src/core/experts/datamigration/expertise.yaml +0 -141
- package/src/core/experts/datamigration/question.md +0 -56
- package/src/core/experts/datamigration/self-improve.md +0 -106
- package/src/core/experts/datamigration/workflow.md +0 -184
- package/src/core/experts/design/expertise.yaml +0 -116
- package/src/core/experts/design/question.md +0 -56
- package/src/core/experts/design/self-improve.md +0 -106
- package/src/core/experts/design/workflow.md +0 -184
- package/src/core/experts/devops/expertise.yaml +0 -116
- package/src/core/experts/devops/question.md +0 -68
- package/src/core/experts/devops/self-improve.md +0 -102
- package/src/core/experts/devops/workflow.md +0 -142
- package/src/core/experts/documentation/expertise.yaml +0 -126
- package/src/core/experts/documentation/question.md +0 -41
- package/src/core/experts/documentation/self-improve.md +0 -45
- package/src/core/experts/documentation/workflow.md +0 -55
- package/src/core/experts/epic-planner/expertise.yaml +0 -144
- package/src/core/experts/epic-planner/question.md +0 -56
- package/src/core/experts/epic-planner/self-improve.md +0 -106
- package/src/core/experts/epic-planner/workflow.md +0 -184
- package/src/core/experts/integrations/expertise.yaml +0 -113
- package/src/core/experts/integrations/question.md +0 -74
- package/src/core/experts/integrations/self-improve.md +0 -151
- package/src/core/experts/integrations/workflow.md +0 -246
- package/src/core/experts/mentor/expertise.yaml +0 -125
- package/src/core/experts/mentor/question.md +0 -56
- package/src/core/experts/mentor/self-improve.md +0 -106
- package/src/core/experts/mentor/workflow.md +0 -184
- package/src/core/experts/mobile/expertise.yaml +0 -136
- package/src/core/experts/mobile/question.md +0 -72
- package/src/core/experts/mobile/self-improve.md +0 -140
- package/src/core/experts/mobile/workflow.md +0 -240
- package/src/core/experts/monitoring/expertise.yaml +0 -132
- package/src/core/experts/monitoring/question.md +0 -76
- package/src/core/experts/monitoring/self-improve.md +0 -150
- package/src/core/experts/monitoring/workflow.md +0 -264
- package/src/core/experts/performance/expertise.yaml +0 -68
- package/src/core/experts/performance/question.md +0 -41
- package/src/core/experts/performance/self-improve.md +0 -45
- package/src/core/experts/performance/workflow.md +0 -61
- package/src/core/experts/product/expertise.yaml +0 -143
- package/src/core/experts/product/question.md +0 -56
- package/src/core/experts/product/self-improve.md +0 -106
- package/src/core/experts/product/workflow.md +0 -184
- package/src/core/experts/qa/expertise.yaml +0 -110
- package/src/core/experts/qa/question.md +0 -56
- package/src/core/experts/qa/self-improve.md +0 -106
- package/src/core/experts/qa/workflow.md +0 -184
- package/src/core/experts/readme-updater/expertise.yaml +0 -141
- package/src/core/experts/readme-updater/question.md +0 -56
- package/src/core/experts/readme-updater/self-improve.md +0 -106
- package/src/core/experts/readme-updater/workflow.md +0 -184
- package/src/core/experts/refactor/expertise.yaml +0 -135
- package/src/core/experts/refactor/question.md +0 -41
- package/src/core/experts/refactor/self-improve.md +0 -45
- package/src/core/experts/refactor/workflow.md +0 -57
- package/src/core/experts/research/expertise.yaml +0 -143
- package/src/core/experts/research/question.md +0 -56
- package/src/core/experts/research/self-improve.md +0 -106
- package/src/core/experts/research/workflow.md +0 -184
- package/src/core/experts/security/expertise.yaml +0 -117
- package/src/core/experts/security/question.md +0 -77
- package/src/core/experts/security/self-improve.md +0 -102
- package/src/core/experts/security/workflow.md +0 -152
- package/src/core/experts/templates/expertise-template.yaml +0 -67
- package/src/core/experts/templates/question-template.md +0 -56
- package/src/core/experts/templates/self-improve-template.md +0 -106
- package/src/core/experts/templates/workflow-template.md +0 -184
- package/src/core/experts/testing/expertise.yaml +0 -112
- package/src/core/experts/testing/question.md +0 -68
- package/src/core/experts/testing/self-improve.md +0 -102
- package/src/core/experts/testing/workflow.md +0 -143
- package/src/core/experts/ui/expertise.yaml +0 -133
- package/src/core/experts/ui/question.md +0 -74
- package/src/core/experts/ui/self-improve.md +0 -122
- package/src/core/experts/ui/workflow.md +0 -262
- package/src/core/knowledge/ads/ad-audit-checklist-scoring.md +0 -424
- package/src/core/knowledge/ads/ad-optimization-logic.md +0 -590
- package/src/core/knowledge/ads/ad-technical-specifications.md +0 -385
- package/src/core/knowledge/ads/definitive-advertising-reference-2026.md +0 -506
- package/src/core/knowledge/ads/paid-advertising-research-2026.md +0 -445
- package/src/core/profiles/COMPARISON.md +0 -170
- package/src/core/profiles/README.md +0 -178
- package/src/core/profiles/claude-code.yaml +0 -111
- package/src/core/profiles/codex.yaml +0 -103
- package/src/core/profiles/cursor.yaml +0 -134
- package/src/core/profiles/examples.js +0 -250
- package/src/core/profiles/loader.js +0 -235
- package/src/core/profiles/windsurf.yaml +0 -159
- package/src/core/skills/_learnings/README.md +0 -91
- package/src/core/skills/_learnings/_template.yaml +0 -106
- package/src/core/skills/_learnings/code-review.yaml +0 -118
- package/src/core/skills/_learnings/commit.yaml +0 -69
- package/src/core/skills/_learnings/story-writer.yaml +0 -71
- package/src/core/teams/backend.json +0 -41
- package/src/core/teams/builder-validator.json +0 -51
- package/src/core/teams/code-review.json +0 -41
- package/src/core/teams/frontend.json +0 -41
- package/src/core/teams/fullstack.json +0 -41
- package/src/core/teams/logic-audit.json +0 -53
- package/src/core/teams/perf-audit.json +0 -71
- package/src/core/teams/qa.json +0 -41
- package/src/core/teams/security-audit.json +0 -71
- package/src/core/teams/solo.json +0 -35
- package/src/core/teams/test-audit.json +0 -71
- package/src/core/templates/CONTEXT.md.example +0 -49
- package/src/core/templates/README-template.md +0 -16
- package/src/core/templates/adr-template.md +0 -28
- package/src/core/templates/agent-coordination-pattern.md +0 -38
- package/src/core/templates/agent-profile-template.md +0 -51
- package/src/core/templates/agileflow-metadata.json +0 -150
- package/src/core/templates/browser-qa-spec.yaml +0 -94
- package/src/core/templates/ci-workflow.yml +0 -74
- package/src/core/templates/claude-settings.advanced.example.json +0 -75
- package/src/core/templates/claude-settings.example.json +0 -26
- package/src/core/templates/command-documentation.md +0 -187
- package/src/core/templates/command-prerequisites.yaml +0 -169
- package/src/core/templates/comms-note-template.md +0 -24
- package/src/core/templates/damage-control-patterns.yaml +0 -243
- package/src/core/templates/environment.json +0 -18
- package/src/core/templates/epic-template.md +0 -27
- package/src/core/templates/plan-template.md +0 -125
- package/src/core/templates/preserve-rules-common.md +0 -107
- package/src/core/templates/preserve-rules.json +0 -42
- package/src/core/templates/proactive-action-spec.md +0 -29
- package/src/core/templates/product-brief.md +0 -136
- package/src/core/templates/quality-gate-priorities.md +0 -34
- package/src/core/templates/research-template.md +0 -44
- package/src/core/templates/session-harness-protocol.md +0 -128
- package/src/core/templates/session-state.json +0 -56
- package/src/core/templates/story-lifecycle.md +0 -213
- package/src/core/templates/story-template.md +0 -92
- package/src/core/templates/tdd-test-template.js +0 -241
- package/src/core/templates/worktrees-guide.md +0 -231
- package/tools/agileflow-npx.js +0 -52
- package/tools/cli/agileflow-cli.js +0 -72
- package/tools/cli/commands/config.js +0 -285
- package/tools/cli/commands/doctor.js +0 -496
- package/tools/cli/commands/list.js +0 -385
- package/tools/cli/commands/serve.js +0 -492
- package/tools/cli/commands/session.js +0 -1176
- package/tools/cli/commands/setup.js +0 -255
- package/tools/cli/commands/status.js +0 -101
- package/tools/cli/commands/tui.js +0 -56
- package/tools/cli/commands/uninstall.js +0 -155
- package/tools/cli/commands/update.js +0 -299
- package/tools/cli/installers/core/installer.js +0 -892
- package/tools/cli/installers/ide/_base-ide.js +0 -518
- package/tools/cli/installers/ide/_interface.js +0 -238
- package/tools/cli/installers/ide/claude-code.js +0 -432
- package/tools/cli/installers/ide/codex.js +0 -426
- package/tools/cli/installers/ide/cursor.js +0 -217
- package/tools/cli/installers/ide/manager.js +0 -222
- package/tools/cli/installers/ide/windsurf.js +0 -282
- package/tools/cli/lib/command-context.js +0 -382
- package/tools/cli/lib/config-manager.js +0 -446
- package/tools/cli/lib/content-injector.js +0 -969
- package/tools/cli/lib/content-transformer.js +0 -496
- package/tools/cli/lib/docs-setup.js +0 -464
- package/tools/cli/lib/error-handler.js +0 -165
- package/tools/cli/lib/ide-error-factory.js +0 -421
- package/tools/cli/lib/ide-errors.js +0 -367
- package/tools/cli/lib/ide-generator.js +0 -357
- package/tools/cli/lib/ide-health-monitor.js +0 -364
- package/tools/cli/lib/ide-registry.js +0 -297
- package/tools/cli/lib/npm-utils.js +0 -103
- package/tools/cli/lib/self-update.js +0 -148
- package/tools/cli/lib/ui.js +0 -211
- package/tools/cli/lib/utils.js +0 -87
- package/tools/cli/lib/validation-middleware.js +0 -491
- package/tools/cli/lib/version-checker.js +0 -95
- package/tools/postinstall.js +0 -190
|
@@ -1,518 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgileFlow CLI - Base IDE Installer
|
|
3
|
-
*
|
|
4
|
-
* Abstract base class for IDE-specific installers.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const path = require('node:path');
|
|
8
|
-
const fs = require('fs-extra');
|
|
9
|
-
const chalk = require('chalk');
|
|
10
|
-
const {
|
|
11
|
-
IdeConfigNotFoundError,
|
|
12
|
-
CommandInstallationError,
|
|
13
|
-
FilePermissionError,
|
|
14
|
-
CleanupError,
|
|
15
|
-
ContentInjectionError,
|
|
16
|
-
withPermissionHandling,
|
|
17
|
-
} = require('../../lib/ide-errors');
|
|
18
|
-
const {
|
|
19
|
-
replaceReferences,
|
|
20
|
-
createDocsReplacements,
|
|
21
|
-
injectContent: injectDynamicContentHelper,
|
|
22
|
-
} = require('../../lib/content-transformer');
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Base class for IDE-specific setup
|
|
26
|
-
* All IDE handlers should extend this class
|
|
27
|
-
*/
|
|
28
|
-
class BaseIdeSetup {
|
|
29
|
-
constructor(name, displayName = null, preferred = false) {
|
|
30
|
-
this.name = name;
|
|
31
|
-
this.displayName = displayName || name;
|
|
32
|
-
this.preferred = preferred;
|
|
33
|
-
this.configDir = null; // Override in subclasses
|
|
34
|
-
this.agileflowFolder = '.agileflow';
|
|
35
|
-
this.docsFolder = 'docs';
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Set the AgileFlow folder name
|
|
40
|
-
* @param {string} folderName - The AgileFlow folder name
|
|
41
|
-
*/
|
|
42
|
-
setAgileflowFolder(folderName) {
|
|
43
|
-
this.agileflowFolder = folderName;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Set the docs folder name
|
|
48
|
-
* @param {string} folderName - The docs folder name
|
|
49
|
-
*/
|
|
50
|
-
setDocsFolder(folderName) {
|
|
51
|
-
this.docsFolder = folderName;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Replace docs/ references in content with custom folder name
|
|
56
|
-
* Uses content-transformer module for consistent replacements
|
|
57
|
-
* @param {string} content - File content
|
|
58
|
-
* @returns {string} Updated content
|
|
59
|
-
*/
|
|
60
|
-
replaceDocsReferences(content) {
|
|
61
|
-
if (this.docsFolder === 'docs') {
|
|
62
|
-
return content; // No replacement needed
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Use content-transformer for standard replacements
|
|
66
|
-
let result = replaceReferences(content, createDocsReplacements(this.docsFolder));
|
|
67
|
-
|
|
68
|
-
// Additional patterns not covered by standard replacements
|
|
69
|
-
result = replaceReferences(result, {
|
|
70
|
-
'docs/)': `${this.docsFolder}/)`,
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// Replace standalone "docs" word (not followed by .)
|
|
74
|
-
// Use replacement function to avoid $ in docsFolder being interpreted as regex backreference
|
|
75
|
-
result = result.replace(/\bdocs\b(?!\.)/g, () => this.docsFolder);
|
|
76
|
-
|
|
77
|
-
return result;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Inject dynamic content into template (agent lists, command lists)
|
|
82
|
-
* Uses content-transformer module for consistent injection
|
|
83
|
-
* @param {string} content - Template file content
|
|
84
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
85
|
-
* @param {Object} [options] - Additional injection options
|
|
86
|
-
* @param {boolean} [options.minimal] - When true, skip full list injection (use discovery pointers)
|
|
87
|
-
* @returns {string} Content with placeholders replaced
|
|
88
|
-
*/
|
|
89
|
-
injectDynamicContent(content, agileflowDir, options = {}) {
|
|
90
|
-
// agileflowDir is the user's .agileflow installation directory
|
|
91
|
-
// which has agents/, commands/, skills/ at the root level
|
|
92
|
-
return injectDynamicContentHelper(content, {
|
|
93
|
-
coreDir: agileflowDir,
|
|
94
|
-
agileflowFolder: this.agileflowFolder,
|
|
95
|
-
version: this.getVersion(),
|
|
96
|
-
minimal: options.minimal || false,
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Get the current AgileFlow version
|
|
102
|
-
* @returns {string} Version string
|
|
103
|
-
*/
|
|
104
|
-
getVersion() {
|
|
105
|
-
try {
|
|
106
|
-
const packageJson = require('../../../../package.json');
|
|
107
|
-
return packageJson.version || 'unknown';
|
|
108
|
-
} catch {
|
|
109
|
-
return 'unknown';
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Detect minimal context mode from project metadata.
|
|
115
|
-
* Reads the contextVerbosity setting from /configure.
|
|
116
|
-
* @param {string} projectDir - Project directory
|
|
117
|
-
* @returns {boolean} True if minimal mode should be used
|
|
118
|
-
*/
|
|
119
|
-
_detectMinimalMode(projectDir) {
|
|
120
|
-
try {
|
|
121
|
-
const metadataPath = path.join(
|
|
122
|
-
projectDir,
|
|
123
|
-
this.docsFolder,
|
|
124
|
-
'00-meta',
|
|
125
|
-
'agileflow-metadata.json'
|
|
126
|
-
);
|
|
127
|
-
if (!fs.existsSync(metadataPath)) return false;
|
|
128
|
-
const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
|
|
129
|
-
const mode = metadata?.features?.contextVerbosity?.mode;
|
|
130
|
-
if (mode === 'minimal') return true;
|
|
131
|
-
return false;
|
|
132
|
-
} catch {
|
|
133
|
-
return false;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Main setup method - must be implemented by subclasses
|
|
139
|
-
* @param {string} projectDir - Project directory
|
|
140
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
141
|
-
* @param {Object} options - Setup options
|
|
142
|
-
*/
|
|
143
|
-
async setup(projectDir, agileflowDir, options = {}) {
|
|
144
|
-
throw new Error(`setup() must be implemented by ${this.name} handler`);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Standard setup flow shared by most IDE installers.
|
|
149
|
-
* Handles cleanup, command/agent installation, and logging.
|
|
150
|
-
*
|
|
151
|
-
* @param {string} projectDir - Project directory
|
|
152
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
153
|
-
* @param {Object} config - Configuration options
|
|
154
|
-
* @param {string} config.targetSubdir - Target subdirectory name under configDir (e.g., 'commands', 'workflows')
|
|
155
|
-
* @param {string} config.agileflowFolder - AgileFlow folder name (e.g., 'agileflow', 'AgileFlow')
|
|
156
|
-
* @param {string} [config.commandLabel='commands'] - Label for commands in output (e.g., 'workflows')
|
|
157
|
-
* @param {string} [config.agentLabel='agents'] - Label for agents in output
|
|
158
|
-
* @param {boolean} [config.minimal=false] - When true, skip full agent/command list injection. Auto-detected from metadata if not set.
|
|
159
|
-
* @returns {Promise<{success: boolean, commands: number, agents: number}>}
|
|
160
|
-
*/
|
|
161
|
-
async setupStandard(projectDir, agileflowDir, config) {
|
|
162
|
-
const {
|
|
163
|
-
targetSubdir,
|
|
164
|
-
agileflowFolder,
|
|
165
|
-
commandLabel = 'commands',
|
|
166
|
-
agentLabel = 'agents',
|
|
167
|
-
minimal: explicitMinimal,
|
|
168
|
-
} = config;
|
|
169
|
-
|
|
170
|
-
// Auto-detect minimal mode from /configure context verbosity setting
|
|
171
|
-
const minimal = explicitMinimal ?? this._detectMinimalMode(projectDir);
|
|
172
|
-
|
|
173
|
-
console.log(chalk.hex('#e8683a')(` Setting up ${this.displayName}...`));
|
|
174
|
-
|
|
175
|
-
// Clean up old installation first
|
|
176
|
-
await this.cleanup(projectDir);
|
|
177
|
-
|
|
178
|
-
// Create target directory (e.g., .cursor/commands/AgileFlow)
|
|
179
|
-
const ideDir = path.join(projectDir, this.configDir);
|
|
180
|
-
const targetDir = path.join(ideDir, targetSubdir);
|
|
181
|
-
const agileflowTargetDir = path.join(targetDir, agileflowFolder);
|
|
182
|
-
|
|
183
|
-
// Install commands using shared recursive method
|
|
184
|
-
const commandsSource = path.join(agileflowDir, 'commands');
|
|
185
|
-
const commandResult = await this.installCommandsRecursive(
|
|
186
|
-
commandsSource,
|
|
187
|
-
agileflowTargetDir,
|
|
188
|
-
agileflowDir,
|
|
189
|
-
true, // Inject dynamic content
|
|
190
|
-
null, // No IDE transform
|
|
191
|
-
{ minimal } // Pass minimal flag for content injection
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
// Install agents as subdirectory
|
|
195
|
-
const agentsSource = path.join(agileflowDir, 'agents');
|
|
196
|
-
const agentsTargetDir = path.join(agileflowTargetDir, 'agents');
|
|
197
|
-
const agentResult = await this.installCommandsRecursive(
|
|
198
|
-
agentsSource,
|
|
199
|
-
agentsTargetDir,
|
|
200
|
-
agileflowDir,
|
|
201
|
-
false // No dynamic content for agents
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
console.log(chalk.green(` ✓ ${this.displayName} configured:`));
|
|
205
|
-
console.log(chalk.dim(` - ${commandResult.commands} ${commandLabel} installed`));
|
|
206
|
-
console.log(chalk.dim(` - ${agentResult.commands} ${agentLabel} installed`));
|
|
207
|
-
console.log(chalk.dim(` - Path: ${path.relative(projectDir, agileflowTargetDir)}`));
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
success: true,
|
|
211
|
-
commands: commandResult.commands,
|
|
212
|
-
agents: agentResult.commands,
|
|
213
|
-
ideDir,
|
|
214
|
-
agileflowTargetDir,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Cleanup IDE configuration
|
|
220
|
-
* @param {string} projectDir - Project directory
|
|
221
|
-
* @throws {CleanupError} If cleanup fails
|
|
222
|
-
*/
|
|
223
|
-
async cleanup(projectDir) {
|
|
224
|
-
if (this.configDir) {
|
|
225
|
-
// Clean up both old (AgileFlow) and new (agileflow) folder names
|
|
226
|
-
for (const folderName of ['agileflow', 'AgileFlow']) {
|
|
227
|
-
const agileflowPath = path.join(projectDir, this.configDir, 'commands', folderName);
|
|
228
|
-
if (await fs.pathExists(agileflowPath)) {
|
|
229
|
-
try {
|
|
230
|
-
await fs.remove(agileflowPath);
|
|
231
|
-
console.log(
|
|
232
|
-
chalk.dim(` Removed old ${folderName} configuration from ${this.displayName}`)
|
|
233
|
-
);
|
|
234
|
-
} catch (error) {
|
|
235
|
-
if (error.code === 'EACCES' || error.code === 'EPERM') {
|
|
236
|
-
throw new CleanupError(
|
|
237
|
-
this.displayName,
|
|
238
|
-
agileflowPath,
|
|
239
|
-
`Permission denied: ${error.message}`
|
|
240
|
-
);
|
|
241
|
-
}
|
|
242
|
-
throw new CleanupError(this.displayName, agileflowPath, error.message);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Remove duplicate command files that exist outside the agileflow/ subfolder
|
|
248
|
-
// These cause "command 2" entries in Claude Code's autocomplete
|
|
249
|
-
await this.removeDuplicateCommands(projectDir);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* Remove duplicate AgileFlow command files from the parent commands directory.
|
|
255
|
-
* When commands exist both in .claude/commands/agileflow/foo.md AND .claude/commands/foo.md,
|
|
256
|
-
* Claude Code shows them as "foo" and "foo 2" in autocomplete. This removes the loose copies.
|
|
257
|
-
* @param {string} projectDir - Project directory
|
|
258
|
-
*/
|
|
259
|
-
async removeDuplicateCommands(projectDir) {
|
|
260
|
-
const commandsDir = path.join(projectDir, this.configDir, 'commands');
|
|
261
|
-
const agileflowDir = path.join(commandsDir, 'agileflow');
|
|
262
|
-
|
|
263
|
-
if (!(await fs.pathExists(commandsDir))) return;
|
|
264
|
-
|
|
265
|
-
// Get list of AgileFlow command names (files and directories)
|
|
266
|
-
const agileflowNames = new Set();
|
|
267
|
-
if (await fs.pathExists(agileflowDir)) {
|
|
268
|
-
const entries = await fs.readdir(agileflowDir, { withFileTypes: true });
|
|
269
|
-
for (const entry of entries) {
|
|
270
|
-
agileflowNames.add(entry.name);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Also collect names from the source commands to catch pre-existing stale copies
|
|
275
|
-
const coreCommandsDir = path.join(projectDir, this.agileflowFolder, 'commands');
|
|
276
|
-
if (await fs.pathExists(coreCommandsDir)) {
|
|
277
|
-
const entries = await fs.readdir(coreCommandsDir, { withFileTypes: true });
|
|
278
|
-
for (const entry of entries) {
|
|
279
|
-
agileflowNames.add(entry.name);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
if (agileflowNames.size === 0) return;
|
|
284
|
-
|
|
285
|
-
// Scan the parent commands directory for loose duplicates
|
|
286
|
-
let removedCount = 0;
|
|
287
|
-
const entries = await fs.readdir(commandsDir, { withFileTypes: true });
|
|
288
|
-
|
|
289
|
-
for (const entry of entries) {
|
|
290
|
-
// Skip the agileflow subfolder itself and non-agileflow items
|
|
291
|
-
if (entry.name === 'agileflow' || entry.name === 'AgileFlow') continue;
|
|
292
|
-
|
|
293
|
-
// Check if this file/directory matches an AgileFlow command name
|
|
294
|
-
if (agileflowNames.has(entry.name)) {
|
|
295
|
-
const duplicatePath = path.join(commandsDir, entry.name);
|
|
296
|
-
try {
|
|
297
|
-
await fs.remove(duplicatePath);
|
|
298
|
-
removedCount++;
|
|
299
|
-
} catch {
|
|
300
|
-
// Best effort - don't fail setup over cleanup
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
if (removedCount > 0) {
|
|
306
|
-
console.log(
|
|
307
|
-
chalk.dim(` Removed ${removedCount} duplicate command(s) from ${this.displayName}`)
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Detect if this IDE is configured in the project
|
|
314
|
-
* @param {string} projectDir - Project directory
|
|
315
|
-
* @returns {Promise<boolean>}
|
|
316
|
-
*/
|
|
317
|
-
async detect(projectDir) {
|
|
318
|
-
if (this.configDir) {
|
|
319
|
-
const configPath = path.join(projectDir, this.configDir);
|
|
320
|
-
return fs.pathExists(configPath);
|
|
321
|
-
}
|
|
322
|
-
return false;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Ensure a directory exists
|
|
327
|
-
* @param {string} dirPath - Directory path
|
|
328
|
-
*/
|
|
329
|
-
async ensureDir(dirPath) {
|
|
330
|
-
await fs.ensureDir(dirPath);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Write a file with permission error handling
|
|
335
|
-
* @param {string} filePath - File path
|
|
336
|
-
* @param {string} content - File content
|
|
337
|
-
* @throws {FilePermissionError} If permission denied
|
|
338
|
-
*/
|
|
339
|
-
async writeFile(filePath, content) {
|
|
340
|
-
await withPermissionHandling(this.displayName, filePath, 'write', async () => {
|
|
341
|
-
await fs.writeFile(filePath, content, 'utf8');
|
|
342
|
-
});
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Read a file with permission error handling
|
|
347
|
-
* @param {string} filePath - File path
|
|
348
|
-
* @returns {Promise<string>} File content
|
|
349
|
-
* @throws {FilePermissionError} If permission denied
|
|
350
|
-
*/
|
|
351
|
-
async readFile(filePath) {
|
|
352
|
-
return withPermissionHandling(this.displayName, filePath, 'read', async () => {
|
|
353
|
-
return fs.readFile(filePath, 'utf8');
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* Check if a path exists
|
|
359
|
-
* @param {string} filePath - Path to check
|
|
360
|
-
* @returns {Promise<boolean>}
|
|
361
|
-
*/
|
|
362
|
-
async exists(filePath) {
|
|
363
|
-
return fs.pathExists(filePath);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Scan a directory for files with a specific extension
|
|
368
|
-
* @param {string} dirPath - Directory path
|
|
369
|
-
* @param {string} extension - File extension (e.g., '.md')
|
|
370
|
-
* @param {string} [prefix=''] - Prefix for nested names (used for recursion)
|
|
371
|
-
* @returns {Promise<Array>} List of files with name, path, filename
|
|
372
|
-
*/
|
|
373
|
-
async scanDirectory(dirPath, extension, prefix = '') {
|
|
374
|
-
const results = [];
|
|
375
|
-
|
|
376
|
-
if (!(await this.exists(dirPath))) {
|
|
377
|
-
return results;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
381
|
-
|
|
382
|
-
for (const entry of entries) {
|
|
383
|
-
const fullPath = path.join(dirPath, entry.name);
|
|
384
|
-
|
|
385
|
-
if (entry.isFile() && entry.name.endsWith(extension)) {
|
|
386
|
-
// Build name with prefix for subcommands (e.g., ideate-new from ideate/new.md)
|
|
387
|
-
const baseName = entry.name.replace(extension, '');
|
|
388
|
-
const fullName = prefix ? `${prefix}-${baseName}` : baseName;
|
|
389
|
-
|
|
390
|
-
results.push({
|
|
391
|
-
name: fullName,
|
|
392
|
-
path: fullPath,
|
|
393
|
-
filename: entry.name,
|
|
394
|
-
});
|
|
395
|
-
} else if (entry.isDirectory()) {
|
|
396
|
-
// Recursively scan subdirectories with prefix
|
|
397
|
-
const subPrefix = prefix ? `${prefix}-${entry.name}` : entry.name;
|
|
398
|
-
const subResults = await this.scanDirectory(fullPath, extension, subPrefix);
|
|
399
|
-
results.push(...subResults);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
return results;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* Recursively install markdown files from source to target directory
|
|
408
|
-
* Handles content injection and docs reference replacement.
|
|
409
|
-
* Optionally applies IDE-specific transformations via ideTransform callback.
|
|
410
|
-
*
|
|
411
|
-
* @param {string} sourceDir - Source directory path
|
|
412
|
-
* @param {string} targetDir - Target directory path
|
|
413
|
-
* @param {string} agileflowDir - AgileFlow installation directory (for dynamic content)
|
|
414
|
-
* @param {boolean} injectDynamic - Whether to inject dynamic content (only for top-level commands)
|
|
415
|
-
* @param {Function} [ideTransform] - Optional IDE transformation function: (content, filename) => string
|
|
416
|
-
* @param {Object} [injectionOptions] - Options passed to injectDynamicContent (e.g., { minimal: true })
|
|
417
|
-
* @returns {Promise<{commands: number, subdirs: number}>} Count of installed items
|
|
418
|
-
* @throws {CommandInstallationError} If command installation fails
|
|
419
|
-
* @throws {FilePermissionError} If permission denied
|
|
420
|
-
*
|
|
421
|
-
* @example
|
|
422
|
-
* // Without transformation (backward compatible)
|
|
423
|
-
* await installer.installCommandsRecursive(src, target, agileflow, true);
|
|
424
|
-
*
|
|
425
|
-
* @example
|
|
426
|
-
* // With IDE transformation
|
|
427
|
-
* await installer.installCommandsRecursive(
|
|
428
|
-
* src,
|
|
429
|
-
* target,
|
|
430
|
-
* agileflow,
|
|
431
|
-
* true,
|
|
432
|
-
* (content, filename) => ideGenerator.generateForIde(content, 'cursor')
|
|
433
|
-
* );
|
|
434
|
-
*/
|
|
435
|
-
async installCommandsRecursive(
|
|
436
|
-
sourceDir,
|
|
437
|
-
targetDir,
|
|
438
|
-
agileflowDir,
|
|
439
|
-
injectDynamic = false,
|
|
440
|
-
ideTransform = null,
|
|
441
|
-
injectionOptions = {}
|
|
442
|
-
) {
|
|
443
|
-
let commandCount = 0;
|
|
444
|
-
let subdirCount = 0;
|
|
445
|
-
|
|
446
|
-
if (!(await this.exists(sourceDir))) {
|
|
447
|
-
return { commands: 0, subdirs: 0 };
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
try {
|
|
451
|
-
await this.ensureDir(targetDir);
|
|
452
|
-
} catch (error) {
|
|
453
|
-
if (error.code === 'EACCES' || error.code === 'EPERM') {
|
|
454
|
-
throw new FilePermissionError(this.displayName, targetDir, 'write');
|
|
455
|
-
}
|
|
456
|
-
throw error;
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
const entries = await fs.readdir(sourceDir, { withFileTypes: true });
|
|
460
|
-
|
|
461
|
-
for (const entry of entries) {
|
|
462
|
-
const sourcePath = path.join(sourceDir, entry.name);
|
|
463
|
-
const targetPath = path.join(targetDir, entry.name);
|
|
464
|
-
|
|
465
|
-
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
466
|
-
try {
|
|
467
|
-
// Read and process .md file
|
|
468
|
-
let content = await this.readFile(sourcePath);
|
|
469
|
-
|
|
470
|
-
// Inject dynamic content if enabled (for top-level commands)
|
|
471
|
-
if (injectDynamic) {
|
|
472
|
-
try {
|
|
473
|
-
content = this.injectDynamicContent(content, agileflowDir, injectionOptions);
|
|
474
|
-
} catch (injectionError) {
|
|
475
|
-
throw new ContentInjectionError(this.displayName, sourcePath, injectionError.message);
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
// Replace docs/ references with custom folder name
|
|
480
|
-
content = this.replaceDocsReferences(content);
|
|
481
|
-
|
|
482
|
-
// Apply IDE-specific transformation if provided
|
|
483
|
-
if (ideTransform && typeof ideTransform === 'function') {
|
|
484
|
-
content = ideTransform(content, entry.name);
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
await this.writeFile(targetPath, content);
|
|
488
|
-
commandCount++;
|
|
489
|
-
} catch (error) {
|
|
490
|
-
// Re-throw typed errors as-is
|
|
491
|
-
if (error.name && error.name.includes('Error') && error.ideName) {
|
|
492
|
-
throw error;
|
|
493
|
-
}
|
|
494
|
-
throw new CommandInstallationError(this.displayName, entry.name, error.message, {
|
|
495
|
-
sourcePath,
|
|
496
|
-
targetPath,
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
} else if (entry.isDirectory()) {
|
|
500
|
-
// Recursively process subdirectory
|
|
501
|
-
const subResult = await this.installCommandsRecursive(
|
|
502
|
-
sourcePath,
|
|
503
|
-
targetPath,
|
|
504
|
-
agileflowDir,
|
|
505
|
-
false, // Don't inject dynamic content in subdirectories
|
|
506
|
-
ideTransform, // Pass ideTransform to recursive calls
|
|
507
|
-
injectionOptions // Pass injection options to recursive calls
|
|
508
|
-
);
|
|
509
|
-
commandCount += subResult.commands;
|
|
510
|
-
subdirCount += 1 + subResult.subdirs;
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
return { commands: commandCount, subdirs: subdirCount };
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
module.exports = { BaseIdeSetup };
|