@sandrinio/vbounce 1.7.0 โ 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -160
- package/bin/vbounce.mjs +250 -25
- package/brains/AGENTS.md +4 -4
- package/brains/CHANGELOG.md +2 -2
- package/brains/CLAUDE.md +4 -4
- package/brains/GEMINI.md +5 -5
- package/brains/SETUP.md +15 -15
- package/brains/claude-agents/architect.md +1 -1
- package/brains/claude-agents/developer.md +1 -1
- package/brains/claude-agents/devops.md +1 -1
- package/brains/claude-agents/qa.md +2 -1
- package/brains/claude-agents/scribe.md +1 -1
- package/brains/copilot/copilot-instructions.md +3 -3
- package/brains/cursor-rules/vbounce-docs.mdc +2 -2
- package/brains/cursor-rules/vbounce-process.mdc +3 -3
- package/brains/cursor-rules/vbounce-rules.mdc +2 -2
- package/brains/windsurf/.windsurfrules +2 -2
- package/docs/HOTFIX_EDGE_CASES.md +1 -1
- package/package.json +5 -5
- package/scripts/doctor.mjs +3 -3
- package/scripts/hotfix_manager.sh +2 -2
- package/scripts/init_gate_config.sh +1 -1
- package/scripts/pre_gate_common.sh +1 -1
- package/scripts/pre_gate_runner.sh +1 -1
- package/scripts/prep_qa_context.mjs +19 -1
- package/scripts/prep_sprint_context.mjs +24 -1
- package/scripts/suggest_improvements.mjs +1 -1
- package/scripts/validate_bounce_readiness.mjs +27 -0
- package/scripts/validate_report.mjs +1 -1
- package/scripts/vdoc_match.mjs +269 -0
- package/scripts/vdoc_staleness.mjs +199 -0
- package/scripts/verify_framework.mjs +1 -1
- package/skills/agent-team/SKILL.md +18 -11
- package/skills/doc-manager/SKILL.md +5 -5
- package/skills/improve/SKILL.md +2 -2
- package/templates/sprint_report.md +6 -2
package/bin/vbounce.mjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
|
+
import crypto from 'crypto';
|
|
5
6
|
import { fileURLToPath } from 'url';
|
|
6
7
|
import readline from 'readline';
|
|
7
8
|
|
|
@@ -65,10 +66,10 @@ const askQuestion = (query) => new Promise(resolve => rl.question(query, resolve
|
|
|
65
66
|
|
|
66
67
|
function displayHelp() {
|
|
67
68
|
console.log(`
|
|
68
|
-
V-Bounce
|
|
69
|
+
V-Bounce Engine CLI
|
|
69
70
|
|
|
70
71
|
Usage:
|
|
71
|
-
vbounce install <platform> Install V-Bounce
|
|
72
|
+
vbounce install <platform> Install V-Bounce Engine into a project
|
|
72
73
|
vbounce state show Show current sprint state
|
|
73
74
|
vbounce state update <storyId> <state|--qa-bounce>
|
|
74
75
|
vbounce sprint init <sprintId> <deliveryId> [--stories STORY-001,...]
|
|
@@ -81,6 +82,8 @@ Usage:
|
|
|
81
82
|
vbounce prep qa <storyId> Generate QA context pack
|
|
82
83
|
vbounce prep arch <storyId> Generate Architect context pack
|
|
83
84
|
vbounce prep sprint <sprintId> Generate Sprint context pack
|
|
85
|
+
vbounce docs match --story <ID> Match story scope against vdoc manifest
|
|
86
|
+
vbounce docs check <sprintId> Detect stale vdocs and generate Scribe task
|
|
84
87
|
vbounce trends Cross-sprint trend analysis
|
|
85
88
|
vbounce suggest <sprintId> Generate improvement suggestions
|
|
86
89
|
vbounce doctor Validate all configs and state files
|
|
@@ -192,6 +195,20 @@ if (command === 'suggest') {
|
|
|
192
195
|
runScript('suggest_improvements.mjs', args.slice(1));
|
|
193
196
|
}
|
|
194
197
|
|
|
198
|
+
// -- docs --
|
|
199
|
+
if (command === 'docs') {
|
|
200
|
+
rl.close();
|
|
201
|
+
if (sub === 'match') {
|
|
202
|
+
runScript('vdoc_match.mjs', args.slice(2));
|
|
203
|
+
} else if (sub === 'check') {
|
|
204
|
+
runScript('vdoc_staleness.mjs', args.slice(2));
|
|
205
|
+
} else {
|
|
206
|
+
console.error(`Unknown docs subcommand: ${sub}`);
|
|
207
|
+
console.error('Usage: vbounce docs match --story <ID> | vbounce docs check <sprintId>');
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
195
212
|
// -- doctor --
|
|
196
213
|
if (command === 'doctor') {
|
|
197
214
|
rl.close();
|
|
@@ -211,6 +228,7 @@ if (command === 'install') {
|
|
|
211
228
|
}
|
|
212
229
|
|
|
213
230
|
const CWD = process.cwd();
|
|
231
|
+
const pkgVersion = JSON.parse(fs.readFileSync(path.join(pkgRoot, 'package.json'), 'utf8')).version;
|
|
214
232
|
|
|
215
233
|
// Map vbounce platform names to vdoc platform names
|
|
216
234
|
const vdocPlatformMap = {
|
|
@@ -271,34 +289,208 @@ if (command === 'install') {
|
|
|
271
289
|
displayHelp();
|
|
272
290
|
}
|
|
273
291
|
|
|
274
|
-
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
// Upgrade-safe install helpers
|
|
294
|
+
// ---------------------------------------------------------------------------
|
|
275
295
|
|
|
276
|
-
const
|
|
277
|
-
const
|
|
296
|
+
const META_PATH = path.join(CWD, '.bounce', 'install-meta.json');
|
|
297
|
+
const BACKUPS_DIR = path.join(CWD, '.bounce', 'backups');
|
|
278
298
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
const
|
|
299
|
+
/** Compute MD5 hash of a single file's contents. */
|
|
300
|
+
function computeFileHash(filePath) {
|
|
301
|
+
const content = fs.readFileSync(filePath);
|
|
302
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
303
|
+
}
|
|
282
304
|
|
|
283
|
-
|
|
284
|
-
|
|
305
|
+
/** Compute a combined hash for a directory by hashing all files sorted by relative path. */
|
|
306
|
+
function computeDirHash(dirPath) {
|
|
307
|
+
const hash = crypto.createHash('md5');
|
|
308
|
+
const entries = [];
|
|
309
|
+
|
|
310
|
+
function walk(dir, rel) {
|
|
311
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
312
|
+
const fullPath = path.join(dir, entry.name);
|
|
313
|
+
const relPath = path.join(rel, entry.name);
|
|
314
|
+
if (entry.isDirectory()) {
|
|
315
|
+
walk(fullPath, relPath);
|
|
316
|
+
} else {
|
|
317
|
+
entries.push({ relPath, fullPath });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
285
320
|
}
|
|
286
321
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
322
|
+
walk(dirPath, '');
|
|
323
|
+
entries.sort((a, b) => a.relPath.localeCompare(b.relPath));
|
|
324
|
+
for (const e of entries) {
|
|
325
|
+
hash.update(e.relPath);
|
|
326
|
+
hash.update(fs.readFileSync(e.fullPath));
|
|
291
327
|
}
|
|
292
|
-
|
|
328
|
+
return hash.digest('hex');
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** Compute hash for a path (file or directory). */
|
|
332
|
+
function computeHash(p) {
|
|
333
|
+
const stats = fs.statSync(p);
|
|
334
|
+
return stats.isDirectory() ? computeDirHash(p) : computeFileHash(p);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** Count files in a path (1 for a file, recursive count for a directory). */
|
|
338
|
+
function countFiles(p) {
|
|
339
|
+
const stats = fs.statSync(p);
|
|
340
|
+
if (!stats.isDirectory()) return 1;
|
|
341
|
+
let count = 0;
|
|
342
|
+
function walk(dir) {
|
|
343
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
344
|
+
if (entry.isDirectory()) walk(path.join(dir, entry.name));
|
|
345
|
+
else count++;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
walk(p);
|
|
349
|
+
return count;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** Read install-meta.json, returns null if missing. */
|
|
353
|
+
function readInstallMeta() {
|
|
354
|
+
if (!fs.existsSync(META_PATH)) return null;
|
|
355
|
+
try {
|
|
356
|
+
return JSON.parse(fs.readFileSync(META_PATH, 'utf8'));
|
|
357
|
+
} catch {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/** Write install-meta.json. */
|
|
363
|
+
function writeInstallMeta(version, platform, files, hashes) {
|
|
364
|
+
const meta = {
|
|
365
|
+
version,
|
|
366
|
+
platform,
|
|
367
|
+
installed_at: new Date().toISOString(),
|
|
368
|
+
files,
|
|
369
|
+
hashes
|
|
370
|
+
};
|
|
371
|
+
fs.mkdirSync(path.dirname(META_PATH), { recursive: true });
|
|
372
|
+
fs.writeFileSync(META_PATH, JSON.stringify(meta, null, 2) + '\n');
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/** Backup files to .bounce/backups/<version>/. Removes previous backup first. */
|
|
376
|
+
function backupFiles(version, paths) {
|
|
377
|
+
// Remove previous backup (keep only one)
|
|
378
|
+
if (fs.existsSync(BACKUPS_DIR)) {
|
|
379
|
+
for (const entry of fs.readdirSync(BACKUPS_DIR, { withFileTypes: true })) {
|
|
380
|
+
if (entry.isDirectory()) {
|
|
381
|
+
fs.rmSync(path.join(BACKUPS_DIR, entry.name), { recursive: true, force: true });
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const backupDir = path.join(BACKUPS_DIR, version);
|
|
387
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
388
|
+
|
|
389
|
+
for (const relPath of paths) {
|
|
390
|
+
const src = path.join(CWD, relPath);
|
|
391
|
+
const dest = path.join(backupDir, relPath);
|
|
392
|
+
|
|
393
|
+
if (!fs.existsSync(src)) continue;
|
|
394
|
+
|
|
395
|
+
const stats = fs.statSync(src);
|
|
396
|
+
if (stats.isDirectory()) {
|
|
397
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
398
|
+
fs.cpSync(src, dest, { recursive: true });
|
|
399
|
+
} else {
|
|
400
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
401
|
+
fs.copyFileSync(src, dest);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return backupDir;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Classify files into unchanged, modified, and newFiles.
|
|
410
|
+
* - unchanged: dest exists and matches what was installed (safe to overwrite)
|
|
411
|
+
* - modified: dest exists but differs from what was installed (user changed it)
|
|
412
|
+
* - newFiles: dest does not exist
|
|
413
|
+
*/
|
|
414
|
+
function classifyFiles(mappingRules, meta) {
|
|
415
|
+
const unchanged = [];
|
|
416
|
+
const modified = [];
|
|
417
|
+
const newFiles = [];
|
|
418
|
+
|
|
419
|
+
for (const rule of mappingRules) {
|
|
420
|
+
const sourcePath = path.join(pkgRoot, rule.src);
|
|
421
|
+
const destPath = path.join(CWD, rule.dest);
|
|
422
|
+
|
|
423
|
+
if (!fs.existsSync(sourcePath)) continue;
|
|
424
|
+
|
|
425
|
+
if (!fs.existsSync(destPath)) {
|
|
426
|
+
newFiles.push(rule);
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Dest exists โ classify as unchanged or modified
|
|
431
|
+
if (!meta || !meta.hashes || !meta.hashes[rule.dest]) {
|
|
432
|
+
// No metadata (first upgrade) โ treat as modified to be safe
|
|
433
|
+
modified.push(rule);
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const currentHash = computeHash(destPath);
|
|
438
|
+
const installedHash = meta.hashes[rule.dest];
|
|
439
|
+
|
|
440
|
+
if (currentHash === installedHash) {
|
|
441
|
+
unchanged.push(rule);
|
|
442
|
+
} else {
|
|
443
|
+
modified.push(rule);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
return { unchanged, modified, newFiles };
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// ---------------------------------------------------------------------------
|
|
451
|
+
// Begin install flow
|
|
452
|
+
// ---------------------------------------------------------------------------
|
|
293
453
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
454
|
+
const meta = readInstallMeta();
|
|
455
|
+
const isUpgrade = meta !== null;
|
|
456
|
+
|
|
457
|
+
if (isUpgrade) {
|
|
458
|
+
console.log(`\n๐ V-Bounce Engine \x1b[36m${pkgVersion}\x1b[0m (upgrading from \x1b[33m${meta.version}\x1b[0m)\n`);
|
|
459
|
+
} else {
|
|
460
|
+
console.log(`\n๐ Preparing to install V-Bounce Engine \x1b[36m${pkgVersion}\x1b[0m for \x1b[36m${targetPlatform}\x1b[0m...\n`);
|
|
297
461
|
}
|
|
298
462
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
463
|
+
const { unchanged, modified, newFiles } = classifyFiles(mapping, meta);
|
|
464
|
+
|
|
465
|
+
if (unchanged.length > 0) {
|
|
466
|
+
console.log('Will update (unchanged by you):');
|
|
467
|
+
for (const rule of unchanged) {
|
|
468
|
+
const destPath = path.join(CWD, rule.dest);
|
|
469
|
+
const n = countFiles(destPath);
|
|
470
|
+
const label = n > 1 ? `(${n} files)` : '';
|
|
471
|
+
console.log(` \x1b[32mโ\x1b[0m ${rule.dest} ${label}`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (modified.length > 0) {
|
|
476
|
+
const backupLabel = isUpgrade ? `.bounce/backups/${meta.version}/` : '.bounce/backups/pre-install/';
|
|
477
|
+
console.log(`\nModified by you (backed up to ${backupLabel}):`);
|
|
478
|
+
for (const rule of modified) {
|
|
479
|
+
console.log(` \x1b[33mโ \x1b[0m ${rule.dest}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (newFiles.length > 0) {
|
|
484
|
+
console.log('\nNew in this version:');
|
|
485
|
+
for (const rule of newFiles) {
|
|
486
|
+
console.log(` \x1b[32m+\x1b[0m ${rule.dest}`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
if (unchanged.length === 0 && modified.length === 0 && newFiles.length === 0) {
|
|
491
|
+
rl.close();
|
|
492
|
+
console.log('Nothing to install โ all source files are missing from the package.');
|
|
493
|
+
process.exit(0);
|
|
302
494
|
}
|
|
303
495
|
|
|
304
496
|
console.log('');
|
|
@@ -312,13 +504,23 @@ if (command === 'install') {
|
|
|
312
504
|
process.exit(0);
|
|
313
505
|
}
|
|
314
506
|
|
|
507
|
+
// Backup modified files before overwriting
|
|
508
|
+
if (modified.length > 0) {
|
|
509
|
+
const backupVersion = isUpgrade ? meta.version : 'pre-install';
|
|
510
|
+
const backupDir = backupFiles(backupVersion, modified.map(r => r.dest));
|
|
511
|
+
console.log(`\n๐ Backed up modified files to ${path.relative(CWD, backupDir)}/`);
|
|
512
|
+
}
|
|
513
|
+
|
|
315
514
|
console.log('\n๐ฆ Installing files...');
|
|
316
515
|
|
|
317
|
-
|
|
516
|
+
const installedFiles = [];
|
|
517
|
+
const hashes = {};
|
|
518
|
+
|
|
519
|
+
for (const rule of [...unchanged, ...modified, ...newFiles]) {
|
|
318
520
|
const sourcePath = path.join(pkgRoot, rule.src);
|
|
319
521
|
const destPath = path.join(CWD, rule.dest);
|
|
320
522
|
|
|
321
|
-
if (!fs.existsSync(sourcePath))
|
|
523
|
+
if (!fs.existsSync(sourcePath)) continue;
|
|
322
524
|
|
|
323
525
|
const stats = fs.statSync(sourcePath);
|
|
324
526
|
if (stats.isDirectory()) {
|
|
@@ -331,8 +533,16 @@ if (command === 'install') {
|
|
|
331
533
|
}
|
|
332
534
|
fs.copyFileSync(sourcePath, destPath);
|
|
333
535
|
}
|
|
536
|
+
|
|
537
|
+
// Record hash of what we just installed (from source)
|
|
538
|
+
hashes[rule.dest] = computeHash(sourcePath);
|
|
539
|
+
installedFiles.push(rule.dest);
|
|
334
540
|
console.log(` \x1b[32mโ\x1b[0m ${rule.dest}`);
|
|
335
|
-
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Write install metadata
|
|
544
|
+
writeInstallMeta(pkgVersion, targetPlatform, installedFiles, hashes);
|
|
545
|
+
console.log(` \x1b[32mโ\x1b[0m .bounce/install-meta.json`);
|
|
336
546
|
|
|
337
547
|
console.log('\nโ๏ธ Installing dependencies...');
|
|
338
548
|
try {
|
|
@@ -364,7 +574,22 @@ if (command === 'install') {
|
|
|
364
574
|
}
|
|
365
575
|
}
|
|
366
576
|
|
|
367
|
-
|
|
577
|
+
// Auto-run doctor to verify installation
|
|
578
|
+
console.log('\n๐ฉบ Running doctor to verify installation...');
|
|
579
|
+
const doctorPath = path.join(CWD, 'scripts', 'doctor.mjs');
|
|
580
|
+
if (fs.existsSync(doctorPath)) {
|
|
581
|
+
const result = spawnSync(process.execPath, [doctorPath], {
|
|
582
|
+
stdio: 'inherit',
|
|
583
|
+
cwd: CWD
|
|
584
|
+
});
|
|
585
|
+
if (result.status !== 0) {
|
|
586
|
+
console.error('\n \x1b[33mโ \x1b[0m Doctor reported issues. Review the output above.');
|
|
587
|
+
}
|
|
588
|
+
} else {
|
|
589
|
+
console.log(' \x1b[33mโ \x1b[0m Doctor script not found โ skipping verification.');
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
console.log('\nโ
V-Bounce Engine successfully installed! Welcome to the team.\n');
|
|
368
593
|
});
|
|
369
594
|
|
|
370
595
|
} else {
|
package/brains/AGENTS.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# V-Bounce
|
|
1
|
+
# V-Bounce Engine โ Agent Brain (Codex CLI)
|
|
2
2
|
|
|
3
|
-
> This file configures OpenAI Codex CLI to operate within the V-Bounce
|
|
3
|
+
> This file configures OpenAI Codex CLI to operate within the V-Bounce Engine framework.
|
|
4
4
|
|
|
5
5
|
## Identity
|
|
6
6
|
|
|
7
|
-
You are an AI coding agent operating within **V-Bounce
|
|
7
|
+
You are an AI coding agent operating within **V-Bounce Engine** โ a structured system for planning, implementing, and validating software using AI agents. You work as part of a team: Team Lead, Developer, QA, Architect, DevOps, and Scribe agents collaborate through structured reports.
|
|
8
8
|
|
|
9
9
|
You MUST follow the V-Bounce process. Deviating from it โ skipping validation, ignoring LESSONS.md, or writing code without reading the Story spec โ is a defect, not a shortcut.
|
|
10
10
|
|
|
@@ -106,7 +106,7 @@ Bouncing โ Escalated (3+ failures)
|
|
|
106
106
|
## Framework Structure
|
|
107
107
|
|
|
108
108
|
```
|
|
109
|
-
V-Bounce
|
|
109
|
+
V-Bounce Engine/
|
|
110
110
|
โโโ brains/ โ Agent brain files (this file)
|
|
111
111
|
โโโ templates/ โ Document templates (immutable)
|
|
112
112
|
โโโ skills/ โ Agent skills (SKILL.md files)
|
package/brains/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# V-Bounce
|
|
1
|
+
# V-Bounce Engine Brains & Skills Changelog
|
|
2
2
|
|
|
3
3
|
This log tracks modifications to the core agentic framework (e.g., `brains/`, `skills/`).
|
|
4
4
|
Per **Rule 13: Framework Integrity**, anytime an entry is made here, all tool-specific brain files must be reviewed for consistency.
|
|
@@ -21,7 +21,7 @@ Per **Rule 13: Framework Integrity**, anytime an entry is made here, all tool-sp
|
|
|
21
21
|
- **Modified**: `.gitignore` โ Removed `.bounce/.lancedb/` entry.
|
|
22
22
|
- **Rationale**: Modern LLMs have 200K+ token context windows. The prep scripts (`vbounce prep sprint/qa/arch`) + LESSONS.md graduation provide targeted, deterministic context without embedding models, sync steps, or heavy dependencies. Removes ~50MB of node_modules and eliminates the most common setup failure point.
|
|
23
23
|
|
|
24
|
-
## [2026-03-12] โ V-Bounce
|
|
24
|
+
## [2026-03-12] โ V-Bounce Engine Optimization Plan (12-Change Batch)
|
|
25
25
|
|
|
26
26
|
### State Management (Change #1)
|
|
27
27
|
- **Added**: `.bounce/state.json` โ machine-readable sprint state snapshot for crash recovery. Tracks sprint_id, delivery_id, current_phase, last_action, and per-story state (V-Bounce state, bounce counts, worktree path, updated_at).
|
package/brains/CLAUDE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# V-Bounce
|
|
1
|
+
# V-Bounce Engine โ Agent Brain
|
|
2
2
|
|
|
3
|
-
> This file configures Claude Code to operate within the V-Bounce
|
|
3
|
+
> This file configures Claude Code to operate within the V-Bounce Engine framework.
|
|
4
4
|
|
|
5
5
|
## Identity
|
|
6
6
|
|
|
7
|
-
You are an AI coding agent operating within **V-Bounce
|
|
7
|
+
You are an AI coding agent operating within **V-Bounce Engine** โ a structured system for planning, implementing, and validating software using AI agents. You work as part of a team: Team Lead, Developer, QA, Architect, DevOps, and Scribe agents collaborate through structured reports.
|
|
8
8
|
|
|
9
9
|
You MUST follow the V-Bounce process. Deviating from it โ skipping validation, ignoring LESSONS.md, or writing code without reading the Story spec โ is a defect, not a shortcut.
|
|
10
10
|
|
|
@@ -127,7 +127,7 @@ Draft โ Refinement โ Ready to Bounce โ Bouncing โ QA Passed โ Architec
|
|
|
127
127
|
## Framework Structure
|
|
128
128
|
|
|
129
129
|
```
|
|
130
|
-
V-Bounce
|
|
130
|
+
V-Bounce Engine/
|
|
131
131
|
โโโ brains/ โ Agent brain files (this file)
|
|
132
132
|
โโโ templates/ โ Document templates (immutable)
|
|
133
133
|
โโโ skills/ โ Agent skills (SKILL.md files)
|
package/brains/GEMINI.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# V-Bounce
|
|
1
|
+
# V-Bounce Engine โ Agent Brain
|
|
2
2
|
|
|
3
|
-
> This file configures Gemini CLI and Antigravity to operate within the V-Bounce
|
|
3
|
+
> This file configures Gemini CLI and Antigravity to operate within the V-Bounce Engine framework.
|
|
4
4
|
> Place at project root for Gemini CLI. For Antigravity, also copy skills to `.agents/skills/`.
|
|
5
5
|
|
|
6
6
|
## Identity
|
|
7
7
|
|
|
8
|
-
You are an AI coding agent operating within **V-Bounce
|
|
8
|
+
You are an AI coding agent operating within **V-Bounce Engine** โ a structured system for planning, implementing, and validating software using AI agents. You work as part of a team: Team Lead, Developer, QA, Architect, DevOps, and Scribe agents collaborate through structured reports.
|
|
9
9
|
|
|
10
10
|
You MUST follow the V-Bounce process. Deviating from it โ skipping validation, ignoring LESSONS.md, or writing code without reading the Story spec โ is a defect, not a shortcut.
|
|
11
11
|
|
|
@@ -27,7 +27,7 @@ For Antigravity: copy skills to `.agents/skills/` for workspace-scoped discovery
|
|
|
27
27
|
|
|
28
28
|
## CLI Commands
|
|
29
29
|
|
|
30
|
-
V-Bounce
|
|
30
|
+
V-Bounce Engine ships a CLI. Use these commands for state management instead of editing files manually:
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
33
|
# Sprint management
|
|
@@ -149,7 +149,7 @@ Draft โ Refinement โ Ready to Bounce โ Bouncing โ QA Passed โ Architec
|
|
|
149
149
|
## Framework Structure
|
|
150
150
|
|
|
151
151
|
```
|
|
152
|
-
V-Bounce
|
|
152
|
+
V-Bounce Engine/
|
|
153
153
|
โโโ brains/ โ Agent brain files (this file)
|
|
154
154
|
โโโ templates/ โ Document templates (immutable)
|
|
155
155
|
โโโ skills/ โ Agent skills (SKILL.md files)
|
package/brains/SETUP.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# Adding V-Bounce
|
|
1
|
+
# Adding V-Bounce Engine to Any Repo
|
|
2
2
|
|
|
3
|
-
Step-by-step guide to set up V-Bounce
|
|
3
|
+
Step-by-step guide to set up V-Bounce Engine in an existing or new project.
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
7
|
-
- A git repository (V-Bounce
|
|
7
|
+
- A git repository (V-Bounce Engine uses branches and worktrees)
|
|
8
8
|
- Node.js installed (for validation and semantic search scripts)
|
|
9
9
|
- At least one supported AI coding tool installed
|
|
10
|
-
- The V-Bounce
|
|
10
|
+
- The V-Bounce Engine folder (this repo)
|
|
11
11
|
|
|
12
12
|
## Step 1: Copy the Framework
|
|
13
13
|
|
|
@@ -15,11 +15,11 @@ Copy the `skills/` and `templates/` directories into your project root:
|
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
# From your project root
|
|
18
|
-
cp -r /path/to/V-Bounce-
|
|
19
|
-
cp -r /path/to/V-Bounce-
|
|
18
|
+
cp -r /path/to/V-Bounce-Engine/skills/ ./skills/
|
|
19
|
+
cp -r /path/to/V-Bounce-Engine/templates/ ./templates/
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
These are the core of V-Bounce
|
|
22
|
+
These are the core of V-Bounce Engine โ skills define agent behavior, templates define document structure.
|
|
23
23
|
|
|
24
24
|
## Step 2: Deploy Brain File for Your AI Tool
|
|
25
25
|
|
|
@@ -27,32 +27,32 @@ Pick the tool you're using and deploy the corresponding brain file:
|
|
|
27
27
|
|
|
28
28
|
### Claude Code
|
|
29
29
|
```bash
|
|
30
|
-
cp /path/to/V-Bounce-
|
|
30
|
+
cp /path/to/V-Bounce-Engine/brains/CLAUDE.md ./CLAUDE.md
|
|
31
31
|
|
|
32
32
|
# Deploy subagent configs
|
|
33
33
|
mkdir -p .claude/agents
|
|
34
|
-
cp /path/to/V-Bounce-
|
|
34
|
+
cp /path/to/V-Bounce-Engine/brains/claude-agents/*.md .claude/agents/
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
### Codex CLI (OpenAI)
|
|
38
38
|
```bash
|
|
39
|
-
cp /path/to/V-Bounce-
|
|
39
|
+
cp /path/to/V-Bounce-Engine/brains/AGENTS.md ./AGENTS.md
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
### Cursor
|
|
43
43
|
```bash
|
|
44
44
|
mkdir -p .cursor/rules
|
|
45
|
-
cp /path/to/V-Bounce-
|
|
45
|
+
cp /path/to/V-Bounce-Engine/brains/cursor-rules/*.mdc .cursor/rules/
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
### Gemini CLI
|
|
49
49
|
```bash
|
|
50
|
-
cp /path/to/V-Bounce-
|
|
50
|
+
cp /path/to/V-Bounce-Engine/brains/GEMINI.md ./GEMINI.md
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
### Antigravity
|
|
54
54
|
```bash
|
|
55
|
-
cp /path/to/V-Bounce-
|
|
55
|
+
cp /path/to/V-Bounce-Engine/brains/GEMINI.md ./GEMINI.md
|
|
56
56
|
cp -r skills/ .agents/skills/
|
|
57
57
|
```
|
|
58
58
|
|
|
@@ -141,7 +141,7 @@ your-project/
|
|
|
141
141
|
โโโ CLAUDE.md โ brain file (or AGENTS.md / GEMINI.md)
|
|
142
142
|
โโโ LESSONS.md โ project-specific rules (grows over time)
|
|
143
143
|
โโโ .claude/agents/ โ subagent configs (Claude Code only)
|
|
144
|
-
โโโ skills/ โ V-Bounce
|
|
144
|
+
โโโ skills/ โ V-Bounce Engine skills
|
|
145
145
|
โ โโโ agent-team/
|
|
146
146
|
โ โโโ doc-manager/
|
|
147
147
|
โ โโโ lesson/
|
|
@@ -192,4 +192,4 @@ brains/
|
|
|
192
192
|
โโโ vbounce-docs.mdc
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
Each brain file is self-contained and authoritative for its tool. When updating V-Bounce
|
|
195
|
+
Each brain file is self-contained and authoritative for its tool. When updating V-Bounce Engine rules, update each brain file directly and keep them in sync.
|
|
@@ -5,7 +5,7 @@ tools: Read, Glob, Grep, Bash
|
|
|
5
5
|
disallowedTools: Edit, Write
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
You are the **Architect Agent** in the V-Bounce
|
|
8
|
+
You are the **Architect Agent** in the V-Bounce Engine framework.
|
|
9
9
|
|
|
10
10
|
## Your Role
|
|
11
11
|
Audit the codebase for structural integrity, standards compliance, and long-term sustainability. You review โ you do not implement. You are the last gate before human review.
|
|
@@ -5,7 +5,7 @@ tools: Read, Edit, Write, Bash, Glob, Grep
|
|
|
5
5
|
model: sonnet
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
You are the **Developer Agent** in the V-Bounce
|
|
8
|
+
You are the **Developer Agent** in the V-Bounce Engine framework.
|
|
9
9
|
|
|
10
10
|
## Your Role
|
|
11
11
|
Implement features and fix bugs as specified in Story documents. You write code โ nothing more, nothing less.
|
|
@@ -5,7 +5,7 @@ tools: Read, Bash, Glob, Grep
|
|
|
5
5
|
disallowedTools: Edit, Write
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
You are the **QA Agent** in the V-Bounce
|
|
8
|
+
You are the **QA Agent** in the V-Bounce Engine framework.
|
|
9
9
|
|
|
10
10
|
## Your Role
|
|
11
11
|
Validate that the Developer's implementation meets the Story's acceptance criteria. You test โ you do not fix. If something fails, you write a detailed bug report and send it back.
|
|
@@ -15,6 +15,7 @@ Validate that the Developer's implementation meets the Story's acceptance criter
|
|
|
15
15
|
1. **Read LESSONS.md**: Scan for failure patterns relevant to this story. Treat matching entries as known risk areas to probe first.
|
|
16
16
|
2. **Read the Developer Implementation Report** (`.bounce/reports/STORY-{ID}-{StoryName}-dev.md`) to understand what was built.
|
|
17
17
|
3. **Read Story ยง2 The Truth** โ these are your pass/fail criteria. If the Gherkin scenarios don't pass, the bounce failed.
|
|
18
|
+
4. **Check vdoc context**: If the QA context pack includes a `## vdoc Context` section, read the referenced product docs. Cross-reference the Developer's changes against documented behavior โ if the implementation contradicts what a vdoc describes, flag it as a behavioral regression even if the Gherkin scenarios pass. Check the Blast Radius warnings for features that may be indirectly affected.
|
|
18
19
|
|
|
19
20
|
## Pre-Computed Scan Results
|
|
20
21
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# V-Bounce
|
|
1
|
+
# V-Bounce Engine โ GitHub Copilot Instructions
|
|
2
2
|
|
|
3
|
-
This project uses **V-Bounce
|
|
3
|
+
This project uses **V-Bounce Engine** โ a structured AI-agent development framework.
|
|
4
4
|
|
|
5
5
|
## What This Means for You
|
|
6
6
|
|
|
7
|
-
You are operating in Tier 4 (Awareness) mode. You understand the project uses V-Bounce
|
|
7
|
+
You are operating in Tier 4 (Awareness) mode. You understand the project uses V-Bounce Engine but you do not orchestrate agents.
|
|
8
8
|
|
|
9
9
|
## Key Behaviors
|
|
10
10
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: V-Bounce
|
|
2
|
+
description: V-Bounce Engine document hierarchy โ templates, locations, and report formats
|
|
3
3
|
globs:
|
|
4
4
|
alwaysApply: false
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# V-Bounce
|
|
7
|
+
# V-Bounce Engine โ Document & Report Reference
|
|
8
8
|
|
|
9
9
|
## Document Locations
|
|
10
10
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: V-Bounce
|
|
2
|
+
description: V-Bounce Engine process rules โ the core framework for AI-assisted software development
|
|
3
3
|
globs:
|
|
4
4
|
alwaysApply: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# V-Bounce
|
|
7
|
+
# V-Bounce Engine โ Process Rules
|
|
8
8
|
|
|
9
|
-
You are an AI coding agent operating within **V-Bounce
|
|
9
|
+
You are an AI coding agent operating within **V-Bounce Engine** โ a structured system for planning, implementing, and validating software using AI agents.
|
|
10
10
|
|
|
11
11
|
## The V-Bounce Process
|
|
12
12
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: V-Bounce
|
|
2
|
+
description: V-Bounce Engine critical rules โ mandatory constraints for all implementation work
|
|
3
3
|
globs:
|
|
4
4
|
alwaysApply: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# V-Bounce
|
|
7
|
+
# V-Bounce Engine โ Critical Rules
|
|
8
8
|
|
|
9
9
|
## Before Writing Code
|
|
10
10
|
1. **Read LESSONS.md** at the project root. Every time. No exceptions.
|