vibe-me 2.0.0 → 3.0.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 +408 -91
- package/Vibe.bat +14 -10
- package/bin/vibes.js +96 -89
- package/package.json +2 -2
- package/templates/ai.md +49 -0
- package/templates/business.md +52 -0
- package/templates/context.md +48 -0
- package/templates/decisions.md +8 -5
- package/templates/experiments.md +36 -0
- package/templates/market.md +39 -0
- package/templates/metrics.md +35 -0
- package/templates/product.md +54 -0
- package/templates/risks.md +44 -0
- package/templates/users.md +47 -0
package/bin/vibes.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
// vibes —
|
|
3
|
+
// vibes — The complete semantic layer for any project
|
|
4
|
+
// Repository memory + Product memory + Business memory + AI instructions
|
|
4
5
|
// Zero dependencies. Single file. Works with npx.
|
|
5
6
|
|
|
6
7
|
const fs = require('fs');
|
|
@@ -15,11 +16,22 @@ const DOCS_DIR = 'docs';
|
|
|
15
16
|
const TEMPLATES_DIR = path.join(__dirname, '..', 'templates');
|
|
16
17
|
const SPEC_DIR = path.join(__dirname, '..', 'spec');
|
|
17
18
|
|
|
19
|
+
// All .vibe/ files — the full suite, always installed
|
|
18
20
|
const VIBE_FILES = [
|
|
21
|
+
// Core — repository memory
|
|
19
22
|
'purpose.md', 'architecture.md', 'flows.md',
|
|
20
|
-
'entities.md', 'decisions.md', 'state.json'
|
|
23
|
+
'entities.md', 'decisions.md', 'state.json',
|
|
24
|
+
// Living context
|
|
25
|
+
'context.md',
|
|
26
|
+
// AI agent guide
|
|
27
|
+
'ai.md',
|
|
28
|
+
// Product memory
|
|
29
|
+
'product.md', 'users.md', 'metrics.md', 'experiments.md',
|
|
30
|
+
// Business memory
|
|
31
|
+
'business.md', 'market.md', 'risks.md',
|
|
21
32
|
];
|
|
22
33
|
|
|
34
|
+
// All docs/ files
|
|
23
35
|
const DOCS_FILES = [
|
|
24
36
|
'README.md', 'topology.md', 'architecture.md', 'api.md',
|
|
25
37
|
'issues.md', 'resolved.md', 'roadmap.md', 'developer_guide.md',
|
|
@@ -31,7 +43,7 @@ const DOCS_EXTRA = ['decisions/0001-template.md'];
|
|
|
31
43
|
const SPEC_FILE = 'VIBE_GUIDE.md';
|
|
32
44
|
|
|
33
45
|
// ─────────────────────────────────────────────
|
|
34
|
-
// Colors (
|
|
46
|
+
// Colors (raw ANSI, zero dependencies)
|
|
35
47
|
// ─────────────────────────────────────────────
|
|
36
48
|
|
|
37
49
|
const bold = (s) => `\x1b[1m${s}\x1b[0m`;
|
|
@@ -40,7 +52,6 @@ const cyan = (s) => `\x1b[36m${s}\x1b[0m`;
|
|
|
40
52
|
const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
|
|
41
53
|
const dim = (s) => `\x1b[2m${s}\x1b[0m`;
|
|
42
54
|
const red = (s) => `\x1b[31m${s}\x1b[0m`;
|
|
43
|
-
const magenta = (s) => `\x1b[35m${s}\x1b[0m`;
|
|
44
55
|
|
|
45
56
|
// ─────────────────────────────────────────────
|
|
46
57
|
// Helpers
|
|
@@ -60,6 +71,8 @@ function getProjectName(dir) {
|
|
|
60
71
|
['Cargo.toml', /^name\s*=\s*"(.+)"/m],
|
|
61
72
|
['go.mod', /^module\s+(.+)/m],
|
|
62
73
|
['pyproject.toml', /^name\s*=\s*"(.+)"/m],
|
|
74
|
+
['setup.py', /name\s*=\s*['"](.+?)['"]/m],
|
|
75
|
+
['CMakeLists.txt', /project\s*\(\s*(\S+)/m],
|
|
63
76
|
]) {
|
|
64
77
|
const p = path.join(dir, file);
|
|
65
78
|
if (!exists(p)) continue;
|
|
@@ -95,13 +108,24 @@ function cmdInit(targetDir) {
|
|
|
95
108
|
|
|
96
109
|
console.log('');
|
|
97
110
|
console.log(bold(' ⚡ vibes init'));
|
|
98
|
-
console.log(dim(` Creating .vibe/
|
|
111
|
+
console.log(dim(` Creating .vibe/ for ${cyan(name)} — full suite`));
|
|
99
112
|
console.log('');
|
|
100
113
|
|
|
101
114
|
fs.mkdirSync(vibeDir, { recursive: true });
|
|
102
115
|
|
|
116
|
+
// Group labels for visual output
|
|
117
|
+
const groups = {
|
|
118
|
+
'purpose.md': '── Core (repository memory) ──',
|
|
119
|
+
'context.md': '── Living Context ──',
|
|
120
|
+
'ai.md': '── AI Agent Guide ──',
|
|
121
|
+
'product.md': '── Product Memory ──',
|
|
122
|
+
'business.md': '── Business Memory ──',
|
|
123
|
+
};
|
|
124
|
+
|
|
103
125
|
let count = 0;
|
|
104
126
|
for (const file of VIBE_FILES) {
|
|
127
|
+
if (groups[file]) console.log(dim(` ${groups[file]}`));
|
|
128
|
+
|
|
105
129
|
const src = path.join(TEMPLATES_DIR, file);
|
|
106
130
|
const dest = path.join(vibeDir, file);
|
|
107
131
|
if (file === 'state.json') {
|
|
@@ -117,6 +141,7 @@ function cmdInit(targetDir) {
|
|
|
117
141
|
|
|
118
142
|
// Copy guide
|
|
119
143
|
copy(path.join(SPEC_DIR, SPEC_FILE), path.join(vibeDir, SPEC_FILE));
|
|
144
|
+
console.log('');
|
|
120
145
|
console.log(green(' ✔ ') + dim('.vibe/') + SPEC_FILE + dim(' (agent instructions)'));
|
|
121
146
|
count++;
|
|
122
147
|
|
|
@@ -130,29 +155,24 @@ function cmdDocs(targetDir) {
|
|
|
130
155
|
const name = getProjectName(targetDir);
|
|
131
156
|
|
|
132
157
|
if (exists(docsDir)) {
|
|
133
|
-
// Check if it has content already
|
|
134
158
|
const contents = fs.readdirSync(docsDir);
|
|
135
159
|
if (contents.length > 0) {
|
|
136
160
|
console.log(yellow('\n ⚠ docs/ already exists with ' + contents.length + ' items.'));
|
|
137
|
-
console.log(dim('
|
|
161
|
+
console.log(dim(' Adding missing files only.\n'));
|
|
138
162
|
}
|
|
139
163
|
}
|
|
140
164
|
|
|
141
165
|
console.log('');
|
|
142
166
|
console.log(bold(' 📄 vibes docs'));
|
|
143
|
-
console.log(dim(` Creating docs/
|
|
167
|
+
console.log(dim(` Creating docs/ for ${cyan(name)}`));
|
|
144
168
|
console.log('');
|
|
145
169
|
|
|
146
|
-
// Create docs dir and subdirs
|
|
147
170
|
fs.mkdirSync(docsDir, { recursive: true });
|
|
148
171
|
for (const sub of DOCS_DIRS) {
|
|
149
172
|
fs.mkdirSync(path.join(docsDir, sub), { recursive: true });
|
|
150
173
|
}
|
|
151
174
|
|
|
152
|
-
let created = 0;
|
|
153
|
-
let skipped = 0;
|
|
154
|
-
|
|
155
|
-
// Copy doc files (skip if they already exist)
|
|
175
|
+
let created = 0, skipped = 0;
|
|
156
176
|
for (const file of [...DOCS_FILES, ...DOCS_EXTRA]) {
|
|
157
177
|
const src = path.join(TEMPLATES_DIR, 'docs', file);
|
|
158
178
|
const dest = path.join(docsDir, file);
|
|
@@ -167,19 +187,8 @@ function cmdDocs(targetDir) {
|
|
|
167
187
|
}
|
|
168
188
|
|
|
169
189
|
console.log('');
|
|
170
|
-
if (skipped > 0) {
|
|
171
|
-
|
|
172
|
-
} else {
|
|
173
|
-
console.log(green(` ✔ Created ${created} files in docs/`));
|
|
174
|
-
}
|
|
175
|
-
console.log('');
|
|
176
|
-
console.log(bold(' Next steps:'));
|
|
177
|
-
console.log('');
|
|
178
|
-
console.log(' Tell your AI agent:');
|
|
179
|
-
console.log('');
|
|
180
|
-
console.log(cyan(' "Read .vibe/VIBE_GUIDE.md for context, then analyze'));
|
|
181
|
-
console.log(cyan(' the codebase and fill out all skeleton files in docs/.'));
|
|
182
|
-
console.log(cyan(' Ask me any questions you can\'t answer from the code."'));
|
|
190
|
+
if (skipped > 0) console.log(green(` ✔ Created ${created} files`) + dim(`, skipped ${skipped} existing`));
|
|
191
|
+
else console.log(green(` ✔ Created ${created} files in docs/`));
|
|
183
192
|
console.log('');
|
|
184
193
|
}
|
|
185
194
|
|
|
@@ -197,12 +206,11 @@ function cmdCheck(targetDir) {
|
|
|
197
206
|
console.log('');
|
|
198
207
|
console.log(bold(' 🔍 vibes check'));
|
|
199
208
|
|
|
200
|
-
let passed = 0, failed = 0, warnings = 0;
|
|
209
|
+
let passed = 0, failed = 0, warnings = 0, na = 0;
|
|
201
210
|
|
|
202
|
-
// Check .vibe/
|
|
203
211
|
if (hasVibe) {
|
|
204
212
|
console.log('');
|
|
205
|
-
console.log(dim(' ── .vibe/
|
|
213
|
+
console.log(dim(' ── .vibe/ ──'));
|
|
206
214
|
console.log('');
|
|
207
215
|
|
|
208
216
|
for (const file of VIBE_FILES) {
|
|
@@ -212,52 +220,66 @@ function cmdCheck(targetDir) {
|
|
|
212
220
|
const content = fs.readFileSync(fp, 'utf-8').trim();
|
|
213
221
|
const lines = content.split('\n').length;
|
|
214
222
|
|
|
223
|
+
// Check for N/A files (product/business layers marked not applicable)
|
|
224
|
+
if (content.match(/^N\/A/m) || content.match(/^"?N\/A/m)) {
|
|
225
|
+
console.log(dim(' ⊘ ') + file + dim(' — N/A (not applicable)'));
|
|
226
|
+
na++;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
|
|
215
230
|
if (lines < 5) { console.log(yellow(' ⚠ ') + file + ` — looks empty (${lines} lines)`); warnings++; continue; }
|
|
216
231
|
|
|
217
|
-
// File-specific
|
|
232
|
+
// File-specific checks
|
|
218
233
|
let warn = null;
|
|
219
234
|
if (file === 'purpose.md' && !content.toLowerCase().includes('not do')) warn = 'missing "NOT do" section';
|
|
220
235
|
if (file === 'decisions.md' && (content.match(/^## Why /gm) || []).length < 2) warn = 'fewer than 2 decisions';
|
|
221
|
-
if (file === 'entities.md' && !content.includes('What depends on it')) warn = 'missing
|
|
236
|
+
if (file === 'entities.md' && !content.includes('What depends on it')) warn = 'missing dependency fields';
|
|
222
237
|
if (file === 'flows.md' && (content.match(/^## \d+\./gm) || []).length < 2) warn = 'fewer than 2 flows';
|
|
223
238
|
if (file === 'state.json') {
|
|
224
239
|
try {
|
|
225
240
|
const s = JSON.parse(content);
|
|
226
|
-
if (!s.vibe_updated) warn = 'missing vibe_updated
|
|
241
|
+
if (!s.vibe_updated) warn = 'missing vibe_updated';
|
|
227
242
|
else {
|
|
228
243
|
const days = (Date.now() - new Date(s.vibe_updated).getTime()) / 86400000;
|
|
229
|
-
if (days > 30) warn = `
|
|
244
|
+
if (days > 30) warn = `stale (${Math.floor(days)} days old)`;
|
|
230
245
|
}
|
|
231
246
|
} catch { console.log(red(' ✖ ') + file + ' — invalid JSON'); failed++; continue; }
|
|
232
247
|
}
|
|
248
|
+
if (file === 'context.md') {
|
|
249
|
+
if (!content.includes('## Current Focus') || content.match(/^- $/m)) warn = 'Current Focus is empty';
|
|
250
|
+
}
|
|
251
|
+
if (file === 'decisions.md' && !content.includes('Depends On') && !content.includes('Threatened By')) {
|
|
252
|
+
// Only warn if decisions exist but lack graph relationships
|
|
253
|
+
if ((content.match(/^## Why /gm) || []).length >= 2) warn = 'decisions missing relationship fields (Depends On, Threatened By)';
|
|
254
|
+
}
|
|
233
255
|
|
|
234
256
|
if (warn) { console.log(yellow(' ⚠ ') + file + ` — ${warn}`); warnings++; }
|
|
235
257
|
else { console.log(green(' ✔ ') + file + ` — ${lines} lines`); passed++; }
|
|
236
258
|
}
|
|
237
259
|
}
|
|
238
260
|
|
|
239
|
-
// Check docs/
|
|
240
261
|
if (hasDocs) {
|
|
241
262
|
console.log('');
|
|
242
|
-
console.log(dim(' ── docs/
|
|
263
|
+
console.log(dim(' ── docs/ ──'));
|
|
243
264
|
console.log('');
|
|
244
265
|
|
|
245
266
|
for (const file of DOCS_FILES) {
|
|
246
267
|
const fp = path.join(docsDir, file);
|
|
247
268
|
if (!exists(fp)) { console.log(yellow(' ⚠ ') + file + ' — missing'); warnings++; continue; }
|
|
248
|
-
|
|
249
269
|
const content = fs.readFileSync(fp, 'utf-8').trim();
|
|
250
270
|
const lines = content.split('\n').length;
|
|
251
|
-
|
|
252
271
|
if (lines < 5) { console.log(yellow(' ⚠ ') + file + ` — looks empty (${lines} lines)`); warnings++; }
|
|
253
272
|
else { console.log(green(' ✔ ') + file + ` — ${lines} lines`); passed++; }
|
|
254
273
|
}
|
|
255
274
|
}
|
|
256
275
|
|
|
257
276
|
console.log('');
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
277
|
+
let result = '';
|
|
278
|
+
if (failed > 0) result = red(`${failed} failed`);
|
|
279
|
+
if (warnings > 0) result += (result ? ', ' : '') + yellow(`${warnings} warnings`);
|
|
280
|
+
if (na > 0) result += (result ? ', ' : '') + dim(`${na} N/A`);
|
|
281
|
+
result += (result ? ', ' : '') + green(`${passed} passed`);
|
|
282
|
+
console.log(` Result: ${result}`);
|
|
261
283
|
console.log('');
|
|
262
284
|
}
|
|
263
285
|
|
|
@@ -270,23 +292,25 @@ function cmdStatus(targetDir) {
|
|
|
270
292
|
console.log(bold(` 📊 ${name}`));
|
|
271
293
|
console.log('');
|
|
272
294
|
|
|
273
|
-
// .vibe status
|
|
274
295
|
if (exists(vibeDir)) {
|
|
275
|
-
|
|
296
|
+
// Count filled vs N/A vs empty
|
|
297
|
+
let filled = 0, naCount = 0, empty = 0;
|
|
298
|
+
for (const f of VIBE_FILES) {
|
|
276
299
|
const fp = path.join(vibeDir, f);
|
|
277
|
-
if (!exists(fp))
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
300
|
+
if (!exists(fp)) { empty++; continue; }
|
|
301
|
+
const content = fs.readFileSync(fp, 'utf-8').trim();
|
|
302
|
+
if (content.match(/^N\/A/m)) naCount++;
|
|
303
|
+
else if (content.split('\n').length >= 10) filled++;
|
|
304
|
+
else empty++;
|
|
305
|
+
}
|
|
306
|
+
const icon = empty === 0 ? green('✔') : filled > 0 ? yellow('◐') : red('✖');
|
|
307
|
+
console.log(` ${icon} .vibe/ ${filled} filled, ${naCount} N/A, ${empty} empty (${VIBE_FILES.length} total)`);
|
|
282
308
|
|
|
283
|
-
// Show state.json health if available
|
|
284
309
|
const statePath = path.join(vibeDir, 'state.json');
|
|
285
310
|
if (exists(statePath)) {
|
|
286
311
|
try {
|
|
287
312
|
const s = JSON.parse(fs.readFileSync(statePath, 'utf-8'));
|
|
288
313
|
if (s.health) console.log(dim(` health: ${s.health}`));
|
|
289
|
-
if (s.version) console.log(dim(` version: ${s.version}`));
|
|
290
314
|
if (s.vibe_updated) {
|
|
291
315
|
const days = Math.floor((Date.now() - new Date(s.vibe_updated).getTime()) / 86400000);
|
|
292
316
|
console.log(dim(` updated: ${days === 0 ? 'today' : days + ' days ago'}`));
|
|
@@ -297,7 +321,6 @@ function cmdStatus(targetDir) {
|
|
|
297
321
|
console.log(red(' ✖') + ' .vibe/ not initialized');
|
|
298
322
|
}
|
|
299
323
|
|
|
300
|
-
// docs status
|
|
301
324
|
if (exists(docsDir)) {
|
|
302
325
|
const filled = DOCS_FILES.filter(f => {
|
|
303
326
|
const fp = path.join(docsDir, f);
|
|
@@ -321,17 +344,10 @@ function cmdAll(targetDir) {
|
|
|
321
344
|
const vibeDir = path.join(targetDir, VIBE_DIR);
|
|
322
345
|
const docsDir = path.join(targetDir, DOCS_DIR);
|
|
323
346
|
|
|
324
|
-
if (!exists(vibeDir))
|
|
325
|
-
|
|
326
|
-
} else {
|
|
327
|
-
console.log(yellow('\n ⊘ .vibe/ already exists, skipping init'));
|
|
328
|
-
}
|
|
347
|
+
if (!exists(vibeDir)) cmdInit(targetDir);
|
|
348
|
+
else console.log(yellow('\n ⊘ .vibe/ already exists, skipping init'));
|
|
329
349
|
|
|
330
|
-
|
|
331
|
-
cmdDocs(targetDir);
|
|
332
|
-
} else {
|
|
333
|
-
cmdDocs(targetDir); // docs command already handles existing files gracefully
|
|
334
|
-
}
|
|
350
|
+
cmdDocs(targetDir);
|
|
335
351
|
}
|
|
336
352
|
|
|
337
353
|
function cmdReset(targetDir) {
|
|
@@ -347,54 +363,45 @@ function cmdReset(targetDir) {
|
|
|
347
363
|
|
|
348
364
|
function printNextSteps() {
|
|
349
365
|
console.log('');
|
|
350
|
-
console.log(bold('
|
|
366
|
+
console.log(bold(' What to do next:'));
|
|
351
367
|
console.log('');
|
|
352
|
-
console.log('
|
|
353
|
-
console.log(' 2. Tell it:');
|
|
368
|
+
console.log(' Tell your AI coding agent:');
|
|
354
369
|
console.log('');
|
|
355
370
|
console.log(cyan(' "Read .vibe/VIBE_GUIDE.md, then analyze this codebase'));
|
|
356
|
-
console.log(cyan(' and fill out all the skeleton files in .vibe/'));
|
|
371
|
+
console.log(cyan(' and fill out all the skeleton files in .vibe/ and docs/.'));
|
|
372
|
+
console.log(cyan(' For files that aren\'t relevant (like business.md for a'));
|
|
373
|
+
console.log(cyan(' library), write N/A with a brief explanation.'));
|
|
357
374
|
console.log(cyan(' Ask me any questions you can\'t answer from the code."'));
|
|
358
375
|
console.log('');
|
|
359
|
-
console.log(' 3. Run ' + cyan('vibes docs') + ' to scaffold operational docs too');
|
|
360
|
-
console.log(' 4. Review the output, commit to version control');
|
|
361
|
-
console.log('');
|
|
362
376
|
}
|
|
363
377
|
|
|
364
378
|
function printHelp() {
|
|
365
379
|
console.log('');
|
|
366
|
-
console.log(bold(' vibes') + ' —
|
|
380
|
+
console.log(bold(' vibes') + ' — The complete semantic layer for any project');
|
|
367
381
|
console.log('');
|
|
368
382
|
console.log(' ' + bold('Usage:'));
|
|
369
383
|
console.log('');
|
|
370
|
-
console.log(' vibes init Create .vibe/
|
|
384
|
+
console.log(' vibes init Create .vibe/ with the full suite (15 files + guide)');
|
|
371
385
|
console.log(' vibes docs Create docs/ operational documentation (11 files)');
|
|
372
386
|
console.log(' vibes all Create both .vibe/ and docs/ at once');
|
|
373
387
|
console.log(' vibes check Validate all files for completeness');
|
|
374
|
-
console.log(' vibes status Quick health
|
|
388
|
+
console.log(' vibes status Quick health dashboard');
|
|
375
389
|
console.log(' vibes reset Delete and recreate everything');
|
|
376
390
|
console.log(' vibes help Show this help message');
|
|
377
391
|
console.log('');
|
|
378
|
-
console.log(' ' + bold('.vibe/') + dim(' —
|
|
379
|
-
console.log('
|
|
380
|
-
console.log(
|
|
381
|
-
console.log('
|
|
382
|
-
console.log('
|
|
383
|
-
console.log(
|
|
384
|
-
console.log('
|
|
392
|
+
console.log(' ' + bold('.vibe/') + dim(' — Project memory'));
|
|
393
|
+
console.log(dim(' Core: purpose · architecture · flows · entities · decisions · state'));
|
|
394
|
+
console.log(dim(' Context: context (living state, updated weekly)'));
|
|
395
|
+
console.log(dim(' AI: ai (agent constraints, safe zones, rules)'));
|
|
396
|
+
console.log(dim(' Product: product · users · metrics · experiments'));
|
|
397
|
+
console.log(dim(' Business: business · market · risks'));
|
|
398
|
+
console.log('');
|
|
399
|
+
console.log(' ' + bold('docs/') + dim(' — Operational documentation'));
|
|
400
|
+
console.log(dim(' README · topology · architecture · api · issues · resolved'));
|
|
401
|
+
console.log(dim(' roadmap · developer_guide · troubleshooting · glossary · decisions/'));
|
|
385
402
|
console.log('');
|
|
386
|
-
console.log('
|
|
387
|
-
console.log('
|
|
388
|
-
console.log(' ' + dim('├── topology.md — File/folder map'));
|
|
389
|
-
console.log(' ' + dim('├── architecture.md — Component-level details'));
|
|
390
|
-
console.log(' ' + dim('├── api.md — API endpoints'));
|
|
391
|
-
console.log(' ' + dim('├── issues.md — Open bugs and blockers'));
|
|
392
|
-
console.log(' ' + dim('├── resolved.md — Closed issues archive'));
|
|
393
|
-
console.log(' ' + dim('├── roadmap.md — Milestones and priorities'));
|
|
394
|
-
console.log(' ' + dim('├── developer_guide.md — Setup, build, test, deploy'));
|
|
395
|
-
console.log(' ' + dim('├── troubleshooting.md — Common errors and fixes'));
|
|
396
|
-
console.log(' ' + dim('├── glossary.md — Project-specific terms'));
|
|
397
|
-
console.log(' ' + dim('└── decisions/ — Architecture decision records'));
|
|
403
|
+
console.log(dim(' Files that aren\'t relevant to your project? Mark them N/A.'));
|
|
404
|
+
console.log(dim(' Your AI agent will figure out which ones apply.'));
|
|
398
405
|
console.log('');
|
|
399
406
|
}
|
|
400
407
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibe-me",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
|
+
"description": "The complete semantic layer for any project. Repository memory, product memory, business memory, AI instructions, and living context — so any human or AI can understand your project without reading the source.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vibes",
|
|
7
7
|
"vibe",
|
package/templates/ai.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# AI Agent Guide
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
INSTRUCTIONS FOR AI AGENT:
|
|
5
|
+
This file is written FOR AI agents, BY the human (or a previous agent session).
|
|
6
|
+
It's the operational manual for how agents should behave in this codebase.
|
|
7
|
+
Fill this out by analyzing the codebase for fragile areas, conventions,
|
|
8
|
+
and constraints. ASK THE USER to confirm or add to each section.
|
|
9
|
+
Delete these instruction comments when done.
|
|
10
|
+
-->
|
|
11
|
+
|
|
12
|
+
## Never Touch
|
|
13
|
+
|
|
14
|
+
<!-- Files, systems, or patterns that are fragile, load-bearing, or manually tuned. -->
|
|
15
|
+
<!-- Example: "Auth middleware — hand-tuned for compliance, do not refactor" -->
|
|
16
|
+
|
|
17
|
+
-
|
|
18
|
+
|
|
19
|
+
## Safe to Refactor
|
|
20
|
+
|
|
21
|
+
<!-- Areas where aggressive changes are welcome. Tests exist, patterns are clear. -->
|
|
22
|
+
|
|
23
|
+
-
|
|
24
|
+
|
|
25
|
+
## Requires Human Approval
|
|
26
|
+
|
|
27
|
+
<!-- Changes that should never be committed without explicit user review. -->
|
|
28
|
+
<!-- Example: "Database migrations", "Pricing logic", "Security configuration" -->
|
|
29
|
+
|
|
30
|
+
-
|
|
31
|
+
|
|
32
|
+
## Project Rules
|
|
33
|
+
|
|
34
|
+
<!-- Hard constraints the agent must follow. -->
|
|
35
|
+
<!-- Example: "Max 700 lines per file", "No dependencies with GPL licenses" -->
|
|
36
|
+
|
|
37
|
+
-
|
|
38
|
+
|
|
39
|
+
## Common Pitfalls
|
|
40
|
+
|
|
41
|
+
<!-- Mistakes previous agents or developers have made. Save the next agent from repeating them. -->
|
|
42
|
+
|
|
43
|
+
-
|
|
44
|
+
|
|
45
|
+
## Preferred Patterns
|
|
46
|
+
|
|
47
|
+
<!-- How this project likes things done — naming conventions, error handling style, etc. -->
|
|
48
|
+
|
|
49
|
+
-
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Business
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
INSTRUCTIONS FOR AI AGENT:
|
|
5
|
+
This captures WHY THE COMPANY EXISTS — not the software, the business.
|
|
6
|
+
Pricing rationale, revenue model, strategy, goals.
|
|
7
|
+
|
|
8
|
+
If this is NOT a business (it's open-source, a side project, a library,
|
|
9
|
+
or internal tooling), write:
|
|
10
|
+
"N/A — This is a [open-source project / internal tool / side project].
|
|
11
|
+
There is no revenue model or business strategy."
|
|
12
|
+
Do NOT delete this file — its absence vs "N/A" signals different things.
|
|
13
|
+
Delete these instruction comments when done.
|
|
14
|
+
-->
|
|
15
|
+
|
|
16
|
+
## Business Model
|
|
17
|
+
|
|
18
|
+
<!-- How does this make money? Be specific. -->
|
|
19
|
+
<!-- Example: "SaaS subscription — $29/mo starter, $99/mo pro, $299/mo enterprise" -->
|
|
20
|
+
|
|
21
|
+
## Pricing Rationale
|
|
22
|
+
|
|
23
|
+
<!-- WHY are prices set this way? What did you consider? -->
|
|
24
|
+
<!-- Example: "Priced at 1/10th of hiring a paralegal. Anchored to competitor X at $49." -->
|
|
25
|
+
|
|
26
|
+
## Revenue Streams
|
|
27
|
+
|
|
28
|
+
<!-- All sources of revenue, ranked by importance -->
|
|
29
|
+
|
|
30
|
+
| Stream | % of Revenue | Status |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| | | |
|
|
33
|
+
|
|
34
|
+
## Strategy
|
|
35
|
+
|
|
36
|
+
<!-- The 1-paragraph strategy. What's the plan to win? -->
|
|
37
|
+
|
|
38
|
+
## Goals
|
|
39
|
+
|
|
40
|
+
<!-- Time-bound goals. What does success look like in 3, 6, 12 months? -->
|
|
41
|
+
|
|
42
|
+
| Timeframe | Goal | Metric |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| 3 months | | |
|
|
45
|
+
| 6 months | | |
|
|
46
|
+
| 12 months | | |
|
|
47
|
+
|
|
48
|
+
## Partnerships
|
|
49
|
+
|
|
50
|
+
<!-- Existing or planned partnerships, integrations, distribution deals -->
|
|
51
|
+
|
|
52
|
+
-
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Context
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
INSTRUCTIONS FOR AI AGENT:
|
|
5
|
+
This file changes FREQUENTLY — weekly or even daily for active projects.
|
|
6
|
+
It captures the living state: what's happening right now, what's stuck,
|
|
7
|
+
what's next. Think of it as project consciousness.
|
|
8
|
+
|
|
9
|
+
If this project is dormant/archived, write "Project is currently inactive"
|
|
10
|
+
and note when it was last actively worked on.
|
|
11
|
+
Delete these instruction comments when done.
|
|
12
|
+
-->
|
|
13
|
+
|
|
14
|
+
## Current Focus
|
|
15
|
+
|
|
16
|
+
<!-- What is being actively worked on RIGHT NOW? Be specific. -->
|
|
17
|
+
|
|
18
|
+
-
|
|
19
|
+
|
|
20
|
+
## Blockers
|
|
21
|
+
|
|
22
|
+
<!-- What's stuck and why? Include external dependencies, waiting on approvals, etc. -->
|
|
23
|
+
|
|
24
|
+
-
|
|
25
|
+
|
|
26
|
+
## Next Up
|
|
27
|
+
|
|
28
|
+
<!-- What happens after the current focus is complete? -->
|
|
29
|
+
|
|
30
|
+
-
|
|
31
|
+
|
|
32
|
+
## Active Experiments
|
|
33
|
+
|
|
34
|
+
<!-- What's being tested or tried? What are you hoping to learn? -->
|
|
35
|
+
|
|
36
|
+
-
|
|
37
|
+
|
|
38
|
+
## Recent Wins
|
|
39
|
+
|
|
40
|
+
<!-- What was recently completed? Keeps momentum visible. -->
|
|
41
|
+
|
|
42
|
+
-
|
|
43
|
+
|
|
44
|
+
## Open Questions
|
|
45
|
+
|
|
46
|
+
<!-- Things the team/person is actively thinking through but hasn't decided yet. -->
|
|
47
|
+
|
|
48
|
+
-
|
package/templates/decisions.md
CHANGED
|
@@ -6,11 +6,9 @@
|
|
|
6
6
|
This is the MOST IMPORTANT file. Most repos are impossible to understand
|
|
7
7
|
because nobody recorded WHY choices were made.
|
|
8
8
|
|
|
9
|
-
For each decision
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
3. List the alternatives that were considered
|
|
13
|
-
4. State the tradeoff that was accepted
|
|
9
|
+
For each decision, include ALL fields — especially "Depends On" and
|
|
10
|
+
"Threatened By". These create a decision GRAPH that lets AI reason about
|
|
11
|
+
cascading impacts when conditions change.
|
|
14
12
|
|
|
15
13
|
Research sources: git log, PR descriptions, code comments (HACK/NOTE/TODO),
|
|
16
14
|
pinned dependency versions, README history.
|
|
@@ -28,6 +26,11 @@
|
|
|
28
26
|
|
|
29
27
|
[Tradeoffs accepted — what's the downside of this choice?]
|
|
30
28
|
|
|
29
|
+
- **Depends On:** [What assumptions must remain true for this decision to hold?]
|
|
30
|
+
- **Threatened By:** [What changes would force us to reconsider?]
|
|
31
|
+
- **Related Decisions:** [Other decisions that are connected to this one]
|
|
32
|
+
- **Revisit When:** [Trigger condition — when should this be re-evaluated?]
|
|
33
|
+
|
|
31
34
|
---
|
|
32
35
|
|
|
33
36
|
<!-- Copy the template above for each major decision. Aim for 3-10 decisions. -->
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Experiments
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
INSTRUCTIONS FOR AI AGENT:
|
|
5
|
+
Track what's being tested, tried, or explored. Not features — hypotheses.
|
|
6
|
+
Every experiment should have a question, a method, and a result (when known).
|
|
7
|
+
|
|
8
|
+
If this project doesn't run experiments, write:
|
|
9
|
+
"No active experiments. This project follows a fixed roadmap."
|
|
10
|
+
Delete these instruction comments when done.
|
|
11
|
+
-->
|
|
12
|
+
|
|
13
|
+
## Active Experiments
|
|
14
|
+
|
|
15
|
+
### [Experiment Name]
|
|
16
|
+
- **Hypothesis:** [What we think will happen if we do X]
|
|
17
|
+
- **Method:** [How we're testing it]
|
|
18
|
+
- **Success Criteria:** [How we'll know it worked]
|
|
19
|
+
- **Status:** [Running / Paused / Complete]
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Completed Experiments
|
|
24
|
+
|
|
25
|
+
### [Experiment Name]
|
|
26
|
+
- **Hypothesis:** [What we thought]
|
|
27
|
+
- **Result:** [What actually happened]
|
|
28
|
+
- **Decision:** [What we did with the learning]
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Ideas to Test
|
|
33
|
+
|
|
34
|
+
<!-- Future experiments. Hypotheses that haven't been tested yet. -->
|
|
35
|
+
|
|
36
|
+
-
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Market
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
INSTRUCTIONS FOR AI AGENT:
|
|
5
|
+
Competitive landscape, positioning, and opportunities.
|
|
6
|
+
|
|
7
|
+
If this is NOT competing in a market (it's open-source, internal, or a
|
|
8
|
+
personal project), write:
|
|
9
|
+
"N/A — This is a [type]. It does not compete in a commercial market."
|
|
10
|
+
If it's open-source but has competitors (other open-source tools),
|
|
11
|
+
document those instead.
|
|
12
|
+
Delete these instruction comments when done.
|
|
13
|
+
-->
|
|
14
|
+
|
|
15
|
+
## Competitors
|
|
16
|
+
|
|
17
|
+
| Competitor | What They Do Well | Where They Fall Short | Our Advantage |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| | | | |
|
|
20
|
+
|
|
21
|
+
## Positioning
|
|
22
|
+
|
|
23
|
+
<!-- How is this positioned relative to competitors? What's the one-line pitch? -->
|
|
24
|
+
|
|
25
|
+
## Target Market
|
|
26
|
+
|
|
27
|
+
<!-- Who are we selling to? Be specific — industry, company size, role, geography. -->
|
|
28
|
+
|
|
29
|
+
## Opportunities
|
|
30
|
+
|
|
31
|
+
<!-- Market gaps, underserved segments, timing advantages -->
|
|
32
|
+
|
|
33
|
+
-
|
|
34
|
+
|
|
35
|
+
## Threats
|
|
36
|
+
|
|
37
|
+
<!-- What could kill this? New competitors, regulation, platform risk, etc. -->
|
|
38
|
+
|
|
39
|
+
-
|