minimal-vibe-coding-kit 0.3.0 → 0.4.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/.agents/skills/agentshield-security-review/SKILL.md +6 -6
- package/.agents/skills/agentshield-security-review/references/native-install.md +10 -10
- package/.agents/skills/agentshield-security-review/references/report-template.md +1 -1
- package/.agents/skills/agentshield-security-review/scripts/agentshield_repo_probe.py +3 -3
- package/.agents/skills/autoresearch-coding/README.md +1 -1
- package/.agents/skills/autoresearch-coding/SKILL.md +4 -4
- package/.agents/skills/daily-workflow-curator/SKILL.md +3 -3
- package/.agents/skills/parallel-analysis/SKILL.md +160 -0
- package/.agents/skills/path-sensitive-shell-safety/SKILL.md +68 -0
- package/.agents/skills/path-sensitive-shell-safety/references/workflow.md +127 -0
- package/.agents/skills/vibekit-init/SKILL.md +6 -6
- package/.claude/commands/vibe-finalize.md +1 -1
- package/.claude/rules/security.md +2 -0
- package/.claude/rules/tooling.md +1 -1
- package/.claude/skills/agentshield-security-review/SKILL.md +6 -6
- package/.claude/skills/agentshield-security-review/references/native-install.md +10 -10
- package/.claude/skills/agentshield-security-review/references/report-template.md +1 -1
- package/.claude/skills/agentshield-security-review/scripts/agentshield_repo_probe.py +3 -3
- package/.claude/skills/autoresearch-coding/README.md +1 -1
- package/.claude/skills/autoresearch-coding/SKILL.md +4 -4
- package/.claude/skills/daily-workflow-curator/SKILL.md +3 -3
- package/.claude/skills/parallel-analysis/SKILL.md +160 -0
- package/.claude/skills/path-sensitive-shell-safety/SKILL.md +68 -0
- package/.claude/skills/path-sensitive-shell-safety/references/workflow.md +127 -0
- package/.claude/skills/vibekit-init/SKILL.md +6 -6
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor/commands/vibe-finalize.md +1 -1
- package/.cursor/rules/001-vibe-core.mdc +1 -1
- package/.cursor/rules/010-init.mdc +1 -1
- package/.cursor/rules/020-security-agentshield.mdc +2 -2
- package/.cursor/rules/030-autoresearch-loop.mdc +1 -1
- package/.cursor/skills/parallel-analysis/SKILL.md +160 -0
- package/.cursor/skills/path-sensitive-shell-safety/SKILL.md +68 -0
- package/.cursor/skills/path-sensitive-shell-safety/references/workflow.md +127 -0
- package/.vibekit/commands/vibe-finalize.md +3 -0
- package/{.vbkit-docs → .vibekit/docs}/AUTORESEARCH_LEDGER.md +3 -3
- package/{.vbkit-docs → .vibekit/docs}/BACKBONE_REFERENCE.md +1 -1
- package/{.vbkit-docs → .vibekit/docs}/INSTALL.md +16 -16
- package/{.vbkit-docs → .vibekit/docs}/RESEARCH_NOTES.md +1 -1
- package/{.vbkit-docs → .vibekit/docs}/SECURITY_MODEL.md +2 -2
- package/{.vbkit-docs → .vibekit/docs}/TOOLING_GUIDE.md +2 -2
- package/{.vbkit-docs → .vibekit/docs}/templates/CONTEXT_TEMPLATE.md +1 -1
- package/{.vbkit-docs → .vibekit/docs}/templates/PRD_TEMPLATE.md +1 -1
- package/{CLAUDE-template.md → .vibekit/init/CLAUDE-template.md} +1 -1
- package/{FIRST_PROMPT.md → .vibekit/init/FIRST_PROMPT.md} +6 -6
- package/{FIRST_TIME_INIT.md → .vibekit/init/FIRST_TIME_INIT.md} +14 -14
- package/{.vbkit-scripts → .vibekit/scripts}/agentshield-probe.mjs +1 -1
- package/{.vbkit-scripts → .vibekit/scripts}/daily-enhance.mjs +3 -3
- package/{.vbkit-scripts → .vibekit/scripts}/doctor.mjs +6 -6
- package/{.vbkit-scripts → .vibekit/scripts}/init-backbone.mjs +22 -22
- package/{.vbkit-scripts → .vibekit/scripts}/mvck.mjs +61 -25
- package/{.vbkit-scripts → .vibekit/scripts}/test-install.mjs +32 -18
- package/{.vbkit-scripts → .vibekit/scripts}/validate-kit.mjs +47 -31
- package/{.vbkit-scripts → .vibekit/scripts}/vibekit-finalize.mjs +7 -7
- package/{skills → .vibekit/skills}/agentshield-security-review/SKILL.md +6 -6
- package/{skills → .vibekit/skills}/agentshield-security-review/references/native-install.md +10 -10
- package/{skills → .vibekit/skills}/agentshield-security-review/references/report-template.md +1 -1
- package/{skills → .vibekit/skills}/agentshield-security-review/scripts/agentshield_repo_probe.py +3 -3
- package/{skills → .vibekit/skills}/autoresearch-coding/README.md +1 -1
- package/{skills → .vibekit/skills}/autoresearch-coding/SKILL.md +4 -4
- package/{skills → .vibekit/skills}/daily-workflow-curator/SKILL.md +3 -3
- package/.vibekit/skills/parallel-analysis/SKILL.md +160 -0
- package/.vibekit/skills/path-sensitive-shell-safety/SKILL.md +68 -0
- package/.vibekit/skills/path-sensitive-shell-safety/references/workflow.md +127 -0
- package/{skills → .vibekit/skills}/vibekit-init/SKILL.md +6 -6
- package/AGENTS.md +5 -2
- package/CHANGELOG.md +13 -2
- package/CONTRIBUTING.md +3 -3
- package/README.md +133 -394
- package/README.vi.md +135 -334
- package/backbone.yml +8 -7
- package/bin/mvck.js +1 -1
- package/bin/vibe-kit.js +1 -1
- package/install.ps1 +1 -1
- package/install.sh +5 -3
- package/package.json +22 -18
- package/.vbkit-commands/vibe-finalize.md +0 -3
- /package/{.vbkit-commands → .vibekit/commands}/autoresearch-coding.md +0 -0
- /package/{.vbkit-commands → .vibekit/commands}/council.md +0 -0
- /package/{.vbkit-commands → .vibekit/commands}/daily-enhance.md +0 -0
- /package/{.vbkit-commands → .vibekit/commands}/init-vibe.md +0 -0
- /package/{.vbkit-commands → .vibekit/commands}/security-scan.md +0 -0
- /package/{.vbkit-docs → .vibekit/docs}/backbone.schema.json +0 -0
- /package/{.vbkit-scripts → .vibekit/scripts}/pack-dry-run.mjs +0 -0
- /package/{skills → .vibekit/skills}/agentshield-security-review/agents/openai.yaml +0 -0
- /package/{skills → .vibekit/skills}/agentshield-security-review/references/review-checklist.md +0 -0
- /package/{skills → .vibekit/skills}/autoresearch-coding/references/experiment-contract.md +0 -0
- /package/{skills → .vibekit/skills}/autoresearch-coding/references/metric-extraction.md +0 -0
- /package/{skills → .vibekit/skills}/autoresearch-coding/references/result-ledger.md +0 -0
- /package/{skills → .vibekit/skills}/autoresearch-coding/scripts/log_result.py +0 -0
- /package/{skills → .vibekit/skills}/autoresearch-coding/scripts/run_logged.py +0 -0
- /package/{skills → .vibekit/skills}/clearthought/SKILL.md +0 -0
- /package/{skills → .vibekit/skills}/clearthought/examples/decision-framework.md +0 -0
- /package/{skills → .vibekit/skills}/clearthought/examples/metagame-examples.md +0 -0
- /package/{skills → .vibekit/skills}/clearthought/examples/sequential-thinking.md +0 -0
- /package/{skills → .vibekit/skills}/clearthought/references/output-schemas.md +0 -0
- /package/{skills → .vibekit/skills}/clearthought/references/parameter-reference.md +0 -0
- /package/{skills → .vibekit/skills}/coding-level/SKILL.md +0 -0
- /package/{skills → .vibekit/skills}/coding-level/references/level-0.md +0 -0
- /package/{skills → .vibekit/skills}/coding-level/references/level-1.md +0 -0
- /package/{skills → .vibekit/skills}/coding-level/references/level-2.md +0 -0
- /package/{skills → .vibekit/skills}/coding-level/references/level-3.md +0 -0
- /package/{skills → .vibekit/skills}/coding-level/references/level-4.md +0 -0
- /package/{skills → .vibekit/skills}/coding-level/references/level-5.md +0 -0
- /package/{skills → .vibekit/skills}/memento/SKILL.md +0 -0
- /package/{skills → .vibekit/skills}/reviewing-4p-priorities/SKILL.md +0 -0
- /package/{skills → .vibekit/skills}/reviewing-4p-priorities/examples.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/SKILL.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/examples/adaptive-depth.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/examples/branching-exploration.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/examples/linear-reasoning.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/examples/revision-pattern.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/references/output-schema.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/references/parameters.md +0 -0
- /package/{skills → .vibekit/skills}/sequential-thinking/references/patterns.md +0 -0
- /package/{skills → .vibekit/skills}/visual-design-loop/SKILL.md +0 -0
- /package/{skills → .vibekit/skills}/visual-design-loop/agents/openai.yaml +0 -0
|
@@ -34,24 +34,27 @@ function listFiles(rel) {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
const required = [
|
|
37
|
-
'AGENTS.md', 'CLAUDE-template.md', 'FIRST_TIME_INIT.md', 'FIRST_PROMPT.md', 'backbone.yml',
|
|
38
|
-
'.
|
|
39
|
-
'.
|
|
40
|
-
'skills/autoresearch-coding/SKILL.md', 'skills/agentshield-security-review/SKILL.md', 'skills/daily-workflow-curator/SKILL.md', 'skills/vibekit-init/SKILL.md',
|
|
41
|
-
'skills/clearthought/SKILL.md', 'skills/sequential-thinking/SKILL.md', 'skills/reviewing-4p-priorities/SKILL.md', 'skills/visual-design-loop/SKILL.md',
|
|
42
|
-
'skills/memento/SKILL.md', 'skills/coding-level/SKILL.md',
|
|
43
|
-
'.
|
|
37
|
+
'AGENTS.md', '.vibekit/init/CLAUDE-template.md', '.vibekit/init/FIRST_TIME_INIT.md', '.vibekit/init/FIRST_PROMPT.md', 'backbone.yml',
|
|
38
|
+
'.vibekit/scripts/mvck.mjs', '.vibekit/scripts/init-backbone.mjs', '.vibekit/scripts/daily-enhance.mjs', '.vibekit/scripts/validate-kit.mjs',
|
|
39
|
+
'.vibekit/scripts/doctor.mjs', '.vibekit/scripts/agentshield-probe.mjs', '.vibekit/scripts/vibekit-finalize.mjs',
|
|
40
|
+
'.vibekit/skills/autoresearch-coding/SKILL.md', '.vibekit/skills/agentshield-security-review/SKILL.md', '.vibekit/skills/daily-workflow-curator/SKILL.md', '.vibekit/skills/vibekit-init/SKILL.md',
|
|
41
|
+
'.vibekit/skills/clearthought/SKILL.md', '.vibekit/skills/sequential-thinking/SKILL.md', '.vibekit/skills/reviewing-4p-priorities/SKILL.md', '.vibekit/skills/visual-design-loop/SKILL.md',
|
|
42
|
+
'.vibekit/skills/path-sensitive-shell-safety/SKILL.md', '.vibekit/skills/memento/SKILL.md', '.vibekit/skills/coding-level/SKILL.md', '.vibekit/skills/parallel-analysis/SKILL.md',
|
|
43
|
+
'.vibekit/docs/templates/PRD_TEMPLATE.md', '.vibekit/docs/templates/CONTEXT_TEMPLATE.md',
|
|
44
44
|
'.codex/README.md', '.codex/config.example.toml',
|
|
45
45
|
'.claude/skills/autoresearch-coding/SKILL.md', '.claude/skills/agentshield-security-review/SKILL.md',
|
|
46
46
|
'.claude/skills/daily-workflow-curator/SKILL.md', '.claude/skills/vibekit-init/SKILL.md',
|
|
47
47
|
'.claude/skills/clearthought/SKILL.md', '.claude/skills/sequential-thinking/SKILL.md', '.claude/skills/reviewing-4p-priorities/SKILL.md', '.claude/skills/visual-design-loop/SKILL.md',
|
|
48
|
-
'.claude/skills/memento/SKILL.md', '.claude/skills/coding-level/SKILL.md',
|
|
48
|
+
'.claude/skills/path-sensitive-shell-safety/SKILL.md', '.claude/skills/memento/SKILL.md', '.claude/skills/coding-level/SKILL.md',
|
|
49
|
+
'.claude/skills/parallel-analysis/SKILL.md',
|
|
49
50
|
'.cursor/rules/001-vibe-core.mdc', '.cursor/skills/clearthought/SKILL.md', '.cursor/skills/sequential-thinking/SKILL.md', '.cursor/skills/reviewing-4p-priorities/SKILL.md',
|
|
50
|
-
'.cursor/skills/
|
|
51
|
+
'.cursor/skills/path-sensitive-shell-safety/SKILL.md',
|
|
52
|
+
'.cursor/skills/memento/SKILL.md', '.cursor/skills/coding-level/SKILL.md', '.cursor/skills/parallel-analysis/SKILL.md',
|
|
51
53
|
'.agents/skills/autoresearch-coding/SKILL.md', '.agents/skills/agentshield-security-review/SKILL.md',
|
|
52
54
|
'.agents/skills/daily-workflow-curator/SKILL.md', '.agents/skills/vibekit-init/SKILL.md',
|
|
53
55
|
'.agents/skills/clearthought/SKILL.md', '.agents/skills/sequential-thinking/SKILL.md', '.agents/skills/reviewing-4p-priorities/SKILL.md', '.agents/skills/visual-design-loop/SKILL.md',
|
|
54
|
-
'.agents/skills/memento/SKILL.md', '.agents/skills/coding-level/SKILL.md',
|
|
56
|
+
'.agents/skills/path-sensitive-shell-safety/SKILL.md', '.agents/skills/memento/SKILL.md', '.agents/skills/coding-level/SKILL.md',
|
|
57
|
+
'.agents/skills/parallel-analysis/SKILL.md',
|
|
55
58
|
'.codex-plugin/plugin.json'
|
|
56
59
|
];
|
|
57
60
|
|
|
@@ -74,10 +77,13 @@ const reasoningSkillResources = {
|
|
|
74
77
|
],
|
|
75
78
|
'reviewing-4p-priorities': [
|
|
76
79
|
'examples.md'
|
|
80
|
+
],
|
|
81
|
+
'path-sensitive-shell-safety': [
|
|
82
|
+
'references/workflow.md'
|
|
77
83
|
]
|
|
78
84
|
};
|
|
79
85
|
|
|
80
|
-
for (const surface of ['skills', '.claude/skills', '.cursor/skills', '.agents/skills']) {
|
|
86
|
+
for (const surface of ['.vibekit/skills', '.claude/skills', '.cursor/skills', '.agents/skills']) {
|
|
81
87
|
for (const [skill, files] of Object.entries(reasoningSkillResources)) {
|
|
82
88
|
for (const file of files) required.push(`${surface}/${skill}/${file}`);
|
|
83
89
|
}
|
|
@@ -87,18 +93,26 @@ for (const rel of required) exists(rel) ? ok(`required file ${rel}`) : fail(`mis
|
|
|
87
93
|
if (exists('README.md')) ok('optional README.md present');
|
|
88
94
|
else console.log('INFO optional README.md not present in target project');
|
|
89
95
|
|
|
96
|
+
// Kit-maintainer files: required in the kit source repo, intentionally absent in end-user installs.
|
|
97
|
+
const isKitSourceRepo = readJson('package.json')?.name === 'minimal-vibe-coding-kit';
|
|
98
|
+
if (isKitSourceRepo) {
|
|
99
|
+
for (const rel of ['.vibekit/scripts/test-install.mjs', '.vibekit/scripts/pack-dry-run.mjs', '.vibekit/docs/RESEARCH_NOTES.md', '.vibekit/docs/AUTORESEARCH_LEDGER.md']) {
|
|
100
|
+
exists(rel) ? ok(`kit-source file ${rel}`) : fail(`missing kit-source file ${rel}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
90
104
|
requireText('.github/workflows/vibekit-validate.yml', 'npm test', 'CI workflow runs npm test');
|
|
91
105
|
requireText('.github/workflows/vibekit-validate.yml', 'npm run security:probe', 'CI workflow runs AgentShield probe');
|
|
92
106
|
requireText('.github/workflows/vibekit-validate.yml', 'npm run pack:dry-run', 'CI workflow verifies npm package contents');
|
|
93
|
-
requireText('.
|
|
94
|
-
requireText('.cursor/rules/020-security-agentshield.mdc', 'node .
|
|
95
|
-
requireText('.
|
|
107
|
+
requireText('.vibekit/docs/AUTORESEARCH_LEDGER.md', 'node .vibekit/scripts/validate-kit.mjs .', 'autoresearch ledger documents validation command');
|
|
108
|
+
requireText('.cursor/rules/020-security-agentshield.mdc', 'node .vibekit/scripts/agentshield-probe.mjs .', 'Cursor security rule uses Node AgentShield probe wrapper');
|
|
109
|
+
requireText('.vibekit/scripts/doctor.mjs', '.vibekit/scripts/agentshield-probe.mjs', 'doctor uses Node AgentShield probe wrapper');
|
|
96
110
|
|
|
97
|
-
if (exists('.
|
|
98
|
-
const ledgerText = read('.
|
|
111
|
+
if (exists('.vibekit/docs/AUTORESEARCH_LEDGER.md')) {
|
|
112
|
+
const ledgerText = read('.vibekit/docs/AUTORESEARCH_LEDGER.md');
|
|
99
113
|
const stalePhrases = ['pending during build', 'BUILD_REPORT.md'];
|
|
100
114
|
const stalePhrase = stalePhrases.find((phrase) => ledgerText.includes(phrase));
|
|
101
|
-
stalePhrase ? fail(`.
|
|
115
|
+
stalePhrase ? fail(`.vibekit/docs/AUTORESEARCH_LEDGER.md contains stale phrase: ${stalePhrase}`) : ok('autoresearch ledger has no stale build placeholders');
|
|
102
116
|
}
|
|
103
117
|
|
|
104
118
|
const skillMirrors = {
|
|
@@ -109,9 +123,11 @@ const skillMirrors = {
|
|
|
109
123
|
'clearthought': ['.claude/skills/clearthought', '.cursor/skills/clearthought', '.agents/skills/clearthought'],
|
|
110
124
|
'sequential-thinking': ['.claude/skills/sequential-thinking', '.cursor/skills/sequential-thinking', '.agents/skills/sequential-thinking'],
|
|
111
125
|
'reviewing-4p-priorities': ['.claude/skills/reviewing-4p-priorities', '.cursor/skills/reviewing-4p-priorities', '.agents/skills/reviewing-4p-priorities'],
|
|
126
|
+
'path-sensitive-shell-safety': ['.claude/skills/path-sensitive-shell-safety', '.cursor/skills/path-sensitive-shell-safety', '.agents/skills/path-sensitive-shell-safety'],
|
|
112
127
|
'visual-design-loop': ['.claude/skills/visual-design-loop', '.agents/skills/visual-design-loop'],
|
|
113
128
|
'memento': ['.claude/skills/memento', '.cursor/skills/memento', '.agents/skills/memento'],
|
|
114
|
-
'coding-level': ['.claude/skills/coding-level', '.cursor/skills/coding-level', '.agents/skills/coding-level']
|
|
129
|
+
'coding-level': ['.claude/skills/coding-level', '.cursor/skills/coding-level', '.agents/skills/coding-level'],
|
|
130
|
+
'parallel-analysis': ['.claude/skills/parallel-analysis', '.cursor/skills/parallel-analysis', '.agents/skills/parallel-analysis']
|
|
115
131
|
};
|
|
116
132
|
|
|
117
133
|
function validateSkillMirror(sourceRel, mirrorRel) {
|
|
@@ -149,7 +165,7 @@ function validateSkillMirror(sourceRel, mirrorRel) {
|
|
|
149
165
|
}
|
|
150
166
|
|
|
151
167
|
for (const [skill, mirrors] of Object.entries(skillMirrors)) {
|
|
152
|
-
for (const mirror of mirrors) validateSkillMirror(
|
|
168
|
+
for (const mirror of mirrors) validateSkillMirror(`.vibekit/skills/${skill}`, mirror);
|
|
153
169
|
}
|
|
154
170
|
|
|
155
171
|
function parseFrontmatter(text) {
|
|
@@ -163,7 +179,7 @@ function parseFrontmatter(text) {
|
|
|
163
179
|
return fields;
|
|
164
180
|
}
|
|
165
181
|
|
|
166
|
-
for (const surface of ['skills', '.claude/skills', '.cursor/skills', '.agents/skills']) {
|
|
182
|
+
for (const surface of ['.vibekit/skills', '.claude/skills', '.cursor/skills', '.agents/skills']) {
|
|
167
183
|
if (!exists(surface)) continue;
|
|
168
184
|
for (const file of listFiles(surface).filter((f) => f.endsWith('SKILL.md'))) {
|
|
169
185
|
const rel = `${surface}/${file}`;
|
|
@@ -180,13 +196,13 @@ function stripFrontmatter(text) {
|
|
|
180
196
|
return text.replace(/^---\n[\s\S]*?\n---\n?/, '').trim();
|
|
181
197
|
}
|
|
182
198
|
|
|
183
|
-
if (exists('.
|
|
184
|
-
const canonicalCmds = listFiles('.
|
|
199
|
+
if (exists('.vibekit/commands')) {
|
|
200
|
+
const canonicalCmds = listFiles('.vibekit/commands').filter((f) => f.endsWith('.md'));
|
|
185
201
|
const cmdMirrors = { '.claude/commands': true, '.cursor/commands': true };
|
|
186
202
|
for (const [mirrorDir, stripFm] of Object.entries(cmdMirrors)) {
|
|
187
203
|
if (!exists(mirrorDir)) { warn(`command mirror dir missing: ${mirrorDir}`); continue; }
|
|
188
204
|
for (const file of canonicalCmds) {
|
|
189
|
-
const srcRel = `.
|
|
205
|
+
const srcRel = `.vibekit/commands/${file}`;
|
|
190
206
|
const mirRel = `${mirrorDir}/${file}`;
|
|
191
207
|
if (!exists(mirRel)) { fail(`command mirror ${mirRel} missing`); continue; }
|
|
192
208
|
const srcText = read(srcRel).trim();
|
|
@@ -219,7 +235,7 @@ if (Array.isArray(pkg?.files)) {
|
|
|
219
235
|
}
|
|
220
236
|
|
|
221
237
|
if (pkg?.scripts && typeof pkg.scripts === 'object') {
|
|
222
|
-
const scriptTargetRe = /node\s+(?:--check\s+)?((?:\.\/)?(?:\.
|
|
238
|
+
const scriptTargetRe = /node\s+(?:--check\s+)?((?:\.\/)?(?:\.vibekit\/scripts|bin)\/[A-Za-z0-9._-]+\.(?:mjs|js))/g;
|
|
223
239
|
const targets = new Set();
|
|
224
240
|
for (const command of Object.values(pkg.scripts)) {
|
|
225
241
|
if (typeof command !== 'string') continue;
|
|
@@ -256,15 +272,15 @@ if (claudeSettings?.permissions?.deny && cursorSettings?.permissions?.deny) {
|
|
|
256
272
|
}
|
|
257
273
|
|
|
258
274
|
if (pkg?.name === 'minimal-vibe-coding-kit') {
|
|
259
|
-
for (const rel of ['SECURITY.md', 'CONTRIBUTING.md', 'CODE_OF_CONDUCT.md', '.github/dependabot.yml', '.github/workflows/vibekit-validate.yml', '.
|
|
275
|
+
for (const rel of ['SECURITY.md', 'CONTRIBUTING.md', 'CODE_OF_CONDUCT.md', '.github/dependabot.yml', '.github/workflows/vibekit-validate.yml', '.vibekit/docs/backbone.schema.json']) {
|
|
260
276
|
exists(rel) ? ok(`release safety file ${rel}`) : fail(`missing release safety file ${rel}`);
|
|
261
277
|
}
|
|
262
278
|
}
|
|
263
279
|
|
|
264
|
-
if (exists('CLAUDE-template.md')) {
|
|
265
|
-
const lines = read('CLAUDE-template.md').split(/\r?\n/).length;
|
|
266
|
-
if (lines <= 120) ok(
|
|
267
|
-
else warn(
|
|
280
|
+
if (exists('.vibekit/init/CLAUDE-template.md')) {
|
|
281
|
+
const lines = read('.vibekit/init/CLAUDE-template.md').split(/\r?\n/).length;
|
|
282
|
+
if (lines <= 120) ok(`.vibekit/init/CLAUDE-template.md is concise (${lines} lines)`);
|
|
283
|
+
else warn(`.vibekit/init/CLAUDE-template.md is long (${lines} lines); target <= 120`);
|
|
268
284
|
}
|
|
269
285
|
|
|
270
286
|
if (exists('backbone.yml')) {
|
|
@@ -385,7 +401,7 @@ const riskyPatterns = [
|
|
|
385
401
|
{ pattern: 'ignore previous' + ' instructions', message: 'prompt injection phrase' }
|
|
386
402
|
];
|
|
387
403
|
|
|
388
|
-
const scanDirs = ['.claude', '.cursor', '.agents', '.codex-plugin', 'skills', '.
|
|
404
|
+
const scanDirs = ['.claude', '.cursor', '.agents', '.codex-plugin', '.vibekit/skills', '.vibekit/commands', '.vibekit/scripts', 'AGENTS.md', '.vibekit/init/CLAUDE-template.md'];
|
|
389
405
|
function walk(item) {
|
|
390
406
|
const p = path.join(root, item);
|
|
391
407
|
if (!fs.existsSync(p)) return [];
|
|
@@ -408,7 +424,7 @@ for (const file of scanDirs.flatMap(walk)) {
|
|
|
408
424
|
}
|
|
409
425
|
}
|
|
410
426
|
|
|
411
|
-
const probe = path.join(root, '.
|
|
427
|
+
const probe = path.join(root, '.vibekit/scripts/agentshield-probe.mjs');
|
|
412
428
|
if (fs.existsSync(probe)) {
|
|
413
429
|
const result = spawnSync(process.execPath, [probe, root, '--json'], { encoding: 'utf8' });
|
|
414
430
|
if (result.status === 0) ok('AgentShield repo probe runs');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Graduate a consumer project: move one-time bootstrap files into a cleanup
|
|
3
3
|
// folder once init and the first prompt are complete. Safe, idempotent, and
|
|
4
4
|
// reversible. Refuses to run on the kit source repo so it never deletes the
|
|
5
|
-
// kit's own bootstrap files (and never breaks .
|
|
5
|
+
// kit's own bootstrap files (and never breaks .vibekit/scripts/validate-kit.mjs).
|
|
6
6
|
import fs from 'node:fs';
|
|
7
7
|
import path from 'node:path';
|
|
8
8
|
|
|
@@ -16,8 +16,8 @@ const json = args.includes('--json');
|
|
|
16
16
|
const DEFAULTS = {
|
|
17
17
|
cleanupDir: '_vibekit-cleanup',
|
|
18
18
|
marker: '.vibekit/FINALIZE_DONE',
|
|
19
|
-
// CLAUDE-template.md is only graduated once CLAUDE.md exists (see below).
|
|
20
|
-
oneTimeFiles: ['FIRST_TIME_INIT.md', 'FIRST_PROMPT.md', 'PUSH_TO_GITHUB.md', 'CLAUDE-template.md']
|
|
19
|
+
// .vibekit/init/CLAUDE-template.md is only graduated once CLAUDE.md exists (see below).
|
|
20
|
+
oneTimeFiles: ['.vibekit/init/FIRST_TIME_INIT.md', '.vibekit/init/FIRST_PROMPT.md', '.vibekit/init/PUSH_TO_GITHUB.md', '.vibekit/init/CLAUDE-template.md']
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
function exists(rel) { return fs.existsSync(path.join(target, rel)); }
|
|
@@ -72,7 +72,7 @@ if (pkg?.name === 'minimal-vibe-coding-kit') {
|
|
|
72
72
|
if (!exists('backbone.yml')) fail('backbone.yml is missing. Install the kit first.');
|
|
73
73
|
const status = backboneValue(read('backbone.yml'), 'template_status');
|
|
74
74
|
if (status !== 'initialized' && !restore) {
|
|
75
|
-
fail(`backbone.yml template_status is "${status || 'unknown'}". Run init (FIRST_TIME_INIT.md) before graduating.`);
|
|
75
|
+
fail(`backbone.yml template_status is "${status || 'unknown'}". Run init (.vibekit/init/FIRST_TIME_INIT.md) before graduating.`);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
const cfg = loadConfig();
|
|
@@ -80,7 +80,7 @@ const cleanupRoot = path.join(target, cfg.cleanupDir);
|
|
|
80
80
|
const markerPath = path.join(target, cfg.marker);
|
|
81
81
|
|
|
82
82
|
function graduateFile(rel) {
|
|
83
|
-
if (rel === 'CLAUDE-template.md' && !exists('CLAUDE.md')) return false;
|
|
83
|
+
if (rel === '.vibekit/init/CLAUDE-template.md' && !exists('CLAUDE.md')) return false;
|
|
84
84
|
return exists(rel);
|
|
85
85
|
}
|
|
86
86
|
|
|
@@ -132,7 +132,7 @@ if (!shouldWrite) {
|
|
|
132
132
|
console.log(`These one-time bootstrap files would move into ${cfg.cleanupDir}/ (then you delete that folder):`);
|
|
133
133
|
for (const f of planned) console.log(`- ${f}`);
|
|
134
134
|
if (!planned.length) console.log('- (none found; nothing to graduate)');
|
|
135
|
-
console.log(`\nApply with: node .
|
|
135
|
+
console.log(`\nApply with: node .vibekit/scripts/vibekit-finalize.mjs ${args[0] && !args[0].startsWith('--') ? args[0] : '.'} --write --yes`);
|
|
136
136
|
console.log('Undo later with: --restore --write');
|
|
137
137
|
}
|
|
138
138
|
process.exit(0);
|
|
@@ -167,7 +167,7 @@ ${moved.map((m) => `- ${m}`).join('\n')}
|
|
|
167
167
|
- Or restore everything to the repo root:
|
|
168
168
|
|
|
169
169
|
\`\`\`bash
|
|
170
|
-
node .
|
|
170
|
+
node .vibekit/scripts/vibekit-finalize.mjs . --restore --write
|
|
171
171
|
\`\`\`
|
|
172
172
|
|
|
173
173
|
The durable project map is \`backbone.yml\`; you do not need these files to keep working.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentshield-security-review
|
|
3
|
-
description: repository-native security review workflow for Claude Code and Codex projects using the AgentShield concept. Use when auditing or hardening agent configuration, skills, prompts, hooks, MCP servers, permissions, slash commands, Codex plugin files, Claude plugin files, AGENTS.md, CLAUDE.md, or repository-level AI coding-agent surfaces. Prefer this skill before merging changes to .claude, .codex, .codex-plugin, .claude-plugin, .agents, skills, .
|
|
3
|
+
description: repository-native security review workflow for Claude Code and Codex projects using the AgentShield concept. Use when auditing or hardening agent configuration, skills, prompts, hooks, MCP servers, permissions, slash commands, Codex plugin files, Claude plugin files, AGENTS.md, CLAUDE.md, or repository-level AI coding-agent surfaces. Prefer this skill before merging changes to .claude, .codex, .codex-plugin, .claude-plugin, .agents, .vibekit/skills, .vibekit/commands, .vibekit/scripts, hooks, mcp configs, or generated code that touches agent execution.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# AgentShield Security Review
|
|
@@ -14,7 +14,7 @@ Do not invent findings. Prefer deterministic scanner output when available, then
|
|
|
14
14
|
## Standard workflow
|
|
15
15
|
|
|
16
16
|
1. Identify the repo root and active harness surfaces.
|
|
17
|
-
2. Run `node .
|
|
17
|
+
2. Run `node .vibekit/scripts/agentshield-probe.mjs .` to inventory Claude, Codex, shared skills, hooks, MCP, commands, and repo instruction files.
|
|
18
18
|
3. If Node/npm is available, run AgentShield from the repo root:
|
|
19
19
|
```bash
|
|
20
20
|
npx ecc-agentshield scan --path . --format text
|
|
@@ -34,9 +34,9 @@ Do not invent findings. Prefer deterministic scanner output when available, then
|
|
|
34
34
|
|
|
35
35
|
Use a shared root skill where possible:
|
|
36
36
|
|
|
37
|
-
-
|
|
38
|
-
- Claude Code may add a slash-command shim in `.
|
|
39
|
-
- Codex should consume the same root
|
|
37
|
+
- `.vibekit/skills/agentshield-security-review/SKILL.md` is the canonical workflow.
|
|
38
|
+
- Claude Code may add a slash-command shim in `.vibekit/commands/security-scan.md` or `.claude/commands/security-scan.md`.
|
|
39
|
+
- Codex should consume the same root `.vibekit/skills/` directory through `.codex-plugin/plugin.json` or the repo's native skill/plugin mechanism.
|
|
40
40
|
- Do not duplicate divergent Claude and Codex skill bodies. Duplication causes drift.
|
|
41
41
|
|
|
42
42
|
See `references/native-install.md` for copy-ready Claude and Codex snippets.
|
|
@@ -48,7 +48,7 @@ Prioritize runtime-active files over examples and docs:
|
|
|
48
48
|
1. `CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`
|
|
49
49
|
2. `.claude/settings.json`, `.claude/settings.local.json`, `.claude/agents/*.md`, `.claude/commands/*.md`
|
|
50
50
|
3. `.codex/config.toml`, `.codex/`, `.codex-plugin/plugin.json`
|
|
51
|
-
4. `.agents/`, `agents/`,
|
|
51
|
+
4. `.agents/`, `agents/`, `.vibekit/skills/`, `.vibekit/commands/`, `.vibekit/scripts/`, `hooks/`
|
|
52
52
|
5. `.mcp.json`, `mcp.json`, `mcp-configs/*.json`
|
|
53
53
|
6. installer scripts, CI workflows, package scripts, and generated plugin manifests
|
|
54
54
|
|
|
@@ -7,18 +7,18 @@ Keep one canonical skill and add thin harness adapters.
|
|
|
7
7
|
Recommended repo layout:
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
|
-
skills/agentshield-security-review/SKILL.md
|
|
11
|
-
skills/agentshield-security-review/references/review-checklist.md
|
|
12
|
-
skills/agentshield-security-review/references/report-template.md
|
|
13
|
-
skills/agentshield-security-review/scripts/agentshield_repo_probe.py
|
|
14
|
-
.
|
|
10
|
+
.vibekit/skills/agentshield-security-review/SKILL.md
|
|
11
|
+
.vibekit/skills/agentshield-security-review/references/review-checklist.md
|
|
12
|
+
.vibekit/skills/agentshield-security-review/references/report-template.md
|
|
13
|
+
.vibekit/skills/agentshield-security-review/scripts/agentshield_repo_probe.py
|
|
14
|
+
.vibekit/commands/security-scan.md
|
|
15
15
|
.codex-plugin/plugin.json
|
|
16
16
|
.claude-plugin/plugin.json
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
## Claude Code command shim
|
|
20
20
|
|
|
21
|
-
Create `.
|
|
21
|
+
Create `.vibekit/commands/security-scan.md` or `.claude/commands/security-scan.md`:
|
|
22
22
|
|
|
23
23
|
```markdown
|
|
24
24
|
---
|
|
@@ -48,7 +48,7 @@ Return grade, score, severity counts, active paths, critical/high findings, and
|
|
|
48
48
|
|
|
49
49
|
## Codex plugin pointer
|
|
50
50
|
|
|
51
|
-
Use the repo-level Codex plugin manifest to point Codex at the same
|
|
51
|
+
Use the repo-level Codex plugin manifest to point Codex at the same `.vibekit/skills/` directory. Exact schema may vary by Codex plugin version, so preserve the existing repo schema and ensure it references the canonical `.vibekit/skills/` directory rather than a copied skill body.
|
|
52
52
|
|
|
53
53
|
Example intent:
|
|
54
54
|
|
|
@@ -56,7 +56,7 @@ Example intent:
|
|
|
56
56
|
{
|
|
57
57
|
"name": "your-repo",
|
|
58
58
|
"version": "0.1.0",
|
|
59
|
-
"skills": "
|
|
59
|
+
"skills": "./.vibekit/skills",
|
|
60
60
|
"mcp": "./.mcp.json"
|
|
61
61
|
}
|
|
62
62
|
```
|
|
@@ -78,8 +78,8 @@ on:
|
|
|
78
78
|
- ".claude-plugin/**"
|
|
79
79
|
- ".agents/**"
|
|
80
80
|
- "agents/**"
|
|
81
|
-
- "skills/**"
|
|
82
|
-
- ".
|
|
81
|
+
- ".vibekit/skills/**"
|
|
82
|
+
- ".vibekit/commands/**"
|
|
83
83
|
- "hooks/**"
|
|
84
84
|
- ".mcp.json"
|
|
85
85
|
- "mcp-configs/**"
|
package/{skills → .vibekit/skills}/agentshield-security-review/references/report-template.md
RENAMED
|
@@ -34,7 +34,7 @@ Use this structure for final reports.
|
|
|
34
34
|
|
|
35
35
|
## Medium/low findings
|
|
36
36
|
|
|
37
|
-
Group by theme: permissions, hooks, MCP, prompts, skills, .
|
|
37
|
+
Group by theme: permissions, hooks, MCP, prompts, skills, .vibekit/docs/examples.
|
|
38
38
|
|
|
39
39
|
## Remediation order
|
|
40
40
|
|
package/{skills → .vibekit/skills}/agentshield-security-review/scripts/agentshield_repo_probe.py
RENAMED
|
@@ -15,9 +15,9 @@ PATTERNS = {
|
|
|
15
15
|
"repo_instructions": ["CLAUDE.md", "AGENTS.md", ".github/copilot-instructions.md"],
|
|
16
16
|
"claude": [".claude", ".claude-plugin", "agents"],
|
|
17
17
|
"codex": [".codex", ".codex-plugin"],
|
|
18
|
-
"shared_skills": ["skills", ".agents/skills"],
|
|
19
|
-
"shared_commands": [".
|
|
20
|
-
"kit_scripts": [".
|
|
18
|
+
"shared_skills": [".vibekit/skills", ".claude/skills", ".cursor/skills", ".agents/skills", "skills"],
|
|
19
|
+
"shared_commands": [".vibekit/commands"],
|
|
20
|
+
"kit_scripts": [".vibekit/scripts"],
|
|
21
21
|
"hooks": ["hooks", ".claude/hooks", ".agents/hooks"],
|
|
22
22
|
"mcp": [".mcp.json", "mcp.json", "mcp-configs"],
|
|
23
23
|
"ci": [".github/workflows"],
|
|
@@ -11,5 +11,5 @@ Example:
|
|
|
11
11
|
For this kit:
|
|
12
12
|
|
|
13
13
|
```text
|
|
14
|
-
/autoresearch-coding goal: improve the kit; metric command: node .
|
|
14
|
+
/autoresearch-coding goal: improve the kit; metric command: node .vibekit/scripts/validate-kit.mjs .; direction: higher; editable paths: .vibekit/docs .vibekit/scripts .vibekit/skills .vibekit/commands .claude .cursor .agents .codex-plugin; budget: 3
|
|
15
15
|
```
|
|
@@ -28,16 +28,16 @@ For this kit itself, use:
|
|
|
28
28
|
|
|
29
29
|
```text
|
|
30
30
|
goal: improve Minimal Vibe Coding Kit quality
|
|
31
|
-
metric command: node .
|
|
31
|
+
metric command: node .vibekit/scripts/validate-kit.mjs .
|
|
32
32
|
direction: higher
|
|
33
|
-
editable paths: .
|
|
33
|
+
editable paths: .vibekit/docs .vibekit/scripts .vibekit/skills .vibekit/commands .claude .cursor .agents .codex-plugin .github README.md AGENTS.md .vibekit/init/CLAUDE-template.md .vibekit/init/FIRST_TIME_INIT.md .vibekit/init/FIRST_PROMPT.md backbone.yml package.json install.sh install.ps1
|
|
34
34
|
protected paths: .git .env* node_modules vendor secrets lockfiles
|
|
35
35
|
budget: 3
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
## Setup
|
|
39
39
|
|
|
40
|
-
1. Read `backbone.yml`. If `meta.template_status` is `uninitialized`, follow
|
|
40
|
+
1. Read `backbone.yml`. If `meta.template_status` is `uninitialized`, follow `.vibekit/init/FIRST_TIME_INIT.md` and wait for explicit approval before experiment edits.
|
|
41
41
|
2. Inspect `git status --short`.
|
|
42
42
|
3. If user changes exist, stop unless the user permits dirty-state experimentation.
|
|
43
43
|
4. Create or switch to an experiment branch named `autoresearch/<date>-<slug>` when a git repo is available. If branch creation is blocked by permissions, ask for approval once and record any approved fallback.
|
|
@@ -78,7 +78,7 @@ For each experiment:
|
|
|
78
78
|
7. Keep good changes; revert discarded or crashed changes.
|
|
79
79
|
8. If a crash is from a trivial patch mistake, fix once and rerun.
|
|
80
80
|
|
|
81
|
-
If a kept change touches agent surfaces such as `AGENTS.md`, `CLAUDE.md`, `.claude/**`, `.cursor/**`, `.agents/**`, `.codex-plugin/**`,
|
|
81
|
+
If a kept change touches agent surfaces such as `AGENTS.md`, `CLAUDE.md`, `.claude/**`, `.cursor/**`, `.agents/**`, `.codex-plugin/**`, `.vibekit/skills/**`, `.vibekit/commands/**`, `.vibekit/scripts/**`, hooks, or MCP config, run the AgentShield probe before final reporting.
|
|
82
82
|
|
|
83
83
|
## Delegation
|
|
84
84
|
|
|
@@ -14,19 +14,19 @@ Run a daily improvement pass that proposes changes, not silent edits.
|
|
|
14
14
|
2. Run:
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
node .
|
|
17
|
+
node .vibekit/scripts/daily-enhance.mjs . --write-report
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
3. Run validation:
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
node .
|
|
23
|
+
node .vibekit/scripts/validate-kit.mjs .
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
4. Run AgentShield read-only probe if present:
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
node .
|
|
29
|
+
node .vibekit/scripts/agentshield-probe.mjs .
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
5. Identify stale, duplicated, or overly broad rules.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: parallel-analysis
|
|
3
|
+
description: Fan out 2-5 independent read-only analysis lanes across the repo using your configured executor (Cursor CLI Composer, Claude subagents, or Codex CLI), then merge the lane reports and verify them with a refutation pass. Use for repo-wide questions, large uncommitted-diff reviews, multi-doc reading, impact analysis, or consistency audits. On first use it asks which provider/model to use and saves the answer so it never asks again.
|
|
4
|
+
argument-hint: "<analysis question, diff, or review target>"
|
|
5
|
+
user-invocable: true
|
|
6
|
+
effort: medium
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Parallel Analysis (Multi-Agent Fan-Out)
|
|
10
|
+
|
|
11
|
+
Split a large analysis into independent read-only lanes, run them concurrently
|
|
12
|
+
with the configured executor, merge the lane reports, and verify merged claims
|
|
13
|
+
with a skeptical refutation pass. One round of parallel lanes replaces slow
|
|
14
|
+
serial reading; the verification lane replaces manual double-checking.
|
|
15
|
+
|
|
16
|
+
This skill is project-agnostic: it works in any repo where the kit is
|
|
17
|
+
installed, using that repo's `backbone.yml` (if present) for boundaries.
|
|
18
|
+
|
|
19
|
+
## Best Use
|
|
20
|
+
|
|
21
|
+
- Repo-wide questions ("where is X handled, what depends on Y").
|
|
22
|
+
- Reviewing a large uncommitted diff by concern (backend vs frontend vs i18n
|
|
23
|
+
vs scripts).
|
|
24
|
+
- Reading several large docs, plans, or reference trees at once.
|
|
25
|
+
- Pre-change impact analysis across packages/apps listed in `backbone.yml`
|
|
26
|
+
`paths.apps`.
|
|
27
|
+
- Consistency audits (docs vs code, rules vs skills, config vs actual layout).
|
|
28
|
+
|
|
29
|
+
Do NOT use for single-file questions or quick lookups; direct reads are faster.
|
|
30
|
+
|
|
31
|
+
## Executor Setup (first use only)
|
|
32
|
+
|
|
33
|
+
Lane execution is delegated to ONE configured executor. The choice is stored
|
|
34
|
+
in `.vibekit/parallel-analysis.json`; while that file exists and its preflight
|
|
35
|
+
passes, NEVER ask again.
|
|
36
|
+
|
|
37
|
+
1. **If `.vibekit/parallel-analysis.json` exists**: read it, run the matching
|
|
38
|
+
preflight below, and proceed silently on success. If preflight fails
|
|
39
|
+
(binary missing, logged out), tell the user what broke, offer to re-run
|
|
40
|
+
setup, and update the file with their answer.
|
|
41
|
+
2. **If it does not exist**: detect what is available, then ask the user ONE
|
|
42
|
+
question — "Which provider should run parallel analysis lanes?" — using the
|
|
43
|
+
harness-native prompt (AskUserQuestion in Claude Code; a plain chat
|
|
44
|
+
question in Cursor/Codex). Offer, in this order:
|
|
45
|
+
- **Cursor CLI + Composer 2.5 Fast (recommended)** — fastest lane executor;
|
|
46
|
+
requires `cursor-agent` installed and logged in.
|
|
47
|
+
- **Claude subagents** — no extra install; lanes run as read-only Claude
|
|
48
|
+
Code subagents (Explore/general-purpose). Choose this automatically if
|
|
49
|
+
the user declines external CLIs.
|
|
50
|
+
- **Codex CLI** — lanes run via `codex exec` in a read-only sandbox with
|
|
51
|
+
the best available Codex model.
|
|
52
|
+
3. **Resolve the model** for the chosen provider (see per-executor notes),
|
|
53
|
+
confirm the resolved value in one line, and write the config file. Include
|
|
54
|
+
a fallback executor so lanes still run when the primary is unavailable.
|
|
55
|
+
|
|
56
|
+
### Preflights and model resolution
|
|
57
|
+
|
|
58
|
+
- `cursor-cli`: `cursor-agent status` must report logged in (otherwise the
|
|
59
|
+
user runs `cursor-agent login` once). Resolve the model with
|
|
60
|
+
`cursor-agent --list-models` and prefer the Composer 2.5 fast variant
|
|
61
|
+
(e.g. `composer-2.5-fast`); if absent, use the newest Composer model and
|
|
62
|
+
record what was picked.
|
|
63
|
+
- `claude-subagents`: available whenever running inside Claude Code; no
|
|
64
|
+
binary needed. Use read-only subagent types only.
|
|
65
|
+
- `codex-cli`: `codex --version` must succeed. Use the CLI's default/best
|
|
66
|
+
coding model unless the user names one; record the resolved model.
|
|
67
|
+
|
|
68
|
+
### Config file — `.vibekit/parallel-analysis.json`
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"executor": "cursor-cli",
|
|
73
|
+
"model": "composer-2.5-fast",
|
|
74
|
+
"fallback": "claude-subagents",
|
|
75
|
+
"configuredAt": "2026-07-16T07:30:00Z"
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`executor` is one of `cursor-cli` | `claude-subagents` | `codex-cli`. The file
|
|
80
|
+
is local state (gitignored by default); a team may commit it deliberately to
|
|
81
|
+
share a default. To change the choice later, delete the file or ask for
|
|
82
|
+
"parallel-analysis setup" again.
|
|
83
|
+
|
|
84
|
+
## Running a lane (per executor)
|
|
85
|
+
|
|
86
|
+
Every lane is READ-ONLY: search, read, summarize — never edit files, execute
|
|
87
|
+
project binaries, run hooks, or trigger installs/deploys/migrations.
|
|
88
|
+
|
|
89
|
+
- `cursor-cli`:
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
cursor-agent -p --mode ask --output-format text \
|
|
93
|
+
--model "<configured-model>" \
|
|
94
|
+
--workspace "<repo-root>" \
|
|
95
|
+
"<lane brief>"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Never pass `--force` or `--yolo`; `--mode ask` keeps Composer read-only.
|
|
99
|
+
One workspace per lane; a question spanning multiple repos becomes one lane
|
|
100
|
+
per repo.
|
|
101
|
+
- `claude-subagents`: launch each lane as a read-only subagent with the lane
|
|
102
|
+
brief as its prompt, all lanes in ONE message so they run concurrently.
|
|
103
|
+
- `codex-cli`:
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
codex exec --sandbox read-only -C "<repo-root>" "<lane brief>"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
If the harness cannot run lanes concurrently (plain CLI loop), run them
|
|
110
|
+
back-to-back without changing the briefs — merge and verification stay the
|
|
111
|
+
same.
|
|
112
|
+
|
|
113
|
+
## Workflow
|
|
114
|
+
|
|
115
|
+
1. **Scope.** State the question in one sentence. Split it into 2-5 lanes that
|
|
116
|
+
are independent of each other (by directory, package, concern, or doc set).
|
|
117
|
+
If lanes would depend on each other's output, merge them or run two rounds.
|
|
118
|
+
2. **Brief.** Give each lane a numbered brief: exact paths, the questions to
|
|
119
|
+
answer, and the required return format ("facts only, numbered sections,
|
|
120
|
+
findings as `file:line — issue — why it matters`").
|
|
121
|
+
3. **Launch all lanes at once** with the configured executor.
|
|
122
|
+
4. **Prepare while waiting.** Build the merge skeleton; do not duplicate lane
|
|
123
|
+
work.
|
|
124
|
+
5. **Merge.** Combine lane reports into one findings list. Mark conflicts
|
|
125
|
+
between lanes and unknowns explicitly — never average away a disagreement.
|
|
126
|
+
6. **Verify.** Run one verification lane that receives the merged claims (not
|
|
127
|
+
the reasoning) with the instruction: "Default-skeptical: confirm or refute
|
|
128
|
+
each claim against the repo with file:line evidence." Drop or re-investigate
|
|
129
|
+
every refuted claim; never silently keep one.
|
|
130
|
+
7. **Deliver.** Report merged findings, what was verified, and remaining
|
|
131
|
+
unknowns. For issue triage, classify surviving findings with the
|
|
132
|
+
`reviewing-4p-priorities` skill (P0-P4). Decisions and edits stay in the
|
|
133
|
+
main session under the repo's normal review rules.
|
|
134
|
+
|
|
135
|
+
## Lane brief template
|
|
136
|
+
|
|
137
|
+
```text
|
|
138
|
+
Lane <n>: <one-line purpose>
|
|
139
|
+
Workspace: <repo root>
|
|
140
|
+
Paths: <exact dirs/files>
|
|
141
|
+
Read-only. Do not modify anything or execute binaries/scripts.
|
|
142
|
+
Questions:
|
|
143
|
+
1. <specific question>
|
|
144
|
+
2. <specific question>
|
|
145
|
+
Return: numbered sections matching the questions, facts only,
|
|
146
|
+
findings as file:line — issue — why it matters.
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Guardrails
|
|
150
|
+
|
|
151
|
+
- 2-5 lanes per round; needing more means the question is under-scoped.
|
|
152
|
+
- Lanes are read-only; only the main session edits files. Agent-surface edits
|
|
153
|
+
(`backbone.yml`, `AGENTS.md`, `CLAUDE.md`, `.claude/**`, `.cursor/**`,
|
|
154
|
+
`.agents/**`, `.codex/**`, kit skills/commands) additionally require the
|
|
155
|
+
`agentshield-security-review` skill afterwards.
|
|
156
|
+
- Respect `backbone.yml` `policy.protected_paths` in every lane brief.
|
|
157
|
+
- Never put secrets in lane briefs or executor prompts: no `.env*` contents,
|
|
158
|
+
credentials, tokens, private keys, or customer data.
|
|
159
|
+
- This skill produces analysis, not decisions; a lane may not conclude
|
|
160
|
+
"therefore change X" without main-session review.
|