@mangold/rvault 0.1.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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/commands/doctor.d.ts +7 -0
  4. package/dist/commands/doctor.d.ts.map +1 -0
  5. package/dist/commands/doctor.js +315 -0
  6. package/dist/commands/doctor.js.map +1 -0
  7. package/dist/commands/init.d.ts +8 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +181 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/run.d.ts +9 -0
  12. package/dist/commands/run.d.ts.map +1 -0
  13. package/dist/commands/run.js +117 -0
  14. package/dist/commands/run.js.map +1 -0
  15. package/dist/commands/status.d.ts +6 -0
  16. package/dist/commands/status.d.ts.map +1 -0
  17. package/dist/commands/status.js +147 -0
  18. package/dist/commands/status.js.map +1 -0
  19. package/dist/commands/upgrade.d.ts +9 -0
  20. package/dist/commands/upgrade.d.ts.map +1 -0
  21. package/dist/commands/upgrade.js +409 -0
  22. package/dist/commands/upgrade.js.map +1 -0
  23. package/dist/commands/version.d.ts +7 -0
  24. package/dist/commands/version.d.ts.map +1 -0
  25. package/dist/commands/version.js +57 -0
  26. package/dist/commands/version.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +103 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/lib/checksum.d.ts +3 -0
  32. package/dist/lib/checksum.d.ts.map +1 -0
  33. package/dist/lib/checksum.js +11 -0
  34. package/dist/lib/checksum.js.map +1 -0
  35. package/dist/lib/claude.d.ts +22 -0
  36. package/dist/lib/claude.d.ts.map +1 -0
  37. package/dist/lib/claude.js +50 -0
  38. package/dist/lib/claude.js.map +1 -0
  39. package/dist/lib/detect.d.ts +3 -0
  40. package/dist/lib/detect.d.ts.map +1 -0
  41. package/dist/lib/detect.js +28 -0
  42. package/dist/lib/detect.js.map +1 -0
  43. package/dist/lib/files.d.ts +28 -0
  44. package/dist/lib/files.d.ts.map +1 -0
  45. package/dist/lib/files.js +92 -0
  46. package/dist/lib/files.js.map +1 -0
  47. package/dist/lib/manifest-parser.d.ts +6 -0
  48. package/dist/lib/manifest-parser.d.ts.map +1 -0
  49. package/dist/lib/manifest-parser.js +108 -0
  50. package/dist/lib/manifest-parser.js.map +1 -0
  51. package/dist/lib/merge-prompt.d.ts +30 -0
  52. package/dist/lib/merge-prompt.d.ts.map +1 -0
  53. package/dist/lib/merge-prompt.js +113 -0
  54. package/dist/lib/merge-prompt.js.map +1 -0
  55. package/dist/lib/registry.d.ts +6 -0
  56. package/dist/lib/registry.d.ts.map +1 -0
  57. package/dist/lib/registry.js +19 -0
  58. package/dist/lib/registry.js.map +1 -0
  59. package/dist/lib/template.d.ts +7 -0
  60. package/dist/lib/template.d.ts.map +1 -0
  61. package/dist/lib/template.js +22 -0
  62. package/dist/lib/template.js.map +1 -0
  63. package/dist/lib/version-file.d.ts +5 -0
  64. package/dist/lib/version-file.d.ts.map +1 -0
  65. package/dist/lib/version-file.js +21 -0
  66. package/dist/lib/version-file.js.map +1 -0
  67. package/dist/types.d.ts +54 -0
  68. package/dist/types.d.ts.map +1 -0
  69. package/dist/types.js +2 -0
  70. package/dist/types.js.map +1 -0
  71. package/package.json +44 -0
  72. package/templates/.claude/agents/vault-adversarial-auditor.md +99 -0
  73. package/templates/.claude/agents/vault-constitutional-reviewer.md +59 -0
  74. package/templates/.claude/agents/vault-contradiction-analyst.md +86 -0
  75. package/templates/.claude/agents/vault-critic.md +73 -0
  76. package/templates/.claude/agents/vault-ideator.md +59 -0
  77. package/templates/.claude/agents/vault-meta-reviewer.md +90 -0
  78. package/templates/.claude/agents/vault-researcher.md +85 -0
  79. package/templates/.claude/agents/vault-synthesizer.md +63 -0
  80. package/templates/.claude/skills/vault/SKILL.md +96 -0
  81. package/templates/.claude/skills/vault-audit/SKILL.md +21 -0
  82. package/templates/.claude/skills/vault-decide/SKILL.md +29 -0
  83. package/templates/.claude/skills/vault-fieldnote/SKILL.md +27 -0
  84. package/templates/.claude/skills/vault-ideas/SKILL.md +24 -0
  85. package/templates/.claude/skills/vault-queue/SKILL.md +28 -0
  86. package/templates/.claude/skills/vault-review/SKILL.md +35 -0
  87. package/templates/.claude/skills/vault-status/SKILL.md +23 -0
  88. package/templates/BOOTSTRAP.md +77 -0
  89. package/templates/infrastructure.json +38 -0
  90. package/templates/research-vault/VAULT_CONSTITUTION.md +307 -0
  91. package/templates/research-vault/VAULT_PROTOCOL.md +432 -0
  92. package/templates/research-vault/archive/.gitkeep +0 -0
  93. package/templates/research-vault/decision-briefs/.gitkeep +0 -0
  94. package/templates/research-vault/distilled/.gitkeep +0 -0
  95. package/templates/research-vault/governance/DESIGN_ORIGINS.md +214 -0
  96. package/templates/research-vault/ideas/.gitkeep +0 -0
  97. package/templates/research-vault/inbox/.gitkeep +0 -0
  98. package/templates/research-vault/integrated/.gitkeep +0 -0
  99. package/templates/research-vault/logs/.gitkeep +0 -0
  100. package/templates/research-vault/project-context/.gitkeep +0 -0
  101. package/templates/research-vault/project-context/FIELD_NOTES.md +28 -0
  102. package/templates/research-vault/project-context/REFERENCES.md +48 -0
  103. package/templates/research-vault/research-queue/briefs/.gitkeep +0 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # rvault
2
+
3
+ CLI tool for the **Research Vault** — a self-governing autonomous research
4
+ system for coding agents. Converts idle agent capacity into decision-ready
5
+ knowledge.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install -g rvault
11
+ ```
12
+
13
+ Or use without installing:
14
+
15
+ ```bash
16
+ npx rvault init
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ```bash
22
+ # 1. Initialize a vault in your project
23
+ cd your-project
24
+ rvault init
25
+
26
+ # 2. Open Claude Code (restart if already open so it discovers the new skills)
27
+
28
+ # 3. Run the vault
29
+ # Inside Claude Code: /vault
30
+ # Or from terminal: rvault run
31
+ ```
32
+
33
+ ## Commands
34
+
35
+ | Command | What it does |
36
+ |---------|-------------|
37
+ | `rvault init` | Scaffold a Research Vault in the current project |
38
+ | `rvault upgrade` | Upgrade infrastructure files to the latest template |
39
+ | `rvault version` | Show installed and available versions |
40
+ | `rvault status` | Quick vault status (free, no tokens) |
41
+ | `rvault doctor` | Diagnostic checks for vault health |
42
+ | `rvault run` | Run a vault cycle via `claude -p` |
43
+
44
+ ## Claude Code Skills
45
+
46
+ Once the vault is installed, these skills are available inside Claude Code:
47
+
48
+ | Skill | What it does |
49
+ |-------|-------------|
50
+ | `/vault` | Run a research cycle |
51
+ | `/vault-status` | Quick check-in (counters, queue, attention items) |
52
+ | `/vault-ideas` | Browse and act on idea proposals |
53
+ | `/vault-queue` | View, add, reprioritize research topics |
54
+ | `/vault-decide` | Record a decision informed by vault research |
55
+ | `/vault-review` | Full catch-up after being away |
56
+ | `/vault-audit` | Challenge claims with the adversarial auditor |
57
+ | `/vault-fieldnote` | Log a development outcome back to the vault |
58
+
59
+ ## Upgrading
60
+
61
+ ```bash
62
+ # Check if an upgrade is available
63
+ rvault version
64
+
65
+ # Upgrade — unmodified files are replaced silently.
66
+ # Files you've modified are flagged for LLM-assisted three-way merge.
67
+ rvault upgrade
68
+
69
+ # Auto-merge modified files via Claude Code
70
+ rvault upgrade --auto
71
+
72
+ # Review each merge before applying
73
+ rvault upgrade --review
74
+ ```
75
+
76
+ ## Architecture
77
+
78
+ See `templates/research-vault/VAULT_CONSTITUTION.md` and
79
+ `templates/research-vault/VAULT_PROTOCOL.md` for the full system design.
80
+
81
+ ## License
82
+
83
+ MIT
@@ -0,0 +1,7 @@
1
+ interface DoctorOptions {
2
+ json?: boolean;
3
+ fix?: boolean;
4
+ }
5
+ export declare function doctorCommand(options: DoctorOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AASA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AASD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDzE"}
@@ -0,0 +1,315 @@
1
+ import { join } from "node:path";
2
+ import { readFile, readdir } from "node:fs/promises";
3
+ import chalk from "chalk";
4
+ import { detectVault } from "../lib/detect.js";
5
+ import { getManifest } from "../lib/template.js";
6
+ import { readVaultVersion } from "../lib/version-file.js";
7
+ import { fileExists } from "../lib/files.js";
8
+ import { hashFile } from "../lib/checksum.js";
9
+ export async function doctorCommand(options) {
10
+ const projectDir = process.cwd();
11
+ const detection = await detectVault(projectDir);
12
+ if (detection.status === "none") {
13
+ console.log(chalk.yellow("No vault found. Run `rvault init` first."));
14
+ return;
15
+ }
16
+ const results = [];
17
+ // Run all checks
18
+ await checkInfrastructureFiles(projectDir, results);
19
+ await checkVersionConsistency(projectDir, results);
20
+ await checkConstitutionReferences(projectDir, results);
21
+ await checkDeprecatedPatterns(projectDir, results);
22
+ await checkOrphanedQueueItems(projectDir, results);
23
+ await checkInboxStaleness(projectDir, results);
24
+ await checkDirectoryStructure(projectDir, results);
25
+ if (options.json) {
26
+ console.log(JSON.stringify(results, null, 2));
27
+ return;
28
+ }
29
+ // Display results
30
+ console.log(chalk.bold("Vault Doctor\n"));
31
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
32
+ results.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
33
+ let hasIssues = false;
34
+ for (const r of results) {
35
+ const icon = r.passed ? chalk.green("PASS") : severityIcon(r.severity);
36
+ console.log(` ${icon} ${r.message}`);
37
+ if (!r.passed)
38
+ hasIssues = true;
39
+ }
40
+ console.log();
41
+ if (hasIssues) {
42
+ const critCount = results.filter((r) => !r.passed && r.severity === "critical").length;
43
+ const warnCount = results.filter((r) => !r.passed && r.severity !== "critical").length;
44
+ if (critCount > 0) {
45
+ console.log(chalk.red(`${critCount} critical issue(s) found.`));
46
+ }
47
+ if (warnCount > 0) {
48
+ console.log(chalk.yellow(`${warnCount} warning(s).`));
49
+ }
50
+ }
51
+ else {
52
+ console.log(chalk.green("All checks passed."));
53
+ }
54
+ }
55
+ function severityIcon(severity) {
56
+ switch (severity) {
57
+ case "critical":
58
+ return chalk.red("CRIT");
59
+ case "high":
60
+ return chalk.red("HIGH");
61
+ case "medium":
62
+ return chalk.yellow("WARN");
63
+ case "low":
64
+ return chalk.dim("LOW ");
65
+ default:
66
+ return chalk.dim("????");
67
+ }
68
+ }
69
+ async function checkInfrastructureFiles(projectDir, results) {
70
+ const manifest = await getManifest();
71
+ let missing = 0;
72
+ for (const file of manifest.infrastructure) {
73
+ if (!(await fileExists(join(projectDir, file)))) {
74
+ missing++;
75
+ results.push({
76
+ severity: "critical",
77
+ name: "infrastructure_missing",
78
+ passed: false,
79
+ message: `Missing infrastructure file: ${file}`,
80
+ });
81
+ }
82
+ }
83
+ if (missing === 0) {
84
+ results.push({
85
+ severity: "critical",
86
+ name: "infrastructure_complete",
87
+ passed: true,
88
+ message: `All ${manifest.infrastructure.length} infrastructure files present`,
89
+ });
90
+ }
91
+ }
92
+ async function checkVersionConsistency(projectDir, results) {
93
+ const vv = await readVaultVersion(projectDir);
94
+ if (!vv) {
95
+ results.push({
96
+ severity: "critical",
97
+ name: "version_file",
98
+ passed: false,
99
+ message: ".vault-version file missing",
100
+ });
101
+ return;
102
+ }
103
+ // Check a few files for hash consistency
104
+ let mismatches = 0;
105
+ const filesToCheck = Object.keys(vv.files).slice(0, 5);
106
+ for (const file of filesToCheck) {
107
+ const diskPath = join(projectDir, file);
108
+ if (await fileExists(diskPath)) {
109
+ const diskHash = await hashFile(diskPath);
110
+ if (diskHash !== vv.files[file].hash) {
111
+ mismatches++;
112
+ }
113
+ }
114
+ }
115
+ // This isn't a failure — mismatches mean local modifications, which are expected
116
+ results.push({
117
+ severity: "critical",
118
+ name: "version_file_readable",
119
+ passed: true,
120
+ message: `.vault-version present (v${vv.version}, ${mismatches} file(s) modified)`,
121
+ });
122
+ }
123
+ async function checkConstitutionReferences(projectDir, results) {
124
+ const manifest = await getManifest();
125
+ const agentFiles = manifest.infrastructure.filter((f) => f.startsWith(".claude/agents/"));
126
+ let missing = 0;
127
+ for (const file of agentFiles) {
128
+ try {
129
+ const content = await readFile(join(projectDir, file), "utf-8");
130
+ if (!content.includes("VAULT_CONSTITUTION.md")) {
131
+ missing++;
132
+ results.push({
133
+ severity: "high",
134
+ name: "constitution_reference",
135
+ passed: false,
136
+ message: `${file} does not reference VAULT_CONSTITUTION.md`,
137
+ });
138
+ }
139
+ }
140
+ catch {
141
+ // Missing file already reported
142
+ }
143
+ }
144
+ if (missing === 0) {
145
+ results.push({
146
+ severity: "high",
147
+ name: "constitution_references",
148
+ passed: true,
149
+ message: "All agent files reference the constitution",
150
+ });
151
+ }
152
+ }
153
+ async function checkDeprecatedPatterns(projectDir, results) {
154
+ const deprecated = [
155
+ "Meta-research cycles in last 10 sessions",
156
+ "Reports synthesized since last ideation",
157
+ ];
158
+ const manifest = await getManifest();
159
+ for (const pattern of deprecated) {
160
+ let found = false;
161
+ for (const file of manifest.infrastructure) {
162
+ try {
163
+ const content = await readFile(join(projectDir, file), "utf-8");
164
+ if (content.includes(pattern)) {
165
+ found = true;
166
+ results.push({
167
+ severity: "high",
168
+ name: "deprecated_pattern",
169
+ passed: false,
170
+ message: `Deprecated pattern "${pattern}" in ${file}`,
171
+ });
172
+ break;
173
+ }
174
+ }
175
+ catch {
176
+ // Skip
177
+ }
178
+ }
179
+ if (!found) {
180
+ results.push({
181
+ severity: "high",
182
+ name: "deprecated_pattern",
183
+ passed: true,
184
+ message: `No deprecated "${pattern}"`,
185
+ });
186
+ }
187
+ }
188
+ }
189
+ async function checkOrphanedQueueItems(projectDir, results) {
190
+ const queuePath = join(projectDir, "research-vault", "research-queue", "QUEUE.md");
191
+ try {
192
+ const content = await readFile(queuePath, "utf-8");
193
+ const pendingTopics = content.match(/\|\s*([^|]+?)\s*\|\s*pending/gi);
194
+ if (!pendingTopics) {
195
+ results.push({
196
+ severity: "medium",
197
+ name: "orphaned_queue",
198
+ passed: true,
199
+ message: "No pending queue items to check",
200
+ });
201
+ return;
202
+ }
203
+ const briefsDir = join(projectDir, "research-vault", "research-queue", "briefs");
204
+ let briefs;
205
+ try {
206
+ briefs = await readdir(briefsDir);
207
+ }
208
+ catch {
209
+ briefs = [];
210
+ }
211
+ const orphaned = pendingTopics.length - briefs.filter((b) => b !== ".gitkeep").length;
212
+ if (orphaned > 0) {
213
+ results.push({
214
+ severity: "medium",
215
+ name: "orphaned_queue",
216
+ passed: false,
217
+ message: `~${orphaned} pending topic(s) may lack pre-briefs`,
218
+ });
219
+ }
220
+ else {
221
+ results.push({
222
+ severity: "medium",
223
+ name: "orphaned_queue",
224
+ passed: true,
225
+ message: "All pending topics appear to have pre-briefs",
226
+ });
227
+ }
228
+ }
229
+ catch {
230
+ results.push({
231
+ severity: "medium",
232
+ name: "orphaned_queue",
233
+ passed: true,
234
+ message: "QUEUE.md not found (pre-bootstrap)",
235
+ });
236
+ }
237
+ }
238
+ async function checkInboxStaleness(projectDir, results) {
239
+ const inboxPath = join(projectDir, "research-vault", "inbox");
240
+ try {
241
+ const entries = await readdir(inboxPath);
242
+ const reportDirs = entries.filter((e) => e !== ".gitkeep");
243
+ if (reportDirs.length === 0) {
244
+ results.push({
245
+ severity: "low",
246
+ name: "inbox_staleness",
247
+ passed: true,
248
+ message: "Inbox is empty",
249
+ });
250
+ return;
251
+ }
252
+ // Check for old entries (>30 days)
253
+ const now = Date.now();
254
+ let stale = 0;
255
+ for (const dir of reportDirs) {
256
+ const dateMatch = dir.match(/^(\d{4}-\d{2}-\d{2})/);
257
+ if (dateMatch) {
258
+ const entryDate = new Date(dateMatch[1]).getTime();
259
+ if (now - entryDate > 30 * 24 * 60 * 60 * 1000) {
260
+ stale++;
261
+ }
262
+ }
263
+ }
264
+ if (stale > 0) {
265
+ results.push({
266
+ severity: "low",
267
+ name: "inbox_staleness",
268
+ passed: false,
269
+ message: `${stale} inbox report(s) older than 30 days (should be distilled or archived)`,
270
+ });
271
+ }
272
+ else {
273
+ results.push({
274
+ severity: "low",
275
+ name: "inbox_staleness",
276
+ passed: true,
277
+ message: `${reportDirs.length} inbox report(s), all recent`,
278
+ });
279
+ }
280
+ }
281
+ catch {
282
+ results.push({
283
+ severity: "low",
284
+ name: "inbox_staleness",
285
+ passed: true,
286
+ message: "Inbox directory not accessible",
287
+ });
288
+ }
289
+ }
290
+ async function checkDirectoryStructure(projectDir, results) {
291
+ const manifest = await getManifest();
292
+ let missing = 0;
293
+ for (const dir of manifest.directories) {
294
+ if (!(await fileExists(join(projectDir, dir)))) {
295
+ missing++;
296
+ }
297
+ }
298
+ if (missing > 0) {
299
+ results.push({
300
+ severity: "low",
301
+ name: "directory_structure",
302
+ passed: false,
303
+ message: `${missing} expected directory(ies) missing`,
304
+ });
305
+ }
306
+ else {
307
+ results.push({
308
+ severity: "low",
309
+ name: "directory_structure",
310
+ passed: true,
311
+ message: `All ${manifest.directories.length} directories present`,
312
+ });
313
+ }
314
+ }
315
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface InitOptions {
2
+ scope?: string;
3
+ noBootstrap?: boolean;
4
+ force?: boolean;
5
+ }
6
+ export declare function initCommand(options: InitOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAmBA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrE"}
@@ -0,0 +1,181 @@
1
+ import { join } from "node:path";
2
+ import { readFile } from "node:fs/promises";
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import { detectVault } from "../lib/detect.js";
6
+ import { appendLineIfMissing, cacheOriginal, computeTemplateHashes, copyTemplateFile, ensureDirectory, fileExists, } from "../lib/files.js";
7
+ import { hashFile } from "../lib/checksum.js";
8
+ import { getManifest, getTemplatePath } from "../lib/template.js";
9
+ import { writeVaultVersion } from "../lib/version-file.js";
10
+ import { getCliVersion } from "./version.js";
11
+ export async function initCommand(options) {
12
+ const projectDir = process.cwd();
13
+ const detection = await detectVault(projectDir);
14
+ if (detection.status === "managed" && !options.force) {
15
+ console.log(chalk.yellow(`Vault already installed (v${detection.version}). Use --force to reinitialize.`));
16
+ return;
17
+ }
18
+ if (detection.status === "unmanaged" && !options.force) {
19
+ await adoptExistingVault(projectDir);
20
+ return;
21
+ }
22
+ await scaffoldVault(projectDir, options);
23
+ }
24
+ async function scaffoldVault(projectDir, options) {
25
+ const manifest = await getManifest();
26
+ const spinner = ora("Scaffolding Research Vault...").start();
27
+ // 1. Create directories
28
+ for (const dir of manifest.directories) {
29
+ await ensureDirectory(dir, projectDir);
30
+ }
31
+ spinner.text = "Copying infrastructure files...";
32
+ // 2. Copy infrastructure files
33
+ for (const file of manifest.infrastructure) {
34
+ await copyTemplateFile(file, projectDir);
35
+ await cacheOriginal(file, projectDir);
36
+ }
37
+ // 3. Copy content templates (only if they don't already exist)
38
+ for (const file of manifest.content_templates) {
39
+ const destPath = join(projectDir, file);
40
+ if (!(await fileExists(destPath))) {
41
+ await copyTemplateFile(file, projectDir);
42
+ }
43
+ }
44
+ // 4. Create .vault-version
45
+ spinner.text = "Creating version file...";
46
+ const fileRecords = await computeTemplateHashes(manifest);
47
+ const cliVersion = getCliVersion();
48
+ const vaultVersion = {
49
+ version: cliVersion,
50
+ installedAt: new Date().toISOString(),
51
+ cliVersion,
52
+ files: fileRecords,
53
+ };
54
+ await writeVaultVersion(projectDir, vaultVersion);
55
+ // 5. Update .gitignore
56
+ const gitignorePath = join(projectDir, ".gitignore");
57
+ await appendLineIfMissing(gitignorePath, ".vault/");
58
+ await appendLineIfMissing(gitignorePath, ".claude/settings.local.json");
59
+ spinner.succeed(chalk.green(`Research Vault initialized (v${cliVersion})`));
60
+ // Summary
61
+ console.log();
62
+ console.log(` ${chalk.dim("Infrastructure:")} ${manifest.infrastructure.length} files`);
63
+ console.log(` ${chalk.dim("Directories:")} ${manifest.directories.length} created`);
64
+ console.log(` ${chalk.dim("Version file:")} .vault-version`);
65
+ console.log(` ${chalk.dim("Originals cache:")} .vault/originals/`);
66
+ console.log();
67
+ // Bootstrap prompt
68
+ if (!options.noBootstrap) {
69
+ await offerBootstrap(projectDir, options.scope);
70
+ }
71
+ else {
72
+ console.log(chalk.dim("Skipped bootstrap. Run /vault-review or paste BOOTSTRAP.md into your agent when ready."));
73
+ }
74
+ }
75
+ async function adoptExistingVault(projectDir) {
76
+ console.log(chalk.yellow("Existing vault detected (unmanaged)."));
77
+ const spinner = ora("Analyzing installed files...").start();
78
+ const manifest = await getManifest();
79
+ const templateHashes = await computeTemplateHashes(manifest);
80
+ let matched = 0;
81
+ let modified = 0;
82
+ const modifiedFiles = [];
83
+ for (const file of manifest.infrastructure) {
84
+ const diskPath = join(projectDir, file);
85
+ if (!(await fileExists(diskPath))) {
86
+ continue;
87
+ }
88
+ const diskHash = await hashFile(diskPath);
89
+ if (templateHashes[file] && diskHash === templateHashes[file].hash) {
90
+ matched++;
91
+ }
92
+ else {
93
+ modified++;
94
+ modifiedFiles.push(file);
95
+ }
96
+ }
97
+ spinner.succeed("File analysis complete.");
98
+ console.log();
99
+ console.log(` ${chalk.green(`${matched}`)} files match current template`);
100
+ if (modified > 0) {
101
+ console.log(` ${chalk.yellow(`${modified}`)} files have local modifications:`);
102
+ for (const f of modifiedFiles) {
103
+ console.log(` ${chalk.dim("~")} ${f}`);
104
+ }
105
+ }
106
+ console.log();
107
+ // Create .vault-version with template hashes as the baseline.
108
+ // Modified files will be detected during upgrade because their disk
109
+ // content won't match these template hashes.
110
+ const cliVersion = getCliVersion();
111
+ const vaultVersion = {
112
+ version: "0.0.0",
113
+ installedAt: new Date().toISOString(),
114
+ cliVersion,
115
+ files: templateHashes,
116
+ };
117
+ await writeVaultVersion(projectDir, vaultVersion);
118
+ // Cache originals from the template (not from disk)
119
+ const cacheSpinner = ora("Caching template originals...").start();
120
+ for (const file of manifest.infrastructure) {
121
+ await cacheOriginal(file, projectDir);
122
+ }
123
+ cacheSpinner.succeed("Cached template originals.");
124
+ // Ensure directories exist
125
+ for (const dir of manifest.directories) {
126
+ await ensureDirectory(dir, projectDir);
127
+ }
128
+ // Update .gitignore
129
+ const gitignorePath = join(projectDir, ".gitignore");
130
+ await appendLineIfMissing(gitignorePath, ".vault/");
131
+ await appendLineIfMissing(gitignorePath, ".claude/settings.local.json");
132
+ console.log();
133
+ console.log(chalk.green("Vault adopted as CLI-managed at baseline v0.0.0."));
134
+ console.log(`Run ${chalk.cyan("rvault upgrade")} to update to the latest template.`);
135
+ }
136
+ async function offerBootstrap(projectDir, scope) {
137
+ const bootstrapPath = getTemplatePath("BOOTSTRAP.md");
138
+ let bootstrapContent;
139
+ try {
140
+ bootstrapContent = await readFile(bootstrapPath, "utf-8");
141
+ }
142
+ catch {
143
+ console.log(chalk.dim("Bootstrap template not found in package."));
144
+ return;
145
+ }
146
+ // Extract just the prompt part (everything after the --- separator)
147
+ const parts = bootstrapContent.split("\n---\n");
148
+ let prompt = parts.length > 1 ? parts.slice(1).join("\n---\n").trim() : bootstrapContent;
149
+ if (scope) {
150
+ prompt =
151
+ `SCOPE CONSTRAINT: Focus this vault on: ${scope}\n\n` + prompt;
152
+ }
153
+ // Check if claude CLI is available
154
+ const claudeAvailable = await isClaudeAvailable();
155
+ if (claudeAvailable) {
156
+ console.log(`To generate project-specific goals and queue, run:`);
157
+ console.log(chalk.cyan(` rvault run --bootstrap`));
158
+ console.log(chalk.dim(` Or paste the bootstrap prompt into Claude Code manually.`));
159
+ }
160
+ else {
161
+ // Save bootstrap prompt for manual use
162
+ const promptPath = join(projectDir, "research-vault", "BOOTSTRAP-PROMPT.md");
163
+ const { writeFile: wf } = await import("node:fs/promises");
164
+ await wf(promptPath, prompt, "utf-8");
165
+ console.log(`Bootstrap prompt saved to ${chalk.cyan("research-vault/BOOTSTRAP-PROMPT.md")}`);
166
+ console.log(chalk.dim("Paste it into your coding agent to complete setup."));
167
+ }
168
+ }
169
+ async function isClaudeAvailable() {
170
+ try {
171
+ const { execFile } = await import("node:child_process");
172
+ const { promisify } = await import("node:util");
173
+ const execAsync = promisify(execFile);
174
+ await execAsync("claude", ["--version"], { timeout: 3000 });
175
+ return true;
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ }
181
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface RunOptions {
2
+ quickBurn?: boolean;
3
+ maxTurns?: number;
4
+ background?: boolean;
5
+ explainPermissions?: boolean;
6
+ }
7
+ export declare function runCommand(options: RunOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AA2BA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FnE"}