agileflow 2.76.0 ā 2.78.0
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/README.md +3 -3
- package/package.json +6 -1
- package/scripts/agileflow-configure.js +185 -13
- package/scripts/agileflow-statusline.sh +266 -27
- package/scripts/agileflow-welcome.js +160 -52
- package/scripts/auto-self-improve.js +63 -20
- package/scripts/check-update.js +1 -4
- package/scripts/damage-control-bash.js +232 -0
- package/scripts/damage-control-edit.js +243 -0
- package/scripts/damage-control-write.js +243 -0
- package/scripts/get-env.js +15 -7
- package/scripts/lib/frontmatter-parser.js +4 -1
- package/scripts/obtain-context.js +59 -48
- package/scripts/ralph-loop.js +25 -13
- package/scripts/validate-expertise.sh +19 -15
- package/src/core/agents/accessibility.md +124 -53
- package/src/core/agents/adr-writer.md +192 -52
- package/src/core/agents/analytics.md +139 -60
- package/src/core/agents/api.md +173 -63
- package/src/core/agents/ci.md +139 -57
- package/src/core/agents/compliance.md +159 -68
- package/src/core/agents/configuration/damage-control.md +356 -0
- package/src/core/agents/database.md +162 -61
- package/src/core/agents/datamigration.md +179 -66
- package/src/core/agents/design.md +179 -57
- package/src/core/agents/devops.md +160 -3
- package/src/core/agents/documentation.md +204 -60
- package/src/core/agents/epic-planner.md +147 -55
- package/src/core/agents/integrations.md +197 -69
- package/src/core/agents/mentor.md +158 -57
- package/src/core/agents/mobile.md +159 -67
- package/src/core/agents/monitoring.md +154 -65
- package/src/core/agents/multi-expert.md +115 -43
- package/src/core/agents/orchestrator.md +77 -24
- package/src/core/agents/performance.md +130 -75
- package/src/core/agents/product.md +151 -55
- package/src/core/agents/qa.md +162 -74
- package/src/core/agents/readme-updater.md +178 -76
- package/src/core/agents/refactor.md +148 -95
- package/src/core/agents/research.md +143 -72
- package/src/core/agents/security.md +154 -65
- package/src/core/agents/testing.md +176 -97
- package/src/core/agents/ui.md +170 -79
- package/src/core/commands/adr/list.md +171 -0
- package/src/core/commands/adr/update.md +235 -0
- package/src/core/commands/adr/view.md +252 -0
- package/src/core/commands/adr.md +207 -50
- package/src/core/commands/agent.md +16 -0
- package/src/core/commands/assign.md +148 -44
- package/src/core/commands/auto.md +18 -1
- package/src/core/commands/babysit.md +361 -36
- package/src/core/commands/baseline.md +14 -0
- package/src/core/commands/blockers.md +170 -51
- package/src/core/commands/board.md +144 -66
- package/src/core/commands/changelog.md +15 -0
- package/src/core/commands/ci.md +179 -69
- package/src/core/commands/compress.md +18 -0
- package/src/core/commands/configure.md +16 -0
- package/src/core/commands/context/export.md +193 -4
- package/src/core/commands/context/full.md +191 -18
- package/src/core/commands/context/note.md +248 -4
- package/src/core/commands/debt.md +17 -0
- package/src/core/commands/deploy.md +208 -65
- package/src/core/commands/deps.md +15 -0
- package/src/core/commands/diagnose.md +16 -0
- package/src/core/commands/docs.md +196 -64
- package/src/core/commands/epic/list.md +170 -0
- package/src/core/commands/epic/view.md +242 -0
- package/src/core/commands/epic.md +192 -69
- package/src/core/commands/feedback.md +191 -71
- package/src/core/commands/handoff.md +162 -48
- package/src/core/commands/help.md +9 -0
- package/src/core/commands/ideate.md +446 -0
- package/src/core/commands/impact.md +16 -0
- package/src/core/commands/metrics.md +141 -37
- package/src/core/commands/multi-expert.md +77 -0
- package/src/core/commands/packages.md +16 -0
- package/src/core/commands/pr.md +161 -67
- package/src/core/commands/readme-sync.md +16 -0
- package/src/core/commands/research/analyze.md +568 -0
- package/src/core/commands/research/ask.md +345 -20
- package/src/core/commands/research/import.md +562 -19
- package/src/core/commands/research/list.md +173 -5
- package/src/core/commands/research/view.md +181 -8
- package/src/core/commands/retro.md +135 -48
- package/src/core/commands/review.md +219 -47
- package/src/core/commands/session/end.md +209 -0
- package/src/core/commands/session/history.md +210 -0
- package/src/core/commands/session/init.md +116 -0
- package/src/core/commands/session/new.md +296 -0
- package/src/core/commands/session/resume.md +166 -0
- package/src/core/commands/session/status.md +166 -0
- package/src/core/commands/skill/create.md +115 -17
- package/src/core/commands/skill/delete.md +117 -0
- package/src/core/commands/skill/edit.md +104 -0
- package/src/core/commands/skill/list.md +128 -0
- package/src/core/commands/skill/test.md +135 -0
- package/src/core/commands/skill/upgrade.md +542 -0
- package/src/core/commands/sprint.md +17 -1
- package/src/core/commands/status.md +133 -21
- package/src/core/commands/story/list.md +176 -0
- package/src/core/commands/story/view.md +265 -0
- package/src/core/commands/story-validate.md +101 -1
- package/src/core/commands/story.md +204 -51
- package/src/core/commands/template.md +16 -1
- package/src/core/commands/tests.md +226 -64
- package/src/core/commands/update.md +17 -1
- package/src/core/commands/validate-expertise.md +16 -0
- package/src/core/commands/velocity.md +140 -36
- package/src/core/commands/verify.md +14 -0
- package/src/core/commands/whats-new.md +30 -0
- package/src/core/skills/_learnings/README.md +91 -0
- package/src/core/skills/_learnings/_template.yaml +106 -0
- package/src/core/skills/_learnings/commit.yaml +69 -0
- package/src/core/templates/damage-control-patterns.yaml +234 -0
- package/src/core/templates/skill-template.md +53 -11
- package/tools/cli/commands/list.js +3 -1
- package/tools/cli/commands/start.js +180 -0
- package/tools/cli/commands/uninstall.js +4 -5
- package/tools/cli/commands/update.js +11 -3
- package/tools/cli/lib/content-injector.js +6 -1
- package/tools/cli/tui/Dashboard.js +66 -0
- package/tools/cli/tui/StoryList.js +69 -0
- package/tools/cli/tui/index.js +16 -0
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/agileflow)
|
|
6
|
-
[](docs/04-architecture/commands.md)
|
|
7
7
|
[](docs/04-architecture/subagents.md)
|
|
8
8
|
[](docs/04-architecture/skills.md)
|
|
9
9
|
|
|
@@ -65,7 +65,7 @@ AgileFlow combines three proven methodologies:
|
|
|
65
65
|
|
|
66
66
|
| Component | Count | Description |
|
|
67
67
|
|-----------|-------|-------------|
|
|
68
|
-
| [Commands](docs/04-architecture/commands.md) |
|
|
68
|
+
| [Commands](docs/04-architecture/commands.md) | 68 | Slash commands for agile workflows |
|
|
69
69
|
| [Agents/Experts](docs/04-architecture/subagents.md) | 27 | Specialized agents with self-improving knowledge bases |
|
|
70
70
|
| [Skills](docs/04-architecture/skills.md) | Dynamic | Generated on-demand with `/agileflow:skill:create` |
|
|
71
71
|
|
|
@@ -76,7 +76,7 @@ AgileFlow combines three proven methodologies:
|
|
|
76
76
|
Full documentation lives in [`docs/04-architecture/`](docs/04-architecture/):
|
|
77
77
|
|
|
78
78
|
### Reference
|
|
79
|
-
- [Commands](docs/04-architecture/commands.md) - All
|
|
79
|
+
- [Commands](docs/04-architecture/commands.md) - All 68 slash commands
|
|
80
80
|
- [Agents/Experts](docs/04-architecture/subagents.md) - 27 specialized agents with self-improving knowledge
|
|
81
81
|
- [Skills](docs/04-architecture/skills.md) - Dynamic skill generator with MCP integration
|
|
82
82
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agileflow",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.78.0",
|
|
4
4
|
"description": "AI-driven agile development system for Claude Code, Cursor, Windsurf, and more",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agile",
|
|
@@ -51,6 +51,8 @@
|
|
|
51
51
|
"test:coverage": "jest --coverage"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
+
"blessed": "^0.1.81",
|
|
55
|
+
"blessed-contrib": "^4.10.1",
|
|
54
56
|
"chalk": "^4.1.2",
|
|
55
57
|
"commander": "^12.1.0",
|
|
56
58
|
"fs-extra": "^11.2.0",
|
|
@@ -59,6 +61,9 @@
|
|
|
59
61
|
"ora": "^5.4.1",
|
|
60
62
|
"semver": "^7.6.3"
|
|
61
63
|
},
|
|
64
|
+
"optionalDependencies": {
|
|
65
|
+
"node-pty": "^1.0.0"
|
|
66
|
+
},
|
|
62
67
|
"engines": {
|
|
63
68
|
"node": ">=18.0.0"
|
|
64
69
|
},
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* --detect Show current status
|
|
24
24
|
* --help Show help
|
|
25
25
|
*
|
|
26
|
-
* Features: sessionstart, precompact, ralphloop, selfimprove, archival, statusline, autoupdate
|
|
26
|
+
* Features: sessionstart, precompact, ralphloop, selfimprove, archival, statusline, autoupdate, damagecontrol
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
29
|
const fs = require('fs');
|
|
@@ -76,6 +76,11 @@ const FEATURES = {
|
|
|
76
76
|
archival: { script: 'archive-completed-stories.sh', requiresHook: 'sessionstart' },
|
|
77
77
|
statusline: { script: 'agileflow-statusline.sh' },
|
|
78
78
|
autoupdate: { metadataOnly: true }, // Stored in metadata.updates.autoUpdate
|
|
79
|
+
damagecontrol: {
|
|
80
|
+
preToolUseHooks: true,
|
|
81
|
+
scripts: ['damage-control-bash.js', 'damage-control-edit.js', 'damage-control-write.js'],
|
|
82
|
+
patternsFile: 'damage-control-patterns.yaml',
|
|
83
|
+
},
|
|
79
84
|
};
|
|
80
85
|
|
|
81
86
|
// Complete registry of all scripts that may need repair
|
|
@@ -87,6 +92,9 @@ const ALL_SCRIPTS = {
|
|
|
87
92
|
'auto-self-improve.js': { feature: 'selfimprove', required: true },
|
|
88
93
|
'archive-completed-stories.sh': { feature: 'archival', required: true },
|
|
89
94
|
'agileflow-statusline.sh': { feature: 'statusline', required: true },
|
|
95
|
+
'damage-control-bash.js': { feature: 'damagecontrol', required: true },
|
|
96
|
+
'damage-control-edit.js': { feature: 'damagecontrol', required: true },
|
|
97
|
+
'damage-control-write.js': { feature: 'damagecontrol', required: true },
|
|
90
98
|
|
|
91
99
|
// Support scripts (used by commands/agents)
|
|
92
100
|
'obtain-context.js': { usedBy: ['/babysit', '/mentor', '/sprint'] },
|
|
@@ -215,6 +223,7 @@ function detectConfig() {
|
|
|
215
223
|
selfimprove: { enabled: false, valid: true, issues: [], version: null, outdated: false },
|
|
216
224
|
archival: { enabled: false, threshold: null, version: null, outdated: false },
|
|
217
225
|
statusline: { enabled: false, valid: true, issues: [], version: null, outdated: false },
|
|
226
|
+
damagecontrol: { enabled: false, valid: true, issues: [], version: null, outdated: false, level: null, patternCount: 0 },
|
|
218
227
|
},
|
|
219
228
|
metadata: { exists: false, version: null },
|
|
220
229
|
currentVersion: VERSION,
|
|
@@ -298,6 +307,32 @@ function detectConfig() {
|
|
|
298
307
|
}
|
|
299
308
|
}
|
|
300
309
|
}
|
|
310
|
+
|
|
311
|
+
// PreToolUse hooks (damage control)
|
|
312
|
+
if (settings.hooks.PreToolUse) {
|
|
313
|
+
if (Array.isArray(settings.hooks.PreToolUse) && settings.hooks.PreToolUse.length > 0) {
|
|
314
|
+
// Check for damage-control hooks by looking for damage-control scripts
|
|
315
|
+
const hasBashHook = settings.hooks.PreToolUse.some(
|
|
316
|
+
h => h.matcher === 'Bash' && h.hooks?.some(hk => hk.command?.includes('damage-control'))
|
|
317
|
+
);
|
|
318
|
+
const hasEditHook = settings.hooks.PreToolUse.some(
|
|
319
|
+
h => h.matcher === 'Edit' && h.hooks?.some(hk => hk.command?.includes('damage-control'))
|
|
320
|
+
);
|
|
321
|
+
const hasWriteHook = settings.hooks.PreToolUse.some(
|
|
322
|
+
h => h.matcher === 'Write' && h.hooks?.some(hk => hk.command?.includes('damage-control'))
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
if (hasBashHook || hasEditHook || hasWriteHook) {
|
|
326
|
+
status.features.damagecontrol.enabled = true;
|
|
327
|
+
// Count how many of the 3 hooks are present
|
|
328
|
+
const hookCount = [hasBashHook, hasEditHook, hasWriteHook].filter(Boolean).length;
|
|
329
|
+
if (hookCount < 3) {
|
|
330
|
+
status.features.damagecontrol.valid = false;
|
|
331
|
+
status.features.damagecontrol.issues.push(`Only ${hookCount}/3 hooks configured`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
301
336
|
}
|
|
302
337
|
|
|
303
338
|
// StatusLine
|
|
@@ -326,6 +361,11 @@ function detectConfig() {
|
|
|
326
361
|
status.features.archival.threshold = meta.archival.threshold_days;
|
|
327
362
|
}
|
|
328
363
|
|
|
364
|
+
// Damage control metadata
|
|
365
|
+
if (meta.features?.damagecontrol?.enabled) {
|
|
366
|
+
status.features.damagecontrol.level = meta.features.damagecontrol.protectionLevel || 'standard';
|
|
367
|
+
}
|
|
368
|
+
|
|
329
369
|
// Read feature versions from metadata and check if outdated
|
|
330
370
|
if (meta.features) {
|
|
331
371
|
Object.entries(meta.features).forEach(([feature, data]) => {
|
|
@@ -402,6 +442,22 @@ function printStatus(status) {
|
|
|
402
442
|
|
|
403
443
|
printFeature('statusline', 'Status Line');
|
|
404
444
|
|
|
445
|
+
// Damage Control (special display with level info)
|
|
446
|
+
const dc = status.features.damagecontrol;
|
|
447
|
+
if (dc.enabled) {
|
|
448
|
+
let dcStatusText = 'enabled';
|
|
449
|
+
if (dc.level) dcStatusText += ` (${dc.level})`;
|
|
450
|
+
if (!dc.valid) dcStatusText = 'INCOMPLETE';
|
|
451
|
+
const dcIcon = dc.enabled && dc.valid ? 'š”ļø' : 'ā ļø';
|
|
452
|
+
const dcColor = dc.enabled && dc.valid ? c.green : c.yellow;
|
|
453
|
+
log(` ${dcIcon} Damage Control: ${dcStatusText}`, dcColor);
|
|
454
|
+
if (dc.issues?.length > 0) {
|
|
455
|
+
dc.issues.forEach(issue => log(` āā ${issue}`, c.yellow));
|
|
456
|
+
}
|
|
457
|
+
} else {
|
|
458
|
+
log(` ā Damage Control: disabled`, c.dim);
|
|
459
|
+
}
|
|
460
|
+
|
|
405
461
|
// Metadata
|
|
406
462
|
if (status.metadata.exists) {
|
|
407
463
|
log(`\nMetadata: v${status.metadata.version}`, c.dim);
|
|
@@ -584,9 +640,10 @@ function enableFeature(feature, options = {}) {
|
|
|
584
640
|
|
|
585
641
|
// Stop hooks use error suppression to avoid blocking Claude
|
|
586
642
|
const isStoHook = config.hook === 'Stop';
|
|
587
|
-
const command =
|
|
588
|
-
|
|
589
|
-
|
|
643
|
+
const command =
|
|
644
|
+
config.type === 'node'
|
|
645
|
+
? `node ${absoluteScriptPath}${isStoHook ? ' 2>/dev/null || true' : ''}`
|
|
646
|
+
: `bash ${absoluteScriptPath}${isStoHook ? ' 2>/dev/null || true' : ''}`;
|
|
590
647
|
|
|
591
648
|
if (isStoHook) {
|
|
592
649
|
// Stop hooks stack - add to existing hooks instead of replacing
|
|
@@ -599,9 +656,7 @@ function enableFeature(feature, options = {}) {
|
|
|
599
656
|
}
|
|
600
657
|
|
|
601
658
|
// Check if this script is already added
|
|
602
|
-
const hasHook = settings.hooks.Stop[0].hooks.some(h =>
|
|
603
|
-
h.command?.includes(config.script)
|
|
604
|
-
);
|
|
659
|
+
const hasHook = settings.hooks.Stop[0].hooks.some(h => h.command?.includes(config.script));
|
|
605
660
|
|
|
606
661
|
if (!hasHook) {
|
|
607
662
|
settings.hooks.Stop[0].hooks.push({ type: 'command', command });
|
|
@@ -686,6 +741,79 @@ function enableFeature(feature, options = {}) {
|
|
|
686
741
|
return true; // Skip settings.json write for this feature
|
|
687
742
|
}
|
|
688
743
|
|
|
744
|
+
// Handle damage control (PreToolUse hooks)
|
|
745
|
+
if (feature === 'damagecontrol') {
|
|
746
|
+
const level = options.protectionLevel || 'standard';
|
|
747
|
+
|
|
748
|
+
// Verify all required scripts exist
|
|
749
|
+
const requiredScripts = ['damage-control-bash.js', 'damage-control-edit.js', 'damage-control-write.js'];
|
|
750
|
+
for (const script of requiredScripts) {
|
|
751
|
+
if (!scriptExists(script)) {
|
|
752
|
+
error(`Script not found: ${getScriptPath(script)}`);
|
|
753
|
+
info('Run "npx agileflow update" to reinstall scripts');
|
|
754
|
+
return false;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
// Deploy patterns file if not exists
|
|
759
|
+
const patternsDir = path.join(process.cwd(), '.agileflow', 'config');
|
|
760
|
+
const patternsDest = path.join(patternsDir, 'damage-control-patterns.yaml');
|
|
761
|
+
if (!fs.existsSync(patternsDest)) {
|
|
762
|
+
ensureDir(patternsDir);
|
|
763
|
+
// Try to copy from templates
|
|
764
|
+
const templatePath = path.join(process.cwd(), '.agileflow', 'templates', 'damage-control-patterns.yaml');
|
|
765
|
+
if (fs.existsSync(templatePath)) {
|
|
766
|
+
fs.copyFileSync(templatePath, patternsDest);
|
|
767
|
+
success('Deployed damage control patterns');
|
|
768
|
+
} else {
|
|
769
|
+
warn('No patterns template found - hooks will use defaults');
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
// Initialize PreToolUse array if not exists
|
|
774
|
+
if (!settings.hooks.PreToolUse) {
|
|
775
|
+
settings.hooks.PreToolUse = [];
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
// Helper to add or update a PreToolUse hook
|
|
779
|
+
const addPreToolUseHook = (matcher, scriptName) => {
|
|
780
|
+
const scriptPath = path.join(process.cwd(), '.agileflow', 'scripts', scriptName);
|
|
781
|
+
|
|
782
|
+
// Remove existing hook for this matcher if present
|
|
783
|
+
settings.hooks.PreToolUse = settings.hooks.PreToolUse.filter(h => h.matcher !== matcher);
|
|
784
|
+
|
|
785
|
+
// Add new hook
|
|
786
|
+
settings.hooks.PreToolUse.push({
|
|
787
|
+
matcher,
|
|
788
|
+
hooks: [{ type: 'command', command: `node ${scriptPath}`, timeout: 5 }],
|
|
789
|
+
});
|
|
790
|
+
};
|
|
791
|
+
|
|
792
|
+
// Add hooks for Bash, Edit, Write tools
|
|
793
|
+
addPreToolUseHook('Bash', 'damage-control-bash.js');
|
|
794
|
+
addPreToolUseHook('Edit', 'damage-control-edit.js');
|
|
795
|
+
addPreToolUseHook('Write', 'damage-control-write.js');
|
|
796
|
+
|
|
797
|
+
success('Damage control PreToolUse hooks enabled');
|
|
798
|
+
|
|
799
|
+
// Update metadata with protection level
|
|
800
|
+
updateMetadata({
|
|
801
|
+
features: {
|
|
802
|
+
damagecontrol: {
|
|
803
|
+
enabled: true,
|
|
804
|
+
protectionLevel: level,
|
|
805
|
+
version: VERSION,
|
|
806
|
+
at: new Date().toISOString(),
|
|
807
|
+
},
|
|
808
|
+
},
|
|
809
|
+
});
|
|
810
|
+
|
|
811
|
+
writeJSON('.claude/settings.json', settings);
|
|
812
|
+
updateGitignore();
|
|
813
|
+
|
|
814
|
+
return true;
|
|
815
|
+
}
|
|
816
|
+
|
|
689
817
|
writeJSON('.claude/settings.json', settings);
|
|
690
818
|
updateMetadata({
|
|
691
819
|
features: { [feature]: { enabled: true, version: VERSION, at: new Date().toISOString() } },
|
|
@@ -765,6 +893,45 @@ function disableFeature(feature) {
|
|
|
765
893
|
return true; // Skip settings.json write for this feature
|
|
766
894
|
}
|
|
767
895
|
|
|
896
|
+
// Disable damage control (PreToolUse hooks)
|
|
897
|
+
if (feature === 'damagecontrol') {
|
|
898
|
+
if (settings.hooks?.PreToolUse && Array.isArray(settings.hooks.PreToolUse)) {
|
|
899
|
+
const before = settings.hooks.PreToolUse.length;
|
|
900
|
+
|
|
901
|
+
// Remove damage-control hooks (Bash, Edit, Write matchers with damage-control scripts)
|
|
902
|
+
settings.hooks.PreToolUse = settings.hooks.PreToolUse.filter(h => {
|
|
903
|
+
const isDamageControlHook = h.hooks?.some(hk => hk.command?.includes('damage-control'));
|
|
904
|
+
return !isDamageControlHook;
|
|
905
|
+
});
|
|
906
|
+
|
|
907
|
+
const after = settings.hooks.PreToolUse.length;
|
|
908
|
+
|
|
909
|
+
if (before > after) {
|
|
910
|
+
success(`Removed ${before - after} damage control PreToolUse hook(s)`);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
// If no more PreToolUse hooks, remove the entire array
|
|
914
|
+
if (settings.hooks.PreToolUse.length === 0) {
|
|
915
|
+
delete settings.hooks.PreToolUse;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// Update metadata
|
|
920
|
+
updateMetadata({
|
|
921
|
+
features: {
|
|
922
|
+
damagecontrol: {
|
|
923
|
+
enabled: false,
|
|
924
|
+
version: VERSION,
|
|
925
|
+
at: new Date().toISOString(),
|
|
926
|
+
},
|
|
927
|
+
},
|
|
928
|
+
});
|
|
929
|
+
|
|
930
|
+
writeJSON('.claude/settings.json', settings);
|
|
931
|
+
success('Damage control disabled');
|
|
932
|
+
return true;
|
|
933
|
+
}
|
|
934
|
+
|
|
768
935
|
writeJSON('.claude/settings.json', settings);
|
|
769
936
|
updateMetadata({
|
|
770
937
|
features: { [feature]: { enabled: false, version: VERSION, at: new Date().toISOString() } },
|
|
@@ -1027,9 +1194,11 @@ function showVersionInfo() {
|
|
|
1027
1194
|
const installed = installedVersion.split('.').map(Number);
|
|
1028
1195
|
const latest = latestVersion.split('.').map(Number);
|
|
1029
1196
|
|
|
1030
|
-
if (
|
|
1031
|
-
|
|
1032
|
-
|
|
1197
|
+
if (
|
|
1198
|
+
latest[0] > installed[0] ||
|
|
1199
|
+
(latest[0] === installed[0] && latest[1] > installed[1]) ||
|
|
1200
|
+
(latest[0] === installed[0] && latest[1] === installed[1] && latest[2] > installed[2])
|
|
1201
|
+
) {
|
|
1033
1202
|
log('\nš Update available! Run: npx agileflow update', c.yellow);
|
|
1034
1203
|
}
|
|
1035
1204
|
}
|
|
@@ -1227,9 +1396,10 @@ ${c.cyan}Feature Control:${c.reset}
|
|
|
1227
1396
|
--enable=<list> Enable features (comma-separated)
|
|
1228
1397
|
--disable=<list> Disable features (comma-separated)
|
|
1229
1398
|
|
|
1230
|
-
Features: sessionstart, precompact, ralphloop, selfimprove, archival, statusline
|
|
1399
|
+
Features: sessionstart, precompact, ralphloop, selfimprove, archival, statusline, damagecontrol
|
|
1231
1400
|
|
|
1232
1401
|
Stop hooks (ralphloop, selfimprove) run when Claude completes/pauses
|
|
1402
|
+
Damage control (damagecontrol) uses PreToolUse hooks to block dangerous commands
|
|
1233
1403
|
|
|
1234
1404
|
${c.cyan}Statusline Components:${c.reset}
|
|
1235
1405
|
--show=<list> Show statusline components (comma-separated)
|
|
@@ -1292,6 +1462,9 @@ ${c.cyan}Examples:${c.reset}
|
|
|
1292
1462
|
|
|
1293
1463
|
# Repair scripts for a specific feature
|
|
1294
1464
|
node .agileflow/scripts/agileflow-configure.js --repair=statusline
|
|
1465
|
+
|
|
1466
|
+
# Enable damage control (PreToolUse hooks to block dangerous commands)
|
|
1467
|
+
node .agileflow/scripts/agileflow-configure.js --enable=damagecontrol
|
|
1295
1468
|
`);
|
|
1296
1469
|
}
|
|
1297
1470
|
|
|
@@ -1351,8 +1524,7 @@ function main() {
|
|
|
1351
1524
|
else if (arg.startsWith('--repair=')) {
|
|
1352
1525
|
repair = true;
|
|
1353
1526
|
repairFeature = arg.split('=')[1].trim().toLowerCase();
|
|
1354
|
-
}
|
|
1355
|
-
else if (arg === '--version' || arg === '-v') showVersion = true;
|
|
1527
|
+
} else if (arg === '--version' || arg === '-v') showVersion = true;
|
|
1356
1528
|
else if (arg === '--list-scripts' || arg === '--scripts') listScriptsMode = true;
|
|
1357
1529
|
});
|
|
1358
1530
|
|