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,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Core hook: damage-control-bash (PreToolUse, matcher: Bash).
|
|
4
|
+
*
|
|
5
|
+
* Reads damage-control-patterns.yaml and rejects Bash commands that
|
|
6
|
+
* match an `error`-severity pattern of kind `bash`. `warn`-severity
|
|
7
|
+
* patterns log but do not block.
|
|
8
|
+
*
|
|
9
|
+
* Stdin payload (Claude Code-shaped):
|
|
10
|
+
* { tool_name: "Bash", tool_input: { command: "...", description: "..." } }
|
|
11
|
+
*
|
|
12
|
+
* Exit codes:
|
|
13
|
+
* 0 allow (default)
|
|
14
|
+
* 2 block (Claude Code surfaces stderr to the user)
|
|
15
|
+
*/
|
|
16
|
+
const fs = require("fs");
|
|
17
|
+
const path = require("path");
|
|
18
|
+
const yaml = require("js-yaml");
|
|
19
|
+
|
|
20
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
21
|
+
const patternsPath = path.join(
|
|
22
|
+
projectDir,
|
|
23
|
+
".agileflow/plugins/core/hooks/damage-control-patterns.yaml",
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
async function readStdin() {
|
|
27
|
+
const chunks = [];
|
|
28
|
+
for await (const c of process.stdin) chunks.push(c);
|
|
29
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function main() {
|
|
33
|
+
const raw = await readStdin();
|
|
34
|
+
let payload;
|
|
35
|
+
try {
|
|
36
|
+
payload = JSON.parse(raw);
|
|
37
|
+
} catch {
|
|
38
|
+
process.exit(0); // No payload, nothing to gate.
|
|
39
|
+
}
|
|
40
|
+
const command =
|
|
41
|
+
payload &&
|
|
42
|
+
payload.tool_input &&
|
|
43
|
+
typeof payload.tool_input.command === "string"
|
|
44
|
+
? payload.tool_input.command
|
|
45
|
+
: "";
|
|
46
|
+
if (!command) process.exit(0);
|
|
47
|
+
|
|
48
|
+
let patterns = [];
|
|
49
|
+
try {
|
|
50
|
+
const parsed = yaml.load(fs.readFileSync(patternsPath, "utf8"));
|
|
51
|
+
patterns = Array.isArray(parsed && parsed.patterns) ? parsed.patterns : [];
|
|
52
|
+
} catch {
|
|
53
|
+
process.exit(0); // No patterns file, fail open.
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const p of patterns) {
|
|
57
|
+
if (p.kind !== "bash") continue;
|
|
58
|
+
let re;
|
|
59
|
+
try {
|
|
60
|
+
re = new RegExp(p.regex, "i");
|
|
61
|
+
} catch {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (re.test(command)) {
|
|
65
|
+
if (p.severity === "error") {
|
|
66
|
+
process.stderr.write(
|
|
67
|
+
`agileflow damage-control: BLOCKED — ${p.reason}\n pattern: ${p.regex}\n command: ${command.slice(0, 200)}\n`,
|
|
68
|
+
);
|
|
69
|
+
process.exit(2);
|
|
70
|
+
}
|
|
71
|
+
// severity: warn — log, do not block
|
|
72
|
+
process.stderr.write(`agileflow damage-control: WARN — ${p.reason}\n`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
process.exit(0);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
main().catch(() => process.exit(0));
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Core hook: damage-control-edit (PreToolUse, matcher: Edit).
|
|
4
|
+
*
|
|
5
|
+
* Reads damage-control-patterns.yaml and rejects Edit operations whose
|
|
6
|
+
* file_path matches an `error`-severity pattern of kind `edit`.
|
|
7
|
+
*
|
|
8
|
+
* Stdin payload:
|
|
9
|
+
* { tool_name: "Edit", tool_input: { file_path: "...", old_string, new_string } }
|
|
10
|
+
*
|
|
11
|
+
* Exit codes: 0 allow, 2 block.
|
|
12
|
+
*/
|
|
13
|
+
const fs = require("fs");
|
|
14
|
+
const path = require("path");
|
|
15
|
+
const yaml = require("js-yaml");
|
|
16
|
+
|
|
17
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
18
|
+
const patternsPath = path.join(
|
|
19
|
+
projectDir,
|
|
20
|
+
".agileflow/plugins/core/hooks/damage-control-patterns.yaml",
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
async function readStdin() {
|
|
24
|
+
const chunks = [];
|
|
25
|
+
for await (const c of process.stdin) chunks.push(c);
|
|
26
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function main() {
|
|
30
|
+
const raw = await readStdin();
|
|
31
|
+
let payload;
|
|
32
|
+
try {
|
|
33
|
+
payload = JSON.parse(raw);
|
|
34
|
+
} catch {
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
const filePath =
|
|
38
|
+
payload &&
|
|
39
|
+
payload.tool_input &&
|
|
40
|
+
typeof payload.tool_input.file_path === "string"
|
|
41
|
+
? payload.tool_input.file_path
|
|
42
|
+
: "";
|
|
43
|
+
if (!filePath) process.exit(0);
|
|
44
|
+
|
|
45
|
+
let patterns = [];
|
|
46
|
+
try {
|
|
47
|
+
const parsed = yaml.load(fs.readFileSync(patternsPath, "utf8"));
|
|
48
|
+
patterns = Array.isArray(parsed && parsed.patterns) ? parsed.patterns : [];
|
|
49
|
+
} catch {
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
for (const p of patterns) {
|
|
54
|
+
if (p.kind !== "edit") continue;
|
|
55
|
+
let re;
|
|
56
|
+
try {
|
|
57
|
+
re = new RegExp(p.regex, "i");
|
|
58
|
+
} catch {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (re.test(filePath)) {
|
|
62
|
+
if (p.severity === "error") {
|
|
63
|
+
process.stderr.write(
|
|
64
|
+
`agileflow damage-control: BLOCKED edit — ${p.reason}\n path: ${filePath}\n`,
|
|
65
|
+
);
|
|
66
|
+
process.exit(2);
|
|
67
|
+
}
|
|
68
|
+
process.stderr.write(
|
|
69
|
+
`agileflow damage-control: WARN — ${p.reason} (path: ${filePath})\n`,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
process.exit(0);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
main().catch(() => process.exit(0));
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Damage control pattern library.
|
|
2
|
+
#
|
|
3
|
+
# The pre-Bash / pre-Edit / pre-Write hooks load this file and reject
|
|
4
|
+
# tool invocations whose payload matches any pattern below. Each entry
|
|
5
|
+
# explains WHY it's blocked so the error message can cite the rule.
|
|
6
|
+
#
|
|
7
|
+
# Pattern syntax:
|
|
8
|
+
# - `regex`: JS RegExp source (used with `new RegExp(pattern, 'i')`)
|
|
9
|
+
# - `kind`: one of bash | edit | write — which hook applies the rule
|
|
10
|
+
# - `severity`: error (block, exit 2) | warn (allow but log warning)
|
|
11
|
+
# - `reason`: human-readable rationale shown in the block message
|
|
12
|
+
#
|
|
13
|
+
# Adding a pattern: keep it surgical. False positives are worse than
|
|
14
|
+
# missed catches because they train users to bypass the guard.
|
|
15
|
+
|
|
16
|
+
patterns:
|
|
17
|
+
# --- Catastrophic filesystem operations ---
|
|
18
|
+
- regex: 'rm\s+-[a-zA-Z]*r[a-zA-Z]*f[a-zA-Z]*\s+(/|~|\$HOME)\b'
|
|
19
|
+
kind: bash
|
|
20
|
+
severity: error
|
|
21
|
+
reason: rm -rf on / or $HOME is almost certainly a mistake — refuse outright
|
|
22
|
+
|
|
23
|
+
- regex: 'rm\s+-[a-zA-Z]*[rfRF][a-zA-Z]*\s+/\*'
|
|
24
|
+
kind: bash
|
|
25
|
+
severity: error
|
|
26
|
+
reason: rm -rf /* deletes the entire filesystem
|
|
27
|
+
|
|
28
|
+
- regex: '\bdd\s+if=.*\s+of=/dev/(sd|nvme|hd)'
|
|
29
|
+
kind: bash
|
|
30
|
+
severity: error
|
|
31
|
+
reason: dd to a raw block device wipes the disk
|
|
32
|
+
|
|
33
|
+
- regex: '\bmkfs\.\w+\s+/dev/'
|
|
34
|
+
kind: bash
|
|
35
|
+
severity: error
|
|
36
|
+
reason: mkfs on a device formats it — destroys all data
|
|
37
|
+
|
|
38
|
+
- regex: '>\s*/dev/(sd|nvme|hd)\w+'
|
|
39
|
+
kind: bash
|
|
40
|
+
severity: error
|
|
41
|
+
reason: writing directly to a block device corrupts the disk
|
|
42
|
+
|
|
43
|
+
- regex: ':\(\)\{\s*:\|:\&\s*\};:'
|
|
44
|
+
kind: bash
|
|
45
|
+
severity: error
|
|
46
|
+
reason: classic fork bomb
|
|
47
|
+
|
|
48
|
+
# --- Risky git operations ---
|
|
49
|
+
- regex: 'git\s+push\s+.*--force(\s|$)'
|
|
50
|
+
kind: bash
|
|
51
|
+
severity: warn
|
|
52
|
+
reason: force push can rewrite shared history — confirm intent
|
|
53
|
+
|
|
54
|
+
- regex: 'git\s+(reset|checkout)\s+.*--hard'
|
|
55
|
+
kind: bash
|
|
56
|
+
severity: warn
|
|
57
|
+
reason: --hard discards uncommitted work — confirm before running
|
|
58
|
+
|
|
59
|
+
- regex: 'git\s+clean\s+-[a-zA-Z]*[fdx]+'
|
|
60
|
+
kind: bash
|
|
61
|
+
severity: warn
|
|
62
|
+
reason: git clean -fdx removes untracked files including .gitignored — confirm
|
|
63
|
+
|
|
64
|
+
# --- Edit / Write path scope ---
|
|
65
|
+
# The edit/write hooks evaluate the file_path payload, not the command.
|
|
66
|
+
- regex: "^/etc/(passwd|shadow|sudoers)$"
|
|
67
|
+
kind: edit
|
|
68
|
+
severity: error
|
|
69
|
+
reason: editing system credential files would compromise the host
|
|
70
|
+
|
|
71
|
+
- regex: "^/etc/(passwd|shadow|sudoers)$"
|
|
72
|
+
kind: write
|
|
73
|
+
severity: error
|
|
74
|
+
reason: writing to system credential files would compromise the host
|
|
75
|
+
|
|
76
|
+
- regex: '\.ssh/(id_[a-z]+|authorized_keys|known_hosts)$'
|
|
77
|
+
kind: edit
|
|
78
|
+
severity: warn
|
|
79
|
+
reason: editing SSH credentials — confirm this is intentional
|
|
80
|
+
|
|
81
|
+
- regex: '\.ssh/(id_[a-z]+|authorized_keys|known_hosts)$'
|
|
82
|
+
kind: write
|
|
83
|
+
severity: warn
|
|
84
|
+
reason: writing to SSH credentials — confirm this is intentional
|
|
85
|
+
|
|
86
|
+
- regex: '\.env(\.|$)'
|
|
87
|
+
kind: write
|
|
88
|
+
severity: warn
|
|
89
|
+
reason: writing to a .env file — confirm it does not commit secrets
|
|
90
|
+
|
|
91
|
+
# --- npm / pnpm risk ---
|
|
92
|
+
- regex: 'npm\s+publish(\s|$)'
|
|
93
|
+
kind: bash
|
|
94
|
+
severity: warn
|
|
95
|
+
reason: npm publish ships to a public registry — confirm version + auth
|
|
96
|
+
|
|
97
|
+
- regex: 'rm\s+-rf?\s+(node_modules|\.git)\b'
|
|
98
|
+
kind: bash
|
|
99
|
+
severity: warn
|
|
100
|
+
reason: nuking node_modules / .git is recoverable but slow — confirm
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Core hook: damage-control-write (PreToolUse, matcher: Write).
|
|
4
|
+
*
|
|
5
|
+
* Mirror of damage-control-edit.js for the Write tool. Same patterns
|
|
6
|
+
* file (kind: write entries). Blocks writing system credential files,
|
|
7
|
+
* warns on writes to .ssh/ and .env*.
|
|
8
|
+
*/
|
|
9
|
+
const fs = require("fs");
|
|
10
|
+
const path = require("path");
|
|
11
|
+
const yaml = require("js-yaml");
|
|
12
|
+
|
|
13
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
14
|
+
const patternsPath = path.join(
|
|
15
|
+
projectDir,
|
|
16
|
+
".agileflow/plugins/core/hooks/damage-control-patterns.yaml",
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
async function readStdin() {
|
|
20
|
+
const chunks = [];
|
|
21
|
+
for await (const c of process.stdin) chunks.push(c);
|
|
22
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function main() {
|
|
26
|
+
const raw = await readStdin();
|
|
27
|
+
let payload;
|
|
28
|
+
try {
|
|
29
|
+
payload = JSON.parse(raw);
|
|
30
|
+
} catch {
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
const filePath =
|
|
34
|
+
payload &&
|
|
35
|
+
payload.tool_input &&
|
|
36
|
+
typeof payload.tool_input.file_path === "string"
|
|
37
|
+
? payload.tool_input.file_path
|
|
38
|
+
: "";
|
|
39
|
+
if (!filePath) process.exit(0);
|
|
40
|
+
|
|
41
|
+
let patterns = [];
|
|
42
|
+
try {
|
|
43
|
+
const parsed = yaml.load(fs.readFileSync(patternsPath, "utf8"));
|
|
44
|
+
patterns = Array.isArray(parsed && parsed.patterns) ? parsed.patterns : [];
|
|
45
|
+
} catch {
|
|
46
|
+
process.exit(0);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
for (const p of patterns) {
|
|
50
|
+
if (p.kind !== "write") continue;
|
|
51
|
+
let re;
|
|
52
|
+
try {
|
|
53
|
+
re = new RegExp(p.regex, "i");
|
|
54
|
+
} catch {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (re.test(filePath)) {
|
|
58
|
+
if (p.severity === "error") {
|
|
59
|
+
process.stderr.write(
|
|
60
|
+
`agileflow damage-control: BLOCKED write — ${p.reason}\n path: ${filePath}\n`,
|
|
61
|
+
);
|
|
62
|
+
process.exit(2);
|
|
63
|
+
}
|
|
64
|
+
process.stderr.write(
|
|
65
|
+
`agileflow damage-control: WARN — ${p.reason} (path: ${filePath})\n`,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
process.exit(0);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
main().catch(() => process.exit(0));
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Core hook: pre-compact-state (PreCompact).
|
|
4
|
+
*
|
|
5
|
+
* Captures the state Claude needs to know AFTER the compaction summary
|
|
6
|
+
* replaces most of the conversation: the active story, the active
|
|
7
|
+
* command, recent decisions, and the dirty git state. Without this,
|
|
8
|
+
* compaction often loses thread on multi-turn implementation work.
|
|
9
|
+
*
|
|
10
|
+
* Output is plain markdown printed to stdout — Claude Code includes
|
|
11
|
+
* the hook's stdout in the prompt context after compaction.
|
|
12
|
+
*
|
|
13
|
+
* Exits 0 always (must not block compaction).
|
|
14
|
+
*/
|
|
15
|
+
const fs = require("fs");
|
|
16
|
+
const path = require("path");
|
|
17
|
+
const { execSync } = require("child_process");
|
|
18
|
+
|
|
19
|
+
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
|
|
20
|
+
|
|
21
|
+
function readJSON(p) {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(fs.readFileSync(p, "utf8"));
|
|
24
|
+
} catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function git(args) {
|
|
30
|
+
try {
|
|
31
|
+
return execSync(`git ${args}`, {
|
|
32
|
+
cwd: projectDir,
|
|
33
|
+
encoding: "utf8",
|
|
34
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
35
|
+
}).trim();
|
|
36
|
+
} catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const out = [];
|
|
42
|
+
out.push("## Pre-compaction state preservation");
|
|
43
|
+
out.push("");
|
|
44
|
+
|
|
45
|
+
const status = readJSON(path.join(projectDir, "docs/09-agents/status.json"));
|
|
46
|
+
if (status && status.stories) {
|
|
47
|
+
const inProgress = Object.entries(status.stories)
|
|
48
|
+
.filter(([, s]) => s && s.status === "in_progress")
|
|
49
|
+
.map(([id, s]) => `${id} ${s.title || ""}`);
|
|
50
|
+
if (inProgress.length) {
|
|
51
|
+
out.push("Active stories:");
|
|
52
|
+
for (const s of inProgress) out.push(` - ${s}`);
|
|
53
|
+
out.push("");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Active command from session-state if it exists
|
|
58
|
+
const sessionState = readJSON(
|
|
59
|
+
path.join(projectDir, "docs/09-agents/session-state.json"),
|
|
60
|
+
);
|
|
61
|
+
if (sessionState && sessionState.active_command) {
|
|
62
|
+
out.push(
|
|
63
|
+
`Active command: ${sessionState.active_command.name || "(unknown)"}`,
|
|
64
|
+
);
|
|
65
|
+
out.push("");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const branch = git("rev-parse --abbrev-ref HEAD");
|
|
69
|
+
const dirty = git("status --short");
|
|
70
|
+
if (branch || dirty) {
|
|
71
|
+
out.push("Git:");
|
|
72
|
+
if (branch) out.push(` branch: ${branch}`);
|
|
73
|
+
if (dirty) {
|
|
74
|
+
const lines = dirty.split("\n").slice(0, 8);
|
|
75
|
+
out.push(` dirty: ${lines.length} file(s)`);
|
|
76
|
+
for (const l of lines) out.push(` ${l}`);
|
|
77
|
+
}
|
|
78
|
+
out.push("");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const log = git("log --oneline -3");
|
|
82
|
+
if (log) {
|
|
83
|
+
out.push("Recent commits:");
|
|
84
|
+
for (const l of log.split("\n")) out.push(` ${l}`);
|
|
85
|
+
out.push("");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
out.push("After compaction, resume from this state.");
|
|
89
|
+
process.stdout.write(out.join("\n") + "\n");
|
|
90
|
+
process.exit(0);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Core plugin hook: session-welcome.
|
|
4
|
+
*
|
|
5
|
+
* Phase 3 stub. The real welcome banner (similar to v3's
|
|
6
|
+
* agileflow-welcome.js but ~200 lines instead of 79KB) lands in
|
|
7
|
+
* Phase 4 alongside the rest of Core plugin content.
|
|
8
|
+
*
|
|
9
|
+
* Reads stdin (Claude Code's payload) and exits 0 — non-blocking.
|
|
10
|
+
*/
|
|
11
|
+
let stdin = '';
|
|
12
|
+
process.stdin.on('data', (chunk) => {
|
|
13
|
+
stdin += chunk;
|
|
14
|
+
});
|
|
15
|
+
process.stdin.on('end', () => {
|
|
16
|
+
// eslint-disable-next-line no-console
|
|
17
|
+
console.log('agileflow: session welcome (Phase 3 stub)');
|
|
18
|
+
process.exit(0);
|
|
19
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Core plugin — essential AgileFlow workflow.
|
|
2
|
+
# Always enabled; cannot be disabled.
|
|
3
|
+
#
|
|
4
|
+
# Hooks declared here are CANDIDATES — the install-time aggregator
|
|
5
|
+
# filters them by the user's `behaviors:` map in agileflow.config.json.
|
|
6
|
+
# A hook ID that maps to a disabled behavior never enters the
|
|
7
|
+
# generated hook-manifest.yaml. See apps/cli/src/runtime/hooks/aggregator.js.
|
|
8
|
+
id: core
|
|
9
|
+
name: Core
|
|
10
|
+
description: Epic, Story, Status, Babysit — essential agile workflow.
|
|
11
|
+
version: 1.0.0
|
|
12
|
+
enabledByDefault: true
|
|
13
|
+
cannotDisable: true
|
|
14
|
+
|
|
15
|
+
depends: []
|
|
16
|
+
|
|
17
|
+
provides:
|
|
18
|
+
commands: []
|
|
19
|
+
skills:
|
|
20
|
+
- id: agileflow-adr
|
|
21
|
+
dir: skills/agileflow-adr
|
|
22
|
+
- id: agileflow-epic-planner
|
|
23
|
+
dir: skills/agileflow-epic-planner
|
|
24
|
+
- id: agileflow-story-writer
|
|
25
|
+
dir: skills/agileflow-story-writer
|
|
26
|
+
- id: agileflow-status-updater
|
|
27
|
+
dir: skills/agileflow-status-updater
|
|
28
|
+
- id: agileflow-babysit-mentor
|
|
29
|
+
dir: skills/agileflow-babysit-mentor
|
|
30
|
+
agents: []
|
|
31
|
+
hooks:
|
|
32
|
+
# SessionStart — context loading + (optional) mentor injection.
|
|
33
|
+
- id: context-loader
|
|
34
|
+
event: SessionStart
|
|
35
|
+
script: hooks/context-loader.js
|
|
36
|
+
timeout: 5000
|
|
37
|
+
skipOnError: true
|
|
38
|
+
behavior: loadContext
|
|
39
|
+
|
|
40
|
+
- id: babysit-mentor-injector
|
|
41
|
+
event: SessionStart
|
|
42
|
+
script: hooks/babysit-mentor-injector.js
|
|
43
|
+
timeout: 2000
|
|
44
|
+
skipOnError: true
|
|
45
|
+
runAfter: [context-loader]
|
|
46
|
+
behavior: babysitDefault
|
|
47
|
+
|
|
48
|
+
# PreToolUse — damage control. skipOnError false: errors should
|
|
49
|
+
# block dangerous operations rather than be tolerated.
|
|
50
|
+
- id: damage-control-bash
|
|
51
|
+
event: PreToolUse
|
|
52
|
+
matcher: Bash
|
|
53
|
+
script: hooks/damage-control-bash.js
|
|
54
|
+
timeout: 3000
|
|
55
|
+
skipOnError: false
|
|
56
|
+
behavior: damageControl
|
|
57
|
+
|
|
58
|
+
- id: damage-control-edit
|
|
59
|
+
event: PreToolUse
|
|
60
|
+
matcher: Edit
|
|
61
|
+
script: hooks/damage-control-edit.js
|
|
62
|
+
timeout: 3000
|
|
63
|
+
skipOnError: false
|
|
64
|
+
behavior: damageControl
|
|
65
|
+
|
|
66
|
+
- id: damage-control-write
|
|
67
|
+
event: PreToolUse
|
|
68
|
+
matcher: Write
|
|
69
|
+
script: hooks/damage-control-write.js
|
|
70
|
+
timeout: 3000
|
|
71
|
+
skipOnError: false
|
|
72
|
+
behavior: damageControl
|
|
73
|
+
|
|
74
|
+
# PreCompact — preserve state across compaction.
|
|
75
|
+
- id: pre-compact-state
|
|
76
|
+
event: PreCompact
|
|
77
|
+
script: hooks/pre-compact-state.js
|
|
78
|
+
timeout: 5000
|
|
79
|
+
skipOnError: true
|
|
80
|
+
behavior: preCompactState
|
|
81
|
+
|
|
82
|
+
templates: []
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agileflow-adr
|
|
3
|
+
version: 2.0.0
|
|
4
|
+
category: agileflow/core
|
|
5
|
+
description: |
|
|
6
|
+
Use when the user is debating a technology / architecture / trade-off
|
|
7
|
+
decision (database choice, framework, API style, infra) or wants to
|
|
8
|
+
formalize one as an Architecture Decision Record. Writes the ADR to
|
|
9
|
+
docs/03-decisions/ in MADR format.
|
|
10
|
+
triggers:
|
|
11
|
+
keywords:
|
|
12
|
+
- architecture decision
|
|
13
|
+
- architectural decision
|
|
14
|
+
- which should we use
|
|
15
|
+
- record this decision
|
|
16
|
+
- trade-off between
|
|
17
|
+
- which framework
|
|
18
|
+
- which database
|
|
19
|
+
- rest vs graphql
|
|
20
|
+
- sql vs nosql
|
|
21
|
+
- adr for
|
|
22
|
+
priority: 50
|
|
23
|
+
exclude:
|
|
24
|
+
- decision tree (algorithmic)
|
|
25
|
+
- decisive moment
|
|
26
|
+
provides:
|
|
27
|
+
agents: []
|
|
28
|
+
learns:
|
|
29
|
+
enabled: true
|
|
30
|
+
file: _learnings/adr.yaml
|
|
31
|
+
maxEntries: 50
|
|
32
|
+
depends:
|
|
33
|
+
skills: []
|
|
34
|
+
plugins: [core]
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
<!-- {{PERSONALIZATION_BLOCK}} -->
|
|
38
|
+
|
|
39
|
+
# AgileFlow ADR Writer
|
|
40
|
+
|
|
41
|
+
Captures architectural / technical decisions as formal Architecture
|
|
42
|
+
Decision Records in `docs/03-decisions/` (MADR format). Decisions stay
|
|
43
|
+
immutable once accepted; if context changes, supersede with a new ADR
|
|
44
|
+
and link the chain.
|
|
45
|
+
|
|
46
|
+
## When this skill activates
|
|
47
|
+
|
|
48
|
+
- User is comparing options ("PostgreSQL vs MongoDB", "REST vs GraphQL")
|
|
49
|
+
- User asks "which X should we use?" with at least two real candidates
|
|
50
|
+
- User wants to record a decision they've already made
|
|
51
|
+
- Discussion of trade-offs, drivers, or constraints
|
|
52
|
+
- Should NOT activate on unrelated mentions of "decision" — `exclude`
|
|
53
|
+
keywords damp casual / algorithmic uses.
|
|
54
|
+
|
|
55
|
+
## What this skill does
|
|
56
|
+
|
|
57
|
+
1. Detect that a decision is being made (or asked about).
|
|
58
|
+
2. Extract the four MADR elements: context/problem, decision drivers,
|
|
59
|
+
considered options, chosen option + justification.
|
|
60
|
+
3. Ask clarifying questions if any are missing or ambiguous.
|
|
61
|
+
4. Read `docs/03-decisions/` to find the next ADR number and any
|
|
62
|
+
related ADRs to cross-link.
|
|
63
|
+
5. Show the proposed ADR and wait for explicit approval.
|
|
64
|
+
6. Write `docs/03-decisions/ADR-####-<slug>.md` in MADR format.
|
|
65
|
+
|
|
66
|
+
## Self-improving learnings
|
|
67
|
+
|
|
68
|
+
`.agileflow/skills/_learnings/adr.yaml` records preferences:
|
|
69
|
+
- Default `Status:` value (Proposed vs Accepted)
|
|
70
|
+
- Whether to require all four MADR sections or allow brief mode
|
|
71
|
+
- Preferred date format
|
|
72
|
+
- Whether to include Deciders names by default
|
|
73
|
+
|
|
74
|
+
## ADR format (MADR)
|
|
75
|
+
|
|
76
|
+
```markdown
|
|
77
|
+
# [ADR-0001] Title
|
|
78
|
+
|
|
79
|
+
**Date**: YYYY-MM-DD
|
|
80
|
+
**Status**: Proposed | Accepted | Deprecated | Superseded
|
|
81
|
+
**Deciders**: Names of people involved
|
|
82
|
+
**Tags**: architecture, database, api, …
|
|
83
|
+
|
|
84
|
+
## Context and Problem Statement
|
|
85
|
+
[Describe the context and problem. What are we trying to solve? Why now?]
|
|
86
|
+
|
|
87
|
+
## Decision Drivers
|
|
88
|
+
- [e.g., Performance requirements]
|
|
89
|
+
- [e.g., Team expertise]
|
|
90
|
+
- [e.g., Cost constraints]
|
|
91
|
+
|
|
92
|
+
## Considered Options
|
|
93
|
+
- [Option 1]
|
|
94
|
+
- [Option 2]
|
|
95
|
+
- [Option 3]
|
|
96
|
+
|
|
97
|
+
## Decision Outcome
|
|
98
|
+
|
|
99
|
+
**Chosen option**: [Option X]
|
|
100
|
+
|
|
101
|
+
**Justification**: [Why this option best satisfies the drivers]
|
|
102
|
+
|
|
103
|
+
### Positive Consequences
|
|
104
|
+
- [Good outcome 1]
|
|
105
|
+
- [Good outcome 2]
|
|
106
|
+
|
|
107
|
+
### Negative Consequences
|
|
108
|
+
- [Bad outcome 1] — Mitigation: [plan, if any]
|
|
109
|
+
- [Bad outcome 2]
|
|
110
|
+
|
|
111
|
+
## Pros and Cons of the Options
|
|
112
|
+
|
|
113
|
+
### [Option 1]
|
|
114
|
+
**Pros**: …
|
|
115
|
+
**Cons**: …
|
|
116
|
+
|
|
117
|
+
### [Option 2]
|
|
118
|
+
**Pros**: …
|
|
119
|
+
**Cons**: …
|
|
120
|
+
|
|
121
|
+
## Links
|
|
122
|
+
- [Related ADRs]
|
|
123
|
+
- [Relevant documentation]
|
|
124
|
+
- [External resources]
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Statuses
|
|
128
|
+
|
|
129
|
+
- **Proposed** — Under discussion, not yet decided
|
|
130
|
+
- **Accepted** — Decision made and ratified
|
|
131
|
+
- **Deprecated** — No longer relevant; kept for history
|
|
132
|
+
- **Superseded** — Replaced by a newer ADR (link forward to it)
|
|
133
|
+
|
|
134
|
+
## When to write the ADR vs ask first
|
|
135
|
+
|
|
136
|
+
Write it now (with `Status: Accepted`):
|
|
137
|
+
- The user has already made a clear decision and wants to record it
|
|
138
|
+
- The user explicitly asks for the ADR
|
|
139
|
+
|
|
140
|
+
Ask first (then write with `Status: Proposed` or `Accepted`):
|
|
141
|
+
- Multiple options are still in play
|
|
142
|
+
- Drivers / constraints aren't clear yet
|
|
143
|
+
- The chosen option's justification is one-line ("we like it more")
|
|
144
|
+
|
|
145
|
+
## Quality checklist
|
|
146
|
+
|
|
147
|
+
- [ ] Problem statement is concrete (not "improve performance")
|
|
148
|
+
- [ ] At least 2 real options considered (single-option ADRs are a
|
|
149
|
+
smell — note that the alternative was "do nothing" or "status
|
|
150
|
+
quo")
|
|
151
|
+
- [ ] Each option has explicit pros AND cons
|
|
152
|
+
- [ ] Decision drivers explicitly stated
|
|
153
|
+
- [ ] Chosen option's justification ties back to drivers
|
|
154
|
+
- [ ] Negative consequences acknowledged with mitigations where possible
|
|
155
|
+
- [ ] File path: `docs/03-decisions/ADR-####-<slug>.md` (4-digit pad)
|
|
156
|
+
- [ ] User approved the diff before write
|
|
157
|
+
|
|
158
|
+
## Integration
|
|
159
|
+
|
|
160
|
+
- **agileflow-story-writer** — completed ADRs inform Technical Notes
|
|
161
|
+
in stories
|
|
162
|
+
- **agileflow-epic-planner** — major epics often spawn one or more
|
|
163
|
+
ADRs at planning time
|
|
164
|
+
- **agileflow-status-updater** — flipping an ADR from Proposed to
|
|
165
|
+
Accepted is a status mutation through that skill
|
|
166
|
+
|
|
167
|
+
## Notes
|
|
168
|
+
|
|
169
|
+
- Capture decisions even if they seem small. Future you (or a new
|
|
170
|
+
hire) won't remember why you chose option B in three months.
|
|
171
|
+
- Be honest about negative consequences — undocumented downsides are
|
|
172
|
+
the source of "why is this code like this?" frustration.
|
|
173
|
+
- ADRs are **immutable** once accepted. To change a decision, create a
|
|
174
|
+
new ADR with `Status: Accepted`, set the old ADR to `Superseded`,
|
|
175
|
+
and link them.
|
|
176
|
+
- Include the deciders' names. Accountability matters; so does
|
|
177
|
+
knowing who to ask.
|
|
178
|
+
- Date the ADR — context erodes; the date is the timestamp on the
|
|
179
|
+
thinking, not just the file.
|