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
package/scripts/claude-tmux.sh
DELETED
|
@@ -1,737 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# claude-tmux.sh - Wrapper script that auto-starts Claude Code in a tmux session
|
|
3
|
-
#
|
|
4
|
-
# Usage:
|
|
5
|
-
# ./claude-tmux.sh # Reattach to detached session, or create new
|
|
6
|
-
# ./claude-tmux.sh --new # Force create a new session
|
|
7
|
-
# ./claude-tmux.sh --attach # Reattach to most recent session (any state)
|
|
8
|
-
# ./claude-tmux.sh --no-tmux # Start without tmux (regular claude)
|
|
9
|
-
# ./claude-tmux.sh -n # Same as --no-tmux
|
|
10
|
-
# ./claude-tmux.sh --kill # Kill ALL sessions for this directory
|
|
11
|
-
# ./claude-tmux.sh --refresh # Refresh tmux config on all existing sessions
|
|
12
|
-
# ./claude-tmux.sh --help # Show help with keybinds
|
|
13
|
-
#
|
|
14
|
-
# When already in tmux: Just runs claude normally
|
|
15
|
-
# When not in tmux: Reattaches to a detached session if one exists, otherwise
|
|
16
|
-
# creates a new tmux session. Use --new to always create a fresh session.
|
|
17
|
-
#
|
|
18
|
-
# Multiple terminals can run `af` from the same directory simultaneously.
|
|
19
|
-
# Sessions are named: claude-<dir>, claude-<dir>-2, claude-<dir>-3, etc.
|
|
20
|
-
# Your Claude conversation is preserved via smart resume (per-pane UUID tracking).
|
|
21
|
-
#
|
|
22
|
-
# SESSION CREATION (while inside tmux):
|
|
23
|
-
# - Alt+N New worktree session (isolated branch + directory)
|
|
24
|
-
# - Alt+S Same-directory session (quick, no worktree)
|
|
25
|
-
#
|
|
26
|
-
# FREEZE RECOVERY (while inside tmux):
|
|
27
|
-
# - Alt+k Send Ctrl+C twice (soft interrupt)
|
|
28
|
-
# - Alt+K Force kill the pane immediately
|
|
29
|
-
# - Alt+R Respawn pane with fresh shell
|
|
30
|
-
# - Alt+q Detach from tmux (session stays alive)
|
|
31
|
-
|
|
32
|
-
set -e
|
|
33
|
-
|
|
34
|
-
# Resolve script directory (used for claude-smart.sh and other helpers)
|
|
35
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
36
|
-
|
|
37
|
-
# Parse arguments
|
|
38
|
-
NO_TMUX=false
|
|
39
|
-
KILL_SESSION=false
|
|
40
|
-
SHOW_HELP=false
|
|
41
|
-
ATTACH_ONLY=false
|
|
42
|
-
FORCE_NEW=false
|
|
43
|
-
REFRESH_CONFIG=false
|
|
44
|
-
CONFIGURE_SESSION=""
|
|
45
|
-
USE_RESUME=false
|
|
46
|
-
RESUME_SESSION_ID=""
|
|
47
|
-
|
|
48
|
-
for arg in "$@"; do
|
|
49
|
-
case $arg in
|
|
50
|
-
--no-tmux|-n)
|
|
51
|
-
NO_TMUX=true
|
|
52
|
-
shift
|
|
53
|
-
;;
|
|
54
|
-
--attach|-a)
|
|
55
|
-
ATTACH_ONLY=true
|
|
56
|
-
shift
|
|
57
|
-
;;
|
|
58
|
-
--new)
|
|
59
|
-
FORCE_NEW=true
|
|
60
|
-
shift
|
|
61
|
-
;;
|
|
62
|
-
--fresh|-f)
|
|
63
|
-
# Kept for backwards compat, but this is now the default behavior
|
|
64
|
-
shift
|
|
65
|
-
;;
|
|
66
|
-
--rescue|-r)
|
|
67
|
-
# Kept for backwards compat, same as default now
|
|
68
|
-
shift
|
|
69
|
-
;;
|
|
70
|
-
--kill)
|
|
71
|
-
KILL_SESSION=true
|
|
72
|
-
shift
|
|
73
|
-
;;
|
|
74
|
-
--refresh)
|
|
75
|
-
REFRESH_CONFIG=true
|
|
76
|
-
shift
|
|
77
|
-
;;
|
|
78
|
-
--configure-session=*)
|
|
79
|
-
CONFIGURE_SESSION="${arg#*=}"
|
|
80
|
-
shift
|
|
81
|
-
;;
|
|
82
|
-
--help|-h)
|
|
83
|
-
SHOW_HELP=true
|
|
84
|
-
shift
|
|
85
|
-
;;
|
|
86
|
-
esac
|
|
87
|
-
done
|
|
88
|
-
|
|
89
|
-
# Show help
|
|
90
|
-
if [ "$SHOW_HELP" = true ]; then
|
|
91
|
-
cat << 'EOF'
|
|
92
|
-
AgileFlow Claude tmux Wrapper
|
|
93
|
-
|
|
94
|
-
USAGE:
|
|
95
|
-
af [options] [claude-args...]
|
|
96
|
-
agileflow [options] [claude-args...]
|
|
97
|
-
|
|
98
|
-
OPTIONS:
|
|
99
|
-
--attach, -a Reattach to most recent session (attached or detached)
|
|
100
|
-
--new Force create a new session (skip auto-reattach)
|
|
101
|
-
--no-tmux, -n Run claude without tmux
|
|
102
|
-
--kill Kill ALL sessions for this directory
|
|
103
|
-
--refresh Refresh tmux config on all existing sessions
|
|
104
|
-
--help, -h Show this help
|
|
105
|
-
|
|
106
|
-
By default, af reattaches to a detached session if one exists (so Alt+Q
|
|
107
|
-
then af gets you right back). Use --new to force a new session.
|
|
108
|
-
|
|
109
|
-
SESSIONS:
|
|
110
|
-
Alt+s New Claude window
|
|
111
|
-
Alt+l Switch between sessions (picker)
|
|
112
|
-
Alt+q Detach (run af to reattach)
|
|
113
|
-
|
|
114
|
-
WINDOWS:
|
|
115
|
-
Alt+1-9 Switch to window N
|
|
116
|
-
Alt+c Create empty window
|
|
117
|
-
Alt+n/p Next/previous window
|
|
118
|
-
Alt+r Rename window
|
|
119
|
-
Alt+w Close window
|
|
120
|
-
Alt+W Batch close windows (picker)
|
|
121
|
-
Alt+t Reopen closed window
|
|
122
|
-
|
|
123
|
-
PANES:
|
|
124
|
-
Alt+d Split side by side
|
|
125
|
-
Alt+v Split top/bottom
|
|
126
|
-
Alt+arrows Navigate panes
|
|
127
|
-
Alt+z Zoom/unzoom pane
|
|
128
|
-
Alt+x Close pane
|
|
129
|
-
|
|
130
|
-
FREEZE RECOVERY:
|
|
131
|
-
Alt+k Send Ctrl+C twice (soft unfreeze)
|
|
132
|
-
Alt+K Force kill Claude process (keeps tab)
|
|
133
|
-
Alt+R Respawn pane (fresh shell)
|
|
134
|
-
|
|
135
|
-
OTHER:
|
|
136
|
-
Alt+h Show keybind help panel
|
|
137
|
-
EOF
|
|
138
|
-
exit 0
|
|
139
|
-
fi
|
|
140
|
-
|
|
141
|
-
# If --no-tmux was specified, just run claude directly
|
|
142
|
-
if [ "$NO_TMUX" = true ]; then
|
|
143
|
-
exec claude "$@"
|
|
144
|
-
fi
|
|
145
|
-
|
|
146
|
-
# ── Self-healing: ensure tmux socket directory exists ──────────────────────
|
|
147
|
-
# macOS clears /private/tmp/ on reboot, which removes the tmux socket dir.
|
|
148
|
-
# This causes "error connecting to ... (No such file or directory)" on every
|
|
149
|
-
# tmux command. We fix it automatically so users never see this error.
|
|
150
|
-
# Must run BEFORE any tmux command (including --kill, --attach, --refresh).
|
|
151
|
-
#
|
|
152
|
-
# IMPORTANT: tmux uses $TMUX_TMPDIR, then falls back to /tmp (NOT $TMPDIR).
|
|
153
|
-
# On macOS, $TMPDIR is /var/folders/.../T/ but tmux uses /private/tmp/.
|
|
154
|
-
if command -v tmux &> /dev/null; then
|
|
155
|
-
_TMUX_BASE="${TMUX_TMPDIR:-/tmp}"
|
|
156
|
-
_TMUX_BASE="${_TMUX_BASE%/}"
|
|
157
|
-
_TMUX_SOCK_DIR="${_TMUX_BASE}/tmux-$(id -u)"
|
|
158
|
-
if [ ! -d "$_TMUX_SOCK_DIR" ]; then
|
|
159
|
-
mkdir -p "$_TMUX_SOCK_DIR" 2>/dev/null && chmod 700 "$_TMUX_SOCK_DIR" 2>/dev/null
|
|
160
|
-
if [ ! -d "$_TMUX_SOCK_DIR" ]; then
|
|
161
|
-
echo "Warning: Could not create tmux socket directory ($_TMUX_SOCK_DIR)."
|
|
162
|
-
echo "Running claude without tmux."
|
|
163
|
-
exec claude "$@"
|
|
164
|
-
fi
|
|
165
|
-
fi
|
|
166
|
-
unset _TMUX_BASE _TMUX_SOCK_DIR
|
|
167
|
-
fi
|
|
168
|
-
|
|
169
|
-
# ══════════════════════════════════════════════════════════════════════════════
|
|
170
|
-
# TAB FORMAT BUILDER — dynamic compaction based on window count & terminal width
|
|
171
|
-
# Uses tmux 3.2+ #{e|...} numeric operators for cascading tier selection
|
|
172
|
-
# ══════════════════════════════════════════════════════════════════════════════
|
|
173
|
-
build_tab_format() {
|
|
174
|
-
# Chrome-like tab compaction: 14 tiers with threshold = width for minimal waste.
|
|
175
|
-
# Per-window budget (width/windows) picks the largest tier that fits.
|
|
176
|
-
# #{pN:#{=N:var}} = exactly N visible chars (truncate long + pad short names).
|
|
177
|
-
|
|
178
|
-
# ── Active tab: orange bg index + dark bg name ──────────────────────────
|
|
179
|
-
# " I " prefix = 5 visible chars (wide); " I " = 3 chars (narrow)
|
|
180
|
-
# Width = prefix + 1(space) + pN(name) + 1(space)
|
|
181
|
-
local a0='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e8683a bg=#2d2f3a]#[fg=#e0e0e0] #{p33:#{=33:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
182
|
-
local a1='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e8683a bg=#2d2f3a]#[fg=#e0e0e0] #{p20:#{=20:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
183
|
-
local a2='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e8683a bg=#2d2f3a]#[fg=#e0e0e0] #{p13:#{=13:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
184
|
-
local a3='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e8683a bg=#2d2f3a]#[fg=#e0e0e0] #{p11:#{=11:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
185
|
-
local a4='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e8683a bg=#2d2f3a]#[fg=#e0e0e0] #{p8:#{=8:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
186
|
-
local a5='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e8683a bg=#2d2f3a]#[fg=#e0e0e0] #{p6:#{=6:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
187
|
-
local a6='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e0e0e0 bg=#2d2f3a] #{p5:#{=5:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
188
|
-
local a7='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e0e0e0 bg=#2d2f3a] #{p4:#{=4:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
189
|
-
local a8='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e0e0e0 bg=#2d2f3a] #{p3:#{=3:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
190
|
-
local a9='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e0e0e0 bg=#2d2f3a] #{p2:#{=2:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
191
|
-
local a10='#[fg=#1a1b26 bg=#e8683a bold] #I #[fg=#e0e0e0 bg=#2d2f3a] #{p1:#{=1:window_name}} #[bg=#1a1b26 fg=#2d2f3a]'
|
|
192
|
-
local a11='#[fg=#1a1b26 bg=#e8683a bold] #I #[bg=#1a1b26 fg=#e8683a]'
|
|
193
|
-
local a12='#[fg=#1a1b26 bg=#e8683a bold] #I #[bg=#1a1b26 fg=#e8683a]'
|
|
194
|
-
local a13='#[fg=#e8683a bold]#I#[fg=default]'
|
|
195
|
-
|
|
196
|
-
# ── Inactive tab: gray text ─────────────────────────────────────────────
|
|
197
|
-
# " I:" prefix = 4 visible chars (wide); " I:" = 3 chars (narrow)
|
|
198
|
-
# Width = prefix + pN(name) + 1(space)
|
|
199
|
-
#
|
|
200
|
-
# Group color support: when @group_color is set on a window (e.g. by
|
|
201
|
-
# spawn-audit-sessions.js), show a colored dot prefix to visually
|
|
202
|
-
# identify grouped windows (ULTRADEEP audit tabs in main session).
|
|
203
|
-
local gc='#{?#{@group_color},#[fg=#{@group_color}]•,}'
|
|
204
|
-
local i0="${gc}"'#[fg=#8a8a8a] #I:#{p35:#{=35:window_name}} '
|
|
205
|
-
local i1="${gc}"'#[fg=#8a8a8a] #I:#{p22:#{=22:window_name}} '
|
|
206
|
-
local i2="${gc}"'#[fg=#8a8a8a] #I:#{p15:#{=15:window_name}} '
|
|
207
|
-
local i3="${gc}"'#[fg=#8a8a8a] #I:#{p12:#{=12:window_name}} '
|
|
208
|
-
local i4="${gc}"'#[fg=#8a8a8a] #I:#{p9:#{=9:window_name}} '
|
|
209
|
-
local i5="${gc}"'#[fg=#8a8a8a] #I:#{p7:#{=7:window_name}} '
|
|
210
|
-
local i6="${gc}"'#[fg=#8a8a8a] #I:#{p6:#{=6:window_name}} '
|
|
211
|
-
local i7="${gc}"'#[fg=#8a8a8a] #I:#{p5:#{=5:window_name}} '
|
|
212
|
-
local i8="${gc}"'#[fg=#8a8a8a] #I:#{p4:#{=4:window_name}} '
|
|
213
|
-
local i9="${gc}"'#[fg=#8a8a8a] #I:#{p3:#{=3:window_name}} '
|
|
214
|
-
local i10="${gc}"'#[fg=#8a8a8a] #I:#{p2:#{=2:window_name}} '
|
|
215
|
-
local i11="${gc}"'#[fg=#8a8a8a] #I:#{p1:#{=1:window_name}} '
|
|
216
|
-
local i12="${gc}"'#[fg=#8a8a8a] #I '
|
|
217
|
-
local i13='#[fg=#565a6e]#I'
|
|
218
|
-
|
|
219
|
-
# ── Tier selection: budget = width / windows ─────────────────────────────
|
|
220
|
-
local budget='#{e|/|:#{client_width},#{session_windows}}'
|
|
221
|
-
local cp="#{?#{e|>=|:${budget},"
|
|
222
|
-
local cm='},'
|
|
223
|
-
local cs='}'
|
|
224
|
-
|
|
225
|
-
# 14 tiers: threshold = format width → minimal wasted space.
|
|
226
|
-
# 81-col fill: 2-11 wins >=95%, 12-16 wins >=86%.
|
|
227
|
-
#
|
|
228
|
-
# Tier >=Thr Width 81-col example Fill%
|
|
229
|
-
# T0 40 40 2 wins (40ea) 98%
|
|
230
|
-
# T1 27 27 3 wins (27ea) 100%
|
|
231
|
-
# T2 20 20 4 wins (20ea) 98%
|
|
232
|
-
# T3 16 16 5 wins (16ea) 98%
|
|
233
|
-
# T4 13 13 6 wins (13ea) 96%
|
|
234
|
-
# T5 11 11 7 wins (11ea) 95%
|
|
235
|
-
# T6 10 10 8 wins (10ea) 98%
|
|
236
|
-
# T7 9 9 9 wins (9ea) 100%
|
|
237
|
-
# T8 8 8 10 wins (8ea) 98%
|
|
238
|
-
# T9 7 7 11 wins (7ea) 95%
|
|
239
|
-
# T10 6 6 12-13 wins 88-96%
|
|
240
|
-
# T11 5 5 14-16 wins 86-98%
|
|
241
|
-
# T12 3 3 17-27 wins
|
|
242
|
-
# T13 fallback 1 28+ wins
|
|
243
|
-
local active="${cp}40${cm}${a0},${cp}27${cm}${a1},${cp}20${cm}${a2},${cp}16${cm}${a3},${cp}13${cm}${a4},${cp}11${cm}${a5},${cp}10${cm}${a6},${cp}9${cm}${a7},${cp}8${cm}${a8},${cp}7${cm}${a9},${cp}6${cm}${a10},${cp}5${cm}${a11},${cp}3${cm}${a12},${a13}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}"
|
|
244
|
-
local inactive="${cp}40${cm}${i0},${cp}27${cm}${i1},${cp}20${cm}${i2},${cp}16${cm}${i3},${cp}13${cm}${i4},${cp}11${cm}${i5},${cp}10${cm}${i6},${cp}9${cm}${i7},${cp}8${cm}${i8},${cp}7${cm}${i9},${cp}6${cm}${i10},${cp}5${cm}${i11},${cp}3${cm}${i12},${i13}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}${cs}"
|
|
245
|
-
|
|
246
|
-
echo "#[bg=#1a1b26]#{W:#{?window_active,${active},${inactive}}}"
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
# ══════════════════════════════════════════════════════════════════════════════
|
|
250
|
-
# TMUX CONFIGURATION FUNCTION — applies theme, keybinds, and status bar
|
|
251
|
-
# Defined early so --refresh can use it before any session logic
|
|
252
|
-
# ══════════════════════════════════════════════════════════════════════════════
|
|
253
|
-
configure_tmux_session() {
|
|
254
|
-
local target_session="$1"
|
|
255
|
-
|
|
256
|
-
# Enable mouse support
|
|
257
|
-
tmux set-option -t "$target_session" mouse on
|
|
258
|
-
|
|
259
|
-
# Reduce escape-time from default 500ms to 10ms.
|
|
260
|
-
# The default causes two problems:
|
|
261
|
-
# 1) Arrow keys (which send \e[A etc.) get misinterpreted as Alt+[ if
|
|
262
|
-
# there's any delivery delay, accidentally triggering copy-mode.
|
|
263
|
-
# 2) Pressing Escape in Claude Code has a 500ms lag before tmux forwards it.
|
|
264
|
-
# 10ms is enough to detect genuine escape sequences on localhost/fast SSH.
|
|
265
|
-
tmux set-option -t "$target_session" escape-time 10
|
|
266
|
-
|
|
267
|
-
# Automatically renumber windows when one is closed (no gaps)
|
|
268
|
-
tmux set-option -t "$target_session" renumber-windows on
|
|
269
|
-
|
|
270
|
-
# Fix colors - proper terminal support
|
|
271
|
-
tmux set-option -t "$target_session" default-terminal "xterm-256color"
|
|
272
|
-
tmux set-option -t "$target_session" -ga terminal-overrides ",xterm-256color:Tc"
|
|
273
|
-
|
|
274
|
-
# ─── Status Bar Styling (2-line) ────────────────────────────────────────────
|
|
275
|
-
|
|
276
|
-
# Status bar position and refresh
|
|
277
|
-
tmux set-option -t "$target_session" status-position bottom
|
|
278
|
-
# Reduce refresh rate to prevent CPU overhead and freezes (was 5s, now 30s)
|
|
279
|
-
tmux set-option -t "$target_session" status-interval 30
|
|
280
|
-
|
|
281
|
-
# Enable 2-line status bar
|
|
282
|
-
tmux set-option -t "$target_session" status 2
|
|
283
|
-
|
|
284
|
-
# Base styling - Tokyo Night inspired dark theme
|
|
285
|
-
tmux set-option -t "$target_session" status-style "bg=#1a1b26,fg=#a9b1d6"
|
|
286
|
-
|
|
287
|
-
# Line 0 (top): Session name + live git branch + keybind hints
|
|
288
|
-
# Uses #() for live branch updates (runs on status-interval, every 30s)
|
|
289
|
-
tmux set-option -t "$target_session" status-format[0] "#[bg=#1a1b26] #[fg=#e8683a bold]#{s/claude-//:session_name} #[fg=#3b4261]· #[fg=#7aa2f7] #(git -C #{pane_current_path} branch --show-current 2>/dev/null || echo '-')#[align=right]#[fg=#565a6e]Alt+h help "
|
|
290
|
-
|
|
291
|
-
# Line 1 (bottom): Window tabs with dynamic compaction
|
|
292
|
-
# Tabs auto-shrink based on window count and terminal width
|
|
293
|
-
local tab_format
|
|
294
|
-
tab_format=$(build_tab_format)
|
|
295
|
-
tmux set-option -t "$target_session" status-format[1] "$tab_format"
|
|
296
|
-
|
|
297
|
-
# Pane border styling - blue inactive, orange active
|
|
298
|
-
tmux set-option -t "$target_session" pane-border-style "fg=#3d59a1"
|
|
299
|
-
tmux set-option -t "$target_session" pane-active-border-style "fg=#e8683a"
|
|
300
|
-
|
|
301
|
-
# Message styling - orange highlight
|
|
302
|
-
tmux set-option -t "$target_session" message-style "bg=#e8683a,fg=#1a1b26,bold"
|
|
303
|
-
|
|
304
|
-
# ─── Keybindings ────────────────────────────────────────────────────────────
|
|
305
|
-
|
|
306
|
-
# Alt+number to switch windows (1-9)
|
|
307
|
-
for i in 1 2 3 4 5 6 7 8 9; do
|
|
308
|
-
tmux bind-key -n "M-$i" select-window -t ":$i"
|
|
309
|
-
done
|
|
310
|
-
|
|
311
|
-
# Alt+c to create new window
|
|
312
|
-
tmux bind-key -n M-c new-window -c "#{pane_current_path}"
|
|
313
|
-
|
|
314
|
-
# Alt+q to detach
|
|
315
|
-
tmux bind-key -n M-q detach-client
|
|
316
|
-
|
|
317
|
-
# Alt+l to list and switch between sessions (interactive picker)
|
|
318
|
-
tmux bind-key -n M-l choose-tree -s -Z
|
|
319
|
-
|
|
320
|
-
# Alt+d to split horizontally (side by side)
|
|
321
|
-
tmux bind-key -n M-d split-window -h -c "#{pane_current_path}"
|
|
322
|
-
|
|
323
|
-
# Alt+v to split vertically (top/bottom)
|
|
324
|
-
tmux bind-key -n M-v split-window -v -c "#{pane_current_path}"
|
|
325
|
-
|
|
326
|
-
# Alt+arrow to navigate panes
|
|
327
|
-
tmux bind-key -n M-Left select-pane -L
|
|
328
|
-
tmux bind-key -n M-Right select-pane -R
|
|
329
|
-
tmux bind-key -n M-Up select-pane -U
|
|
330
|
-
tmux bind-key -n M-Down select-pane -D
|
|
331
|
-
|
|
332
|
-
# Alt+x to close current pane (with confirmation)
|
|
333
|
-
tmux bind-key -n M-x confirm-before -p "Close pane? (y/n)" kill-pane
|
|
334
|
-
|
|
335
|
-
# Alt+w to close current window (save state for Alt+T restore, then kill)
|
|
336
|
-
tmux bind-key -n M-w confirm-before -p "Close window? (y/n)" "run-shell '\"\$AGILEFLOW_SCRIPTS/tmux-save-closed-window.sh\"' ; kill-window"
|
|
337
|
-
|
|
338
|
-
# Alt+W (uppercase) to batch-close windows via multi-select picker
|
|
339
|
-
tmux bind-key -n M-W display-popup -E -w 60 -h 20 "\"$AGILEFLOW_SCRIPTS/tmux-close-windows.sh\""
|
|
340
|
-
|
|
341
|
-
# Alt+t to restore the most recently closed window (like Ctrl+Shift+T in browsers)
|
|
342
|
-
tmux bind-key -n M-t run-shell '"$AGILEFLOW_SCRIPTS/tmux-restore-window.sh"'
|
|
343
|
-
|
|
344
|
-
# Alt+n/p for next/previous window
|
|
345
|
-
tmux bind-key -n M-n next-window
|
|
346
|
-
tmux bind-key -n M-p previous-window
|
|
347
|
-
|
|
348
|
-
# Alt+r to rename window
|
|
349
|
-
tmux bind-key -n M-r command-prompt -I "#W" "rename-window '%%'"
|
|
350
|
-
|
|
351
|
-
# Alt+z to zoom/unzoom pane (fullscreen toggle)
|
|
352
|
-
tmux bind-key -n M-z resize-pane -Z
|
|
353
|
-
|
|
354
|
-
# ─── Session Creation Keybindings ──────────────────────────────────────────
|
|
355
|
-
# Alt+s to create a new Claude window (starts fresh, future re-runs in same pane resume)
|
|
356
|
-
# Window gets sequential name (claude-2, claude-3, ...) so windows are distinguishable
|
|
357
|
-
tmux bind-key -n M-s run-shell "N=\$(( \$(tmux list-windows -F '#{window_name}' 2>/dev/null | grep -c '^claude') + 1 )); tmux new-window -n \"claude-\$N\" -c '#{pane_current_path}' && tmux send-keys '\"\$AGILEFLOW_SCRIPTS/claude-smart.sh\" --fresh \$CLAUDE_SESSION_FLAGS' Enter"
|
|
358
|
-
|
|
359
|
-
# ─── Freeze Recovery Keybindings ───────────────────────────────────────────
|
|
360
|
-
# Alt+k to send Ctrl+C twice (soft interrupt for frozen processes)
|
|
361
|
-
# Uses #{pane_id} to target the correct pane even if focus shifts during the sleep
|
|
362
|
-
tmux bind-key -n M-k run-shell "tmux send-keys -t '#{pane_id}' C-c; sleep 0.5; tmux send-keys -t '#{pane_id}' C-c"
|
|
363
|
-
|
|
364
|
-
# Alt+K (uppercase) to force kill Claude process in pane without closing tab
|
|
365
|
-
# Finds the claude child process under the pane's shell and kills it,
|
|
366
|
-
# leaving the shell prompt intact so the user can restart or continue.
|
|
367
|
-
# Uses ps -o pid=,args= with grep to find claude, then cuts the PID (avoids awk quoting issues in tmux run-shell).
|
|
368
|
-
tmux bind-key -n M-K run-shell '\
|
|
369
|
-
PANE_PID=$(tmux display-message -p "#{pane_pid}"); \
|
|
370
|
-
CLAUDE_PID=$(ps --ppid "$PANE_PID" -o pid=,args= 2>/dev/null | grep -v "watchdog" | grep "claude" | head -1 | sed "s/^[[:space:]]*//" | cut -d" " -f1); \
|
|
371
|
-
if [ -n "$CLAUDE_PID" ]; then \
|
|
372
|
-
kill -TERM "$CLAUDE_PID" 2>/dev/null; \
|
|
373
|
-
sleep 2; \
|
|
374
|
-
kill -0 "$CLAUDE_PID" 2>/dev/null && kill -KILL "$CLAUDE_PID" 2>/dev/null; \
|
|
375
|
-
tmux display-message "Killed Claude process (PID $CLAUDE_PID)"; \
|
|
376
|
-
else \
|
|
377
|
-
tmux display-message "No Claude process found in this pane"; \
|
|
378
|
-
fi'
|
|
379
|
-
|
|
380
|
-
# Alt+R to respawn pane (kills everything in the pane, starts fresh shell)
|
|
381
|
-
tmux bind-key -n M-R respawn-pane -k
|
|
382
|
-
|
|
383
|
-
# ─── Help Panel ──────────────────────────────────────────────────────────
|
|
384
|
-
# Alt+h to show all Alt keybindings in a popup
|
|
385
|
-
tmux bind-key -n M-h display-popup -E -w 52 -h 32 "\
|
|
386
|
-
printf '\\n';\
|
|
387
|
-
printf ' \\033[1;38;5;208mSESSIONS\\033[0m\\n';\
|
|
388
|
-
printf ' Alt+s New Claude session\\n';\
|
|
389
|
-
printf ' Alt+l Switch session (picker)\\n';\
|
|
390
|
-
printf ' Alt+q Detach (af to resume)\\n';\
|
|
391
|
-
printf '\\n';\
|
|
392
|
-
printf ' \\033[1;38;5;208mWINDOWS\\033[0m\\n';\
|
|
393
|
-
printf ' Alt+c New empty window\\n';\
|
|
394
|
-
printf ' Alt+1-9 Switch to window N\\n';\
|
|
395
|
-
printf ' Alt+n/p Next / previous window\\n';\
|
|
396
|
-
printf ' Alt+r Rename window\\n';\
|
|
397
|
-
printf ' Alt+w Close window\\n';\
|
|
398
|
-
printf ' Alt+W Batch close windows\\n';\
|
|
399
|
-
printf ' Alt+t Reopen closed window\\n';\
|
|
400
|
-
printf '\\n';\
|
|
401
|
-
printf ' \\033[1;38;5;208mPANES\\033[0m\\n';\
|
|
402
|
-
printf ' Alt+d Split side by side\\n';\
|
|
403
|
-
printf ' Alt+v Split top / bottom\\n';\
|
|
404
|
-
printf ' Alt+arrows Navigate panes\\n';\
|
|
405
|
-
printf ' Alt+z Zoom / unzoom\\n';\
|
|
406
|
-
printf ' Alt+x Close pane (confirm)\\n';\
|
|
407
|
-
printf ' Alt+K Force kill process\\n';\
|
|
408
|
-
printf ' Alt+R Respawn pane (fresh)\\n';\
|
|
409
|
-
printf '\\n';\
|
|
410
|
-
printf ' \\033[1;38;5;208mOTHER\\033[0m\\n';\
|
|
411
|
-
printf ' Alt+k Unfreeze (Ctrl+C x2)\\n';\
|
|
412
|
-
printf ' Alt+h This help\\n';\
|
|
413
|
-
printf '\\n';\
|
|
414
|
-
read -n 1 -s -r -p ' Press any key to close'"
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
# Handle --configure-session flag — apply theme to a specific session and exit
|
|
418
|
-
# Used by spawn-audit-sessions.js to give audit sessions the same status bar
|
|
419
|
-
if [ -n "$CONFIGURE_SESSION" ]; then
|
|
420
|
-
configure_tmux_session "$CONFIGURE_SESSION"
|
|
421
|
-
exit 0
|
|
422
|
-
fi
|
|
423
|
-
|
|
424
|
-
# Handle --refresh flag — re-apply config to all existing claude-* sessions
|
|
425
|
-
if [ "$REFRESH_CONFIG" = true ]; then
|
|
426
|
-
REFRESHED=0
|
|
427
|
-
for sid in $(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep "^claude-"); do
|
|
428
|
-
configure_tmux_session "$sid"
|
|
429
|
-
# Ensure AGILEFLOW_SCRIPTS is set (needed by Alt+S keybind)
|
|
430
|
-
tmux set-environment -t "$sid" AGILEFLOW_SCRIPTS "$SCRIPT_DIR" 2>/dev/null || true
|
|
431
|
-
# (Re)start watchdog if not running for this session
|
|
432
|
-
_EXISTING_WD=$(tmux show-environment -t "$sid" WATCHDOG_PID 2>/dev/null | cut -d= -f2)
|
|
433
|
-
if [ -z "$_EXISTING_WD" ] || ! kill -0 "$_EXISTING_WD" 2>/dev/null; then
|
|
434
|
-
"$SCRIPT_DIR/claude-watchdog.sh" "$sid" &
|
|
435
|
-
_WD_PID=$!
|
|
436
|
-
tmux set-environment -t "$sid" WATCHDOG_PID "$_WD_PID"
|
|
437
|
-
disown "$_WD_PID"
|
|
438
|
-
fi
|
|
439
|
-
REFRESHED=$((REFRESHED + 1))
|
|
440
|
-
done
|
|
441
|
-
if [ "$REFRESHED" -gt 0 ]; then
|
|
442
|
-
echo "Refreshed config on $REFRESHED session(s)."
|
|
443
|
-
else
|
|
444
|
-
echo "No claude-* sessions found to refresh."
|
|
445
|
-
fi
|
|
446
|
-
exit 0
|
|
447
|
-
fi
|
|
448
|
-
|
|
449
|
-
# Check if we're already inside tmux — use smart wrapper instead of session management
|
|
450
|
-
if [ -n "$TMUX" ]; then
|
|
451
|
-
# shellcheck disable=SC2086
|
|
452
|
-
exec "$SCRIPT_DIR/claude-smart.sh" $CLAUDE_SESSION_FLAGS "$@"
|
|
453
|
-
fi
|
|
454
|
-
|
|
455
|
-
# Generate directory name (used for session name patterns)
|
|
456
|
-
DIR_NAME=$(basename "$(pwd)")
|
|
457
|
-
|
|
458
|
-
# Handle --kill flag — kill ALL sessions for this directory
|
|
459
|
-
if [ "$KILL_SESSION" = true ]; then
|
|
460
|
-
SESSION_BASE="claude-${DIR_NAME}"
|
|
461
|
-
KILLED=0
|
|
462
|
-
# Kill exact base session
|
|
463
|
-
if tmux has-session -t "$SESSION_BASE" 2>/dev/null; then
|
|
464
|
-
tmux kill-session -t "$SESSION_BASE" 2>/dev/null || true
|
|
465
|
-
KILLED=$((KILLED + 1))
|
|
466
|
-
fi
|
|
467
|
-
# Kill numbered sessions (claude-dir-2, claude-dir-3, etc.)
|
|
468
|
-
for sid in $(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep "^${SESSION_BASE}-[0-9]*$"); do
|
|
469
|
-
tmux kill-session -t "$sid" 2>/dev/null || true
|
|
470
|
-
KILLED=$((KILLED + 1))
|
|
471
|
-
done
|
|
472
|
-
if [ "$KILLED" -gt 0 ]; then
|
|
473
|
-
echo "Killed $KILLED session(s) for $DIR_NAME."
|
|
474
|
-
else
|
|
475
|
-
echo "No sessions found for '$DIR_NAME'."
|
|
476
|
-
fi
|
|
477
|
-
exit 0
|
|
478
|
-
fi
|
|
479
|
-
|
|
480
|
-
# Handle --attach flag (reattach to most recent session for this directory)
|
|
481
|
-
if [ "$ATTACH_ONLY" = true ]; then
|
|
482
|
-
SESSION_BASE="claude-${DIR_NAME}"
|
|
483
|
-
# Find the highest-numbered existing session
|
|
484
|
-
LATEST=""
|
|
485
|
-
if tmux has-session -t "$SESSION_BASE" 2>/dev/null; then
|
|
486
|
-
LATEST="$SESSION_BASE"
|
|
487
|
-
fi
|
|
488
|
-
for sid in $(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep "^${SESSION_BASE}-[0-9]*$" | sort -t- -k3 -n); do
|
|
489
|
-
LATEST="$sid"
|
|
490
|
-
done
|
|
491
|
-
if [ -n "$LATEST" ]; then
|
|
492
|
-
echo "Attaching to session: $LATEST"
|
|
493
|
-
exec tmux attach-session -t "$LATEST"
|
|
494
|
-
else
|
|
495
|
-
echo "No existing session. Creating new one..."
|
|
496
|
-
# Fall through to create new session
|
|
497
|
-
fi
|
|
498
|
-
fi
|
|
499
|
-
|
|
500
|
-
# ── Auto-cleanup dead sessions ────────────────────────────────────────────
|
|
501
|
-
# Silently remove sessions where all panes have exited (dead/empty shells).
|
|
502
|
-
# This prevents accumulation of orphan sessions over time.
|
|
503
|
-
SESSION_BASE="claude-${DIR_NAME}"
|
|
504
|
-
for sid in $(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep -E "^${SESSION_BASE}($|-[0-9]+$)"); do
|
|
505
|
-
# Count alive panes (pane_dead=0 means alive)
|
|
506
|
-
ALIVE=$(tmux list-panes -t "$sid" -F '#{pane_dead}' 2>/dev/null | grep -c '^0$' || true)
|
|
507
|
-
if [ "$ALIVE" = "0" ]; then
|
|
508
|
-
tmux kill-session -t "$sid" 2>/dev/null || true
|
|
509
|
-
fi
|
|
510
|
-
done
|
|
511
|
-
|
|
512
|
-
# ── Consolidate duplicate sessions ───────────────────────────────────────
|
|
513
|
-
# Kill numbered duplicates (e.g. claude-Acuide-2, -3) that were created by
|
|
514
|
-
# a previous bug. If the base session exists, duplicates are unnecessary.
|
|
515
|
-
# If only numbered sessions remain, promote the lowest to the base name.
|
|
516
|
-
if [ "$FORCE_NEW" = false ]; then
|
|
517
|
-
HAS_BASE=false
|
|
518
|
-
NUMBERED=()
|
|
519
|
-
if tmux has-session -t "$SESSION_BASE" 2>/dev/null; then
|
|
520
|
-
HAS_BASE=true
|
|
521
|
-
fi
|
|
522
|
-
while IFS= read -r sid; do
|
|
523
|
-
[ -n "$sid" ] && NUMBERED+=("$sid")
|
|
524
|
-
done < <(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep -E "^${SESSION_BASE}-[0-9]+$" | sort -t- -k3 -n)
|
|
525
|
-
|
|
526
|
-
if [ "$HAS_BASE" = true ] && [ "${#NUMBERED[@]}" -gt 0 ]; then
|
|
527
|
-
# Base exists — kill all numbered duplicates
|
|
528
|
-
for sid in "${NUMBERED[@]}"; do
|
|
529
|
-
tmux kill-session -t "$sid" 2>/dev/null || true
|
|
530
|
-
done
|
|
531
|
-
elif [ "$HAS_BASE" = false ] && [ "${#NUMBERED[@]}" -gt 0 ]; then
|
|
532
|
-
# No base — promote lowest numbered session to base name
|
|
533
|
-
PROMOTE="${NUMBERED[0]}"
|
|
534
|
-
tmux rename-session -t "$PROMOTE" "$SESSION_BASE" 2>/dev/null || true
|
|
535
|
-
# Kill remaining duplicates
|
|
536
|
-
for sid in "${NUMBERED[@]:1}"; do
|
|
537
|
-
tmux kill-session -t "$sid" 2>/dev/null || true
|
|
538
|
-
done
|
|
539
|
-
fi
|
|
540
|
-
fi
|
|
541
|
-
|
|
542
|
-
# ── Auto-reattach to detached session ──────────────────────────────────────
|
|
543
|
-
# When user does Alt+Q (detach) and then runs `af` again, reattach to the
|
|
544
|
-
# existing session instead of creating a new one. This preserves tmux windows,
|
|
545
|
-
# pane layout, and the live Claude chat session.
|
|
546
|
-
# If multiple detached sessions exist, show a picker so user can choose.
|
|
547
|
-
if [ "$FORCE_NEW" = false ]; then
|
|
548
|
-
DETACHED=()
|
|
549
|
-
while IFS= read -r sid; do
|
|
550
|
-
[ -n "$sid" ] && DETACHED+=("$sid")
|
|
551
|
-
done < <(tmux list-sessions -F '#{session_name} #{session_attached}' 2>/dev/null | awk '$2 == "0" {print $1}' | grep -E "^${SESSION_BASE}($|-[0-9]+$)")
|
|
552
|
-
|
|
553
|
-
if [ "${#DETACHED[@]}" -eq 1 ]; then
|
|
554
|
-
# Single detached session — just reattach
|
|
555
|
-
echo "Reattaching to: ${DETACHED[0]}"
|
|
556
|
-
exec tmux attach-session -t "${DETACHED[0]}"
|
|
557
|
-
elif [ "${#DETACHED[@]}" -gt 1 ]; then
|
|
558
|
-
# Multiple detached sessions — let user pick
|
|
559
|
-
echo ""
|
|
560
|
-
echo " Multiple detached sessions found:"
|
|
561
|
-
echo ""
|
|
562
|
-
i=1
|
|
563
|
-
for sid in "${DETACHED[@]}"; do
|
|
564
|
-
WINS=$(tmux list-windows -t "$sid" -F '#{window_name}' 2>/dev/null | tr '\n' ',' | sed 's/,$//')
|
|
565
|
-
printf " %d) %s (%s)\n" "$i" "$sid" "$WINS"
|
|
566
|
-
i=$((i + 1))
|
|
567
|
-
done
|
|
568
|
-
printf " %d) Create new session\n" "$i"
|
|
569
|
-
echo ""
|
|
570
|
-
printf " Pick [1]: "
|
|
571
|
-
read -r CHOICE
|
|
572
|
-
CHOICE=${CHOICE:-1}
|
|
573
|
-
if [ "$CHOICE" -ge 1 ] 2>/dev/null && [ "$CHOICE" -lt "$i" ] 2>/dev/null; then
|
|
574
|
-
IDX=$((CHOICE - 1))
|
|
575
|
-
echo "Reattaching to: ${DETACHED[$IDX]}"
|
|
576
|
-
exec tmux attach-session -t "${DETACHED[$IDX]}"
|
|
577
|
-
fi
|
|
578
|
-
# Fall through to create new session
|
|
579
|
-
fi
|
|
580
|
-
fi
|
|
581
|
-
|
|
582
|
-
# ── Reuse existing attached session ──────────────────────────────────────
|
|
583
|
-
# If a session exists but is attached in another terminal, attach to it
|
|
584
|
-
# as a second client rather than creating a duplicate session (e.g. -2).
|
|
585
|
-
# Use --new to force creating a separate session.
|
|
586
|
-
if [ "$FORCE_NEW" = false ]; then
|
|
587
|
-
EXISTING=()
|
|
588
|
-
while IFS= read -r sid; do
|
|
589
|
-
[ -n "$sid" ] && EXISTING+=("$sid")
|
|
590
|
-
done < <(tmux list-sessions -F '#{session_name}' 2>/dev/null | grep -E "^${SESSION_BASE}($|-[0-9]+$)")
|
|
591
|
-
|
|
592
|
-
if [ "${#EXISTING[@]}" -gt 0 ]; then
|
|
593
|
-
# Prefer the base session, otherwise pick the first one
|
|
594
|
-
TARGET="${EXISTING[0]}"
|
|
595
|
-
for sid in "${EXISTING[@]}"; do
|
|
596
|
-
if [ "$sid" = "$SESSION_BASE" ]; then
|
|
597
|
-
TARGET="$sid"
|
|
598
|
-
break
|
|
599
|
-
fi
|
|
600
|
-
done
|
|
601
|
-
echo "Attaching to existing session: $TARGET"
|
|
602
|
-
exec tmux attach-session -t "$TARGET"
|
|
603
|
-
fi
|
|
604
|
-
fi
|
|
605
|
-
|
|
606
|
-
# No existing session found — create a new one
|
|
607
|
-
SESSION_NAME="$SESSION_BASE"
|
|
608
|
-
SESSION_NUM=1
|
|
609
|
-
while tmux has-session -t "$SESSION_NAME" 2>/dev/null; do
|
|
610
|
-
SESSION_NUM=$((SESSION_NUM + 1))
|
|
611
|
-
SESSION_NAME="${SESSION_BASE}-${SESSION_NUM}"
|
|
612
|
-
done
|
|
613
|
-
|
|
614
|
-
# Find the most recent conversation to resume
|
|
615
|
-
PROJ_DIR=$(pwd | sed 's|/|-|g' | sed 's|^-||')
|
|
616
|
-
SESSIONS_DIR="$HOME/.claude/projects/-$PROJ_DIR"
|
|
617
|
-
|
|
618
|
-
if [ -d "$SESSIONS_DIR" ]; then
|
|
619
|
-
# Get most recent non-agent session (main conversations only)
|
|
620
|
-
RECENT_SESSION=$(ls -t "$SESSIONS_DIR"/*.jsonl 2>/dev/null | grep -v "agent-" | head -1)
|
|
621
|
-
if [ -n "$RECENT_SESSION" ] && [ -s "$RECENT_SESSION" ]; then
|
|
622
|
-
RESUME_SESSION_ID=$(basename "$RECENT_SESSION" .jsonl)
|
|
623
|
-
USE_RESUME=true
|
|
624
|
-
fi
|
|
625
|
-
fi
|
|
626
|
-
|
|
627
|
-
# Check if tmux auto-spawn is disabled in config
|
|
628
|
-
METADATA_FILE="docs/00-meta/agileflow-metadata.json"
|
|
629
|
-
if [ -f "$METADATA_FILE" ]; then
|
|
630
|
-
# Use node to parse JSON (more reliable than jq which may not be installed)
|
|
631
|
-
TMUX_ENABLED=$(node -e "
|
|
632
|
-
try {
|
|
633
|
-
const meta = JSON.parse(require('fs').readFileSync('$METADATA_FILE', 'utf8'));
|
|
634
|
-
// Default to true (enabled) if not explicitly set to false
|
|
635
|
-
console.log(meta.features?.tmuxAutoSpawn?.enabled !== false ? 'true' : 'false');
|
|
636
|
-
} catch (e) {
|
|
637
|
-
console.log('true'); // Default to enabled on error
|
|
638
|
-
}
|
|
639
|
-
" 2>/dev/null || echo "true")
|
|
640
|
-
|
|
641
|
-
if [ "$TMUX_ENABLED" = "false" ]; then
|
|
642
|
-
exec claude "$@"
|
|
643
|
-
fi
|
|
644
|
-
fi
|
|
645
|
-
|
|
646
|
-
# Check for default Claude flags from metadata (e.g., --dangerously-skip-permissions)
|
|
647
|
-
# Priority: 1) sessions.defaultStartupMode (from /configure), 2) features.claudeFlags
|
|
648
|
-
if [ -f "$METADATA_FILE" ]; then
|
|
649
|
-
META_FLAGS=$(node -e "
|
|
650
|
-
try {
|
|
651
|
-
const meta = JSON.parse(require('fs').readFileSync('$METADATA_FILE', 'utf8'));
|
|
652
|
-
// Check sessions config first (from /configure)
|
|
653
|
-
const mode = meta.sessions?.defaultStartupMode;
|
|
654
|
-
if (mode && mode !== 'normal') {
|
|
655
|
-
const modeConfig = meta.sessions?.startupModes?.[mode];
|
|
656
|
-
if (modeConfig?.flags) {
|
|
657
|
-
// Normalize short flags to canonical form
|
|
658
|
-
let flags = modeConfig.flags;
|
|
659
|
-
if (flags === '--dangerous') flags = '--dangerously-skip-permissions';
|
|
660
|
-
console.log(flags);
|
|
661
|
-
process.exit(0);
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
// Fallback to claudeFlags feature
|
|
665
|
-
if (meta.features?.claudeFlags?.enabled) {
|
|
666
|
-
let flags = meta.features.claudeFlags.defaultFlags || '';
|
|
667
|
-
if (flags === '--dangerous') flags = '--dangerously-skip-permissions';
|
|
668
|
-
console.log(flags);
|
|
669
|
-
} else {
|
|
670
|
-
console.log('');
|
|
671
|
-
}
|
|
672
|
-
} catch(e) { console.log(''); }
|
|
673
|
-
" 2>/dev/null || echo "")
|
|
674
|
-
if [ -n "$META_FLAGS" ]; then
|
|
675
|
-
CLAUDE_SESSION_FLAGS="${CLAUDE_SESSION_FLAGS:+$CLAUDE_SESSION_FLAGS }$META_FLAGS"
|
|
676
|
-
export CLAUDE_SESSION_FLAGS
|
|
677
|
-
fi
|
|
678
|
-
fi
|
|
679
|
-
|
|
680
|
-
# Check if tmux is available
|
|
681
|
-
if ! command -v tmux &> /dev/null; then
|
|
682
|
-
echo "tmux not found. Running claude without tmux."
|
|
683
|
-
echo "Install tmux for parallel session support:"
|
|
684
|
-
echo " macOS: brew install tmux"
|
|
685
|
-
echo " Ubuntu/Debian: sudo apt install tmux"
|
|
686
|
-
echo ""
|
|
687
|
-
exec claude "$@"
|
|
688
|
-
fi
|
|
689
|
-
|
|
690
|
-
# Create new tmux session with Claude
|
|
691
|
-
echo "Starting Claude in tmux session: $SESSION_NAME"
|
|
692
|
-
|
|
693
|
-
# Create session and set base-index in one atomic command.
|
|
694
|
-
# new-session starts the server (required after reboot when no server exists).
|
|
695
|
-
# Separate start-server/set-option calls fail because the server exits immediately
|
|
696
|
-
# when no sessions exist. The \; syntax chains commands on the same server instance.
|
|
697
|
-
tmux new-session -d -s "$SESSION_NAME" -n "main" \; set-option -g base-index 1
|
|
698
|
-
# Move window to index 1 if not already there (suppress stdout "same index"
|
|
699
|
-
# message when base-index was already 1 from a previous session)
|
|
700
|
-
tmux move-window -t "$SESSION_NAME":1 >/dev/null 2>&1 || true
|
|
701
|
-
|
|
702
|
-
# Apply tmux configuration
|
|
703
|
-
configure_tmux_session "$SESSION_NAME"
|
|
704
|
-
|
|
705
|
-
# Export scripts directory to tmux session environment (used by keybinds)
|
|
706
|
-
tmux set-environment -t "$SESSION_NAME" AGILEFLOW_SCRIPTS "$SCRIPT_DIR"
|
|
707
|
-
if [ -n "$CLAUDE_SESSION_FLAGS" ]; then
|
|
708
|
-
tmux set-environment -t "$SESSION_NAME" CLAUDE_SESSION_FLAGS "$CLAUDE_SESSION_FLAGS"
|
|
709
|
-
fi
|
|
710
|
-
|
|
711
|
-
# Start watchdog to auto-detect and kill frozen Claude processes
|
|
712
|
-
EXISTING_WD=$(tmux show-environment -t "$SESSION_NAME" WATCHDOG_PID 2>/dev/null | cut -d= -f2)
|
|
713
|
-
if [ -z "$EXISTING_WD" ] || ! kill -0 "$EXISTING_WD" 2>/dev/null; then
|
|
714
|
-
"$SCRIPT_DIR/claude-watchdog.sh" "$SESSION_NAME" &
|
|
715
|
-
_WD_PID=$!
|
|
716
|
-
tmux set-environment -t "$SESSION_NAME" WATCHDOG_PID "$_WD_PID"
|
|
717
|
-
disown "$_WD_PID"
|
|
718
|
-
fi
|
|
719
|
-
|
|
720
|
-
# Pre-seed @claude_uuid on initial pane if we found a recent conversation
|
|
721
|
-
if [ "$USE_RESUME" = true ] && [ -n "$RESUME_SESSION_ID" ]; then
|
|
722
|
-
tmux set-option -p -t "$SESSION_NAME" @claude_uuid "$RESUME_SESSION_ID" 2>/dev/null || true
|
|
723
|
-
fi
|
|
724
|
-
|
|
725
|
-
# Launch Claude via smart wrapper (handles resume from @claude_uuid)
|
|
726
|
-
SMART_CMD="\"$SCRIPT_DIR/claude-smart.sh\""
|
|
727
|
-
if [ -n "$CLAUDE_SESSION_FLAGS" ]; then
|
|
728
|
-
SMART_CMD="$SMART_CMD $CLAUDE_SESSION_FLAGS"
|
|
729
|
-
fi
|
|
730
|
-
if [ $# -gt 0 ]; then
|
|
731
|
-
SMART_CMD="$SMART_CMD $*"
|
|
732
|
-
fi
|
|
733
|
-
|
|
734
|
-
tmux send-keys -t "$SESSION_NAME" "$SMART_CMD" Enter
|
|
735
|
-
|
|
736
|
-
# Attach to the session
|
|
737
|
-
exec tmux attach-session -t "$SESSION_NAME"
|