agileflow 3.4.3 → 4.0.0-alpha.2
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 +238 -473
- 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/babysit-mentor-injector.js +55 -0
- package/content/plugins/core/hooks/context-loader.js +169 -0
- package/content/plugins/core/hooks/damage-control-bash.js +78 -0
- package/content/plugins/core/hooks/damage-control-edit.js +76 -0
- package/content/plugins/core/hooks/damage-control-patterns.yaml +100 -0
- package/content/plugins/core/hooks/damage-control-write.js +72 -0
- package/content/plugins/core/hooks/pre-compact-state.js +90 -0
- package/content/plugins/core/hooks/session-welcome.js +19 -0
- package/content/plugins/core/plugin.yaml +82 -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 +292 -0
- package/src/cli/commands/status.js +47 -0
- package/src/cli/commands/update.js +83 -0
- package/src/cli/index.js +73 -0
- package/src/cli/wizard/behaviors-picker.js +108 -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 +61 -0
- package/src/runtime/config/loader.js +117 -0
- package/src/runtime/config/schema.json +99 -0
- package/src/runtime/config/writer.js +55 -0
- package/src/runtime/hooks/aggregator.js +157 -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 +329 -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/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/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 -879
- 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-sessions.js +0 -116
- 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/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 -788
- package/scripts/lib/scale-detector.js +0 -396
- package/scripts/lib/sessionRegistry.js +0 -678
- package/scripts/lib/signal-detectors.js +0 -867
- 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 -612
- 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 -453
- 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 -363
- package/src/core/commands/code/api.md +0 -313
- package/src/core/commands/code/architecture.md +0 -313
- package/src/core/commands/code/completeness.md +0 -519
- package/src/core/commands/code/legal.md +0 -509
- package/src/core/commands/code/logic.md +0 -432
- package/src/core/commands/code/performance.md +0 -506
- package/src/core/commands/code/security.md +0 -509
- package/src/core/commands/code/test.md +0 -505
- 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 -497
- package/src/core/commands/ideate/history.md +0 -403
- package/src/core/commands/ideate/new.md +0 -900
- 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 -444
- 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/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/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,238 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* _interface.js - IDE Handler Interface
|
|
3
|
-
*
|
|
4
|
-
* Defines the formal contract that all IDE handlers must implement.
|
|
5
|
-
* This interface ensures consistency across IDE installers and
|
|
6
|
-
* enables validation at registration time.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* const { IdeHandlerInterface, validateHandler } = require('./_interface');
|
|
10
|
-
*
|
|
11
|
-
* class MyIdeSetup extends BaseIdeSetup {
|
|
12
|
-
* // Implement required methods
|
|
13
|
-
* }
|
|
14
|
-
*
|
|
15
|
-
* // In IdeManager.loadHandlers():
|
|
16
|
-
* const validationResult = validateHandler(handler);
|
|
17
|
-
* if (!validationResult.valid) {
|
|
18
|
-
* throw new Error(`Invalid handler: ${validationResult.errors.join(', ')}`);
|
|
19
|
-
* }
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Required methods that every IDE handler must implement
|
|
24
|
-
* @type {Object.<string, {required: boolean, description: string, signature: string}>}
|
|
25
|
-
*/
|
|
26
|
-
const REQUIRED_METHODS = {
|
|
27
|
-
setup: {
|
|
28
|
-
required: true,
|
|
29
|
-
description: 'Main setup method to configure the IDE',
|
|
30
|
-
signature:
|
|
31
|
-
'async setup(projectDir: string, agileflowDir: string, options?: object): Promise<object>',
|
|
32
|
-
},
|
|
33
|
-
cleanup: {
|
|
34
|
-
required: true,
|
|
35
|
-
description: 'Cleanup old IDE configuration',
|
|
36
|
-
signature: 'async cleanup(projectDir: string): Promise<void>',
|
|
37
|
-
},
|
|
38
|
-
detect: {
|
|
39
|
-
required: true,
|
|
40
|
-
description: 'Detect if this IDE is configured in the project',
|
|
41
|
-
signature: 'async detect(projectDir: string): Promise<boolean>',
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Required properties that every IDE handler must have
|
|
47
|
-
* @type {Object.<string, {required: boolean, description: string, type: string}>}
|
|
48
|
-
*/
|
|
49
|
-
const REQUIRED_PROPERTIES = {
|
|
50
|
-
name: {
|
|
51
|
-
required: true,
|
|
52
|
-
description: 'Unique identifier for the IDE (lowercase)',
|
|
53
|
-
type: 'string',
|
|
54
|
-
},
|
|
55
|
-
displayName: {
|
|
56
|
-
required: true,
|
|
57
|
-
description: 'Human-readable name for display',
|
|
58
|
-
type: 'string',
|
|
59
|
-
},
|
|
60
|
-
configDir: {
|
|
61
|
-
required: true,
|
|
62
|
-
description: 'Configuration directory name (e.g., ".cursor", ".claude")',
|
|
63
|
-
type: 'string',
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Optional methods that handlers may implement
|
|
69
|
-
* @type {Object.<string, {description: string, signature: string}>}
|
|
70
|
-
*/
|
|
71
|
-
const OPTIONAL_METHODS = {
|
|
72
|
-
setAgileflowFolder: {
|
|
73
|
-
description: 'Set the AgileFlow folder name',
|
|
74
|
-
signature: 'setAgileflowFolder(folderName: string): void',
|
|
75
|
-
},
|
|
76
|
-
setDocsFolder: {
|
|
77
|
-
description: 'Set the docs folder name',
|
|
78
|
-
signature: 'setDocsFolder(folderName: string): void',
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Validate that a handler implements all required methods and properties
|
|
84
|
-
* @param {object} handler - IDE handler instance to validate
|
|
85
|
-
* @returns {{valid: boolean, errors: string[], warnings: string[]}}
|
|
86
|
-
*/
|
|
87
|
-
function validateHandler(handler) {
|
|
88
|
-
const errors = [];
|
|
89
|
-
const warnings = [];
|
|
90
|
-
|
|
91
|
-
if (!handler) {
|
|
92
|
-
return { valid: false, errors: ['Handler is null or undefined'], warnings: [] };
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Check required properties
|
|
96
|
-
for (const [propName, propDef] of Object.entries(REQUIRED_PROPERTIES)) {
|
|
97
|
-
if (propDef.required) {
|
|
98
|
-
const value = handler[propName];
|
|
99
|
-
|
|
100
|
-
if (value === undefined || value === null) {
|
|
101
|
-
errors.push(`Missing required property: ${propName} (${propDef.description})`);
|
|
102
|
-
} else if (propDef.type && typeof value !== propDef.type) {
|
|
103
|
-
errors.push(`Property ${propName} must be of type ${propDef.type}, got ${typeof value}`);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Check required methods
|
|
109
|
-
for (const [methodName, methodDef] of Object.entries(REQUIRED_METHODS)) {
|
|
110
|
-
if (methodDef.required) {
|
|
111
|
-
const method = handler[methodName];
|
|
112
|
-
|
|
113
|
-
if (typeof method !== 'function') {
|
|
114
|
-
errors.push(`Missing required method: ${methodName}() - ${methodDef.description}`);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Check for optional methods (just warnings)
|
|
120
|
-
for (const [methodName, methodDef] of Object.entries(OPTIONAL_METHODS)) {
|
|
121
|
-
if (typeof handler[methodName] !== 'function') {
|
|
122
|
-
warnings.push(`Optional method not implemented: ${methodName}() - ${methodDef.description}`);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return {
|
|
127
|
-
valid: errors.length === 0,
|
|
128
|
-
errors,
|
|
129
|
-
warnings,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Get a summary of the interface requirements
|
|
135
|
-
* @returns {string} Human-readable summary
|
|
136
|
-
*/
|
|
137
|
-
function getInterfaceSummary() {
|
|
138
|
-
const lines = ['IDE Handler Interface Requirements:', ''];
|
|
139
|
-
|
|
140
|
-
lines.push('Required Properties:');
|
|
141
|
-
for (const [name, def] of Object.entries(REQUIRED_PROPERTIES)) {
|
|
142
|
-
lines.push(` - ${name}: ${def.type} - ${def.description}`);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
lines.push('');
|
|
146
|
-
lines.push('Required Methods:');
|
|
147
|
-
for (const [name, def] of Object.entries(REQUIRED_METHODS)) {
|
|
148
|
-
lines.push(` - ${name}()`);
|
|
149
|
-
lines.push(` Signature: ${def.signature}`);
|
|
150
|
-
lines.push(` Purpose: ${def.description}`);
|
|
151
|
-
lines.push('');
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
lines.push('Optional Methods:');
|
|
155
|
-
for (const [name, def] of Object.entries(OPTIONAL_METHODS)) {
|
|
156
|
-
lines.push(` - ${name}(): ${def.description}`);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return lines.join('\n');
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* IDE Handler Interface - Abstract base that defines the contract
|
|
164
|
-
* This is for documentation purposes; actual handlers extend BaseIdeSetup
|
|
165
|
-
*/
|
|
166
|
-
class IdeHandlerInterface {
|
|
167
|
-
/**
|
|
168
|
-
* @param {string} name - Unique identifier (lowercase)
|
|
169
|
-
* @param {string} displayName - Human-readable name
|
|
170
|
-
* @param {string} configDir - Configuration directory name
|
|
171
|
-
*/
|
|
172
|
-
constructor(name, displayName, configDir) {
|
|
173
|
-
if (this.constructor === IdeHandlerInterface) {
|
|
174
|
-
throw new Error('IdeHandlerInterface is abstract and cannot be instantiated directly');
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
this.name = name;
|
|
178
|
-
this.displayName = displayName;
|
|
179
|
-
this.configDir = configDir;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Main setup method - MUST be implemented
|
|
184
|
-
* @param {string} projectDir - Project directory
|
|
185
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
186
|
-
* @param {Object} [options] - Setup options
|
|
187
|
-
* @returns {Promise<{success: boolean, commands?: number, agents?: number}>}
|
|
188
|
-
* @abstract
|
|
189
|
-
*/
|
|
190
|
-
async setup(projectDir, agileflowDir, options = {}) {
|
|
191
|
-
throw new Error('setup() must be implemented by subclass');
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Cleanup IDE configuration - MUST be implemented
|
|
196
|
-
* @param {string} projectDir - Project directory
|
|
197
|
-
* @returns {Promise<void>}
|
|
198
|
-
* @abstract
|
|
199
|
-
*/
|
|
200
|
-
async cleanup(projectDir) {
|
|
201
|
-
throw new Error('cleanup() must be implemented by subclass');
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Detect if IDE is configured - MUST be implemented
|
|
206
|
-
* @param {string} projectDir - Project directory
|
|
207
|
-
* @returns {Promise<boolean>}
|
|
208
|
-
* @abstract
|
|
209
|
-
*/
|
|
210
|
-
async detect(projectDir) {
|
|
211
|
-
throw new Error('detect() must be implemented by subclass');
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Set AgileFlow folder name - OPTIONAL
|
|
216
|
-
* @param {string} folderName - Folder name
|
|
217
|
-
*/
|
|
218
|
-
setAgileflowFolder(folderName) {
|
|
219
|
-
// Optional - implement if needed
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Set docs folder name - OPTIONAL
|
|
224
|
-
* @param {string} folderName - Folder name
|
|
225
|
-
*/
|
|
226
|
-
setDocsFolder(folderName) {
|
|
227
|
-
// Optional - implement if needed
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
module.exports = {
|
|
232
|
-
IdeHandlerInterface,
|
|
233
|
-
validateHandler,
|
|
234
|
-
getInterfaceSummary,
|
|
235
|
-
REQUIRED_METHODS,
|
|
236
|
-
REQUIRED_PROPERTIES,
|
|
237
|
-
OPTIONAL_METHODS,
|
|
238
|
-
};
|
|
@@ -1,432 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgileFlow CLI - Claude Code IDE Installer
|
|
3
|
-
*
|
|
4
|
-
* Installs AgileFlow commands for Claude Code IDE.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const path = require('node:path');
|
|
8
|
-
const fs = require('fs-extra');
|
|
9
|
-
const chalk = require('chalk');
|
|
10
|
-
const { BaseIdeSetup } = require('./_base-ide');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Claude Code IDE setup handler
|
|
14
|
-
*/
|
|
15
|
-
class ClaudeCodeSetup extends BaseIdeSetup {
|
|
16
|
-
constructor() {
|
|
17
|
-
super('claude-code', 'Claude Code', true);
|
|
18
|
-
this.configDir = '.claude';
|
|
19
|
-
this.commandsDir = 'commands';
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Setup Claude Code IDE configuration
|
|
24
|
-
* @param {string} projectDir - Project directory
|
|
25
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
26
|
-
* @param {Object} options - Setup options
|
|
27
|
-
*/
|
|
28
|
-
async setup(projectDir, agileflowDir, options = {}) {
|
|
29
|
-
// Use standard setup for commands and agents
|
|
30
|
-
const result = await this.setupStandard(projectDir, agileflowDir, {
|
|
31
|
-
targetSubdir: this.commandsDir,
|
|
32
|
-
agileflowFolder: 'agileflow',
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
const { ideDir, agileflowTargetDir } = result;
|
|
36
|
-
const agentsSource = path.join(agileflowDir, 'agents');
|
|
37
|
-
|
|
38
|
-
// Claude Code specific: Check for duplicates in user-level ~/.claude/commands/
|
|
39
|
-
// Commands in both ~/.claude/commands/ and .claude/commands/agileflow/ cause
|
|
40
|
-
// "command 2" entries in autocomplete
|
|
41
|
-
await this.removeUserLevelDuplicates(agileflowDir);
|
|
42
|
-
|
|
43
|
-
// Claude Code specific: Install agents as spawnable subagents (.claude/agents/agileflow/)
|
|
44
|
-
// This allows Task tool to spawn them with subagent_type: "agileflow-ui"
|
|
45
|
-
const spawnableAgentsDir = path.join(ideDir, 'agents', 'agileflow');
|
|
46
|
-
|
|
47
|
-
// Clean existing spawnable agents directory to prevent duplicates during update
|
|
48
|
-
if (await fs.pathExists(spawnableAgentsDir)) {
|
|
49
|
-
await fs.remove(spawnableAgentsDir);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
await this.installCommandsRecursive(agentsSource, spawnableAgentsDir, agileflowDir, false);
|
|
53
|
-
console.log(chalk.dim(` - Spawnable agents: .claude/agents/agileflow/`));
|
|
54
|
-
|
|
55
|
-
// Claude Code specific: Create skills directory for marketplace skills
|
|
56
|
-
// Users browse and install skills via /agileflow:skill:recommend or npx skills add
|
|
57
|
-
const skillsTargetDir = path.join(ideDir, 'skills');
|
|
58
|
-
await this.ensureDir(skillsTargetDir);
|
|
59
|
-
console.log(chalk.dim(` - Skills directory: .claude/skills/ (for marketplace skills)`));
|
|
60
|
-
|
|
61
|
-
// Claude Code specific: Setup damage control hooks
|
|
62
|
-
await this.setupDamageControl(projectDir, agileflowDir, ideDir, options);
|
|
63
|
-
|
|
64
|
-
// Claude Code specific: Setup SessionStart hooks (welcome, archive, context-loader)
|
|
65
|
-
await this.setupSessionStartHooks(projectDir, agileflowDir, ideDir, options);
|
|
66
|
-
|
|
67
|
-
// Claude Code specific: Setup PostToolUse hooks (native team observer)
|
|
68
|
-
await this.setupPostToolUseHooks(projectDir, agileflowDir, ideDir, options);
|
|
69
|
-
|
|
70
|
-
return result;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Setup damage control hooks
|
|
75
|
-
* @param {string} projectDir - Project directory
|
|
76
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
77
|
-
* @param {string} claudeDir - .claude directory path
|
|
78
|
-
* @param {Object} options - Setup options
|
|
79
|
-
*/
|
|
80
|
-
async setupDamageControl(projectDir, agileflowDir, claudeDir, options = {}) {
|
|
81
|
-
const damageControlSource = path.join(agileflowDir, 'scripts', 'damage-control');
|
|
82
|
-
const damageControlTarget = path.join(claudeDir, 'hooks', 'damage-control');
|
|
83
|
-
|
|
84
|
-
// Check if source exists
|
|
85
|
-
if (!fs.existsSync(damageControlSource)) {
|
|
86
|
-
console.log(chalk.dim(` - Damage control: source not found, skipping`));
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Create hooks directory
|
|
91
|
-
await this.ensureDir(damageControlTarget);
|
|
92
|
-
|
|
93
|
-
// Copy hook scripts
|
|
94
|
-
const scripts = [
|
|
95
|
-
'bash-tool-damage-control.js',
|
|
96
|
-
'edit-tool-damage-control.js',
|
|
97
|
-
'write-tool-damage-control.js',
|
|
98
|
-
];
|
|
99
|
-
for (const script of scripts) {
|
|
100
|
-
const src = path.join(damageControlSource, script);
|
|
101
|
-
const dest = path.join(damageControlTarget, script);
|
|
102
|
-
if (fs.existsSync(src)) {
|
|
103
|
-
await fs.copy(src, dest);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Copy lib/damage-control-utils.js (required by hook scripts via ../lib/damage-control-utils)
|
|
108
|
-
const libSource = path.join(agileflowDir, 'scripts', 'lib', 'damage-control-utils.js');
|
|
109
|
-
const libTarget = path.join(claudeDir, 'hooks', 'lib', 'damage-control-utils.js');
|
|
110
|
-
if (fs.existsSync(libSource)) {
|
|
111
|
-
await this.ensureDir(path.dirname(libTarget));
|
|
112
|
-
await fs.copy(libSource, libTarget);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Copy patterns.yaml (preserve existing)
|
|
116
|
-
const patternsSource = path.join(damageControlSource, 'patterns.yaml');
|
|
117
|
-
const patternsTarget = path.join(damageControlTarget, 'patterns.yaml');
|
|
118
|
-
if (fs.existsSync(patternsSource) && !fs.existsSync(patternsTarget)) {
|
|
119
|
-
await fs.copy(patternsSource, patternsTarget);
|
|
120
|
-
console.log(chalk.dim(` - Damage control: patterns.yaml created`));
|
|
121
|
-
} else if (fs.existsSync(patternsTarget)) {
|
|
122
|
-
console.log(chalk.dim(` - Damage control: patterns.yaml preserved`));
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Setup hooks in settings.json (unless disabled)
|
|
126
|
-
if (!options.skipDamageControl) {
|
|
127
|
-
await this.setupDamageControlHooks(claudeDir);
|
|
128
|
-
console.log(chalk.dim(` - Damage control: hooks enabled`));
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Add PreToolUse hooks to settings.json
|
|
134
|
-
* @param {string} claudeDir - .claude directory path
|
|
135
|
-
*/
|
|
136
|
-
async setupDamageControlHooks(claudeDir) {
|
|
137
|
-
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
138
|
-
let settings = {};
|
|
139
|
-
|
|
140
|
-
// Load existing settings
|
|
141
|
-
if (fs.existsSync(settingsPath)) {
|
|
142
|
-
try {
|
|
143
|
-
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
144
|
-
} catch (e) {
|
|
145
|
-
settings = {};
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Initialize hooks structure
|
|
150
|
-
if (!settings.hooks) settings.hooks = {};
|
|
151
|
-
if (!settings.hooks.PreToolUse) settings.hooks.PreToolUse = [];
|
|
152
|
-
|
|
153
|
-
// Define damage control hooks
|
|
154
|
-
const damageControlHooks = [
|
|
155
|
-
{
|
|
156
|
-
matcher: 'Bash',
|
|
157
|
-
hooks: [
|
|
158
|
-
{
|
|
159
|
-
type: 'command',
|
|
160
|
-
command:
|
|
161
|
-
'node $CLAUDE_PROJECT_DIR/.claude/hooks/damage-control/bash-tool-damage-control.js',
|
|
162
|
-
timeout: 5000,
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
matcher: 'Edit',
|
|
168
|
-
hooks: [
|
|
169
|
-
{
|
|
170
|
-
type: 'command',
|
|
171
|
-
command:
|
|
172
|
-
'node $CLAUDE_PROJECT_DIR/.claude/hooks/damage-control/edit-tool-damage-control.js',
|
|
173
|
-
timeout: 5000,
|
|
174
|
-
},
|
|
175
|
-
],
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
matcher: 'Write',
|
|
179
|
-
hooks: [
|
|
180
|
-
{
|
|
181
|
-
type: 'command',
|
|
182
|
-
command:
|
|
183
|
-
'node $CLAUDE_PROJECT_DIR/.claude/hooks/damage-control/write-tool-damage-control.js',
|
|
184
|
-
timeout: 5000,
|
|
185
|
-
},
|
|
186
|
-
],
|
|
187
|
-
},
|
|
188
|
-
];
|
|
189
|
-
|
|
190
|
-
// Merge with existing hooks (don't duplicate)
|
|
191
|
-
for (const newHook of damageControlHooks) {
|
|
192
|
-
const existingIdx = settings.hooks.PreToolUse.findIndex(h => h.matcher === newHook.matcher);
|
|
193
|
-
if (existingIdx === -1) {
|
|
194
|
-
// No existing matcher, add new
|
|
195
|
-
settings.hooks.PreToolUse.push(newHook);
|
|
196
|
-
} else {
|
|
197
|
-
// Existing matcher, merge hooks array
|
|
198
|
-
const existing = settings.hooks.PreToolUse[existingIdx];
|
|
199
|
-
if (!existing.hooks) existing.hooks = [];
|
|
200
|
-
|
|
201
|
-
// Check if damage control hook already exists
|
|
202
|
-
const dcHook = newHook.hooks[0];
|
|
203
|
-
const hasDcHook = existing.hooks.some(
|
|
204
|
-
h => h.type === 'command' && h.command && h.command.includes('damage-control')
|
|
205
|
-
);
|
|
206
|
-
|
|
207
|
-
if (!hasDcHook) {
|
|
208
|
-
// Add at beginning for priority
|
|
209
|
-
existing.hooks.unshift(dcHook);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Write settings
|
|
215
|
-
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Setup SessionStart hooks (welcome, archive, context-loader)
|
|
220
|
-
* @param {string} projectDir - Project directory
|
|
221
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
222
|
-
* @param {string} claudeDir - .claude directory path
|
|
223
|
-
* @param {Object} options - Setup options
|
|
224
|
-
*/
|
|
225
|
-
async setupSessionStartHooks(projectDir, agileflowDir, claudeDir, options = {}) {
|
|
226
|
-
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
227
|
-
let settings = {};
|
|
228
|
-
|
|
229
|
-
// Load existing settings
|
|
230
|
-
if (fs.existsSync(settingsPath)) {
|
|
231
|
-
try {
|
|
232
|
-
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
233
|
-
} catch (e) {
|
|
234
|
-
settings = {};
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Initialize hooks structure
|
|
239
|
-
if (!settings.hooks) settings.hooks = {};
|
|
240
|
-
if (!settings.hooks.SessionStart) settings.hooks.SessionStart = [];
|
|
241
|
-
|
|
242
|
-
// Define SessionStart hooks
|
|
243
|
-
// babysit-clear-restore MUST run before welcome to set last_precompact_at flag
|
|
244
|
-
const sessionStartHooks = [
|
|
245
|
-
{
|
|
246
|
-
type: 'command',
|
|
247
|
-
command:
|
|
248
|
-
'node $CLAUDE_PROJECT_DIR/.agileflow/scripts/babysit-clear-restore.js 2>/dev/null || true',
|
|
249
|
-
timeout: 5000,
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
type: 'command',
|
|
253
|
-
command:
|
|
254
|
-
'node $CLAUDE_PROJECT_DIR/.agileflow/scripts/agileflow-welcome.js 2>/dev/null || true',
|
|
255
|
-
timeout: 10000,
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
type: 'command',
|
|
259
|
-
command:
|
|
260
|
-
'bash $CLAUDE_PROJECT_DIR/.agileflow/scripts/archive-completed-stories.sh --quiet 2>/dev/null || true',
|
|
261
|
-
timeout: 10000,
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
type: 'command',
|
|
265
|
-
command:
|
|
266
|
-
'node $CLAUDE_PROJECT_DIR/.agileflow/scripts/context-loader.js 2>/dev/null || true',
|
|
267
|
-
timeout: 5000,
|
|
268
|
-
},
|
|
269
|
-
];
|
|
270
|
-
|
|
271
|
-
// Check if SessionStart hooks already exist
|
|
272
|
-
const existingEntry = settings.hooks.SessionStart.find(
|
|
273
|
-
h => h.matcher === '' || h.matcher === undefined
|
|
274
|
-
);
|
|
275
|
-
|
|
276
|
-
if (existingEntry) {
|
|
277
|
-
// Merge hooks - add any missing
|
|
278
|
-
if (!existingEntry.hooks) existingEntry.hooks = [];
|
|
279
|
-
|
|
280
|
-
for (const newHook of sessionStartHooks) {
|
|
281
|
-
const alreadyExists = existingEntry.hooks.some(
|
|
282
|
-
h => h.command && h.command.includes(newHook.command.split('/').pop().split(' ')[0])
|
|
283
|
-
);
|
|
284
|
-
if (!alreadyExists) {
|
|
285
|
-
existingEntry.hooks.push(newHook);
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
} else {
|
|
289
|
-
// Add new entry
|
|
290
|
-
settings.hooks.SessionStart.push({
|
|
291
|
-
matcher: '',
|
|
292
|
-
hooks: sessionStartHooks,
|
|
293
|
-
});
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// Write settings
|
|
297
|
-
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
298
|
-
console.log(
|
|
299
|
-
chalk.dim(` - SessionStart hooks: babysit-restore, welcome, archive, context-loader`)
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Setup PostToolUse hooks for native Agent Teams observability.
|
|
305
|
-
* Registers native-team-observer.js for TeamCreate, SendMessage, ListTeams.
|
|
306
|
-
* @param {string} projectDir - Project directory
|
|
307
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
308
|
-
* @param {string} claudeDir - .claude directory path
|
|
309
|
-
* @param {Object} options - Setup options
|
|
310
|
-
*/
|
|
311
|
-
async setupPostToolUseHooks(projectDir, agileflowDir, claudeDir, options = {}) {
|
|
312
|
-
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
313
|
-
let settings = {};
|
|
314
|
-
|
|
315
|
-
if (fs.existsSync(settingsPath)) {
|
|
316
|
-
try {
|
|
317
|
-
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
318
|
-
} catch (e) {
|
|
319
|
-
settings = {};
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
if (!settings.hooks) settings.hooks = {};
|
|
324
|
-
if (!settings.hooks.PostToolUse) settings.hooks.PostToolUse = [];
|
|
325
|
-
|
|
326
|
-
const observerCommand = 'node $CLAUDE_PROJECT_DIR/.agileflow/scripts/native-team-observer.js';
|
|
327
|
-
|
|
328
|
-
const postToolUseHooks = [
|
|
329
|
-
{
|
|
330
|
-
matcher: 'TeamCreate',
|
|
331
|
-
hooks: [{ type: 'command', command: observerCommand, timeout: 5000 }],
|
|
332
|
-
},
|
|
333
|
-
{
|
|
334
|
-
matcher: 'SendMessage',
|
|
335
|
-
hooks: [{ type: 'command', command: observerCommand, timeout: 5000 }],
|
|
336
|
-
},
|
|
337
|
-
{
|
|
338
|
-
matcher: 'ListTeams',
|
|
339
|
-
hooks: [{ type: 'command', command: observerCommand, timeout: 5000 }],
|
|
340
|
-
},
|
|
341
|
-
];
|
|
342
|
-
|
|
343
|
-
// Merge with existing hooks (don't duplicate)
|
|
344
|
-
for (const newHook of postToolUseHooks) {
|
|
345
|
-
const existingIdx = settings.hooks.PostToolUse.findIndex(h => h.matcher === newHook.matcher);
|
|
346
|
-
if (existingIdx === -1) {
|
|
347
|
-
settings.hooks.PostToolUse.push(newHook);
|
|
348
|
-
} else {
|
|
349
|
-
const existing = settings.hooks.PostToolUse[existingIdx];
|
|
350
|
-
if (!existing.hooks) existing.hooks = [];
|
|
351
|
-
const hasObserver = existing.hooks.some(
|
|
352
|
-
h => h.type === 'command' && h.command && h.command.includes('native-team-observer')
|
|
353
|
-
);
|
|
354
|
-
if (!hasObserver) {
|
|
355
|
-
existing.hooks.push(newHook.hooks[0]);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
361
|
-
console.log(
|
|
362
|
-
chalk.dim(
|
|
363
|
-
` - PostToolUse hooks: native team observer (TeamCreate, SendMessage, ListTeams)`
|
|
364
|
-
)
|
|
365
|
-
);
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* Remove AgileFlow command duplicates from user-level ~/.claude/commands/
|
|
370
|
-
* When the same command exists in both ~/.claude/commands/ and
|
|
371
|
-
* <project>/.claude/commands/agileflow/, Claude Code shows duplicates.
|
|
372
|
-
* @param {string} agileflowDir - AgileFlow installation directory (to get command names)
|
|
373
|
-
*/
|
|
374
|
-
async removeUserLevelDuplicates(agileflowDir) {
|
|
375
|
-
const os = require('os');
|
|
376
|
-
const userCommandsDir = path.join(os.homedir(), '.claude', 'commands');
|
|
377
|
-
|
|
378
|
-
if (!(await fs.pathExists(userCommandsDir))) return;
|
|
379
|
-
|
|
380
|
-
// Collect AgileFlow command names from source
|
|
381
|
-
const agileflowNames = new Set();
|
|
382
|
-
const commandsSource = path.join(agileflowDir, 'commands');
|
|
383
|
-
const agentsSource = path.join(agileflowDir, 'agents');
|
|
384
|
-
|
|
385
|
-
for (const sourceDir of [commandsSource, agentsSource]) {
|
|
386
|
-
if (await fs.pathExists(sourceDir)) {
|
|
387
|
-
const entries = await fs.readdir(sourceDir, { withFileTypes: true });
|
|
388
|
-
for (const entry of entries) {
|
|
389
|
-
agileflowNames.add(entry.name);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
if (agileflowNames.size === 0) return;
|
|
395
|
-
|
|
396
|
-
// Check for agileflow-related items in user-level commands
|
|
397
|
-
let removedCount = 0;
|
|
398
|
-
const entries = await fs.readdir(userCommandsDir, { withFileTypes: true });
|
|
399
|
-
|
|
400
|
-
for (const entry of entries) {
|
|
401
|
-
// Only remove items that match AgileFlow command names
|
|
402
|
-
if (agileflowNames.has(entry.name)) {
|
|
403
|
-
const duplicatePath = path.join(userCommandsDir, entry.name);
|
|
404
|
-
try {
|
|
405
|
-
await fs.remove(duplicatePath);
|
|
406
|
-
removedCount++;
|
|
407
|
-
} catch {
|
|
408
|
-
// Best effort - don't fail setup over cleanup
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
// Also remove any agileflow/ subfolder from user-level commands
|
|
414
|
-
for (const folderName of ['agileflow', 'AgileFlow']) {
|
|
415
|
-
const userAgileflowDir = path.join(userCommandsDir, folderName);
|
|
416
|
-
if (await fs.pathExists(userAgileflowDir)) {
|
|
417
|
-
try {
|
|
418
|
-
await fs.remove(userAgileflowDir);
|
|
419
|
-
removedCount++;
|
|
420
|
-
} catch {
|
|
421
|
-
// Best effort
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
if (removedCount > 0) {
|
|
427
|
-
console.log(chalk.dim(` - Removed ${removedCount} duplicate(s) from ~/.claude/commands/`));
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
module.exports = { ClaudeCodeSetup };
|