agileflow 3.4.3 → 4.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +238 -473
- package/README.md +22 -114
- package/bin/agileflow.js +15 -0
- package/bin/hooks/pre-bash.js +35 -0
- package/bin/hooks/pre-compact.js +34 -0
- package/bin/hooks/pre-edit.js +32 -0
- package/bin/hooks/pre-write.js +32 -0
- package/bin/hooks/session-start.js +42 -0
- package/bin/hooks/stop.js +34 -0
- package/content/plugins/ads/plugin.yaml +14 -0
- package/content/plugins/audit/plugin.yaml +14 -0
- package/content/plugins/core/hooks/babysit-mentor-injector.js +55 -0
- package/content/plugins/core/hooks/context-loader.js +169 -0
- package/content/plugins/core/hooks/damage-control-bash.js +78 -0
- package/content/plugins/core/hooks/damage-control-edit.js +76 -0
- package/content/plugins/core/hooks/damage-control-patterns.yaml +100 -0
- package/content/plugins/core/hooks/damage-control-write.js +72 -0
- package/content/plugins/core/hooks/pre-compact-state.js +90 -0
- package/content/plugins/core/hooks/session-welcome.js +19 -0
- package/content/plugins/core/plugin.yaml +82 -0
- package/content/plugins/core/skills/agileflow-adr/SKILL.md +179 -0
- package/content/plugins/core/skills/agileflow-babysit-mentor/SKILL.md +144 -0
- package/content/plugins/core/skills/agileflow-epic-planner/SKILL.md +179 -0
- package/content/plugins/core/skills/agileflow-status-updater/SKILL.md +132 -0
- package/content/plugins/core/skills/agileflow-story-writer/SKILL.md +200 -0
- package/content/plugins/council/plugin.yaml +14 -0
- package/content/plugins/seo/plugin.yaml +14 -0
- package/package.json +29 -49
- package/src/cli/commands/doctor.js +159 -0
- package/src/cli/commands/hook.js +80 -0
- package/src/cli/commands/setup.js +292 -0
- package/src/cli/commands/status.js +47 -0
- package/src/cli/commands/update.js +83 -0
- package/src/cli/index.js +73 -0
- package/src/cli/wizard/behaviors-picker.js +108 -0
- package/src/cli/wizard/ide-picker.js +57 -0
- package/src/cli/wizard/personalization.js +64 -0
- package/src/cli/wizard/plugin-picker.js +106 -0
- package/src/lib/hash.js +41 -0
- package/src/runtime/config/defaults.js +61 -0
- package/src/runtime/config/loader.js +117 -0
- package/src/runtime/config/schema.json +99 -0
- package/src/runtime/config/writer.js +55 -0
- package/src/runtime/hooks/aggregator.js +157 -0
- package/src/runtime/hooks/chain.js +93 -0
- package/src/runtime/hooks/logger.js +68 -0
- package/src/runtime/hooks/manifest-loader.js +228 -0
- package/src/runtime/hooks/orchestrator.js +322 -0
- package/src/runtime/ide/capabilities.js +111 -0
- package/src/runtime/ide/claude-code-settings.js +234 -0
- package/src/runtime/ide/claude-code-skills.js +202 -0
- package/src/runtime/installer/file-index.js +112 -0
- package/src/runtime/installer/install.js +329 -0
- package/src/runtime/installer/stash.js +61 -0
- package/src/runtime/installer/sync-engine.js +205 -0
- package/src/runtime/plugins/registry.js +132 -0
- package/src/runtime/plugins/resolver.js +138 -0
- package/src/runtime/plugins/validator.js +196 -0
- package/src/runtime/skills/validator.js +335 -0
- package/lib/README.md +0 -178
- package/lib/api-routes.js +0 -625
- package/lib/api-server.js +0 -278
- package/lib/cache-provider.js +0 -155
- package/lib/codebase-indexer.js +0 -819
- package/lib/colors.generated.js +0 -117
- package/lib/colors.js +0 -341
- package/lib/consent.js +0 -232
- package/lib/content-sanitizer.js +0 -464
- package/lib/correlation.js +0 -277
- package/lib/drivers/claude-driver.ts +0 -312
- package/lib/drivers/codex-driver.ts +0 -464
- package/lib/drivers/driver-manager.ts +0 -159
- package/lib/drivers/gemini-driver.ts +0 -498
- package/lib/drivers/index.ts +0 -17
- package/lib/error-codes.js +0 -590
- package/lib/errors.js +0 -670
- package/lib/feature-flags.js +0 -171
- package/lib/feedback.js +0 -595
- package/lib/file-cache.js +0 -541
- package/lib/flag-detection.js +0 -344
- package/lib/format-error.js +0 -156
- package/lib/gate-runner.js +0 -282
- package/lib/generator-factory.js +0 -333
- package/lib/git-operations.js +0 -266
- package/lib/lazy-require.js +0 -59
- package/lib/lock-file.js +0 -144
- package/lib/logger.js +0 -106
- package/lib/merge-operations.js +0 -1006
- package/lib/path-resolver.js +0 -544
- package/lib/path-utils.js +0 -49
- package/lib/paths.js +0 -291
- package/lib/placeholder-registry.js +0 -822
- package/lib/process-executor.js +0 -214
- package/lib/progress.js +0 -334
- package/lib/protocol/driver.ts +0 -354
- package/lib/protocol/index.ts +0 -12
- package/lib/protocol/ir.ts +0 -271
- package/lib/registry-cache.js +0 -80
- package/lib/registry-di.js +0 -358
- package/lib/result-schema.js +0 -363
- package/lib/result.js +0 -210
- package/lib/session-display.js +0 -331
- package/lib/session-operations.js +0 -611
- package/lib/session-registry.js +0 -484
- package/lib/session-state-machine.js +0 -465
- package/lib/session-switching.js +0 -191
- package/lib/skill-loader.js +0 -213
- package/lib/smart-json-file.js +0 -682
- package/lib/state-machine.js +0 -286
- package/lib/table-formatter.js +0 -519
- package/lib/template-loader.js +0 -143
- package/lib/transient-status.js +0 -374
- package/lib/ui-manager.js +0 -612
- package/lib/validate-args.js +0 -213
- package/lib/validate-commands.js +0 -308
- package/lib/validate-names.js +0 -143
- package/lib/validate-paths.js +0 -434
- package/lib/validate.js +0 -134
- package/lib/worktree-operations.js +0 -201
- package/lib/yaml-utils.js +0 -164
- package/scripts/README.md +0 -267
- package/scripts/af +0 -34
- package/scripts/agent-loop.js +0 -879
- package/scripts/agileflow-configure.js +0 -368
- package/scripts/agileflow-statusline.sh +0 -857
- package/scripts/agileflow-welcome.js +0 -2246
- package/scripts/api-server-runner.js +0 -177
- package/scripts/archive-completed-stories.sh +0 -308
- package/scripts/auto-self-improve.js +0 -326
- package/scripts/automation-run-due.js +0 -128
- package/scripts/babysit-clear-restore.js +0 -154
- package/scripts/babysit-context-restore.js +0 -89
- package/scripts/backfill-ideation-status.js +0 -128
- package/scripts/batch-pmap-loop.js +0 -551
- package/scripts/check-sessions.js +0 -116
- package/scripts/check-update.js +0 -282
- package/scripts/ci-summary.js +0 -294
- package/scripts/claude-smart.sh +0 -85
- package/scripts/claude-tmux.sh +0 -737
- package/scripts/claude-watchdog.sh +0 -225
- package/scripts/clear-active-command.js +0 -48
- package/scripts/compress-status.sh +0 -116
- package/scripts/context-loader.js +0 -310
- package/scripts/damage-control/bash-tool-damage-control.js +0 -22
- package/scripts/damage-control/edit-tool-damage-control.js +0 -19
- package/scripts/damage-control/patterns.yaml +0 -227
- package/scripts/damage-control/write-tool-damage-control.js +0 -19
- package/scripts/damage-control-bash.js +0 -51
- package/scripts/damage-control-edit.js +0 -48
- package/scripts/damage-control-multi-agent.js +0 -231
- package/scripts/damage-control-write.js +0 -48
- package/scripts/dependency-check.js +0 -311
- package/scripts/document-repl.js +0 -793
- package/scripts/expertise-metrics.sh +0 -264
- package/scripts/generate-all.sh +0 -77
- package/scripts/generate-colors.js +0 -314
- package/scripts/generators/agent-registry.js +0 -183
- package/scripts/generators/command-registry.js +0 -166
- package/scripts/generators/index.js +0 -85
- package/scripts/generators/inject-babysit.js +0 -191
- package/scripts/generators/inject-help.js +0 -125
- package/scripts/generators/inject-readme.js +0 -166
- package/scripts/generators/skill-registry.js +0 -188
- package/scripts/get-env.js +0 -225
- package/scripts/init.sh +0 -76
- package/scripts/lib/README-portable-tasks.md +0 -424
- package/scripts/lib/ac-test-matcher.js +0 -452
- package/scripts/lib/audit-cleanup.js +0 -250
- package/scripts/lib/audit-registry.js +0 -340
- package/scripts/lib/automation-registry.js +0 -544
- package/scripts/lib/automation-runner.js +0 -476
- package/scripts/lib/browser-qa-evidence.js +0 -409
- package/scripts/lib/browser-qa-status.js +0 -192
- package/scripts/lib/bus-utils.js +0 -473
- package/scripts/lib/colors.generated.sh +0 -82
- package/scripts/lib/colors.sh +0 -46
- package/scripts/lib/command-prereqs.js +0 -280
- package/scripts/lib/concurrency-limiter.js +0 -511
- package/scripts/lib/configure-detect.js +0 -596
- package/scripts/lib/configure-features.js +0 -1927
- package/scripts/lib/configure-repair.js +0 -327
- package/scripts/lib/configure-utils.js +0 -114
- package/scripts/lib/context-formatter.js +0 -1158
- package/scripts/lib/context-loader.js +0 -840
- package/scripts/lib/counter.js +0 -103
- package/scripts/lib/damage-control-utils.js +0 -619
- package/scripts/lib/feature-catalog.js +0 -332
- package/scripts/lib/file-lock.js +0 -392
- package/scripts/lib/file-tracking.js +0 -735
- package/scripts/lib/frontmatter-parser.js +0 -133
- package/scripts/lib/gate-enforcer.js +0 -295
- package/scripts/lib/hook-metrics.js +0 -324
- package/scripts/lib/ideation-index.js +0 -1205
- package/scripts/lib/json-utils.sh +0 -162
- package/scripts/lib/lifecycle-detector.js +0 -125
- package/scripts/lib/model-profiles.js +0 -118
- package/scripts/lib/portable-tasks-cli.js +0 -274
- package/scripts/lib/portable-tasks.js +0 -479
- package/scripts/lib/process-cleanup.js +0 -527
- package/scripts/lib/quality-gates.js +0 -788
- package/scripts/lib/scale-detector.js +0 -396
- package/scripts/lib/sessionRegistry.js +0 -678
- package/scripts/lib/signal-detectors.js +0 -867
- package/scripts/lib/skill-catalog.js +0 -557
- package/scripts/lib/skill-recommender.js +0 -311
- package/scripts/lib/state-migrator.js +0 -353
- package/scripts/lib/status-task-bridge.js +0 -522
- package/scripts/lib/status-writer.js +0 -255
- package/scripts/lib/story-claiming.js +0 -704
- package/scripts/lib/story-state-machine.js +0 -437
- package/scripts/lib/sync-ideation-status.js +0 -291
- package/scripts/lib/task-registry-cache.js +0 -490
- package/scripts/lib/task-registry.js +0 -1191
- package/scripts/lib/task-sync.js +0 -230
- package/scripts/lib/tdd-phase-manager.js +0 -455
- package/scripts/lib/team-events.js +0 -510
- package/scripts/lib/tmux-audit-monitor.js +0 -612
- package/scripts/lib/tmux-group-colors.js +0 -113
- package/scripts/lib/tool-registry.yaml +0 -241
- package/scripts/lib/tool-shed.js +0 -441
- package/scripts/lib/validation-registry.js +0 -177
- package/scripts/messaging-bridge.js +0 -561
- package/scripts/migrate-ideation-index.js +0 -553
- package/scripts/native-team-observer.js +0 -219
- package/scripts/obtain-context.js +0 -272
- package/scripts/pre-push-check.sh +0 -46
- package/scripts/precompact-context.sh +0 -306
- package/scripts/query-codebase.js +0 -543
- package/scripts/ralph-loop.js +0 -1278
- package/scripts/resume-session.sh +0 -121
- package/scripts/screenshot-verifier.js +0 -215
- package/scripts/session-boundary.js +0 -138
- package/scripts/session-coordinator.sh +0 -232
- package/scripts/session-manager.js +0 -546
- package/scripts/smart-detect.js +0 -449
- package/scripts/spawn-audit-sessions.js +0 -877
- package/scripts/spawn-parallel.js +0 -751
- package/scripts/strip-ai-attribution.js +0 -63
- package/scripts/task-completed-gate.js +0 -237
- package/scripts/team-manager.js +0 -596
- package/scripts/team-status-display.js +0 -200
- package/scripts/teammate-idle-gate.js +0 -237
- package/scripts/test-session-boundary.js +0 -80
- package/scripts/tmux-close-windows.sh +0 -180
- package/scripts/tmux-restore-window.sh +0 -67
- package/scripts/tmux-save-closed-window.sh +0 -35
- package/scripts/tui/App.js +0 -151
- package/scripts/tui/Dashboard.js +0 -277
- package/scripts/tui/blessed/data/watcher.js +0 -180
- package/scripts/tui/blessed/index.js +0 -244
- package/scripts/tui/blessed/panels/output.js +0 -101
- package/scripts/tui/blessed/panels/sessions.js +0 -150
- package/scripts/tui/blessed/panels/trace.js +0 -97
- package/scripts/tui/blessed/ui/help.js +0 -77
- package/scripts/tui/blessed/ui/screen.js +0 -52
- package/scripts/tui/blessed/ui/statusbar.js +0 -47
- package/scripts/tui/blessed/ui/tabbar.js +0 -99
- package/scripts/tui/index.js +0 -70
- package/scripts/tui/lib/crashRecovery.js +0 -304
- package/scripts/tui/lib/eventStream.js +0 -309
- package/scripts/tui/lib/keyboard.js +0 -261
- package/scripts/tui/lib/loopControl.js +0 -371
- package/scripts/tui/panels/OutputPanel.js +0 -240
- package/scripts/tui/panels/SessionPanel.js +0 -170
- package/scripts/tui/panels/TracePanel.js +0 -298
- package/scripts/tui/simple-tui.js +0 -510
- package/scripts/validate-expertise.sh +0 -263
- package/scripts/validate-tokens.sh +0 -73
- package/scripts/validators/README.md +0 -143
- package/scripts/validators/component-validator.js +0 -239
- package/scripts/validators/json-schema-validator.js +0 -186
- package/scripts/validators/markdown-validator.js +0 -152
- package/scripts/validators/migration-validator.js +0 -129
- package/scripts/validators/security-validator.js +0 -380
- package/scripts/validators/story-format-validator.js +0 -197
- package/scripts/validators/test-result-validator.js +0 -114
- package/scripts/validators/workflow-validator.js +0 -247
- package/scripts/welcome-deferred.js +0 -437
- package/scripts/worktree-create.sh +0 -111
- package/src/core/agents/a11y-analyzer-aria.md +0 -155
- package/src/core/agents/a11y-analyzer-forms.md +0 -162
- package/src/core/agents/a11y-analyzer-keyboard.md +0 -175
- package/src/core/agents/a11y-analyzer-semantic.md +0 -153
- package/src/core/agents/a11y-analyzer-visual.md +0 -158
- package/src/core/agents/a11y-consensus.md +0 -248
- package/src/core/agents/accessibility.md +0 -515
- package/src/core/agents/adr-writer.md +0 -463
- package/src/core/agents/ads-audit-budget.md +0 -181
- package/src/core/agents/ads-audit-compliance.md +0 -169
- package/src/core/agents/ads-audit-creative.md +0 -164
- package/src/core/agents/ads-audit-google.md +0 -226
- package/src/core/agents/ads-audit-meta.md +0 -183
- package/src/core/agents/ads-audit-tracking.md +0 -197
- package/src/core/agents/ads-consensus.md +0 -396
- package/src/core/agents/ads-generate.md +0 -145
- package/src/core/agents/ads-performance-tracker.md +0 -197
- package/src/core/agents/analytics.md +0 -617
- package/src/core/agents/api-quality-analyzer-conventions.md +0 -148
- package/src/core/agents/api-quality-analyzer-docs.md +0 -176
- package/src/core/agents/api-quality-analyzer-errors.md +0 -183
- package/src/core/agents/api-quality-analyzer-pagination.md +0 -171
- package/src/core/agents/api-quality-analyzer-versioning.md +0 -143
- package/src/core/agents/api-quality-consensus.md +0 -214
- package/src/core/agents/api-validator.md +0 -183
- package/src/core/agents/api.md +0 -665
- package/src/core/agents/arch-analyzer-circular.md +0 -148
- package/src/core/agents/arch-analyzer-complexity.md +0 -171
- package/src/core/agents/arch-analyzer-coupling.md +0 -146
- package/src/core/agents/arch-analyzer-layering.md +0 -151
- package/src/core/agents/arch-analyzer-patterns.md +0 -162
- package/src/core/agents/arch-consensus.md +0 -227
- package/src/core/agents/brainstorm-analyzer-features.md +0 -169
- package/src/core/agents/brainstorm-analyzer-growth.md +0 -161
- package/src/core/agents/brainstorm-analyzer-integration.md +0 -172
- package/src/core/agents/brainstorm-analyzer-market.md +0 -147
- package/src/core/agents/brainstorm-analyzer-ux.md +0 -167
- package/src/core/agents/brainstorm-consensus.md +0 -237
- package/src/core/agents/browser-qa.md +0 -328
- package/src/core/agents/ci.md +0 -511
- package/src/core/agents/code-reviewer.md +0 -288
- package/src/core/agents/codebase-query.md +0 -266
- package/src/core/agents/completeness-analyzer-api.md +0 -190
- package/src/core/agents/completeness-analyzer-conditional.md +0 -201
- package/src/core/agents/completeness-analyzer-handlers.md +0 -159
- package/src/core/agents/completeness-analyzer-imports.md +0 -159
- package/src/core/agents/completeness-analyzer-routes.md +0 -182
- package/src/core/agents/completeness-analyzer-state.md +0 -188
- package/src/core/agents/completeness-analyzer-stubs.md +0 -198
- package/src/core/agents/completeness-consensus.md +0 -286
- package/src/core/agents/compliance.md +0 -509
- package/src/core/agents/council-advocate.md +0 -206
- package/src/core/agents/council-analyst.md +0 -252
- package/src/core/agents/council-optimist.md +0 -170
- package/src/core/agents/database.md +0 -601
- package/src/core/agents/datamigration.md +0 -699
- package/src/core/agents/design.md +0 -525
- package/src/core/agents/devops.md +0 -720
- package/src/core/agents/documentation.md +0 -504
- package/src/core/agents/epic-planner.md +0 -480
- package/src/core/agents/error-analyzer.md +0 -201
- package/src/core/agents/integrations.md +0 -603
- package/src/core/agents/legal-analyzer-a11y.md +0 -110
- package/src/core/agents/legal-analyzer-ai.md +0 -117
- package/src/core/agents/legal-analyzer-consumer.md +0 -108
- package/src/core/agents/legal-analyzer-content.md +0 -113
- package/src/core/agents/legal-analyzer-international.md +0 -115
- package/src/core/agents/legal-analyzer-licensing.md +0 -115
- package/src/core/agents/legal-analyzer-privacy.md +0 -108
- package/src/core/agents/legal-analyzer-security.md +0 -112
- package/src/core/agents/legal-analyzer-terms.md +0 -111
- package/src/core/agents/legal-consensus.md +0 -242
- package/src/core/agents/logic-analyzer-edge.md +0 -170
- package/src/core/agents/logic-analyzer-flow.md +0 -253
- package/src/core/agents/logic-analyzer-invariant.md +0 -206
- package/src/core/agents/logic-analyzer-race.md +0 -266
- package/src/core/agents/logic-analyzer-type.md +0 -217
- package/src/core/agents/logic-consensus.md +0 -253
- package/src/core/agents/mentor.md +0 -654
- package/src/core/agents/mobile.md +0 -501
- package/src/core/agents/monitoring.md +0 -537
- package/src/core/agents/multi-expert.md +0 -311
- package/src/core/agents/orchestrator.md +0 -749
- package/src/core/agents/perf-analyzer-assets.md +0 -174
- package/src/core/agents/perf-analyzer-bundle.md +0 -165
- package/src/core/agents/perf-analyzer-caching.md +0 -160
- package/src/core/agents/perf-analyzer-compute.md +0 -165
- package/src/core/agents/perf-analyzer-memory.md +0 -182
- package/src/core/agents/perf-analyzer-network.md +0 -157
- package/src/core/agents/perf-analyzer-queries.md +0 -155
- package/src/core/agents/perf-analyzer-rendering.md +0 -156
- package/src/core/agents/perf-consensus.md +0 -280
- package/src/core/agents/performance.md +0 -492
- package/src/core/agents/product.md +0 -535
- package/src/core/agents/qa.md +0 -765
- package/src/core/agents/readme-updater.md +0 -579
- package/src/core/agents/refactor.md +0 -558
- package/src/core/agents/research.md +0 -453
- package/src/core/agents/rlm-subcore.md +0 -207
- package/src/core/agents/schema-validator.md +0 -454
- package/src/core/agents/security-analyzer-api.md +0 -199
- package/src/core/agents/security-analyzer-auth.md +0 -160
- package/src/core/agents/security-analyzer-authz.md +0 -168
- package/src/core/agents/security-analyzer-deps.md +0 -147
- package/src/core/agents/security-analyzer-infra.md +0 -176
- package/src/core/agents/security-analyzer-injection.md +0 -148
- package/src/core/agents/security-analyzer-input.md +0 -191
- package/src/core/agents/security-analyzer-secrets.md +0 -175
- package/src/core/agents/security-consensus.md +0 -276
- package/src/core/agents/security.md +0 -486
- package/src/core/agents/seo-analyzer-content.md +0 -167
- package/src/core/agents/seo-analyzer-images.md +0 -187
- package/src/core/agents/seo-analyzer-performance.md +0 -206
- package/src/core/agents/seo-analyzer-schema.md +0 -176
- package/src/core/agents/seo-analyzer-sitemap.md +0 -172
- package/src/core/agents/seo-analyzer-technical.md +0 -144
- package/src/core/agents/seo-consensus.md +0 -289
- package/src/core/agents/team-coordinator.md +0 -333
- package/src/core/agents/team-lead.md +0 -171
- package/src/core/agents/test-analyzer-assertions.md +0 -181
- package/src/core/agents/test-analyzer-coverage.md +0 -183
- package/src/core/agents/test-analyzer-fragility.md +0 -185
- package/src/core/agents/test-analyzer-integration.md +0 -155
- package/src/core/agents/test-analyzer-maintenance.md +0 -173
- package/src/core/agents/test-analyzer-mocking.md +0 -178
- package/src/core/agents/test-analyzer-patterns.md +0 -189
- package/src/core/agents/test-analyzer-structure.md +0 -177
- package/src/core/agents/test-consensus.md +0 -294
- package/src/core/agents/testing.md +0 -527
- package/src/core/agents/ui-validator.md +0 -331
- package/src/core/agents/ui.md +0 -1227
- package/src/core/commands/adr/list.md +0 -191
- package/src/core/commands/adr/update.md +0 -258
- package/src/core/commands/adr/view.md +0 -274
- package/src/core/commands/adr.md +0 -394
- package/src/core/commands/ads/audit.md +0 -453
- package/src/core/commands/ads/budget.md +0 -97
- package/src/core/commands/ads/competitor.md +0 -112
- package/src/core/commands/ads/creative.md +0 -85
- package/src/core/commands/ads/generate.md +0 -238
- package/src/core/commands/ads/google.md +0 -112
- package/src/core/commands/ads/health.md +0 -327
- package/src/core/commands/ads/landing.md +0 -119
- package/src/core/commands/ads/linkedin.md +0 -112
- package/src/core/commands/ads/meta.md +0 -91
- package/src/core/commands/ads/microsoft.md +0 -115
- package/src/core/commands/ads/plan.md +0 -321
- package/src/core/commands/ads/test-plan.md +0 -317
- package/src/core/commands/ads/tiktok.md +0 -129
- package/src/core/commands/ads/track.md +0 -288
- package/src/core/commands/ads/youtube.md +0 -124
- package/src/core/commands/ads.md +0 -140
- package/src/core/commands/agent.md +0 -256
- package/src/core/commands/api.md +0 -267
- package/src/core/commands/assign.md +0 -369
- package/src/core/commands/audit.md +0 -531
- package/src/core/commands/auto.md +0 -556
- package/src/core/commands/automate.md +0 -415
- package/src/core/commands/babysit.md +0 -643
- package/src/core/commands/baseline.md +0 -743
- package/src/core/commands/batch.md +0 -551
- package/src/core/commands/blockers.md +0 -602
- package/src/core/commands/board.md +0 -509
- package/src/core/commands/browser-qa.md +0 -240
- package/src/core/commands/changelog.md +0 -582
- package/src/core/commands/choose.md +0 -430
- package/src/core/commands/ci.md +0 -330
- package/src/core/commands/code/accessibility.md +0 -363
- package/src/core/commands/code/api.md +0 -313
- package/src/core/commands/code/architecture.md +0 -313
- package/src/core/commands/code/completeness.md +0 -519
- package/src/core/commands/code/legal.md +0 -509
- package/src/core/commands/code/logic.md +0 -432
- package/src/core/commands/code/performance.md +0 -506
- package/src/core/commands/code/security.md +0 -509
- package/src/core/commands/code/test.md +0 -505
- package/src/core/commands/compress.md +0 -408
- package/src/core/commands/configure.md +0 -1159
- package/src/core/commands/context/export.md +0 -296
- package/src/core/commands/context/full.md +0 -353
- package/src/core/commands/context/note.md +0 -380
- package/src/core/commands/council.md +0 -592
- package/src/core/commands/debt.md +0 -491
- package/src/core/commands/deploy.md +0 -864
- package/src/core/commands/deps.md +0 -728
- package/src/core/commands/diagnose.md +0 -404
- package/src/core/commands/docs.md +0 -469
- package/src/core/commands/epic/edit.md +0 -213
- package/src/core/commands/epic/list.md +0 -190
- package/src/core/commands/epic/view.md +0 -267
- package/src/core/commands/epic.md +0 -477
- package/src/core/commands/export.md +0 -238
- package/src/core/commands/feedback.md +0 -603
- package/src/core/commands/handoff.md +0 -386
- package/src/core/commands/help.md +0 -194
- package/src/core/commands/ideate/brief.md +0 -363
- package/src/core/commands/ideate/discover.md +0 -399
- package/src/core/commands/ideate/features.md +0 -497
- package/src/core/commands/ideate/history.md +0 -403
- package/src/core/commands/ideate/new.md +0 -900
- package/src/core/commands/impact.md +0 -407
- package/src/core/commands/install.md +0 -529
- package/src/core/commands/learn/explain.md +0 -118
- package/src/core/commands/learn/glossary.md +0 -135
- package/src/core/commands/learn/patterns.md +0 -138
- package/src/core/commands/learn/tour.md +0 -126
- package/src/core/commands/maintain.md +0 -558
- package/src/core/commands/metrics.md +0 -844
- package/src/core/commands/migrate/codemods.md +0 -151
- package/src/core/commands/migrate/plan.md +0 -131
- package/src/core/commands/migrate/scan.md +0 -114
- package/src/core/commands/migrate/validate.md +0 -119
- package/src/core/commands/multi-expert.md +0 -447
- package/src/core/commands/packages.md +0 -535
- package/src/core/commands/pr.md +0 -337
- package/src/core/commands/readme-sync.md +0 -329
- package/src/core/commands/research/analyze.md +0 -798
- package/src/core/commands/research/ask.md +0 -864
- package/src/core/commands/research/import.md +0 -1025
- package/src/core/commands/research/list.md +0 -273
- package/src/core/commands/research/synthesize.md +0 -928
- package/src/core/commands/research/view.md +0 -323
- package/src/core/commands/retro.md +0 -795
- package/src/core/commands/review.md +0 -694
- package/src/core/commands/rlm.md +0 -446
- package/src/core/commands/roadmap/analyze.md +0 -400
- package/src/core/commands/rpi.md +0 -633
- package/src/core/commands/seo/audit.md +0 -444
- package/src/core/commands/seo/competitor.md +0 -174
- package/src/core/commands/seo/content.md +0 -107
- package/src/core/commands/seo/geo.md +0 -229
- package/src/core/commands/seo/hreflang.md +0 -140
- package/src/core/commands/seo/images.md +0 -96
- package/src/core/commands/seo/page.md +0 -198
- package/src/core/commands/seo/plan.md +0 -163
- package/src/core/commands/seo/programmatic.md +0 -131
- package/src/core/commands/seo/references/cwv-thresholds.md +0 -64
- package/src/core/commands/seo/references/eeat-framework.md +0 -110
- package/src/core/commands/seo/references/quality-gates.md +0 -91
- package/src/core/commands/seo/references/schema-types.md +0 -102
- package/src/core/commands/seo/schema.md +0 -183
- package/src/core/commands/seo/sitemap.md +0 -97
- package/src/core/commands/seo/technical.md +0 -100
- package/src/core/commands/seo.md +0 -107
- package/src/core/commands/session/cleanup.md +0 -452
- package/src/core/commands/session/end.md +0 -865
- package/src/core/commands/session/history.md +0 -293
- package/src/core/commands/session/init.md +0 -210
- package/src/core/commands/session/new.md +0 -827
- package/src/core/commands/session/resume.md +0 -291
- package/src/core/commands/session/spawn.md +0 -205
- package/src/core/commands/session/status.md +0 -274
- package/src/core/commands/skill/list.md +0 -139
- package/src/core/commands/skill/recommend.md +0 -216
- package/src/core/commands/sprint.md +0 -714
- package/src/core/commands/status/undo.md +0 -191
- package/src/core/commands/status.md +0 -423
- package/src/core/commands/story/edit.md +0 -204
- package/src/core/commands/story/list.md +0 -199
- package/src/core/commands/story/view.md +0 -312
- package/src/core/commands/story-validate.md +0 -491
- package/src/core/commands/story.md +0 -465
- package/src/core/commands/tdd-next.md +0 -238
- package/src/core/commands/tdd.md +0 -211
- package/src/core/commands/team/guide.md +0 -688
- package/src/core/commands/team/list.md +0 -59
- package/src/core/commands/team/start.md +0 -130
- package/src/core/commands/team/status.md +0 -66
- package/src/core/commands/team/stop.md +0 -78
- package/src/core/commands/template.md +0 -644
- package/src/core/commands/tests.md +0 -731
- package/src/core/commands/update.md +0 -591
- package/src/core/commands/validate-expertise.md +0 -305
- package/src/core/commands/velocity.md +0 -630
- package/src/core/commands/verify.md +0 -534
- package/src/core/commands/whats-new.md +0 -201
- package/src/core/commands/workflow.md +0 -449
- package/src/core/council/sessions/.gitkeep +0 -0
- package/src/core/council/shared_reasoning.template.md +0 -106
- package/src/core/experts/README.md +0 -236
- package/src/core/experts/_core-expertise.yaml +0 -105
- package/src/core/experts/accessibility/expertise.yaml +0 -115
- package/src/core/experts/accessibility/question.md +0 -41
- package/src/core/experts/accessibility/self-improve.md +0 -45
- package/src/core/experts/accessibility/workflow.md +0 -59
- package/src/core/experts/adr-writer/expertise.yaml +0 -138
- package/src/core/experts/adr-writer/question.md +0 -56
- package/src/core/experts/adr-writer/self-improve.md +0 -106
- package/src/core/experts/adr-writer/workflow.md +0 -184
- package/src/core/experts/analytics/expertise.yaml +0 -119
- package/src/core/experts/analytics/question.md +0 -74
- package/src/core/experts/analytics/self-improve.md +0 -163
- package/src/core/experts/analytics/workflow.md +0 -272
- package/src/core/experts/api/expertise.yaml +0 -124
- package/src/core/experts/api/question.md +0 -74
- package/src/core/experts/api/self-improve.md +0 -122
- package/src/core/experts/api/workflow.md +0 -248
- package/src/core/experts/ci/expertise.yaml +0 -106
- package/src/core/experts/ci/question.md +0 -69
- package/src/core/experts/ci/self-improve.md +0 -100
- package/src/core/experts/ci/workflow.md +0 -145
- package/src/core/experts/codebase-query/expertise.yaml +0 -121
- package/src/core/experts/codebase-query/question.md +0 -73
- package/src/core/experts/codebase-query/self-improve.md +0 -105
- package/src/core/experts/compliance/expertise.yaml +0 -101
- package/src/core/experts/compliance/question.md +0 -56
- package/src/core/experts/compliance/self-improve.md +0 -106
- package/src/core/experts/compliance/workflow.md +0 -184
- package/src/core/experts/database/expertise.yaml +0 -109
- package/src/core/experts/database/question.md +0 -74
- package/src/core/experts/database/self-improve.md +0 -121
- package/src/core/experts/database/workflow.md +0 -234
- package/src/core/experts/datamigration/expertise.yaml +0 -141
- package/src/core/experts/datamigration/question.md +0 -56
- package/src/core/experts/datamigration/self-improve.md +0 -106
- package/src/core/experts/datamigration/workflow.md +0 -184
- package/src/core/experts/design/expertise.yaml +0 -116
- package/src/core/experts/design/question.md +0 -56
- package/src/core/experts/design/self-improve.md +0 -106
- package/src/core/experts/design/workflow.md +0 -184
- package/src/core/experts/devops/expertise.yaml +0 -116
- package/src/core/experts/devops/question.md +0 -68
- package/src/core/experts/devops/self-improve.md +0 -102
- package/src/core/experts/devops/workflow.md +0 -142
- package/src/core/experts/documentation/expertise.yaml +0 -126
- package/src/core/experts/documentation/question.md +0 -41
- package/src/core/experts/documentation/self-improve.md +0 -45
- package/src/core/experts/documentation/workflow.md +0 -55
- package/src/core/experts/epic-planner/expertise.yaml +0 -144
- package/src/core/experts/epic-planner/question.md +0 -56
- package/src/core/experts/epic-planner/self-improve.md +0 -106
- package/src/core/experts/epic-planner/workflow.md +0 -184
- package/src/core/experts/integrations/expertise.yaml +0 -113
- package/src/core/experts/integrations/question.md +0 -74
- package/src/core/experts/integrations/self-improve.md +0 -151
- package/src/core/experts/integrations/workflow.md +0 -246
- package/src/core/experts/mentor/expertise.yaml +0 -125
- package/src/core/experts/mentor/question.md +0 -56
- package/src/core/experts/mentor/self-improve.md +0 -106
- package/src/core/experts/mentor/workflow.md +0 -184
- package/src/core/experts/mobile/expertise.yaml +0 -136
- package/src/core/experts/mobile/question.md +0 -72
- package/src/core/experts/mobile/self-improve.md +0 -140
- package/src/core/experts/mobile/workflow.md +0 -240
- package/src/core/experts/monitoring/expertise.yaml +0 -132
- package/src/core/experts/monitoring/question.md +0 -76
- package/src/core/experts/monitoring/self-improve.md +0 -150
- package/src/core/experts/monitoring/workflow.md +0 -264
- package/src/core/experts/performance/expertise.yaml +0 -68
- package/src/core/experts/performance/question.md +0 -41
- package/src/core/experts/performance/self-improve.md +0 -45
- package/src/core/experts/performance/workflow.md +0 -61
- package/src/core/experts/product/expertise.yaml +0 -143
- package/src/core/experts/product/question.md +0 -56
- package/src/core/experts/product/self-improve.md +0 -106
- package/src/core/experts/product/workflow.md +0 -184
- package/src/core/experts/qa/expertise.yaml +0 -110
- package/src/core/experts/qa/question.md +0 -56
- package/src/core/experts/qa/self-improve.md +0 -106
- package/src/core/experts/qa/workflow.md +0 -184
- package/src/core/experts/readme-updater/expertise.yaml +0 -141
- package/src/core/experts/readme-updater/question.md +0 -56
- package/src/core/experts/readme-updater/self-improve.md +0 -106
- package/src/core/experts/readme-updater/workflow.md +0 -184
- package/src/core/experts/refactor/expertise.yaml +0 -135
- package/src/core/experts/refactor/question.md +0 -41
- package/src/core/experts/refactor/self-improve.md +0 -45
- package/src/core/experts/refactor/workflow.md +0 -57
- package/src/core/experts/research/expertise.yaml +0 -143
- package/src/core/experts/research/question.md +0 -56
- package/src/core/experts/research/self-improve.md +0 -106
- package/src/core/experts/research/workflow.md +0 -184
- package/src/core/experts/security/expertise.yaml +0 -117
- package/src/core/experts/security/question.md +0 -77
- package/src/core/experts/security/self-improve.md +0 -102
- package/src/core/experts/security/workflow.md +0 -152
- package/src/core/experts/templates/expertise-template.yaml +0 -67
- package/src/core/experts/templates/question-template.md +0 -56
- package/src/core/experts/templates/self-improve-template.md +0 -106
- package/src/core/experts/templates/workflow-template.md +0 -184
- package/src/core/experts/testing/expertise.yaml +0 -112
- package/src/core/experts/testing/question.md +0 -68
- package/src/core/experts/testing/self-improve.md +0 -102
- package/src/core/experts/testing/workflow.md +0 -143
- package/src/core/experts/ui/expertise.yaml +0 -133
- package/src/core/experts/ui/question.md +0 -74
- package/src/core/experts/ui/self-improve.md +0 -122
- package/src/core/experts/ui/workflow.md +0 -262
- package/src/core/knowledge/ads/ad-audit-checklist-scoring.md +0 -424
- package/src/core/knowledge/ads/ad-optimization-logic.md +0 -590
- package/src/core/knowledge/ads/ad-technical-specifications.md +0 -385
- package/src/core/knowledge/ads/definitive-advertising-reference-2026.md +0 -506
- package/src/core/knowledge/ads/paid-advertising-research-2026.md +0 -445
- package/src/core/profiles/COMPARISON.md +0 -170
- package/src/core/profiles/README.md +0 -178
- package/src/core/profiles/claude-code.yaml +0 -111
- package/src/core/profiles/codex.yaml +0 -103
- package/src/core/profiles/cursor.yaml +0 -134
- package/src/core/profiles/examples.js +0 -250
- package/src/core/profiles/loader.js +0 -235
- package/src/core/profiles/windsurf.yaml +0 -159
- package/src/core/skills/_learnings/README.md +0 -91
- package/src/core/skills/_learnings/_template.yaml +0 -106
- package/src/core/skills/_learnings/code-review.yaml +0 -118
- package/src/core/skills/_learnings/commit.yaml +0 -69
- package/src/core/skills/_learnings/story-writer.yaml +0 -71
- package/src/core/teams/backend.json +0 -41
- package/src/core/teams/builder-validator.json +0 -51
- package/src/core/teams/code-review.json +0 -41
- package/src/core/teams/frontend.json +0 -41
- package/src/core/teams/fullstack.json +0 -41
- package/src/core/teams/logic-audit.json +0 -53
- package/src/core/teams/perf-audit.json +0 -71
- package/src/core/teams/qa.json +0 -41
- package/src/core/teams/security-audit.json +0 -71
- package/src/core/teams/solo.json +0 -35
- package/src/core/teams/test-audit.json +0 -71
- package/src/core/templates/CONTEXT.md.example +0 -49
- package/src/core/templates/README-template.md +0 -16
- package/src/core/templates/adr-template.md +0 -28
- package/src/core/templates/agent-coordination-pattern.md +0 -38
- package/src/core/templates/agent-profile-template.md +0 -51
- package/src/core/templates/agileflow-metadata.json +0 -150
- package/src/core/templates/browser-qa-spec.yaml +0 -94
- package/src/core/templates/ci-workflow.yml +0 -74
- package/src/core/templates/claude-settings.advanced.example.json +0 -75
- package/src/core/templates/claude-settings.example.json +0 -26
- package/src/core/templates/command-documentation.md +0 -187
- package/src/core/templates/command-prerequisites.yaml +0 -169
- package/src/core/templates/comms-note-template.md +0 -24
- package/src/core/templates/damage-control-patterns.yaml +0 -243
- package/src/core/templates/environment.json +0 -18
- package/src/core/templates/epic-template.md +0 -27
- package/src/core/templates/plan-template.md +0 -125
- package/src/core/templates/preserve-rules-common.md +0 -107
- package/src/core/templates/preserve-rules.json +0 -42
- package/src/core/templates/proactive-action-spec.md +0 -29
- package/src/core/templates/product-brief.md +0 -136
- package/src/core/templates/quality-gate-priorities.md +0 -34
- package/src/core/templates/research-template.md +0 -44
- package/src/core/templates/session-harness-protocol.md +0 -128
- package/src/core/templates/session-state.json +0 -56
- package/src/core/templates/story-lifecycle.md +0 -213
- package/src/core/templates/story-template.md +0 -92
- package/src/core/templates/tdd-test-template.js +0 -241
- package/src/core/templates/worktrees-guide.md +0 -231
- package/tools/agileflow-npx.js +0 -52
- package/tools/cli/agileflow-cli.js +0 -72
- package/tools/cli/commands/config.js +0 -285
- package/tools/cli/commands/doctor.js +0 -496
- package/tools/cli/commands/list.js +0 -385
- package/tools/cli/commands/session.js +0 -1176
- package/tools/cli/commands/setup.js +0 -255
- package/tools/cli/commands/status.js +0 -101
- package/tools/cli/commands/tui.js +0 -56
- package/tools/cli/commands/uninstall.js +0 -155
- package/tools/cli/commands/update.js +0 -299
- package/tools/cli/installers/core/installer.js +0 -892
- package/tools/cli/installers/ide/_base-ide.js +0 -518
- package/tools/cli/installers/ide/_interface.js +0 -238
- package/tools/cli/installers/ide/claude-code.js +0 -432
- package/tools/cli/installers/ide/codex.js +0 -426
- package/tools/cli/installers/ide/cursor.js +0 -217
- package/tools/cli/installers/ide/manager.js +0 -222
- package/tools/cli/installers/ide/windsurf.js +0 -282
- package/tools/cli/lib/command-context.js +0 -382
- package/tools/cli/lib/config-manager.js +0 -446
- package/tools/cli/lib/content-injector.js +0 -969
- package/tools/cli/lib/content-transformer.js +0 -496
- package/tools/cli/lib/docs-setup.js +0 -464
- package/tools/cli/lib/error-handler.js +0 -165
- package/tools/cli/lib/ide-error-factory.js +0 -421
- package/tools/cli/lib/ide-errors.js +0 -367
- package/tools/cli/lib/ide-generator.js +0 -357
- package/tools/cli/lib/ide-health-monitor.js +0 -364
- package/tools/cli/lib/ide-registry.js +0 -297
- package/tools/cli/lib/npm-utils.js +0 -103
- package/tools/cli/lib/self-update.js +0 -148
- package/tools/cli/lib/ui.js +0 -211
- package/tools/cli/lib/utils.js +0 -87
- package/tools/cli/lib/validation-middleware.js +0 -491
- package/tools/cli/lib/version-checker.js +0 -95
- package/tools/postinstall.js +0 -190
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# claude-watchdog.sh - Background watchdog that detects and kills frozen Claude processes
|
|
3
|
-
#
|
|
4
|
-
# Usage: claude-watchdog.sh <session-name>
|
|
5
|
-
#
|
|
6
|
-
# Runs in the background, checking every WATCHDOG_INTERVAL seconds for Claude
|
|
7
|
-
# processes that appear frozen. A process is considered frozen when ALL of:
|
|
8
|
-
# 1. Running for > WATCHDOG_MAX_AGE_HOURS hours
|
|
9
|
-
# 2. Using > WATCHDOG_MAX_MEMORY_MB megabytes of RSS
|
|
10
|
-
# 3. No JSONL file modification in > WATCHDOG_MAX_IDLE_MINUTES minutes
|
|
11
|
-
#
|
|
12
|
-
# Recovery sequence: Ctrl+C x2 (5s wait) → SIGTERM (5s wait) → SIGKILL
|
|
13
|
-
# After kill, the pane stays open with a shell prompt (tab is NOT closed).
|
|
14
|
-
#
|
|
15
|
-
# Logs kills to ~/.claude/watchdog.log
|
|
16
|
-
#
|
|
17
|
-
# Environment variable configuration:
|
|
18
|
-
# WATCHDOG_INTERVAL Check interval in seconds (default: 120)
|
|
19
|
-
# WATCHDOG_MAX_AGE_HOURS Minimum process age to consider (default: 6)
|
|
20
|
-
# WATCHDOG_MAX_MEMORY_MB Minimum RSS in MB to consider (default: 400)
|
|
21
|
-
# WATCHDOG_MAX_IDLE_MINUTES Minutes since last JSONL write (default: 60)
|
|
22
|
-
#
|
|
23
|
-
# NOTE: Linux-only (requires /proc filesystem and GNU ps). macOS not supported.
|
|
24
|
-
|
|
25
|
-
set -euo pipefail
|
|
26
|
-
|
|
27
|
-
SESSION_NAME="${1:-}"
|
|
28
|
-
if [ -z "$SESSION_NAME" ]; then
|
|
29
|
-
echo "Usage: claude-watchdog.sh <session-name>" >&2
|
|
30
|
-
exit 1
|
|
31
|
-
fi
|
|
32
|
-
|
|
33
|
-
# Configuration (all overridable via environment)
|
|
34
|
-
INTERVAL="${WATCHDOG_INTERVAL:-120}"
|
|
35
|
-
MAX_AGE_HOURS="${WATCHDOG_MAX_AGE_HOURS:-6}"
|
|
36
|
-
MAX_MEMORY_MB="${WATCHDOG_MAX_MEMORY_MB:-400}"
|
|
37
|
-
MAX_IDLE_MINUTES="${WATCHDOG_MAX_IDLE_MINUTES:-60}"
|
|
38
|
-
|
|
39
|
-
# Validate numeric configuration
|
|
40
|
-
for _var_name in INTERVAL MAX_AGE_HOURS MAX_MEMORY_MB MAX_IDLE_MINUTES; do
|
|
41
|
-
_var_val="${!_var_name}"
|
|
42
|
-
if ! [[ "$_var_val" =~ ^[0-9]+$ ]]; then
|
|
43
|
-
echo "ERROR: $_var_name must be a positive integer, got: '$_var_val'" >&2
|
|
44
|
-
exit 1
|
|
45
|
-
fi
|
|
46
|
-
done
|
|
47
|
-
|
|
48
|
-
LOG_FILE="$HOME/.claude/watchdog.log"
|
|
49
|
-
mkdir -p "$(dirname "$LOG_FILE")"
|
|
50
|
-
|
|
51
|
-
log() {
|
|
52
|
-
local timestamp
|
|
53
|
-
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
54
|
-
echo "[$timestamp] [watchdog:$SESSION_NAME] $*" >> "$LOG_FILE"
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
log "Started (interval=${INTERVAL}s, max_age=${MAX_AGE_HOURS}h, max_mem=${MAX_MEMORY_MB}MB, max_idle=${MAX_IDLE_MINUTES}m)"
|
|
58
|
-
|
|
59
|
-
# Clean exit when session is destroyed
|
|
60
|
-
cleanup() {
|
|
61
|
-
log "Stopping (session gone or signal received)" || true
|
|
62
|
-
exit 0
|
|
63
|
-
}
|
|
64
|
-
trap cleanup INT TERM
|
|
65
|
-
|
|
66
|
-
# Check if a process's JSONL files have been modified recently
|
|
67
|
-
# Returns 0 if idle (no recent writes), 1 if active
|
|
68
|
-
is_process_idle() {
|
|
69
|
-
local pid="$1"
|
|
70
|
-
local idle_minutes="$2"
|
|
71
|
-
|
|
72
|
-
# Find the working directory of the process to locate .claude/ project dirs
|
|
73
|
-
local cwd
|
|
74
|
-
cwd=$(readlink "/proc/$pid/cwd" 2>/dev/null) || return 1
|
|
75
|
-
|
|
76
|
-
# Build the project path Claude Code uses for JSONL session files
|
|
77
|
-
local proj_dir
|
|
78
|
-
proj_dir=$(echo "$cwd" | sed 's|/|-|g' | sed 's|^-||')
|
|
79
|
-
local sessions_dir="$HOME/.claude/projects/-$proj_dir"
|
|
80
|
-
|
|
81
|
-
if [ ! -d "$sessions_dir" ]; then
|
|
82
|
-
# No session dir means no activity tracking — assume idle
|
|
83
|
-
return 0
|
|
84
|
-
fi
|
|
85
|
-
|
|
86
|
-
# Check if any JSONL file was modified within idle_minutes
|
|
87
|
-
local recent_file
|
|
88
|
-
recent_file=$(find "$sessions_dir" -name '*.jsonl' -mmin "-$idle_minutes" -print -quit 2>/dev/null)
|
|
89
|
-
|
|
90
|
-
if [ -n "$recent_file" ]; then
|
|
91
|
-
# Recently modified — process is active
|
|
92
|
-
return 1
|
|
93
|
-
fi
|
|
94
|
-
|
|
95
|
-
# No recent modifications — process is idle
|
|
96
|
-
return 0
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
# Get process RSS in MB (Linux /proc-based, ps fallback)
|
|
100
|
-
get_rss_mb() {
|
|
101
|
-
local pid="$1"
|
|
102
|
-
local rss_kb
|
|
103
|
-
if [ -f "/proc/$pid/status" ]; then
|
|
104
|
-
rss_kb=$(awk '/^VmRSS:/ { print $2 }' "/proc/$pid/status" 2>/dev/null) || return 1
|
|
105
|
-
[ -z "$rss_kb" ] && return 1 # process died between stat and read
|
|
106
|
-
echo $(( rss_kb / 1024 ))
|
|
107
|
-
else
|
|
108
|
-
rss_kb=$(ps -o rss= -p "$pid" 2>/dev/null | tr -d ' ') || return 1
|
|
109
|
-
[ -z "$rss_kb" ] && return 1
|
|
110
|
-
echo $(( rss_kb / 1024 ))
|
|
111
|
-
fi
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
# Get process age in hours
|
|
115
|
-
get_age_hours() {
|
|
116
|
-
local pid="$1"
|
|
117
|
-
local elapsed_seconds
|
|
118
|
-
elapsed_seconds=$(ps -o etimes= -p "$pid" 2>/dev/null | tr -d ' ') || return 1
|
|
119
|
-
[ -z "$elapsed_seconds" ] && return 1
|
|
120
|
-
echo $(( elapsed_seconds / 3600 ))
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
# Gracefully kill a frozen process with escalating signals
|
|
124
|
-
kill_frozen_process() {
|
|
125
|
-
local pid="$1"
|
|
126
|
-
local pane_id="$2"
|
|
127
|
-
local age_h="$3"
|
|
128
|
-
local mem_mb="$4"
|
|
129
|
-
|
|
130
|
-
log "FROZEN DETECTED: PID=$pid pane=$pane_id age=${age_h}h mem=${mem_mb}MB"
|
|
131
|
-
log "Recovery: sending Ctrl+C x2 to pane $pane_id"
|
|
132
|
-
|
|
133
|
-
# Step 1: Try Ctrl+C twice via tmux (gentlest approach)
|
|
134
|
-
tmux send-keys -t "$pane_id" C-c 2>/dev/null || true
|
|
135
|
-
sleep 1
|
|
136
|
-
tmux send-keys -t "$pane_id" C-c 2>/dev/null || true
|
|
137
|
-
sleep 4
|
|
138
|
-
|
|
139
|
-
# Check if process is still alive
|
|
140
|
-
if ! kill -0 "$pid" 2>/dev/null; then
|
|
141
|
-
log "Process $pid terminated after Ctrl+C"
|
|
142
|
-
return 0
|
|
143
|
-
fi
|
|
144
|
-
|
|
145
|
-
# Step 2: SIGTERM
|
|
146
|
-
log "Recovery: sending SIGTERM to PID $pid"
|
|
147
|
-
kill -TERM "$pid" 2>/dev/null || true
|
|
148
|
-
sleep 5
|
|
149
|
-
|
|
150
|
-
if ! kill -0 "$pid" 2>/dev/null; then
|
|
151
|
-
log "Process $pid terminated after SIGTERM"
|
|
152
|
-
return 0
|
|
153
|
-
fi
|
|
154
|
-
|
|
155
|
-
# Step 3: SIGKILL (last resort)
|
|
156
|
-
log "Recovery: sending SIGKILL to PID $pid"
|
|
157
|
-
kill -KILL "$pid" 2>/dev/null || true
|
|
158
|
-
sleep 1
|
|
159
|
-
|
|
160
|
-
if ! kill -0 "$pid" 2>/dev/null; then
|
|
161
|
-
log "Process $pid terminated after SIGKILL"
|
|
162
|
-
else
|
|
163
|
-
log "WARNING: Process $pid survived SIGKILL — zombie or kernel issue"
|
|
164
|
-
fi
|
|
165
|
-
|
|
166
|
-
return 0
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
# Main check loop
|
|
170
|
-
while true; do
|
|
171
|
-
# Exit if session no longer exists
|
|
172
|
-
if ! tmux has-session -t "$SESSION_NAME" 2>/dev/null; then
|
|
173
|
-
log "Session '$SESSION_NAME' no longer exists"
|
|
174
|
-
break
|
|
175
|
-
fi
|
|
176
|
-
|
|
177
|
-
# Iterate over all panes in the session
|
|
178
|
-
while IFS= read -r pane_info; do
|
|
179
|
-
[ -z "$pane_info" ] && continue
|
|
180
|
-
|
|
181
|
-
pane_id="${pane_info%% *}"
|
|
182
|
-
pane_pid="${pane_info#* }"
|
|
183
|
-
|
|
184
|
-
# Find claude child processes under this pane's shell
|
|
185
|
-
# Look for processes whose command contains "claude" under the pane PID
|
|
186
|
-
while IFS= read -r child_line; do
|
|
187
|
-
[ -z "$child_line" ] && continue
|
|
188
|
-
|
|
189
|
-
child_pid="${child_line%% *}"
|
|
190
|
-
child_cmd="${child_line#* }"
|
|
191
|
-
|
|
192
|
-
# Skip non-claude processes and skip ourselves
|
|
193
|
-
case "$child_cmd" in
|
|
194
|
-
*claude-watchdog*|*watchdog*) continue ;;
|
|
195
|
-
*claude*) ;; # This is a Claude process — check it
|
|
196
|
-
*) continue ;;
|
|
197
|
-
esac
|
|
198
|
-
|
|
199
|
-
# Criterion 1: Age check
|
|
200
|
-
age_h=$(get_age_hours "$child_pid" 2>/dev/null) || continue
|
|
201
|
-
if [ "$age_h" -lt "$MAX_AGE_HOURS" ]; then
|
|
202
|
-
continue
|
|
203
|
-
fi
|
|
204
|
-
|
|
205
|
-
# Criterion 2: Memory check
|
|
206
|
-
mem_mb=$(get_rss_mb "$child_pid" 2>/dev/null) || continue
|
|
207
|
-
if [ "$mem_mb" -lt "$MAX_MEMORY_MB" ]; then
|
|
208
|
-
continue
|
|
209
|
-
fi
|
|
210
|
-
|
|
211
|
-
# Criterion 3: Idle check (most important — prevents killing active work)
|
|
212
|
-
if ! is_process_idle "$child_pid" "$MAX_IDLE_MINUTES"; then
|
|
213
|
-
# Process has recent JSONL activity — NOT frozen, just long-running
|
|
214
|
-
continue
|
|
215
|
-
fi
|
|
216
|
-
|
|
217
|
-
# All three criteria met — this process is frozen
|
|
218
|
-
kill_frozen_process "$child_pid" "$pane_id" "$age_h" "$mem_mb"
|
|
219
|
-
|
|
220
|
-
done < <(ps --ppid "$pane_pid" -o pid=,args= 2>/dev/null || true)
|
|
221
|
-
|
|
222
|
-
done < <(tmux list-panes -t "$SESSION_NAME" -F '#{pane_id} #{pane_pid}' 2>/dev/null || true)
|
|
223
|
-
|
|
224
|
-
sleep "$INTERVAL"
|
|
225
|
-
done
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* clear-active-command.js - Clears active_commands on session start
|
|
4
|
-
*
|
|
5
|
-
* This script runs on SessionStart to reset the active_commands array
|
|
6
|
-
* in session-state.json. This ensures that if a user starts a new chat
|
|
7
|
-
* without running a command like /babysit, they won't get stale command
|
|
8
|
-
* rules in their PreCompact output.
|
|
9
|
-
*
|
|
10
|
-
* Usage: Called automatically by SessionStart hook
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const fs = require('fs');
|
|
14
|
-
const path = require('path');
|
|
15
|
-
|
|
16
|
-
function clearActiveCommands() {
|
|
17
|
-
const sessionStatePath = path.join(process.cwd(), 'docs/09-agents/session-state.json');
|
|
18
|
-
|
|
19
|
-
// Skip if session-state.json doesn't exist
|
|
20
|
-
if (!fs.existsSync(sessionStatePath)) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
const sessionState = JSON.parse(fs.readFileSync(sessionStatePath, 'utf8'));
|
|
26
|
-
|
|
27
|
-
// Only update if active_commands has items
|
|
28
|
-
if (sessionState.active_commands && sessionState.active_commands.length > 0) {
|
|
29
|
-
sessionState.active_commands = [];
|
|
30
|
-
fs.writeFileSync(sessionStatePath, JSON.stringify(sessionState, null, 2) + '\n', 'utf8');
|
|
31
|
-
console.log('Cleared active_commands from previous session');
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Migration: also clear old active_command field if present
|
|
35
|
-
if (sessionState.active_command !== undefined) {
|
|
36
|
-
delete sessionState.active_command;
|
|
37
|
-
fs.writeFileSync(sessionStatePath, JSON.stringify(sessionState, null, 2) + '\n', 'utf8');
|
|
38
|
-
}
|
|
39
|
-
} catch (err) {
|
|
40
|
-
// Silently ignore errors - don't break session start
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
if (require.main === module) {
|
|
45
|
-
clearActiveCommands();
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
module.exports = { clearActiveCommands };
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# compress-status.sh
|
|
4
|
-
# Removes verbose fields from status.json to reduce file size
|
|
5
|
-
# Keeps only essential tracking metadata
|
|
6
|
-
|
|
7
|
-
set -e
|
|
8
|
-
|
|
9
|
-
# Colors for output
|
|
10
|
-
RED='\033[0;31m'
|
|
11
|
-
GREEN='\033[0;32m'
|
|
12
|
-
YELLOW='\033[1;33m'
|
|
13
|
-
BLUE='\033[0;34m'
|
|
14
|
-
NC='\033[0m' # No Color
|
|
15
|
-
|
|
16
|
-
# Default paths (relative to project root)
|
|
17
|
-
DOCS_DIR="docs"
|
|
18
|
-
STATUS_FILE="$DOCS_DIR/09-agents/status.json"
|
|
19
|
-
|
|
20
|
-
# Find project root (directory containing .agileflow)
|
|
21
|
-
PROJECT_ROOT="$(pwd)"
|
|
22
|
-
while [[ ! -d "$PROJECT_ROOT/.agileflow" ]] && [[ "$PROJECT_ROOT" != "/" ]]; do
|
|
23
|
-
PROJECT_ROOT="$(dirname "$PROJECT_ROOT")"
|
|
24
|
-
done
|
|
25
|
-
|
|
26
|
-
if [[ "$PROJECT_ROOT" == "/" ]]; then
|
|
27
|
-
echo -e "${RED}Error: Not in an AgileFlow project (no .agileflow directory found)${NC}"
|
|
28
|
-
exit 1
|
|
29
|
-
fi
|
|
30
|
-
|
|
31
|
-
# Update paths to absolute
|
|
32
|
-
STATUS_FILE="$PROJECT_ROOT/$STATUS_FILE"
|
|
33
|
-
|
|
34
|
-
# Check if status.json exists
|
|
35
|
-
if [[ ! -f "$STATUS_FILE" ]]; then
|
|
36
|
-
echo -e "${YELLOW}No status.json found at $STATUS_FILE${NC}"
|
|
37
|
-
exit 0
|
|
38
|
-
fi
|
|
39
|
-
|
|
40
|
-
echo -e "${BLUE}Compressing status.json...${NC}"
|
|
41
|
-
|
|
42
|
-
# Get original size
|
|
43
|
-
ORIGINAL_SIZE=$(wc -c < "$STATUS_FILE")
|
|
44
|
-
|
|
45
|
-
# Compress using Node.js
|
|
46
|
-
if command -v node &> /dev/null; then
|
|
47
|
-
STATUS_FILE="$STATUS_FILE" node <<'EOF'
|
|
48
|
-
const fs = require('fs');
|
|
49
|
-
|
|
50
|
-
const statusFile = process.env.STATUS_FILE;
|
|
51
|
-
|
|
52
|
-
// Read status.json
|
|
53
|
-
const status = JSON.parse(fs.readFileSync(statusFile, 'utf8'));
|
|
54
|
-
const stories = status.stories || {};
|
|
55
|
-
|
|
56
|
-
// Fields to keep (essential tracking metadata only)
|
|
57
|
-
const KEEP_FIELDS = [
|
|
58
|
-
'id',
|
|
59
|
-
'title',
|
|
60
|
-
'status',
|
|
61
|
-
'owner',
|
|
62
|
-
'created_at',
|
|
63
|
-
'updated_at',
|
|
64
|
-
'completed_at',
|
|
65
|
-
'epic',
|
|
66
|
-
'dependencies',
|
|
67
|
-
'blocked_by',
|
|
68
|
-
'blocks',
|
|
69
|
-
'pr_url',
|
|
70
|
-
'test_status',
|
|
71
|
-
'priority',
|
|
72
|
-
'tags'
|
|
73
|
-
];
|
|
74
|
-
|
|
75
|
-
// Compress each story
|
|
76
|
-
let removedFields = 0;
|
|
77
|
-
const compressed = {};
|
|
78
|
-
|
|
79
|
-
for (const [storyId, story] of Object.entries(stories)) {
|
|
80
|
-
compressed[storyId] = {};
|
|
81
|
-
|
|
82
|
-
for (const field of KEEP_FIELDS) {
|
|
83
|
-
if (story[field] !== undefined) {
|
|
84
|
-
compressed[storyId][field] = story[field];
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const originalFieldCount = Object.keys(story).length;
|
|
89
|
-
const compressedFieldCount = Object.keys(compressed[storyId]).length;
|
|
90
|
-
removedFields += (originalFieldCount - compressedFieldCount);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Update status.json
|
|
94
|
-
status.stories = compressed;
|
|
95
|
-
status.updated = new Date().toISOString();
|
|
96
|
-
fs.writeFileSync(statusFile, JSON.stringify(status, null, 2));
|
|
97
|
-
|
|
98
|
-
console.log(`\x1b[32m✓ Removed ${removedFields} verbose fields\x1b[0m`);
|
|
99
|
-
console.log(`\x1b[34mStories processed: ${Object.keys(compressed).length}\x1b[0m`);
|
|
100
|
-
EOF
|
|
101
|
-
|
|
102
|
-
# Get new size
|
|
103
|
-
NEW_SIZE=$(wc -c < "$STATUS_FILE")
|
|
104
|
-
SAVED=$((ORIGINAL_SIZE - NEW_SIZE))
|
|
105
|
-
PERCENT=$((SAVED * 100 / ORIGINAL_SIZE))
|
|
106
|
-
|
|
107
|
-
echo -e "${GREEN}Compression complete!${NC}"
|
|
108
|
-
echo -e "${BLUE}Original size: ${ORIGINAL_SIZE} bytes${NC}"
|
|
109
|
-
echo -e "${BLUE}New size: ${NEW_SIZE} bytes${NC}"
|
|
110
|
-
echo -e "${BLUE}Saved: ${SAVED} bytes (${PERCENT}%)${NC}"
|
|
111
|
-
else
|
|
112
|
-
echo -e "${RED}Error: Node.js not found. Cannot compress status.json.${NC}"
|
|
113
|
-
exit 1
|
|
114
|
-
fi
|
|
115
|
-
|
|
116
|
-
exit 0
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* context-loader.js - Auto-generate session context from authoritative sources
|
|
4
|
-
*
|
|
5
|
-
* This hook runs during SessionStart to provide project context that Claude
|
|
6
|
-
* should be aware of. Context is DYNAMICALLY GENERATED from sources that
|
|
7
|
-
* are already being updated (status.json, git, epics) - no manual maintenance.
|
|
8
|
-
*
|
|
9
|
-
* Context Sources (in order):
|
|
10
|
-
* 1. status.json - Current WIP stories, blocked items
|
|
11
|
-
* 2. Git - Current branch, recent commits
|
|
12
|
-
* 3. Active epics - From docs/05-epics/
|
|
13
|
-
* 4. CONTEXT.md (optional) - Static rules/constraints that rarely change
|
|
14
|
-
*
|
|
15
|
-
* Exit codes:
|
|
16
|
-
* 0 - Success
|
|
17
|
-
* 1 - Error (unexpected failure)
|
|
18
|
-
*
|
|
19
|
-
* Usage: Add to SessionStart hooks in .claude/settings.json
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
const fs = require('fs');
|
|
23
|
-
const path = require('path');
|
|
24
|
-
const { execFileSync } = require('child_process');
|
|
25
|
-
|
|
26
|
-
// Optional: hook metrics integration
|
|
27
|
-
let hookMetrics;
|
|
28
|
-
try {
|
|
29
|
-
hookMetrics = require('./lib/hook-metrics.js');
|
|
30
|
-
} catch (e) {
|
|
31
|
-
// Hook metrics not available
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Feature flags (Agent Teams detection)
|
|
35
|
-
let featureFlags;
|
|
36
|
-
try {
|
|
37
|
-
featureFlags = require('../lib/feature-flags');
|
|
38
|
-
} catch (e) {
|
|
39
|
-
// Feature flags not available
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Colors for output (use shared color utilities)
|
|
43
|
-
const { c } = require('../lib/colors');
|
|
44
|
-
const { createLogger } = require('../lib/logger');
|
|
45
|
-
const log = createLogger('context-loader');
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Find project root by looking for .agileflow or .git directory
|
|
49
|
-
*/
|
|
50
|
-
function findProjectRoot() {
|
|
51
|
-
let dir = process.cwd();
|
|
52
|
-
while (dir !== '/') {
|
|
53
|
-
if (fs.existsSync(path.join(dir, '.agileflow'))) {
|
|
54
|
-
return dir;
|
|
55
|
-
}
|
|
56
|
-
if (fs.existsSync(path.join(dir, '.git'))) {
|
|
57
|
-
return dir;
|
|
58
|
-
}
|
|
59
|
-
dir = path.dirname(dir);
|
|
60
|
-
}
|
|
61
|
-
return process.cwd();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Get current stories from status.json
|
|
66
|
-
*/
|
|
67
|
-
function getStoriesContext(projectRoot) {
|
|
68
|
-
const statusPath = path.join(projectRoot, 'docs', '09-agents', 'status.json');
|
|
69
|
-
if (!fs.existsSync(statusPath)) return null;
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
const status = JSON.parse(fs.readFileSync(statusPath, 'utf8'));
|
|
73
|
-
const stories = status.stories || {};
|
|
74
|
-
|
|
75
|
-
const inProgress = [];
|
|
76
|
-
const blocked = [];
|
|
77
|
-
const ready = [];
|
|
78
|
-
|
|
79
|
-
for (const [id, story] of Object.entries(stories)) {
|
|
80
|
-
const item = { id, title: story.title, epic: story.epic };
|
|
81
|
-
if (story.status === 'in_progress') inProgress.push(item);
|
|
82
|
-
else if (story.status === 'blocked') blocked.push(item);
|
|
83
|
-
else if (story.status === 'ready') ready.push(item);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return { inProgress, blocked, ready };
|
|
87
|
-
} catch (e) {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Get git context (branch, recent commits)
|
|
94
|
-
*/
|
|
95
|
-
function getGitContext(projectRoot) {
|
|
96
|
-
try {
|
|
97
|
-
const branch = execFileSync('git', ['branch', '--show-current'], {
|
|
98
|
-
cwd: projectRoot,
|
|
99
|
-
encoding: 'utf8',
|
|
100
|
-
timeout: 5000,
|
|
101
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
102
|
-
}).trim();
|
|
103
|
-
|
|
104
|
-
const recentCommits = execFileSync('git', ['log', '-3', '--oneline'], {
|
|
105
|
-
cwd: projectRoot,
|
|
106
|
-
encoding: 'utf8',
|
|
107
|
-
timeout: 5000,
|
|
108
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
109
|
-
})
|
|
110
|
-
.trim()
|
|
111
|
-
.split('\n')
|
|
112
|
-
.filter(Boolean);
|
|
113
|
-
|
|
114
|
-
// Check for uncommitted changes
|
|
115
|
-
const status = execFileSync('git', ['status', '--porcelain'], {
|
|
116
|
-
cwd: projectRoot,
|
|
117
|
-
encoding: 'utf8',
|
|
118
|
-
timeout: 5000,
|
|
119
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
120
|
-
}).trim();
|
|
121
|
-
|
|
122
|
-
const hasUncommitted = status.length > 0;
|
|
123
|
-
const uncommittedCount = hasUncommitted ? status.split('\n').length : 0;
|
|
124
|
-
|
|
125
|
-
return { branch, recentCommits, hasUncommitted, uncommittedCount };
|
|
126
|
-
} catch (e) {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* Get active epics from docs/05-epics/
|
|
133
|
-
*/
|
|
134
|
-
function getEpicsContext(projectRoot) {
|
|
135
|
-
const epicsDir = path.join(projectRoot, 'docs', '05-epics');
|
|
136
|
-
if (!fs.existsSync(epicsDir)) return null;
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
const files = fs.readdirSync(epicsDir).filter(f => f.endsWith('.md'));
|
|
140
|
-
const epics = [];
|
|
141
|
-
|
|
142
|
-
for (const file of files.slice(0, 5)) {
|
|
143
|
-
// Limit to 5 epics
|
|
144
|
-
const content = fs.readFileSync(path.join(epicsDir, file), 'utf8');
|
|
145
|
-
const titleMatch = content.match(/^#\s+(.+)/m);
|
|
146
|
-
const statusMatch = content.match(/status:\s*(\w+)/i);
|
|
147
|
-
|
|
148
|
-
if (titleMatch) {
|
|
149
|
-
epics.push({
|
|
150
|
-
id: file.replace('.md', ''),
|
|
151
|
-
title: titleMatch[1].trim(),
|
|
152
|
-
status: statusMatch ? statusMatch[1] : 'unknown',
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return epics.filter(e => e.status !== 'completed');
|
|
158
|
-
} catch (e) {
|
|
159
|
-
return null;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Load static rules from CONTEXT.md (optional - for things that rarely change)
|
|
165
|
-
*/
|
|
166
|
-
function getStaticRules(projectRoot) {
|
|
167
|
-
const contextFile = path.join(projectRoot, 'CONTEXT.md');
|
|
168
|
-
if (!fs.existsSync(contextFile)) return null;
|
|
169
|
-
|
|
170
|
-
try {
|
|
171
|
-
const content = fs.readFileSync(contextFile, 'utf8');
|
|
172
|
-
|
|
173
|
-
// Extract only "Key Constraints" or "Rules" sections - these are static
|
|
174
|
-
const rulesMatch = content.match(
|
|
175
|
-
/##\s*(Key Constraints|Rules|Constraints|Guidelines)([\s\S]*?)(?=##|$)/i
|
|
176
|
-
);
|
|
177
|
-
if (rulesMatch) {
|
|
178
|
-
return rulesMatch[2].trim();
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// If file is small (<2KB), include it all as static rules
|
|
182
|
-
if (content.length < 2048) {
|
|
183
|
-
return content.trim();
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return null;
|
|
187
|
-
} catch (e) {
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Generate and output context
|
|
194
|
-
*/
|
|
195
|
-
function generateContext() {
|
|
196
|
-
const timer = hookMetrics ? hookMetrics.startHookTimer('SessionStart', 'context_loader') : null;
|
|
197
|
-
const projectRoot = findProjectRoot();
|
|
198
|
-
|
|
199
|
-
// Gather context from all sources
|
|
200
|
-
const stories = getStoriesContext(projectRoot);
|
|
201
|
-
const git = getGitContext(projectRoot);
|
|
202
|
-
const epics = getEpicsContext(projectRoot);
|
|
203
|
-
const staticRules = getStaticRules(projectRoot);
|
|
204
|
-
|
|
205
|
-
// Check if we have any meaningful context to output
|
|
206
|
-
const hasStories = stories && (stories.inProgress.length > 0 || stories.blocked.length > 0);
|
|
207
|
-
const hasGit = git && git.branch;
|
|
208
|
-
const hasEpics = epics && epics.length > 0;
|
|
209
|
-
const hasRules = staticRules && staticRules.length > 0;
|
|
210
|
-
|
|
211
|
-
if (!hasStories && !hasGit && !hasEpics && !hasRules) {
|
|
212
|
-
// No context to output
|
|
213
|
-
if (timer && hookMetrics) {
|
|
214
|
-
hookMetrics.recordHookMetrics(timer, 'success', null, { rootDir: projectRoot });
|
|
215
|
-
}
|
|
216
|
-
process.exit(0);
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Output context header
|
|
220
|
-
console.log('');
|
|
221
|
-
console.log(`${c.cyan}━━━ Session Context (auto-generated) ━━━${c.reset}`);
|
|
222
|
-
|
|
223
|
-
// Current Work (from status.json)
|
|
224
|
-
if (hasStories) {
|
|
225
|
-
console.log('');
|
|
226
|
-
console.log(`${c.yellow}## Current Work${c.reset}`);
|
|
227
|
-
|
|
228
|
-
if (stories.inProgress.length > 0) {
|
|
229
|
-
console.log(`${c.green}In Progress:${c.reset}`);
|
|
230
|
-
for (const s of stories.inProgress.slice(0, 3)) {
|
|
231
|
-
const epic = s.epic ? ` (${s.epic})` : '';
|
|
232
|
-
console.log(` - ${s.id}: ${s.title}${epic}`);
|
|
233
|
-
}
|
|
234
|
-
if (stories.inProgress.length > 3) {
|
|
235
|
-
console.log(` ${c.dim}... and ${stories.inProgress.length - 3} more${c.reset}`);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
if (stories.blocked.length > 0) {
|
|
240
|
-
console.log(`${c.red}Blocked:${c.reset}`);
|
|
241
|
-
for (const s of stories.blocked.slice(0, 2)) {
|
|
242
|
-
console.log(` - ${s.id}: ${s.title}`);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Git context
|
|
248
|
-
if (hasGit) {
|
|
249
|
-
console.log('');
|
|
250
|
-
console.log(`${c.yellow}## Git Status${c.reset}`);
|
|
251
|
-
console.log(`Branch: ${c.green}${git.branch}${c.reset}`);
|
|
252
|
-
|
|
253
|
-
if (git.hasUncommitted) {
|
|
254
|
-
console.log(`${c.yellow}Uncommitted changes: ${git.uncommittedCount} file(s)${c.reset}`);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
if (git.recentCommits.length > 0) {
|
|
258
|
-
console.log(`${c.dim}Recent commits:${c.reset}`);
|
|
259
|
-
for (const commit of git.recentCommits) {
|
|
260
|
-
console.log(` ${c.dim}${commit}${c.reset}`);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
// Active epics
|
|
266
|
-
if (hasEpics) {
|
|
267
|
-
console.log('');
|
|
268
|
-
console.log(`${c.yellow}## Active Epics${c.reset}`);
|
|
269
|
-
for (const epic of epics) {
|
|
270
|
-
console.log(` - ${epic.id}: ${epic.title}`);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Agent Teams capability
|
|
275
|
-
if (featureFlags) {
|
|
276
|
-
try {
|
|
277
|
-
const teamsInfo = featureFlags.getAgentTeamsDisplayInfo({ rootDir: projectRoot });
|
|
278
|
-
if (teamsInfo.status === 'enabled') {
|
|
279
|
-
console.log('');
|
|
280
|
-
console.log(`${c.yellow}## Agent Teams${c.reset}`);
|
|
281
|
-
console.log(`Mode: ${c.green}native${c.reset} (Claude Code Agent Teams enabled)`);
|
|
282
|
-
console.log(`${c.dim}Use /agileflow:team:start <template> to create a team${c.reset}`);
|
|
283
|
-
}
|
|
284
|
-
} catch (e) {
|
|
285
|
-
// Silently ignore
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Static rules from CONTEXT.md
|
|
290
|
-
if (hasRules) {
|
|
291
|
-
console.log('');
|
|
292
|
-
console.log(`${c.yellow}## Project Rules${c.reset}`);
|
|
293
|
-
console.log(staticRules);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
// Footer
|
|
297
|
-
console.log('');
|
|
298
|
-
console.log(`${c.dim}━━━ End Context ━━━${c.reset}`);
|
|
299
|
-
console.log('');
|
|
300
|
-
|
|
301
|
-
// Record metrics
|
|
302
|
-
if (timer && hookMetrics) {
|
|
303
|
-
hookMetrics.recordHookMetrics(timer, 'success', null, { rootDir: projectRoot });
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
process.exit(0);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// Run
|
|
310
|
-
generateContext();
|