claude-raid 0.1.7 → 0.2.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/bin/cli.js +13 -1
- package/package.json +1 -1
- package/src/descriptions.js +26 -24
- package/src/init.js +6 -10
- package/src/merge-settings.js +0 -15
- package/src/remove.js +18 -16
- package/src/ui.js +1 -1
- package/src/update.js +28 -13
- package/template/.claude/agents/archer.md +10 -20
- package/template/.claude/agents/rogue.md +11 -21
- package/template/.claude/agents/warrior.md +8 -19
- package/template/.claude/agents/wizard.md +14 -247
- package/template/.claude/dungeon-master-rules.md +210 -0
- package/template/.claude/hooks/raid-lib.sh +29 -2
- package/template/.claude/hooks/raid-pre-compact.sh +12 -1
- package/template/.claude/hooks/raid-session-end.sh +23 -13
- package/template/.claude/hooks/raid-session-start.sh +21 -3
- package/template/.claude/hooks/validate-commit.sh +7 -74
- package/template/.claude/hooks/validate-dungeon.sh +30 -11
- package/template/.claude/hooks/validate-no-placeholders.sh +3 -3
- package/template/.claude/hooks/validate-write-gate.sh +45 -63
- package/template/.claude/{raid-rules.md → party-rules.md} +38 -13
- package/template/.claude/skills/raid-browser-chrome/SKILL.md +1 -1
- package/template/.claude/skills/{raid-design → raid-canonical-design}/SKILL.md +52 -16
- package/template/.claude/skills/{raid-implementation → raid-canonical-implementation}/SKILL.md +41 -14
- package/template/.claude/skills/{raid-implementation-plan → raid-canonical-implementation-plan}/SKILL.md +49 -17
- package/template/.claude/skills/raid-canonical-prd/SKILL.md +133 -0
- package/template/.claude/skills/raid-canonical-protocol/SKILL.md +211 -0
- package/template/.claude/skills/{raid-review → raid-canonical-review}/SKILL.md +78 -17
- package/template/.claude/skills/raid-debugging/SKILL.md +30 -5
- package/template/.claude/skills/raid-init/SKILL.md +130 -0
- package/template/.claude/skills/raid-tdd/SKILL.md +1 -1
- package/template/.claude/skills/raid-wrap-up/SKILL.md +184 -0
- package/template/.claude/hooks/raid-stop.sh +0 -20
- package/template/.claude/hooks/raid-task-completed.sh +0 -42
- package/template/.claude/hooks/validate-bash-writes.sh +0 -157
- package/template/.claude/skills/raid-browser-playwright/SKILL.md +0 -163
- package/template/.claude/skills/raid-finishing/SKILL.md +0 -140
- package/template/.claude/skills/raid-git-worktrees/SKILL.md +0 -96
- package/template/.claude/skills/raid-protocol/SKILL.md +0 -337
package/bin/cli.js
CHANGED
|
@@ -10,6 +10,17 @@ const versionCheck = require('../src/version-check');
|
|
|
10
10
|
const showUpdateNotice = versionCheck.start();
|
|
11
11
|
|
|
12
12
|
const COMMANDS = {
|
|
13
|
+
// Start a Raid quest — launches wizard with full permissions
|
|
14
|
+
start: () => {
|
|
15
|
+
const { spawn } = require('child_process');
|
|
16
|
+
console.log('\n' + banner());
|
|
17
|
+
console.log(header('Summoning the Wizard...') + '\n');
|
|
18
|
+
const child = spawn('claude', ['--dangerously-skip-permissions', '--agent', 'wizard'], {
|
|
19
|
+
stdio: 'inherit',
|
|
20
|
+
env: process.env,
|
|
21
|
+
});
|
|
22
|
+
child.on('exit', (code) => process.exit(code || 0));
|
|
23
|
+
},
|
|
13
24
|
// Sync local with remote after CI version bump
|
|
14
25
|
sync: async () => {
|
|
15
26
|
const { execSync } = require('child_process');
|
|
@@ -53,6 +64,7 @@ if (!command || !COMMANDS[command]) {
|
|
|
53
64
|
console.log('\n' + banner());
|
|
54
65
|
console.log(header('Commands') + '\n');
|
|
55
66
|
const cmds = [
|
|
67
|
+
['start', 'Begin the Raid (launches Wizard)'],
|
|
56
68
|
['summon', 'Summon the party into this realm'],
|
|
57
69
|
['update', 'Reforge the party\'s arsenal'],
|
|
58
70
|
['dismantle', 'Dismantle the camp and retreat'],
|
|
@@ -63,7 +75,7 @@ if (!command || !COMMANDS[command]) {
|
|
|
63
75
|
console.log(' ' + colors.bold(name.padEnd(12)) + desc);
|
|
64
76
|
}
|
|
65
77
|
console.log(header('Begin the Raid') + '\n');
|
|
66
|
-
console.log(' claude
|
|
78
|
+
console.log(' claude-raid start\n');
|
|
67
79
|
console.log(colors.dim(' github.com/pedropicardi/claude-raid') + '\n');
|
|
68
80
|
process.exit(command ? 1 : 0);
|
|
69
81
|
}
|
package/package.json
CHANGED
package/src/descriptions.js
CHANGED
|
@@ -13,44 +13,46 @@ const AGENTS = {
|
|
|
13
13
|
const HOOKS = {
|
|
14
14
|
lifecycle: [
|
|
15
15
|
{ name: 'raid-lib.sh', desc: 'Shared config — reads raid.json, exports session state' },
|
|
16
|
-
{ name: 'raid-session-start.sh', desc: 'Activates Raid workflow
|
|
17
|
-
{ name: 'raid-session-end.sh', desc: 'Archives
|
|
18
|
-
{ name: 'raid-stop.sh', desc: 'Backs up Dungeon on phase transitions' },
|
|
16
|
+
{ name: 'raid-session-start.sh', desc: 'Activates Raid workflow, creates quest directory' },
|
|
17
|
+
{ name: 'raid-session-end.sh', desc: 'Archives quest dungeon to vault, cleans up' },
|
|
19
18
|
{ name: 'raid-pre-compact.sh', desc: 'Backs up Dungeon before message compaction' },
|
|
20
19
|
{ name: 'raid-task-created.sh', desc: 'Validates task subjects are meaningful' },
|
|
21
|
-
{ name: 'raid-task-completed.sh', desc: 'Blocks task completion without test evidence' },
|
|
22
20
|
],
|
|
23
21
|
gates: [
|
|
24
|
-
{ name: 'validate-commit.sh', desc: 'Enforces conventional
|
|
25
|
-
{ name: 'validate-write-gate.sh', desc: '
|
|
22
|
+
{ name: 'validate-commit.sh', desc: 'Enforces conventional commit format' },
|
|
23
|
+
{ name: 'validate-write-gate.sh', desc: 'Protects session files, allows quest dir writes' },
|
|
26
24
|
{ name: 'validate-file-naming.sh', desc: 'Enforces naming convention (kebab-case, etc.)' },
|
|
27
|
-
{ name: 'validate-no-placeholders.sh', desc: 'Blocks TBD/TODO in specs and
|
|
28
|
-
{ name: 'validate-dungeon.sh', desc: '
|
|
25
|
+
{ name: 'validate-no-placeholders.sh', desc: 'Blocks TBD/TODO in specs, plans, and quest docs' },
|
|
26
|
+
{ name: 'validate-dungeon.sh', desc: 'Validates dungeon entries and black cards' },
|
|
29
27
|
{ name: 'validate-browser-tests-exist.sh', desc: 'Checks Playwright tests exist before commits' },
|
|
30
28
|
{ name: 'validate-browser-cleanup.sh', desc: 'Verifies browser processes cleaned up properly' },
|
|
31
29
|
],
|
|
32
30
|
};
|
|
33
31
|
|
|
34
32
|
const SKILLS = {
|
|
35
|
-
|
|
36
|
-
'raid-
|
|
37
|
-
|
|
38
|
-
'raid-
|
|
39
|
-
'raid-
|
|
40
|
-
'raid-
|
|
41
|
-
'raid-
|
|
42
|
-
'raid-
|
|
43
|
-
'raid-
|
|
44
|
-
'raid-
|
|
45
|
-
|
|
46
|
-
'raid-
|
|
47
|
-
'raid-
|
|
33
|
+
// Core
|
|
34
|
+
'raid-init': 'Quest selection, greeting, session setup',
|
|
35
|
+
// Canonical Quest chain
|
|
36
|
+
'raid-canonical-protocol': 'Canonical Quest protocol and rules',
|
|
37
|
+
'raid-canonical-prd': 'Phase 1: PRD creation (optional)',
|
|
38
|
+
'raid-canonical-design': 'Phase 2: adversarial design exploration',
|
|
39
|
+
'raid-canonical-implementation-plan': 'Phase 3: task decomposition',
|
|
40
|
+
'raid-canonical-implementation': 'Phase 4: TDD with cross-testing',
|
|
41
|
+
'raid-canonical-review': 'Phase 5: pinning + fixing + black cards',
|
|
42
|
+
'raid-wrap-up': 'Phase 6: storyboard, PR, vault archival',
|
|
43
|
+
// Reusable (quest-agnostic)
|
|
44
|
+
'raid-tdd': 'RED-GREEN-REFACTOR enforcement',
|
|
45
|
+
'raid-verification': 'Evidence-before-claims gate',
|
|
46
|
+
'raid-debugging': 'Root-cause investigation',
|
|
47
|
+
'raid-browser': 'Browser startup discovery',
|
|
48
|
+
'raid-browser-chrome': 'Live browser inspection',
|
|
48
49
|
};
|
|
49
50
|
|
|
50
51
|
const CONFIG = {
|
|
51
|
-
'raid.json':
|
|
52
|
-
'
|
|
53
|
-
'
|
|
52
|
+
'raid.json': 'Project settings (editable)',
|
|
53
|
+
'party-rules.md': 'Party agent rules (editable)',
|
|
54
|
+
'dungeon-master-rules.md': 'Wizard rules (editable)',
|
|
55
|
+
'settings.json': 'Hooks merged into existing (backup created)',
|
|
54
56
|
};
|
|
55
57
|
|
|
56
58
|
module.exports = { AGENTS, HOOKS, SKILLS, CONFIG };
|
package/src/init.js
CHANGED
|
@@ -37,7 +37,7 @@ function install(cwd) {
|
|
|
37
37
|
const result = { skipped: [], alreadyInstalled: false, detected: null };
|
|
38
38
|
|
|
39
39
|
// Check if already installed
|
|
40
|
-
if (fs.existsSync(path.join(claudeDir, '
|
|
40
|
+
if (fs.existsSync(path.join(claudeDir, 'party-rules.md'))) {
|
|
41
41
|
result.alreadyInstalled = true;
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -97,6 +97,7 @@ function install(cwd) {
|
|
|
97
97
|
},
|
|
98
98
|
raid: {
|
|
99
99
|
defaultMode: 'full',
|
|
100
|
+
agentEffort: 'medium',
|
|
100
101
|
vault: {
|
|
101
102
|
path: '.claude/vault',
|
|
102
103
|
enabled: true,
|
|
@@ -141,10 +142,7 @@ function install(cwd) {
|
|
|
141
142
|
const ignoreEntries = [
|
|
142
143
|
'.claude/raid-last-test-run',
|
|
143
144
|
'.claude/raid-session',
|
|
144
|
-
'.claude/
|
|
145
|
-
'.claude/raid-dungeon-phase-*',
|
|
146
|
-
'.claude/raid-dungeon-backup.md',
|
|
147
|
-
'.claude/raid-dungeon-phase-*-backup.md',
|
|
145
|
+
'.claude/dungeon/',
|
|
148
146
|
'.claude/vault/.draft/',
|
|
149
147
|
'.env.raid',
|
|
150
148
|
];
|
|
@@ -212,7 +210,8 @@ async function run() {
|
|
|
212
210
|
console.log('');
|
|
213
211
|
console.log(' ' + header('Config'));
|
|
214
212
|
console.log(' Generated ' + bold('raid.json') + ' ' + dim('Project settings (editable)'));
|
|
215
|
-
console.log(' Copied ' + bold('
|
|
213
|
+
console.log(' Copied ' + bold('party-rules.md') + ' ' + dim('Party agent rules (editable)'));
|
|
214
|
+
console.log(' Copied ' + bold('dungeon-master-rules.md') + ' ' + dim('Wizard rules (editable)'));
|
|
216
215
|
console.log(' Merged ' + bold('settings.json') + ' ' + dim('Backup at .pre-raid-backup'));
|
|
217
216
|
|
|
218
217
|
// Skipped files
|
|
@@ -293,10 +292,7 @@ function dryRun(cwd) {
|
|
|
293
292
|
const ignoreEntries = [
|
|
294
293
|
'.claude/raid-last-test-run',
|
|
295
294
|
'.claude/raid-session',
|
|
296
|
-
'.claude/
|
|
297
|
-
'.claude/raid-dungeon-phase-*',
|
|
298
|
-
'.claude/raid-dungeon-backup.md',
|
|
299
|
-
'.claude/raid-dungeon-phase-*-backup.md',
|
|
295
|
+
'.claude/dungeon/',
|
|
300
296
|
'.claude/vault/.draft/',
|
|
301
297
|
'.env.raid',
|
|
302
298
|
];
|
package/src/merge-settings.js
CHANGED
|
@@ -32,7 +32,6 @@ const RAID_HOOKS = {
|
|
|
32
32
|
{
|
|
33
33
|
matcher: 'Bash',
|
|
34
34
|
hooks: [
|
|
35
|
-
{ type: 'command', command: `bash .claude/hooks/validate-bash-writes.sh ${RAID_HOOK_MARKER}` },
|
|
36
35
|
{ type: 'command', command: `bash .claude/hooks/validate-commit.sh ${RAID_HOOK_MARKER}` },
|
|
37
36
|
{ type: 'command', command: `bash .claude/hooks/validate-browser-tests-exist.sh ${RAID_HOOK_MARKER}` },
|
|
38
37
|
],
|
|
@@ -66,20 +65,6 @@ TaskCreated: [
|
|
|
66
65
|
],
|
|
67
66
|
},
|
|
68
67
|
],
|
|
69
|
-
TaskCompleted: [
|
|
70
|
-
{
|
|
71
|
-
hooks: [
|
|
72
|
-
{ type: 'command', command: `bash .claude/hooks/raid-task-completed.sh ${RAID_HOOK_MARKER}` },
|
|
73
|
-
],
|
|
74
|
-
},
|
|
75
|
-
],
|
|
76
|
-
Stop: [
|
|
77
|
-
{
|
|
78
|
-
hooks: [
|
|
79
|
-
{ type: 'command', command: `bash .claude/hooks/raid-stop.sh ${RAID_HOOK_MARKER}` },
|
|
80
|
-
],
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
68
|
PreCompact: [
|
|
84
69
|
{
|
|
85
70
|
hooks: [
|
package/src/remove.js
CHANGED
|
@@ -7,10 +7,13 @@ const { banner, header, colors } = require('./ui');
|
|
|
7
7
|
|
|
8
8
|
const RAID_AGENTS = ['wizard.md', 'warrior.md', 'archer.md', 'rogue.md'];
|
|
9
9
|
const RAID_SKILLS = [
|
|
10
|
+
'raid-init', 'raid-canonical-protocol', 'raid-canonical-prd', 'raid-canonical-design',
|
|
11
|
+
'raid-canonical-implementation-plan', 'raid-canonical-implementation', 'raid-canonical-review',
|
|
12
|
+
'raid-wrap-up', 'raid-tdd', 'raid-debugging', 'raid-verification',
|
|
13
|
+
'raid-browser', 'raid-browser-chrome',
|
|
14
|
+
// Legacy (v0.1.x)
|
|
10
15
|
'raid-protocol', 'raid-design', 'raid-implementation-plan', 'raid-implementation',
|
|
11
|
-
'raid-review', 'raid-finishing', 'raid-
|
|
12
|
-
'raid-verification', 'raid-git-worktrees',
|
|
13
|
-
'raid-browser', 'raid-browser-playwright', 'raid-browser-chrome',
|
|
16
|
+
'raid-review', 'raid-prd', 'raid-finishing', 'raid-browser-playwright', 'raid-git-worktrees',
|
|
14
17
|
];
|
|
15
18
|
|
|
16
19
|
function rmSafe(filePath) {
|
|
@@ -54,13 +57,19 @@ function performRemove(cwd) {
|
|
|
54
57
|
rmDirIfEmpty(path.join(claudeDir, 'hooks'));
|
|
55
58
|
rmDirIfEmpty(path.join(claudeDir, 'skills'));
|
|
56
59
|
|
|
57
|
-
rmSafe(path.join(claudeDir, '
|
|
60
|
+
rmSafe(path.join(claudeDir, 'party-rules.md'));
|
|
61
|
+
rmSafe(path.join(claudeDir, 'dungeon-master-rules.md'));
|
|
62
|
+
rmSafe(path.join(claudeDir, 'raid-rules.md')); // legacy cleanup
|
|
58
63
|
rmSafe(path.join(claudeDir, 'raid.json'));
|
|
59
64
|
rmSafe(path.join(claudeDir, 'raid-last-test-run'));
|
|
60
65
|
rmSafe(path.join(claudeDir, 'raid-session'));
|
|
61
66
|
|
|
62
|
-
// Clean up
|
|
67
|
+
// Clean up quest dungeon directory
|
|
68
|
+
rmDirSafe(path.join(claudeDir, 'dungeon'));
|
|
69
|
+
|
|
70
|
+
// Clean up legacy flat dungeon files (v0.1.x)
|
|
63
71
|
rmSafe(path.join(claudeDir, 'raid-dungeon.md'));
|
|
72
|
+
rmSafe(path.join(claudeDir, 'raid-dungeon-backup.md'));
|
|
64
73
|
if (fs.existsSync(claudeDir)) {
|
|
65
74
|
const dungeonFiles = fs.readdirSync(claudeDir).filter(f => f.startsWith('raid-dungeon-phase-'));
|
|
66
75
|
for (const file of dungeonFiles) {
|
|
@@ -68,15 +77,6 @@ function performRemove(cwd) {
|
|
|
68
77
|
}
|
|
69
78
|
}
|
|
70
79
|
|
|
71
|
-
// Clean up Dungeon backups
|
|
72
|
-
rmSafe(path.join(claudeDir, 'raid-dungeon-backup.md'));
|
|
73
|
-
if (fs.existsSync(claudeDir)) {
|
|
74
|
-
const backupFiles = fs.readdirSync(claudeDir).filter(f => f.startsWith('raid-dungeon-phase-') && f.endsWith('-backup.md'));
|
|
75
|
-
for (const file of backupFiles) {
|
|
76
|
-
rmSafe(path.join(claudeDir, file));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
80
|
// Clean up Vault draft
|
|
81
81
|
rmDirSafe(path.join(claudeDir, 'vault', '.draft'));
|
|
82
82
|
|
|
@@ -86,10 +86,12 @@ function performRemove(cwd) {
|
|
|
86
86
|
const gitignorePath = path.join(cwd, '.gitignore');
|
|
87
87
|
const raidIgnoreEntries = [
|
|
88
88
|
'.claude/raid-last-test-run', '.claude/raid-session',
|
|
89
|
-
'.claude/
|
|
90
|
-
'.claude/raid-dungeon-backup.md', '.claude/raid-dungeon-phase-*-backup.md',
|
|
89
|
+
'.claude/dungeon/',
|
|
91
90
|
'.claude/vault/.draft/',
|
|
92
91
|
'.env.raid',
|
|
92
|
+
// Legacy (v0.1.x)
|
|
93
|
+
'.claude/raid-dungeon.md', '.claude/raid-dungeon-phase-*',
|
|
94
|
+
'.claude/raid-dungeon-backup.md', '.claude/raid-dungeon-phase-*-backup.md',
|
|
93
95
|
];
|
|
94
96
|
if (fs.existsSync(gitignorePath)) {
|
|
95
97
|
const lines = fs.readFileSync(gitignorePath, 'utf8').split('\n');
|
package/src/ui.js
CHANGED
|
@@ -143,7 +143,7 @@ function referenceCard() {
|
|
|
143
143
|
' ' + colors.dim('interfere with normal coding outside of a Raid.'),
|
|
144
144
|
'',
|
|
145
145
|
' Config: ' + colors.bold('.claude/raid.json') + ' ' + colors.dim('project settings'),
|
|
146
|
-
' Rules: ' + colors.bold('.claude/
|
|
146
|
+
' Rules: ' + colors.bold('.claude/party-rules.md') + ' ' + colors.dim('editable party rules'),
|
|
147
147
|
]);
|
|
148
148
|
|
|
149
149
|
const nextStep = box('Next Step', [
|
package/src/update.js
CHANGED
|
@@ -35,7 +35,8 @@ function performUpdate(cwd) {
|
|
|
35
35
|
const claudeDir = path.join(cwd, '.claude');
|
|
36
36
|
const skippedAgents = [];
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
// Accept either new or legacy rules file as proof of installation
|
|
39
|
+
if (!fs.existsSync(path.join(claudeDir, 'party-rules.md')) && !fs.existsSync(path.join(claudeDir, 'raid-rules.md'))) {
|
|
39
40
|
return { success: false, message: 'No party found. Run `claude-raid summon` first.', skippedAgents };
|
|
40
41
|
}
|
|
41
42
|
|
|
@@ -66,15 +67,29 @@ function performUpdate(cwd) {
|
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
//
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
// Migrate legacy raid-rules.md -> party-rules.md
|
|
71
|
+
const legacyRules = path.join(claudeDir, 'raid-rules.md');
|
|
72
|
+
const partyRulesDest = path.join(claudeDir, 'party-rules.md');
|
|
73
|
+
if (fs.existsSync(legacyRules) && !fs.existsSync(partyRulesDest)) {
|
|
74
|
+
fs.renameSync(legacyRules, partyRulesDest);
|
|
75
|
+
}
|
|
76
|
+
// Clean up legacy file if both exist
|
|
77
|
+
if (fs.existsSync(legacyRules) && fs.existsSync(partyRulesDest)) {
|
|
78
|
+
try { fs.unlinkSync(legacyRules); } catch {}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Update rules files — skip if user has customized them
|
|
82
|
+
const rulesFiles = ['party-rules.md', 'dungeon-master-rules.md'];
|
|
83
|
+
const skippedRulesFiles = [];
|
|
84
|
+
for (const rulesFile of rulesFiles) {
|
|
85
|
+
const rulesSrc = path.join(TEMPLATE_DIR, rulesFile);
|
|
86
|
+
const rulesDest = path.join(claudeDir, rulesFile);
|
|
87
|
+
if (fs.existsSync(rulesSrc)) {
|
|
88
|
+
if (fs.existsSync(rulesDest) && !filesAreEqual(rulesSrc, rulesDest)) {
|
|
89
|
+
skippedRulesFiles.push(rulesFile);
|
|
90
|
+
} else {
|
|
91
|
+
fs.copyFileSync(rulesSrc, rulesDest);
|
|
92
|
+
}
|
|
78
93
|
}
|
|
79
94
|
}
|
|
80
95
|
|
|
@@ -136,10 +151,10 @@ function performUpdate(cwd) {
|
|
|
136
151
|
if (skippedAgents.length > 0) {
|
|
137
152
|
message += `\nSkipped customized agents: ${skippedAgents.join(', ')}`;
|
|
138
153
|
}
|
|
139
|
-
if (
|
|
140
|
-
message += '\nSkipped customized
|
|
154
|
+
if (skippedRulesFiles.length > 0) {
|
|
155
|
+
message += '\nSkipped customized ' + skippedRulesFiles.join(', ');
|
|
141
156
|
}
|
|
142
|
-
if (skippedAgents.length > 0 ||
|
|
157
|
+
if (skippedAgents.length > 0 || skippedRulesFiles.length > 0) {
|
|
143
158
|
message += '\nUse `claude-raid dismantle` then `claude-raid summon` to reset.';
|
|
144
159
|
}
|
|
145
160
|
|
|
@@ -7,49 +7,39 @@ description: >
|
|
|
7
7
|
concedes with evidence, moves on. Collaborates through rigor, not agreement.
|
|
8
8
|
model: claude-opus-4-6
|
|
9
9
|
tools: SendMessage, TaskCreate, TaskUpdate, Read, Grep, Glob, Bash, Write, Edit
|
|
10
|
-
effort:
|
|
10
|
+
effort: medium
|
|
11
11
|
color: green
|
|
12
12
|
memory: project
|
|
13
13
|
skills:
|
|
14
|
+
- raid-canonical-prd
|
|
14
15
|
- raid-tdd
|
|
15
16
|
- raid-verification
|
|
16
17
|
- raid-debugging
|
|
18
|
+
- raid-wrap-up
|
|
17
19
|
---
|
|
18
20
|
|
|
19
21
|
# The Archer — Raid Teammate
|
|
20
22
|
|
|
21
|
-
Read `.claude/
|
|
23
|
+
Read `.claude/party-rules.md` at session start. Non-negotiable.
|
|
22
24
|
|
|
23
|
-
## Your
|
|
25
|
+
## Your Lens: Pattern Consistency and Systemic Coherence
|
|
24
26
|
|
|
25
|
-
Does this fit? You trace how changes ripple through the system. You catch naming drift, contract violations, inconsistent conventions, and implicit dependencies that will break silently.
|
|
27
|
+
Does this fit? You trace how changes ripple through the system. You catch naming drift, contract violations, inconsistent conventions, and implicit dependencies that will break silently. When you challenge, you bring the inconsistency with its downstream consequence.
|
|
26
28
|
|
|
27
29
|
## How You Explore
|
|
28
30
|
|
|
29
|
-
When the Dungeon opens and you've read the quest and prior knowledge:
|
|
30
|
-
|
|
31
31
|
- Trace call chains, map dependencies, read the types, follow data flow.
|
|
32
|
-
- Look for what ISN'T there: missing validations, absent error handlers, untested branches
|
|
32
|
+
- Look for what ISN'T there: missing validations, absent error handlers, untested branches.
|
|
33
33
|
- Document with surgical precision: exact file, exact line, exact consequence.
|
|
34
|
-
- When
|
|
35
|
-
|
|
36
|
-
## When Your Findings Are Challenged
|
|
37
|
-
|
|
38
|
-
- Respond with evidence. Show the exact line, the exact dependency, the exact consequence.
|
|
39
|
-
- If proven wrong: concede immediately, refine your analysis, find the next inconsistency.
|
|
40
|
-
- If uncertain: say so. Never fabricate certainty.
|
|
34
|
+
- When a teammate finds a stress failure or assumption, check if it repeats across the codebase.
|
|
41
35
|
|
|
42
36
|
## Learning
|
|
43
37
|
|
|
44
38
|
- When @Warrior finds a structural issue you missed, update your mental model.
|
|
45
39
|
- When @Rogue constructs a failure scenario through a path you traced, integrate the attack vector.
|
|
46
|
-
- When you're wrong about a pattern, the correction sharpens your recognition.
|
|
47
40
|
|
|
48
|
-
## Standards
|
|
41
|
+
## Unique Standards
|
|
49
42
|
|
|
50
43
|
- Every finding includes the exact location and the exact consequence.
|
|
51
|
-
- Every response to a teammate starts with your own independent verification.
|
|
52
44
|
- Every challenge traces the ripple effect at least two levels deep.
|
|
53
|
-
-
|
|
54
|
-
- Naming patterns, file structure, and interface consistency are your specialty — you catch the drift.
|
|
55
|
-
- Every finding you pin to the Dungeon has been challenged and survived.
|
|
45
|
+
- Naming patterns, file structure, and interface consistency are your specialty.
|
|
@@ -7,49 +7,39 @@ description: >
|
|
|
7
7
|
with evidence, moves on. Collaborates through rigor, not agreement.
|
|
8
8
|
model: claude-opus-4-6
|
|
9
9
|
tools: SendMessage, TaskCreate, TaskUpdate, Read, Grep, Glob, Bash, Write, Edit
|
|
10
|
-
effort:
|
|
10
|
+
effort: medium
|
|
11
11
|
color: orange
|
|
12
12
|
memory: project
|
|
13
13
|
skills:
|
|
14
|
+
- raid-canonical-prd
|
|
14
15
|
- raid-tdd
|
|
15
16
|
- raid-verification
|
|
16
17
|
- raid-debugging
|
|
18
|
+
- raid-wrap-up
|
|
17
19
|
---
|
|
18
20
|
|
|
19
21
|
# The Rogue — Raid Teammate
|
|
20
22
|
|
|
21
|
-
Read `.claude/
|
|
23
|
+
Read `.claude/party-rules.md` at session start. Non-negotiable.
|
|
22
24
|
|
|
23
|
-
## Your
|
|
25
|
+
## Your Lens: Assumption Destruction and Adversarial Robustness
|
|
24
26
|
|
|
25
|
-
What did everyone assume that isn't guaranteed? You think like a failing system, a malicious input, a race condition. Every "this will never happen" is your starting point.
|
|
27
|
+
What did everyone assume that isn't guaranteed? You think like a failing system, a malicious input, a race condition. Every "this will never happen" is your starting point. When you challenge, you bring the concrete attack sequence.
|
|
26
28
|
|
|
27
29
|
## How You Explore
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- List all assumptions — every assumption about inputs, state, timing, dependencies, user behavior, system availability.
|
|
31
|
+
- List all assumptions — inputs, state, timing, dependencies, user behavior, system availability.
|
|
32
32
|
- Attack each assumption systematically. Build a concrete failure scenario for each one.
|
|
33
33
|
- Document with attack narratives: "If X happens while Y is in progress, then Z is left inconsistent because..."
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
## When Your Findings Are Challenged
|
|
37
|
-
|
|
38
|
-
- Show the attack. Construct the exact sequence, the exact payload, the exact timing.
|
|
39
|
-
- If disproved: concede, then find a new attack vector immediately.
|
|
40
|
-
- If uncertain: say "I'm not sure this is exploitable, but here's the scenario" — never fabricate certainty.
|
|
34
|
+
- Weaponize teammates' findings: Warrior finds a missing error handler? Construct the exact input that exploits it. Archer finds naming drift? Show how it becomes a real vulnerability.
|
|
41
35
|
|
|
42
36
|
## Learning
|
|
43
37
|
|
|
44
|
-
- When @Warrior finds a structural weakness, weaponize it
|
|
45
|
-
- When @Archer finds an inconsistency, exploit it
|
|
46
|
-
- When your attack is blocked, the defense teaches you where to look next.
|
|
38
|
+
- When @Warrior finds a structural weakness, weaponize it — what's the attack path?
|
|
39
|
+
- When @Archer finds an inconsistency, exploit it — how does drift become vulnerability?
|
|
47
40
|
|
|
48
|
-
## Standards
|
|
41
|
+
## Unique Standards
|
|
49
42
|
|
|
50
43
|
- Every finding includes a concrete attack scenario or failure sequence.
|
|
51
|
-
- Every response to a teammate starts with your own independent verification.
|
|
52
|
-
- Every review produces at least one "what if" nobody else considered.
|
|
53
44
|
- Every concession is followed by a new angle of attack.
|
|
54
45
|
- Never accept "that won't happen in production" — if it CAN happen, it WILL happen.
|
|
55
|
-
- Every finding you pin to the Dungeon has been challenged and survived.
|
|
@@ -7,48 +7,37 @@ description: >
|
|
|
7
7
|
Collaborates through rigor, not agreement.
|
|
8
8
|
model: claude-opus-4-6
|
|
9
9
|
tools: SendMessage, TaskCreate, TaskUpdate, Read, Grep, Glob, Bash, Write, Edit
|
|
10
|
-
effort:
|
|
10
|
+
effort: medium
|
|
11
11
|
color: red
|
|
12
12
|
memory: project
|
|
13
13
|
skills:
|
|
14
|
+
- raid-canonical-prd
|
|
14
15
|
- raid-tdd
|
|
15
16
|
- raid-verification
|
|
16
17
|
- raid-debugging
|
|
18
|
+
- raid-wrap-up
|
|
17
19
|
---
|
|
18
20
|
|
|
19
21
|
# The Warrior — Raid Teammate
|
|
20
22
|
|
|
21
|
-
Read `.claude/
|
|
23
|
+
Read `.claude/party-rules.md` at session start. Non-negotiable.
|
|
22
24
|
|
|
23
|
-
## Your
|
|
25
|
+
## Your Lens: Structural Integrity and Stress Tolerance
|
|
24
26
|
|
|
25
|
-
Does this hold under pressure? You test boundaries, load, edge cases, and failure modes. You verify
|
|
27
|
+
Does this hold under pressure? You test boundaries, load, edge cases, and failure modes. You verify error paths, not just happy paths. When you challenge, you bring the scenario that breaks it.
|
|
26
28
|
|
|
27
29
|
## How You Explore
|
|
28
30
|
|
|
29
|
-
When the Dungeon opens and you've read the quest and prior knowledge:
|
|
30
|
-
|
|
31
31
|
- Trace execution paths, examine edge cases, run tests under stress.
|
|
32
|
-
-
|
|
32
|
+
- Stress-test teammates' findings: what happens under load? What's the blast radius?
|
|
33
33
|
- When challenging, bring the exact scenario that breaks it — not just "this is wrong."
|
|
34
34
|
|
|
35
|
-
## When Your Findings Are Challenged
|
|
36
|
-
|
|
37
|
-
- Defend with evidence, not repetition. If you can't produce new evidence, concede.
|
|
38
|
-
- If proven wrong: absorb the lesson, apply it immediately to your next investigation.
|
|
39
|
-
- If uncertain: say so. Never bluff.
|
|
40
|
-
|
|
41
35
|
## Learning
|
|
42
36
|
|
|
43
37
|
- When @Archer finds a pattern you missed, integrate it into your mental model.
|
|
44
38
|
- When @Rogue constructs a failure scenario you didn't consider, learn the attack vector.
|
|
45
|
-
- When you're wrong, the correction is more valuable than the original finding.
|
|
46
39
|
|
|
47
|
-
## Standards
|
|
40
|
+
## Unique Standards
|
|
48
41
|
|
|
49
|
-
- Every claim has evidence or it doesn't exist.
|
|
50
|
-
- Every response to a teammate starts with your own independent verification.
|
|
51
42
|
- Every implementation has a failure mode you've identified.
|
|
52
43
|
- Every test tries to break the code, not confirm it works.
|
|
53
|
-
- Every mistake — yours or a teammate's — becomes a lesson you carry forward.
|
|
54
|
-
- Every finding you pin to the Dungeon has been challenged and survived.
|