minimal-vibe-coding-kit 0.3.0 → 0.4.1
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/coding-level/SKILL.md +8 -1
- 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 +69 -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/safe-delete.md +11 -0
- 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/coding-level/SKILL.md +8 -1
- 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 +69 -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/rules/040-safe-delete.mdc +16 -0
- package/.cursor/skills/coding-level/SKILL.md +8 -1
- package/.cursor/skills/parallel-analysis/SKILL.md +160 -0
- package/.cursor/skills/path-sensitive-shell-safety/SKILL.md +69 -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 +28 -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} +3 -1
- package/{FIRST_PROMPT.md → .vibekit/init/FIRST_PROMPT.md} +6 -6
- package/{FIRST_TIME_INIT.md → .vibekit/init/FIRST_TIME_INIT.md} +46 -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 +22 -7
- package/{.vbkit-scripts → .vibekit/scripts}/init-backbone.mjs +31 -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}/coding-level/SKILL.md +8 -1
- 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 +69 -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 +6 -2
- package/CHANGELOG.md +24 -2
- package/CONTRIBUTING.md +3 -3
- package/README.md +147 -372
- package/backbone.yml +8 -7
- package/bin/mvck.js +1 -1
- package/bin/vibe-kit.js +1 -1
- package/docs/README.vi.md +268 -0
- package/install.ps1 +1 -1
- package/install.sh +5 -3
- package/package.json +23 -19
- package/.vbkit-commands/vibe-finalize.md +0 -3
- package/README.vi.md +0 -431
- /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/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
|
@@ -6,7 +6,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
|
|
8
8
|
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
-
const kitRoot = path.resolve(path.dirname(__filename), '..');
|
|
9
|
+
const kitRoot = path.resolve(path.dirname(__filename), '..', '..');
|
|
10
10
|
const node = process.execPath;
|
|
11
11
|
const keep = process.argv.includes('--keep');
|
|
12
12
|
const temps = [];
|
|
@@ -44,21 +44,35 @@ function count(text, marker) {
|
|
|
44
44
|
|
|
45
45
|
try {
|
|
46
46
|
const clean = tempDir('clean');
|
|
47
|
-
run(['.
|
|
48
|
-
run(['.
|
|
47
|
+
run(['.vibekit/scripts/mvck.mjs', 'install', clean, '--profile', 'all']);
|
|
48
|
+
run(['.vibekit/scripts/validate-kit.mjs', clean]);
|
|
49
49
|
assert(fs.existsSync(path.join(clean, 'AGENTS.md')), 'clean install creates AGENTS.md');
|
|
50
|
-
assert(fs.existsSync(path.join(clean, '.
|
|
51
|
-
assert(fs.existsSync(path.join(clean, '.
|
|
52
|
-
assert(fs.existsSync(path.join(clean, '.
|
|
50
|
+
assert(fs.existsSync(path.join(clean, '.vibekit/commands')), 'clean install creates .vibekit/commands');
|
|
51
|
+
assert(fs.existsSync(path.join(clean, '.vibekit/scripts')), 'clean install creates .vibekit/scripts');
|
|
52
|
+
assert(fs.existsSync(path.join(clean, '.vibekit/docs')), 'clean install creates .vibekit/docs');
|
|
53
53
|
assert(!fs.existsSync(path.join(clean, 'commands')), 'clean install does not create root commands');
|
|
54
54
|
assert(!fs.existsSync(path.join(clean, 'scripts')), 'clean install does not create root scripts');
|
|
55
55
|
assert(!fs.existsSync(path.join(clean, 'docs')), 'clean install does not create root docs');
|
|
56
|
+
assert(fs.existsSync(path.join(clean, '.vibekit/skills/vibekit-init/SKILL.md')), 'clean install creates .vibekit/skills');
|
|
57
|
+
assert(fs.existsSync(path.join(clean, '.vibekit/init/FIRST_TIME_INIT.md')), 'clean install seeds init files under .vibekit/init');
|
|
58
|
+
assert(!fs.existsSync(path.join(clean, 'skills')), 'clean install does not create root skills');
|
|
59
|
+
assert(!fs.existsSync(path.join(clean, '.vbkit-scripts')), 'clean install does not create legacy .vbkit-scripts');
|
|
60
|
+
assert(!fs.existsSync(path.join(clean, '.vbkit-commands')), 'clean install does not create legacy .vbkit-commands');
|
|
61
|
+
assert(!fs.existsSync(path.join(clean, '.vbkit-docs')), 'clean install does not create legacy .vbkit-docs');
|
|
62
|
+
assert(!fs.existsSync(path.join(clean, 'FIRST_TIME_INIT.md')), 'clean install does not seed root FIRST_TIME_INIT.md');
|
|
63
|
+
assert(!fs.existsSync(path.join(clean, '.vibekit/scripts/test-install.mjs')), 'clean install omits kit-dev test-install.mjs');
|
|
64
|
+
assert(!fs.existsSync(path.join(clean, '.vibekit/scripts/pack-dry-run.mjs')), 'clean install omits kit-dev pack-dry-run.mjs');
|
|
65
|
+
assert(!fs.existsSync(path.join(clean, '.vibekit/docs/RESEARCH_NOTES.md')), 'clean install omits maintainer RESEARCH_NOTES.md');
|
|
66
|
+
assert(!fs.existsSync(path.join(clean, '.vibekit/docs/AUTORESEARCH_LEDGER.md')), 'clean install omits maintainer AUTORESEARCH_LEDGER.md');
|
|
67
|
+
assert(fs.existsSync(path.join(clean, '.vibekit/docs/INSTALL.md')), 'clean install keeps end-user docs like INSTALL.md');
|
|
68
|
+
run(['.vibekit/scripts/mvck.mjs', 'install', clean, '--profile', 'bogus'], { expect: 1 });
|
|
69
|
+
assert(true, 'install rejects an unknown --profile value');
|
|
56
70
|
|
|
57
71
|
const existing = tempDir('existing');
|
|
58
72
|
fs.writeFileSync(path.join(existing, 'AGENTS.md'), '# Existing\n');
|
|
59
73
|
fs.writeFileSync(path.join(existing, 'CLAUDE.md'), '# Existing Claude\n');
|
|
60
|
-
run(['.
|
|
61
|
-
run(['.
|
|
74
|
+
run(['.vibekit/scripts/mvck.mjs', 'install', existing, '--profile', 'all']);
|
|
75
|
+
run(['.vibekit/scripts/mvck.mjs', 'install', existing, '--profile', 'all']);
|
|
62
76
|
|
|
63
77
|
const agents = fs.readFileSync(path.join(existing, 'AGENTS.md'), 'utf8');
|
|
64
78
|
const claude = fs.readFileSync(path.join(existing, 'CLAUDE.md'), 'utf8');
|
|
@@ -70,39 +84,39 @@ try {
|
|
|
70
84
|
assert(count(claude, 'END: minimal-vibe-coding-kit') === 1, 'CLAUDE.md has one managed end marker');
|
|
71
85
|
|
|
72
86
|
const cwdTarget = tempDir('cwd-target');
|
|
73
|
-
run([path.join(kitRoot, '.
|
|
87
|
+
run([path.join(kitRoot, '.vibekit/scripts/mvck.mjs'), 'install', '--profile', 'all'], { cwd: cwdTarget });
|
|
74
88
|
assert(fs.existsSync(path.join(cwdTarget, 'backbone.yml')), 'install without target uses current working directory');
|
|
75
89
|
|
|
76
|
-
const proposed = run([path.join(kitRoot, '.
|
|
90
|
+
const proposed = run([path.join(kitRoot, '.vibekit/scripts/mvck.mjs'), 'init', '--propose'], { cwd: cwdTarget });
|
|
77
91
|
assert(proposed.stdout.includes('Proposed backbone.yml'), 'init --propose without target preserves flag');
|
|
78
92
|
|
|
79
|
-
const jsonPlan = run(['.
|
|
93
|
+
const jsonPlan = run(['.vibekit/scripts/mvck.mjs', 'install', clean, '--dry-run', '--json']);
|
|
80
94
|
const parsed = JSON.parse(jsonPlan.stdout);
|
|
81
95
|
assert(parsed.status === 'dry-run' && parsed.dryRun === true, 'install --dry-run --json returns machine-readable plan');
|
|
82
96
|
|
|
83
97
|
const upd = tempDir('update');
|
|
84
|
-
run(['.
|
|
98
|
+
run(['.vibekit/scripts/mvck.mjs', 'install', upd, '--profile', 'all']);
|
|
85
99
|
assert(fs.existsSync(path.join(upd, '.vibekit/KIT_VERSION')), 'install stamps .vibekit/KIT_VERSION');
|
|
86
100
|
fs.appendFileSync(path.join(upd, 'backbone.yml'), '# user-custom-line\n');
|
|
87
|
-
fs.writeFileSync(path.join(upd, 'skills/memento/SKILL.md'), '# stale kit file\n');
|
|
101
|
+
fs.writeFileSync(path.join(upd, '.vibekit/skills/memento/SKILL.md'), '# stale kit file\n');
|
|
88
102
|
fs.rmSync(path.join(upd, '.claude/skills/coding-level'), { recursive: true, force: true });
|
|
89
103
|
|
|
90
|
-
run(['.
|
|
91
|
-
assert(fs.readFileSync(path.join(upd, 'skills/memento/SKILL.md'), 'utf8').includes('name: memento'), 'update refreshes stale kit files');
|
|
104
|
+
run(['.vibekit/scripts/mvck.mjs', 'update', upd]);
|
|
105
|
+
assert(fs.readFileSync(path.join(upd, '.vibekit/skills/memento/SKILL.md'), 'utf8').includes('name: memento'), 'update refreshes stale kit files');
|
|
92
106
|
assert(fs.existsSync(path.join(upd, '.claude/skills/coding-level/SKILL.md')), 'update re-adds missing kit skill mirrors');
|
|
93
107
|
assert(fs.readFileSync(path.join(upd, 'backbone.yml'), 'utf8').includes('# user-custom-line'), 'update preserves user-modified backbone.yml');
|
|
94
108
|
const backupRoot = path.join(upd, '.vibekit', 'update-backup');
|
|
95
109
|
assert(fs.existsSync(backupRoot) && fs.readdirSync(backupRoot).length >= 1, 'update backs up replaced kit files');
|
|
96
|
-
run(['.
|
|
110
|
+
run(['.vibekit/scripts/validate-kit.mjs', upd]);
|
|
97
111
|
|
|
98
112
|
const updAgents = fs.readFileSync(path.join(upd, 'AGENTS.md'), 'utf8');
|
|
99
113
|
assert(count(updAgents, 'BEGIN: minimal-vibe-coding-kit') === 1, 'update keeps one managed begin marker in AGENTS.md');
|
|
100
114
|
|
|
101
115
|
const emptyTarget = tempDir('update-empty');
|
|
102
|
-
run(['.
|
|
116
|
+
run(['.vibekit/scripts/mvck.mjs', 'update', emptyTarget], { expect: 1 });
|
|
103
117
|
assert(true, 'update refuses a target without the kit installed');
|
|
104
118
|
|
|
105
|
-
const updPlan = run(['.
|
|
119
|
+
const updPlan = run(['.vibekit/scripts/mvck.mjs', 'update', upd, '--dry-run', '--json']);
|
|
106
120
|
const updParsed = JSON.parse(updPlan.stdout);
|
|
107
121
|
assert(updParsed.status === 'dry-run' && typeof updParsed.toVersion === 'string', 'update --dry-run --json returns machine-readable plan');
|
|
108
122
|
|
|
@@ -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
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: coding-level
|
|
3
|
-
description: Set the coding-explanation register. /coding-level N (0=ELI5, 1=Junior, 2=Mid, 3=Senior, 4=Tech Lead, 5=God); active until reinvoked.
|
|
3
|
+
description: Set the coding-explanation register. /coding-level N (0=ELI5, 1=Junior, 2=Mid, 3=Senior, 4=Tech Lead, 5=God); active until reinvoked. A project default may be recorded in backbone.yml conventions.custom_rules.
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
argument-hint: "[0-5]"
|
|
6
6
|
---
|
|
@@ -20,6 +20,13 @@ argument-hint: "[0-5]"
|
|
|
20
20
|
|
|
21
21
|
1. Read `$ARGUMENTS` as N. If N is not an integer 0–5, reply with the table above and ask for a valid N.
|
|
22
22
|
2. Read `references/level-<N>.md`, state once which level is now active, and apply that persona to every reply until `/coding-level` is invoked again.
|
|
23
|
+
3. Ask once: "Save level N as the project default?" If yes, add or update the `Default coding level: N` entry in `backbone.yml` `conventions.custom_rules` (show the diff and wait for approval, per kit rules).
|
|
24
|
+
|
|
25
|
+
## Project default
|
|
26
|
+
|
|
27
|
+
- First-time init records a default as a `backbone.yml` `conventions.custom_rules` entry: `Default coding level: N (<Register>)`.
|
|
28
|
+
- Sessions without an explicit `/coding-level` start from that default level.
|
|
29
|
+
- `/coding-level N` overrides the default for the current session only, unless the user saves it in step 3.
|
|
23
30
|
|
|
24
31
|
## Scope
|
|
25
32
|
|
|
@@ -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.
|