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/bin/vibes.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // vibes — Semantic repository layers + standardized docs for humans and AI
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 (no dependencies raw ANSI)
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/ semantic layer for ${cyan(name)}`));
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(' Skipping files that already exist. Adding missing ones only.\n'));
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/ structure for ${cyan(name)}`));
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
- console.log(green(` ✔ Created ${created} files`) + dim(`, skipped ${skipped} existing`));
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/ (semantic layer) ──'));
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 quality checks
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 "What depends on it?" fields';
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 timestamp';
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 = `last updated ${Math.floor(days)} days ago`;
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/ (operational 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
- if (failed > 0) console.log(red(` Result: ${failed} failed, ${warnings} warnings, ${passed} passed`));
259
- else if (warnings > 0) console.log(yellow(` Result: ${warnings} warnings, ${passed} passed`));
260
- else console.log(green(` Result: All ${passed} files pass ✔`));
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
- const filled = VIBE_FILES.filter(f => {
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)) return false;
278
- return fs.readFileSync(fp, 'utf-8').trim().split('\n').length >= 10;
279
- }).length;
280
- const icon = filled === VIBE_FILES.length ? green('') : filled > 0 ? yellow('◐') : red('✖');
281
- console.log(` ${icon} .vibe/ ${filled}/${VIBE_FILES.length} files filled`);
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
- cmdInit(targetDir);
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
- if (!exists(docsDir) || fs.readdirSync(docsDir).length === 0) {
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(' Next steps:'));
366
+ console.log(bold(' What to do next:'));
351
367
  console.log('');
352
- console.log(' 1. Point your AI coding agent at this project');
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') + ' — Semantic layers + standardized docs for humans and AI');
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/ semantic layer (6 files)');
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 overview');
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(' — Semantic layer (intent, decisions, flows)'));
379
- console.log(' ' + dim('├── purpose.md — What is this? Who is it for?'));
380
- console.log(' ' + dim('├── architecture.md Systems and how they connect'));
381
- console.log(' ' + dim('├── flows.md — User journeys, step by step'));
382
- console.log(' ' + dim('├── entities.md — Important nouns and relationships'));
383
- console.log(' ' + dim('├── decisions.md — Why things exist the way they do'));
384
- console.log(' ' + dim('└── state.json — Machine-readable project health'));
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(' ' + bold('docs/') + dim(' Operational docs (topology, API, issues, guides)'));
387
- console.log(' ' + dim('├── README.md — Executive summary'));
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": "2.0.0",
4
- "description": "Create a .vibe/ semantic repository layer for any project. Helps humans and AI agents understand your codebase without reading the source.",
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",
@@ -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
+ -
@@ -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
- 1. State the choice that was made
11
- 2. Explain the context and constraints
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
+ -