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
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agileflow status` — print install state, enabled plugins, hook health.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1 stub: prints version + config summary if present. Hook health,
|
|
5
|
+
* plugin state beyond `enabled` flag, and integrity counts land in Phase 5.
|
|
6
|
+
*/
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const pkg = require('../../../package.json');
|
|
9
|
+
const { loadConfig } = require('../../runtime/config/loader.js');
|
|
10
|
+
|
|
11
|
+
/** @param {{ json?: boolean }} options */
|
|
12
|
+
async function status(options = {}) {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const result = await loadConfig(cwd);
|
|
15
|
+
|
|
16
|
+
const summary = {
|
|
17
|
+
version: pkg.version,
|
|
18
|
+
cwd,
|
|
19
|
+
configPath: result.path || null,
|
|
20
|
+
configSource: result.source, // 'file' | 'defaults'
|
|
21
|
+
plugins: Object.entries(result.config.plugins || {})
|
|
22
|
+
.filter(([, v]) => v && v.enabled)
|
|
23
|
+
.map(([id]) => id),
|
|
24
|
+
personalization: result.config.personalization,
|
|
25
|
+
phase: 'Phase 2a — wizard ready; installer sync engine + hooks + content pending (Phase 2b+)',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
if (options.json) {
|
|
29
|
+
// eslint-disable-next-line no-console
|
|
30
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const lines = [
|
|
35
|
+
`agileflow v${summary.version}`,
|
|
36
|
+
`cwd: ${summary.cwd}`,
|
|
37
|
+
`config: ${summary.configPath ? path.relative(cwd, summary.configPath) : '(defaults — no agileflow.config.json found)'}`,
|
|
38
|
+
`plugins: ${summary.plugins.length ? summary.plugins.join(', ') : '(none enabled — core is default)'}`,
|
|
39
|
+
`tone: ${summary.personalization.tone}`,
|
|
40
|
+
`ask: ${summary.personalization.ask_level}`,
|
|
41
|
+
`phase: ${summary.phase}`,
|
|
42
|
+
];
|
|
43
|
+
// eslint-disable-next-line no-console
|
|
44
|
+
console.log(lines.join('\n'));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = status;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agileflow update` — re-run the installer for the currently-enabled
|
|
3
|
+
* plugin set, no prompts.
|
|
4
|
+
*
|
|
5
|
+
* Use cases:
|
|
6
|
+
* - User edited `agileflow.config.json` directly and wants to apply
|
|
7
|
+
* it without re-running the wizard.
|
|
8
|
+
* - CI step that ensures `.agileflow/` is in sync with the committed
|
|
9
|
+
* `agileflow.config.json`.
|
|
10
|
+
* - User installed a new bundled plugin via `enable` and wants the
|
|
11
|
+
* content materialized.
|
|
12
|
+
*
|
|
13
|
+
* Always non-interactive. Exits non-zero on validation / install
|
|
14
|
+
* failure.
|
|
15
|
+
*/
|
|
16
|
+
const path = require("path");
|
|
17
|
+
const pkg = require("../../../package.json");
|
|
18
|
+
const { loadConfig } = require("../../runtime/config/loader.js");
|
|
19
|
+
const { discoverPlugins } = require("../../runtime/plugins/registry.js");
|
|
20
|
+
const { installPlugins } = require("../../runtime/installer/install.js");
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @param {{ force?: boolean }} options
|
|
24
|
+
*/
|
|
25
|
+
async function update(options = {}) {
|
|
26
|
+
const cwd = process.cwd();
|
|
27
|
+
|
|
28
|
+
let existing;
|
|
29
|
+
try {
|
|
30
|
+
existing = await loadConfig(cwd);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
// eslint-disable-next-line no-console
|
|
33
|
+
console.error(`agileflow update: ${err.message}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (existing.source === "defaults") {
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.error(
|
|
40
|
+
"agileflow update: no agileflow.config.json found. Run `agileflow setup` first.",
|
|
41
|
+
);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const enabled = Object.entries(existing.config.plugins || {})
|
|
46
|
+
.filter(([, v]) => v && v.enabled)
|
|
47
|
+
.map(([id]) => id);
|
|
48
|
+
|
|
49
|
+
// userSelected excludes core (cannotDisable handles it).
|
|
50
|
+
const userSelected = enabled.filter((id) => id !== "core");
|
|
51
|
+
|
|
52
|
+
let result;
|
|
53
|
+
try {
|
|
54
|
+
result = await installPlugins({
|
|
55
|
+
discovered: discoverPlugins(),
|
|
56
|
+
userSelected,
|
|
57
|
+
agileflowDir: path.join(cwd, ".agileflow"),
|
|
58
|
+
cliVersion: pkg.version,
|
|
59
|
+
ide: existing.config.ide.primary,
|
|
60
|
+
behaviors: existing.config.behaviors,
|
|
61
|
+
force: Boolean(options.force),
|
|
62
|
+
});
|
|
63
|
+
} catch (err) {
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.error(`agileflow update: install failed: ${err.message}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// eslint-disable-next-line no-console
|
|
70
|
+
console.log(`✓ Updated ${enabled.length} plugin(s): ${enabled.join(", ")}`);
|
|
71
|
+
// eslint-disable-next-line no-console
|
|
72
|
+
console.log(
|
|
73
|
+
` created=${result.ops.created} updated=${result.ops.updated} unchanged=${result.ops.unchanged} preserved=${result.ops.preserved} removed=${result.ops.removed}`,
|
|
74
|
+
);
|
|
75
|
+
if (result.ops.preserved > 0 && result.ops.updatesPath) {
|
|
76
|
+
// eslint-disable-next-line no-console
|
|
77
|
+
console.log(
|
|
78
|
+
` ${result.ops.preserved} file(s) preserved — review ${result.ops.updatesPath}/`,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
module.exports = update;
|
package/src/cli/index.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI dispatcher — wires commander up with the v4 command surface.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1 ships `status`, `setup` (stub), and `doctor` (stub). Phase 2 adds
|
|
5
|
+
* `enable`, `disable`, and a real `setup`. Phase 5 adds `uninstall`.
|
|
6
|
+
*/
|
|
7
|
+
const { Command } = require('commander');
|
|
8
|
+
const pkg = require('../../package.json');
|
|
9
|
+
|
|
10
|
+
const status = require('./commands/status.js');
|
|
11
|
+
const setup = require('./commands/setup.js');
|
|
12
|
+
const update = require('./commands/update.js');
|
|
13
|
+
const doctor = require('./commands/doctor.js');
|
|
14
|
+
const hook = require('./commands/hook.js');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Build the commander program. Exported so tests can construct it without
|
|
18
|
+
* parsing argv.
|
|
19
|
+
* @returns {Command}
|
|
20
|
+
*/
|
|
21
|
+
function buildProgram() {
|
|
22
|
+
const program = new Command();
|
|
23
|
+
|
|
24
|
+
program
|
|
25
|
+
.name('agileflow')
|
|
26
|
+
.description('AgileFlow v4 — skills-first agile toolkit for Claude Code')
|
|
27
|
+
.version(pkg.version, '-v, --version', 'print version');
|
|
28
|
+
|
|
29
|
+
program
|
|
30
|
+
.command('status')
|
|
31
|
+
.description('print install state, enabled plugins, and hook health')
|
|
32
|
+
.option('--json', 'output machine-readable JSON')
|
|
33
|
+
.action(status);
|
|
34
|
+
|
|
35
|
+
program
|
|
36
|
+
.command('setup')
|
|
37
|
+
.description('run interactive install wizard')
|
|
38
|
+
.option('--yes', 'skip prompts, install with defaults')
|
|
39
|
+
.option('--plugins <ids>', 'comma-separated plugin list to enable')
|
|
40
|
+
.option('--ide <id>', 'target IDE / CLI: claude-code | cursor | windsurf | codex', 'claude-code')
|
|
41
|
+
.action(setup);
|
|
42
|
+
|
|
43
|
+
program
|
|
44
|
+
.command('update')
|
|
45
|
+
.description('re-install plugins from the current agileflow.config.json (no prompts)')
|
|
46
|
+
.option('--force', 'overwrite local modifications instead of preserving them')
|
|
47
|
+
.action(update);
|
|
48
|
+
|
|
49
|
+
program
|
|
50
|
+
.command('doctor')
|
|
51
|
+
.description('validate config, plugins, skills, and hook manifest (Phase 5)')
|
|
52
|
+
.action(doctor);
|
|
53
|
+
|
|
54
|
+
program
|
|
55
|
+
.command('hook <event>')
|
|
56
|
+
.description('internal: dispatch a Claude Code hook event (used by settings.json)')
|
|
57
|
+
.option('--matcher <name>', 'tool name for tool-related events (Bash / Edit / Write / etc.)')
|
|
58
|
+
.action(hook);
|
|
59
|
+
|
|
60
|
+
return program;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Execute the CLI against the given argv.
|
|
65
|
+
* @param {string[]} argv
|
|
66
|
+
* @returns {Promise<void>}
|
|
67
|
+
*/
|
|
68
|
+
async function run(argv) {
|
|
69
|
+
const program = buildProgram();
|
|
70
|
+
await program.parseAsync(argv);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = { buildProgram, run };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Behaviors picker — curated multiselect for the 4 hook-driven presets.
|
|
3
|
+
*
|
|
4
|
+
* Behaviors map 1:N to hooks declared in plugin manifests via the
|
|
5
|
+
* `behavior: <key>` field. Disabling a behavior here excludes its hooks
|
|
6
|
+
* from the generated `.agileflow/hook-manifest.yaml` at install time.
|
|
7
|
+
*
|
|
8
|
+
* Pure logic lives in `buildBehaviorsMap()` so it can be unit-tested
|
|
9
|
+
* without spawning a TTY.
|
|
10
|
+
*/
|
|
11
|
+
const prompts = require("@clack/prompts");
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @typedef {import('../../runtime/config/defaults.js').Behaviors} Behaviors
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Stable list of presets surfaced in the wizard, in display order. */
|
|
18
|
+
const BEHAVIOR_OPTIONS = [
|
|
19
|
+
{
|
|
20
|
+
key: "loadContext",
|
|
21
|
+
label: "Load project context at session start",
|
|
22
|
+
hint: "SessionStart hook prints stories, dirty files, and recent commits so Claude has project context immediately.",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: "babysitDefault",
|
|
26
|
+
label: "Activate Babysit mentor by default",
|
|
27
|
+
hint: "SessionStart hook injects the mentor pattern so Claude defaults to mentor mode without /agileflow:babysit.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
key: "damageControl",
|
|
31
|
+
label: "Damage control on Bash, Edit, Write",
|
|
32
|
+
hint: "PreToolUse hooks block dangerous commands (rm -rf /, fork bombs) and risky writes (.env, .ssh/) — fail-closed.",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
key: "preCompactState",
|
|
36
|
+
label: "Save context before compaction",
|
|
37
|
+
hint: "PreCompact hook dumps active stories, current command, and dirty git state so they survive compaction.",
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Build a complete Behaviors map from a set of selected keys, falling
|
|
43
|
+
* back to current values for any key not represented in the selection
|
|
44
|
+
* input. Missing keys default to `false` (the user actively saw the
|
|
45
|
+
* option and chose not to enable it).
|
|
46
|
+
*
|
|
47
|
+
* @param {Iterable<string>} selectedKeys
|
|
48
|
+
* @returns {Behaviors}
|
|
49
|
+
*/
|
|
50
|
+
function buildBehaviorsMap(selectedKeys) {
|
|
51
|
+
const set = new Set(selectedKeys);
|
|
52
|
+
/** @type {Behaviors} */
|
|
53
|
+
const result = {
|
|
54
|
+
loadContext: set.has("loadContext"),
|
|
55
|
+
babysitDefault: set.has("babysitDefault"),
|
|
56
|
+
damageControl: set.has("damageControl"),
|
|
57
|
+
preCompactState: set.has("preCompactState"),
|
|
58
|
+
};
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Pre-check options whose keys are currently enabled (or — when no
|
|
64
|
+
* existing config — fall back to the preset's enabledByDefault). The
|
|
65
|
+
* default-on shape lives in `defaults.js`; this just reads it.
|
|
66
|
+
*
|
|
67
|
+
* @param {Partial<Behaviors>} [current]
|
|
68
|
+
* @returns {string[]}
|
|
69
|
+
*/
|
|
70
|
+
function initialSelectedKeys(current) {
|
|
71
|
+
if (!current) return BEHAVIOR_OPTIONS.map((o) => o.key);
|
|
72
|
+
return BEHAVIOR_OPTIONS.filter((o) => current[o.key] !== false).map(
|
|
73
|
+
(o) => o.key,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Interactive picker. Returns a complete Behaviors object.
|
|
79
|
+
*
|
|
80
|
+
* @param {Partial<Behaviors>} [currentBehaviors]
|
|
81
|
+
* @returns {Promise<Behaviors>}
|
|
82
|
+
*/
|
|
83
|
+
async function pickBehaviors(currentBehaviors) {
|
|
84
|
+
const picked = await prompts.multiselect({
|
|
85
|
+
message: "Which behaviors should AgileFlow run? (Recommended: all)",
|
|
86
|
+
options: BEHAVIOR_OPTIONS.map((o) => ({
|
|
87
|
+
value: o.key,
|
|
88
|
+
label: o.label,
|
|
89
|
+
hint: o.hint,
|
|
90
|
+
})),
|
|
91
|
+
initialValues: initialSelectedKeys(currentBehaviors),
|
|
92
|
+
required: false,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
if (prompts.isCancel(picked)) {
|
|
96
|
+
prompts.cancel("Setup cancelled. No changes made.");
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return buildBehaviorsMap(/** @type {string[]} */ (picked));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
module.exports = {
|
|
104
|
+
pickBehaviors,
|
|
105
|
+
buildBehaviorsMap,
|
|
106
|
+
initialSelectedKeys,
|
|
107
|
+
BEHAVIOR_OPTIONS,
|
|
108
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IDE / CLI picker — Clack select prompt.
|
|
3
|
+
*
|
|
4
|
+
* Asks the user which agentic IDE or CLI they're targeting. Defaults to
|
|
5
|
+
* Claude Code (the full-feature target). The choice is persisted to
|
|
6
|
+
* `agileflow.config.json` at `ide.primary` and gates which plugin
|
|
7
|
+
* content the installer writes (hooks, skills, etc. — see
|
|
8
|
+
* `runtime/ide/capabilities.js`).
|
|
9
|
+
*/
|
|
10
|
+
const prompts = require('@clack/prompts');
|
|
11
|
+
const {
|
|
12
|
+
IDE_CAPABILITIES,
|
|
13
|
+
SUPPORTED_IDES,
|
|
14
|
+
capabilitiesFor,
|
|
15
|
+
} = require('../../runtime/ide/capabilities.js');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @param {string} currentIde - existing config's ide.primary
|
|
19
|
+
* @returns {Promise<string>} selected ide id
|
|
20
|
+
*/
|
|
21
|
+
async function pickIde(currentIde) {
|
|
22
|
+
const initialValue = SUPPORTED_IDES.includes(currentIde) ? currentIde : 'claude-code';
|
|
23
|
+
|
|
24
|
+
const choice = await prompts.select({
|
|
25
|
+
message: 'Which IDE / CLI are you using?',
|
|
26
|
+
options: SUPPORTED_IDES.map((id) => {
|
|
27
|
+
const caps = IDE_CAPABILITIES[id];
|
|
28
|
+
const featureList = ['hooks', 'skills', 'commands', 'agents', 'mcp']
|
|
29
|
+
.filter((f) => caps[f])
|
|
30
|
+
.join(', ');
|
|
31
|
+
return {
|
|
32
|
+
value: id,
|
|
33
|
+
label: caps.description,
|
|
34
|
+
hint: featureList ? `enables: ${featureList}` : '(very limited support)',
|
|
35
|
+
};
|
|
36
|
+
}),
|
|
37
|
+
initialValue,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
if (prompts.isCancel(choice)) {
|
|
41
|
+
prompts.cancel('Setup cancelled. No changes made.');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const caps = capabilitiesFor(/** @type {string} */ (choice));
|
|
46
|
+
const disabled = ['hooks', 'skills', 'commands', 'agents']
|
|
47
|
+
.filter((f) => !caps[f]);
|
|
48
|
+
if (disabled.length) {
|
|
49
|
+
prompts.log.warn(
|
|
50
|
+
`${choice}: ${disabled.join(', ')} won't be installed (not supported by this IDE).`,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return /** @type {string} */ (choice);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
module.exports = { pickIde };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Personalization prompts — three Clack selects for tone, ask-level, verbosity.
|
|
3
|
+
*
|
|
4
|
+
* v4.0-alpha scope: three enum flags that render into a short
|
|
5
|
+
* `{{PERSONALIZATION_BLOCK}}` in each installed SKILL.md (the renderer lands
|
|
6
|
+
* in Phase 5). ADR-0015 covers the future XML-tag matrix.
|
|
7
|
+
*/
|
|
8
|
+
const prompts = require('@clack/prompts');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @param {import('../../runtime/config/defaults.js').Personalization} current
|
|
12
|
+
* @returns {Promise<import('../../runtime/config/defaults.js').Personalization>}
|
|
13
|
+
*/
|
|
14
|
+
async function personalizationPrompts(current) {
|
|
15
|
+
const tone = await prompts.select({
|
|
16
|
+
message: 'How should AgileFlow respond?',
|
|
17
|
+
options: [
|
|
18
|
+
{ value: 'concise', label: 'Concise', hint: 'Tight answers, low ceremony' },
|
|
19
|
+
{ value: 'detailed', label: 'Detailed', hint: 'More context and explanation' },
|
|
20
|
+
{ value: 'teaching', label: 'Teaching', hint: 'Walk through the why' },
|
|
21
|
+
],
|
|
22
|
+
initialValue: current.tone,
|
|
23
|
+
});
|
|
24
|
+
if (prompts.isCancel(tone)) {
|
|
25
|
+
prompts.cancel('Setup cancelled. No changes made.');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const askLevel = await prompts.select({
|
|
30
|
+
message: 'When should AgileFlow ask for confirmation?',
|
|
31
|
+
options: [
|
|
32
|
+
{ value: 'none', label: 'Never', hint: 'Fully autonomous' },
|
|
33
|
+
{ value: 'decision_points', label: 'At decision points', hint: 'Standard' },
|
|
34
|
+
{ value: 'always', label: 'Always', hint: 'Confirm before each step' },
|
|
35
|
+
],
|
|
36
|
+
initialValue: current.ask_level,
|
|
37
|
+
});
|
|
38
|
+
if (prompts.isCancel(askLevel)) {
|
|
39
|
+
prompts.cancel('Setup cancelled. No changes made.');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const verbosity = await prompts.select({
|
|
44
|
+
message: 'Output length preference?',
|
|
45
|
+
options: [
|
|
46
|
+
{ value: 'low', label: 'Low', hint: 'Short responses' },
|
|
47
|
+
{ value: 'medium', label: 'Medium', hint: 'Balanced' },
|
|
48
|
+
{ value: 'high', label: 'High', hint: 'Full context' },
|
|
49
|
+
],
|
|
50
|
+
initialValue: current.verbosity,
|
|
51
|
+
});
|
|
52
|
+
if (prompts.isCancel(verbosity)) {
|
|
53
|
+
prompts.cancel('Setup cancelled. No changes made.');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
tone: /** @type {any} */ (tone),
|
|
59
|
+
ask_level: /** @type {any} */ (askLevel),
|
|
60
|
+
verbosity: /** @type {any} */ (verbosity),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
module.exports = { personalizationPrompts };
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin picker — Clack multiselect driven by the plugin registry.
|
|
3
|
+
*
|
|
4
|
+
* Exports a pure `buildPluginsMap()` helper used by both the interactive
|
|
5
|
+
* wizard and the non-interactive `--yes` path. The helper:
|
|
6
|
+
* - forces cannotDisable plugins (core) to enabled
|
|
7
|
+
* - marks the user-picked opt-ins as enabled
|
|
8
|
+
* - marks the rest of discovered opt-ins as disabled
|
|
9
|
+
* - PRESERVES any custom (non-discovered) plugin entries from the
|
|
10
|
+
* existing config, so wizard reruns don't silently drop user edits
|
|
11
|
+
*
|
|
12
|
+
* Cancellation (Ctrl+C / Esc) exits with code 1 (not 0) so CI can tell
|
|
13
|
+
* the difference between success and user abort.
|
|
14
|
+
*/
|
|
15
|
+
const prompts = require('@clack/prompts');
|
|
16
|
+
const { discoverPlugins } = require('../../runtime/plugins/registry.js');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {Array<{id:string, cannotDisable?:boolean}>} discovered
|
|
20
|
+
* @param {Set<string>} selectedOptionalIds
|
|
21
|
+
* @param {Record<string, {enabled:boolean, settings?:any}>} [existingPluginsMap]
|
|
22
|
+
* @returns {Record<string, { enabled: boolean, settings?: any }>}
|
|
23
|
+
*/
|
|
24
|
+
function buildPluginsMap(discovered, selectedOptionalIds, existingPluginsMap = {}) {
|
|
25
|
+
/** @type {Record<string, { enabled: boolean, settings?: any }>} */
|
|
26
|
+
const result = {};
|
|
27
|
+
for (const p of discovered) {
|
|
28
|
+
/** @type {{ enabled: boolean, settings?: any }} */
|
|
29
|
+
const entry = {
|
|
30
|
+
enabled: Boolean(p.cannotDisable) || selectedOptionalIds.has(p.id),
|
|
31
|
+
};
|
|
32
|
+
// Preserve `settings` sub-object across wizard reruns: enable/disable
|
|
33
|
+
// is recomputed each time from the user's picker choices, but any
|
|
34
|
+
// per-plugin settings (e.g. seo.settings.crawlDepth) are keyed by
|
|
35
|
+
// plugin id and should survive untouched.
|
|
36
|
+
const existing = (existingPluginsMap || {})[p.id];
|
|
37
|
+
if (
|
|
38
|
+
existing &&
|
|
39
|
+
typeof existing === 'object' &&
|
|
40
|
+
!Array.isArray(existing) &&
|
|
41
|
+
existing.settings
|
|
42
|
+
) {
|
|
43
|
+
entry.settings = existing.settings;
|
|
44
|
+
}
|
|
45
|
+
result[p.id] = entry;
|
|
46
|
+
}
|
|
47
|
+
// Preserve unknown (custom / user-added) plugin entries from existing config.
|
|
48
|
+
// Arrays are rejected — they pass `typeof === 'object'` but would break any
|
|
49
|
+
// downstream code that reads `entry.enabled` as a property.
|
|
50
|
+
for (const [id, entry] of Object.entries(existingPluginsMap || {})) {
|
|
51
|
+
if (
|
|
52
|
+
!(id in result) &&
|
|
53
|
+
entry &&
|
|
54
|
+
typeof entry === 'object' &&
|
|
55
|
+
!Array.isArray(entry)
|
|
56
|
+
) {
|
|
57
|
+
result[id] = entry;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {import('../../runtime/config/defaults.js').AgileflowConfig} currentConfig
|
|
65
|
+
* @returns {Promise<Record<string, { enabled: boolean }>>}
|
|
66
|
+
*/
|
|
67
|
+
async function pickPlugins(currentConfig) {
|
|
68
|
+
const all = discoverPlugins();
|
|
69
|
+
const required = all.filter((p) => p.cannotDisable);
|
|
70
|
+
const optional = all.filter((p) => !p.cannotDisable);
|
|
71
|
+
|
|
72
|
+
if (required.length) {
|
|
73
|
+
prompts.log.info(
|
|
74
|
+
`Always on: ${required.map((p) => `${p.name} (${p.id})`).join(', ')}`,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const initialValues = optional
|
|
79
|
+
.filter((p) => {
|
|
80
|
+
const existing = (currentConfig.plugins || {})[p.id];
|
|
81
|
+
if (existing && typeof existing.enabled === 'boolean') return existing.enabled;
|
|
82
|
+
return Boolean(p.enabledByDefault);
|
|
83
|
+
})
|
|
84
|
+
.map((p) => p.id);
|
|
85
|
+
|
|
86
|
+
const picked = await prompts.multiselect({
|
|
87
|
+
message: 'Select optional plugins to enable:',
|
|
88
|
+
options: optional.map((p) => ({
|
|
89
|
+
value: p.id,
|
|
90
|
+
label: p.name,
|
|
91
|
+
hint: p.description,
|
|
92
|
+
})),
|
|
93
|
+
initialValues,
|
|
94
|
+
required: false,
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
if (prompts.isCancel(picked)) {
|
|
98
|
+
prompts.cancel('Setup cancelled. No changes made.');
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const selectedOptionalIds = new Set(/** @type {string[]} */ (picked));
|
|
103
|
+
return buildPluginsMap(all, selectedOptionalIds, currentConfig.plugins || {});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
module.exports = { pickPlugins, buildPluginsMap };
|
package/src/lib/hash.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SHA256 helpers.
|
|
3
|
+
*
|
|
4
|
+
* `sha256Hex` accepts either a Buffer or a string. Strings are encoded as
|
|
5
|
+
* UTF-8 for hashing so the output is deterministic regardless of whether
|
|
6
|
+
* the caller holds a pre-rendered text string or the raw file bytes.
|
|
7
|
+
*/
|
|
8
|
+
const crypto = require('crypto');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {Buffer|string} content
|
|
13
|
+
* @returns {string} lowercase hex digest
|
|
14
|
+
* @throws {TypeError} if content is null or undefined
|
|
15
|
+
*/
|
|
16
|
+
function sha256Hex(content) {
|
|
17
|
+
if (content == null) {
|
|
18
|
+
throw new TypeError(
|
|
19
|
+
`sha256Hex: content must be Buffer or string, got ${content === null ? 'null' : 'undefined'}`,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
const buf = Buffer.isBuffer(content) ? content : Buffer.from(content, 'utf8');
|
|
23
|
+
return crypto.createHash('sha256').update(buf).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Hash a file on disk. Returns null if the file does not exist.
|
|
28
|
+
* @param {string} filePath
|
|
29
|
+
* @returns {Promise<string|null>}
|
|
30
|
+
*/
|
|
31
|
+
async function sha256File(filePath) {
|
|
32
|
+
try {
|
|
33
|
+
const data = await fs.promises.readFile(filePath);
|
|
34
|
+
return sha256Hex(data);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
if (err.code === 'ENOENT') return null;
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = { sha256Hex, sha256File };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default user config.
|
|
3
|
+
*
|
|
4
|
+
* Returned when `agileflow.config.json` is absent. Also merged into
|
|
5
|
+
* user-supplied config so missing sections get sensible defaults.
|
|
6
|
+
*
|
|
7
|
+
* @typedef {Object} Personalization
|
|
8
|
+
* @property {'concise'|'detailed'|'teaching'} tone
|
|
9
|
+
* @property {'none'|'decision_points'|'always'} ask_level
|
|
10
|
+
* @property {'low'|'medium'|'high'} verbosity
|
|
11
|
+
*
|
|
12
|
+
* @typedef {Object} PluginEntry
|
|
13
|
+
* @property {boolean} enabled
|
|
14
|
+
* @property {Record<string, unknown>} [settings]
|
|
15
|
+
*
|
|
16
|
+
* @typedef {Object} Behaviors
|
|
17
|
+
* @property {boolean} loadContext - SessionStart context dump
|
|
18
|
+
* @property {boolean} babysitDefault - HARD mentor mode at SessionStart
|
|
19
|
+
* @property {boolean} damageControl - PreToolUse guards on Bash/Edit/Write
|
|
20
|
+
* @property {boolean} preCompactState - PreCompact state preservation
|
|
21
|
+
*
|
|
22
|
+
* @typedef {Object} AgileflowConfig
|
|
23
|
+
* @property {1} version
|
|
24
|
+
* @property {Record<string, PluginEntry>} plugins
|
|
25
|
+
* @property {Record<string, { enabled?: boolean, timeout?: number, skipOnError?: boolean }>} hooks
|
|
26
|
+
* @property {Behaviors} behaviors
|
|
27
|
+
* @property {Personalization} personalization
|
|
28
|
+
* @property {{ primary: 'claude-code'|'cursor'|'windsurf'|'codex' }} ide
|
|
29
|
+
* @property {string} language
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** @returns {AgileflowConfig} */
|
|
33
|
+
function defaultConfig() {
|
|
34
|
+
return {
|
|
35
|
+
version: 1,
|
|
36
|
+
plugins: {
|
|
37
|
+
core: { enabled: true },
|
|
38
|
+
},
|
|
39
|
+
hooks: {},
|
|
40
|
+
behaviors: {
|
|
41
|
+
// Behaviors are presets that map to one or more hooks. The
|
|
42
|
+
// wizard surfaces these as a curated multiselect; advanced
|
|
43
|
+
// users can override individual hooks via the `hooks:` map.
|
|
44
|
+
loadContext: true,
|
|
45
|
+
babysitDefault: true,
|
|
46
|
+
damageControl: true,
|
|
47
|
+
preCompactState: true,
|
|
48
|
+
},
|
|
49
|
+
personalization: {
|
|
50
|
+
tone: "concise",
|
|
51
|
+
ask_level: "decision_points",
|
|
52
|
+
verbosity: "medium",
|
|
53
|
+
},
|
|
54
|
+
ide: {
|
|
55
|
+
primary: "claude-code",
|
|
56
|
+
},
|
|
57
|
+
language: "en",
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = { defaultConfig };
|