openwolf 1.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.
Files changed (112) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +232 -0
  3. package/dist/bin/openwolf.js +10 -0
  4. package/dist/bin/openwolf.js.map +1 -0
  5. package/dist/dashboard/assets/AISuggestions-DzE-DQkR.js +1 -0
  6. package/dist/dashboard/assets/ActivityTimeline-DGVjujnt.js +1 -0
  7. package/dist/dashboard/assets/AnatomyBrowser-S-2rmYtw.js +1 -0
  8. package/dist/dashboard/assets/BugLog-CG2zDHJc.js +1 -0
  9. package/dist/dashboard/assets/CerebrumViewer-Dlgoy69U.js +1 -0
  10. package/dist/dashboard/assets/CronStatus-DxUF1iW_.js +1 -0
  11. package/dist/dashboard/assets/DesignQC-BGXn_aq8.js +1 -0
  12. package/dist/dashboard/assets/MemoryViewer-CGqkTyvQ.js +1 -0
  13. package/dist/dashboard/assets/ProjectOverview-DlFhu69i.js +1 -0
  14. package/dist/dashboard/assets/TokenUsage-DDsQiVIq.js +68 -0
  15. package/dist/dashboard/assets/index-CzK9GUjV.css +1 -0
  16. package/dist/dashboard/assets/index-PYeNGjkN.js +52 -0
  17. package/dist/dashboard/index.html +16 -0
  18. package/dist/hooks/post-read.js +68 -0
  19. package/dist/hooks/post-write.js +502 -0
  20. package/dist/hooks/pre-read.js +79 -0
  21. package/dist/hooks/pre-write.js +120 -0
  22. package/dist/hooks/session-start.js +76 -0
  23. package/dist/hooks/shared.js +613 -0
  24. package/dist/hooks/stop.js +146 -0
  25. package/dist/src/buglog/bug-matcher.js +3 -0
  26. package/dist/src/buglog/bug-matcher.js.map +1 -0
  27. package/dist/src/buglog/bug-tracker.js +81 -0
  28. package/dist/src/buglog/bug-tracker.js.map +1 -0
  29. package/dist/src/cli/bug-cmd.js +28 -0
  30. package/dist/src/cli/bug-cmd.js.map +1 -0
  31. package/dist/src/cli/cron-cmd.js +106 -0
  32. package/dist/src/cli/cron-cmd.js.map +1 -0
  33. package/dist/src/cli/daemon-cmd.js +177 -0
  34. package/dist/src/cli/daemon-cmd.js.map +1 -0
  35. package/dist/src/cli/dashboard.js +84 -0
  36. package/dist/src/cli/dashboard.js.map +1 -0
  37. package/dist/src/cli/designqc-cmd.js +31 -0
  38. package/dist/src/cli/designqc-cmd.js.map +1 -0
  39. package/dist/src/cli/index.js +149 -0
  40. package/dist/src/cli/index.js.map +1 -0
  41. package/dist/src/cli/init.js +506 -0
  42. package/dist/src/cli/init.js.map +1 -0
  43. package/dist/src/cli/registry.js +93 -0
  44. package/dist/src/cli/registry.js.map +1 -0
  45. package/dist/src/cli/scan.js +39 -0
  46. package/dist/src/cli/scan.js.map +1 -0
  47. package/dist/src/cli/status.js +85 -0
  48. package/dist/src/cli/status.js.map +1 -0
  49. package/dist/src/cli/update.js +414 -0
  50. package/dist/src/cli/update.js.map +1 -0
  51. package/dist/src/daemon/cron-engine.js +300 -0
  52. package/dist/src/daemon/cron-engine.js.map +1 -0
  53. package/dist/src/daemon/file-watcher.js +53 -0
  54. package/dist/src/daemon/file-watcher.js.map +1 -0
  55. package/dist/src/daemon/health.js +23 -0
  56. package/dist/src/daemon/health.js.map +1 -0
  57. package/dist/src/daemon/wolf-daemon.js +294 -0
  58. package/dist/src/daemon/wolf-daemon.js.map +1 -0
  59. package/dist/src/designqc/designqc-capture.js +235 -0
  60. package/dist/src/designqc/designqc-capture.js.map +1 -0
  61. package/dist/src/designqc/designqc-engine.js +141 -0
  62. package/dist/src/designqc/designqc-engine.js.map +1 -0
  63. package/dist/src/designqc/designqc-types.js +5 -0
  64. package/dist/src/designqc/designqc-types.js.map +1 -0
  65. package/dist/src/hooks/post-read.js +69 -0
  66. package/dist/src/hooks/post-read.js.map +1 -0
  67. package/dist/src/hooks/post-write.js +503 -0
  68. package/dist/src/hooks/post-write.js.map +1 -0
  69. package/dist/src/hooks/pre-read.js +80 -0
  70. package/dist/src/hooks/pre-read.js.map +1 -0
  71. package/dist/src/hooks/pre-write.js +121 -0
  72. package/dist/src/hooks/pre-write.js.map +1 -0
  73. package/dist/src/hooks/session-start.js +77 -0
  74. package/dist/src/hooks/session-start.js.map +1 -0
  75. package/dist/src/hooks/shared.js +614 -0
  76. package/dist/src/hooks/shared.js.map +1 -0
  77. package/dist/src/hooks/stop.js +147 -0
  78. package/dist/src/hooks/stop.js.map +1 -0
  79. package/dist/src/scanner/anatomy-scanner.js +260 -0
  80. package/dist/src/scanner/anatomy-scanner.js.map +1 -0
  81. package/dist/src/scanner/description-extractor.js +1007 -0
  82. package/dist/src/scanner/description-extractor.js.map +1 -0
  83. package/dist/src/scanner/project-root.js +42 -0
  84. package/dist/src/scanner/project-root.js.map +1 -0
  85. package/dist/src/tracker/token-estimator.js +20 -0
  86. package/dist/src/tracker/token-estimator.js.map +1 -0
  87. package/dist/src/tracker/token-ledger.js +45 -0
  88. package/dist/src/tracker/token-ledger.js.map +1 -0
  89. package/dist/src/tracker/waste-detector.js +101 -0
  90. package/dist/src/tracker/waste-detector.js.map +1 -0
  91. package/dist/src/utils/fs-safe.js +74 -0
  92. package/dist/src/utils/fs-safe.js.map +1 -0
  93. package/dist/src/utils/logger.js +48 -0
  94. package/dist/src/utils/logger.js.map +1 -0
  95. package/dist/src/utils/paths.js +23 -0
  96. package/dist/src/utils/paths.js.map +1 -0
  97. package/dist/src/utils/platform.js +14 -0
  98. package/dist/src/utils/platform.js.map +1 -0
  99. package/package.json +77 -0
  100. package/src/templates/OPENWOLF.md +135 -0
  101. package/src/templates/anatomy.md +5 -0
  102. package/src/templates/buglog.json +4 -0
  103. package/src/templates/cerebrum.md +22 -0
  104. package/src/templates/claude-md-snippet.md +5 -0
  105. package/src/templates/claude-rules-openwolf.md +15 -0
  106. package/src/templates/config.json +73 -0
  107. package/src/templates/cron-manifest.json +97 -0
  108. package/src/templates/cron-state.json +7 -0
  109. package/src/templates/identity.md +9 -0
  110. package/src/templates/memory.md +4 -0
  111. package/src/templates/reframe-frameworks.md +597 -0
  112. package/src/templates/token-ledger.json +21 -0
@@ -0,0 +1,506 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { execSync } from "node:child_process";
5
+ import { findProjectRoot } from "../scanner/project-root.js";
6
+ import { scanProject } from "../scanner/anatomy-scanner.js";
7
+ import { readJSON, writeJSON, readText, writeText } from "../utils/fs-safe.js";
8
+ import { ensureDir } from "../utils/paths.js";
9
+ import { isWindows } from "../utils/platform.js";
10
+ import { registerProject } from "./registry.js";
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ // Read version from package.json
14
+ function getVersion() {
15
+ try {
16
+ const pkgPath = path.resolve(__dirname, "../../../package.json");
17
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
18
+ return pkg.version || "unknown";
19
+ }
20
+ catch {
21
+ return "unknown";
22
+ }
23
+ }
24
+ // Files that are safe to overwrite on upgrade (config/protocol, not user data)
25
+ const ALWAYS_OVERWRITE = [
26
+ "OPENWOLF.md",
27
+ "config.json",
28
+ "reframe-frameworks.md",
29
+ ];
30
+ // Files that contain user/session data — only create if missing, never overwrite
31
+ const CREATE_IF_MISSING = [
32
+ "identity.md",
33
+ "cerebrum.md",
34
+ "memory.md",
35
+ "anatomy.md",
36
+ "token-ledger.json",
37
+ "buglog.json",
38
+ "cron-manifest.json",
39
+ "cron-state.json",
40
+ "designqc-report.json",
41
+ "suggestions.json",
42
+ ];
43
+ // Use $CLAUDE_PROJECT_DIR so hooks resolve correctly even if CWD changes during a session
44
+ const HOOK_SETTINGS = {
45
+ hooks: {
46
+ SessionStart: [
47
+ {
48
+ matcher: "",
49
+ hooks: [
50
+ {
51
+ type: "command",
52
+ command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/session-start.js"',
53
+ timeout: 5,
54
+ },
55
+ ],
56
+ },
57
+ ],
58
+ PreToolUse: [
59
+ {
60
+ matcher: "Read",
61
+ hooks: [
62
+ {
63
+ type: "command",
64
+ command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/pre-read.js"',
65
+ timeout: 5,
66
+ },
67
+ ],
68
+ },
69
+ {
70
+ matcher: "Write|Edit|MultiEdit",
71
+ hooks: [
72
+ {
73
+ type: "command",
74
+ command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/pre-write.js"',
75
+ timeout: 5,
76
+ },
77
+ ],
78
+ },
79
+ ],
80
+ PostToolUse: [
81
+ {
82
+ matcher: "Read",
83
+ hooks: [
84
+ {
85
+ type: "command",
86
+ command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/post-read.js"',
87
+ timeout: 5,
88
+ },
89
+ ],
90
+ },
91
+ {
92
+ matcher: "Write|Edit|MultiEdit",
93
+ hooks: [
94
+ {
95
+ type: "command",
96
+ command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/post-write.js"',
97
+ timeout: 10,
98
+ },
99
+ ],
100
+ },
101
+ ],
102
+ Stop: [
103
+ {
104
+ matcher: "",
105
+ hooks: [
106
+ {
107
+ type: "command",
108
+ command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/stop.js"',
109
+ timeout: 10,
110
+ },
111
+ ],
112
+ },
113
+ ],
114
+ },
115
+ };
116
+ export async function initCommand() {
117
+ // Check Node.js version
118
+ const nodeVersion = parseInt(process.version.slice(1), 10);
119
+ if (nodeVersion < 20) {
120
+ console.error(`Node.js 20+ required. Current: ${process.version}`);
121
+ process.exit(1);
122
+ }
123
+ // Detect project root
124
+ const projectRoot = findProjectRoot();
125
+ console.log(`Project root: ${projectRoot}`);
126
+ const wolfDir = path.join(projectRoot, ".wolf");
127
+ const isUpgrade = fs.existsSync(wolfDir);
128
+ const version = getVersion();
129
+ if (isUpgrade) {
130
+ console.log(`Upgrading OpenWolf to v${version}...`);
131
+ }
132
+ // Create .wolf/ directory
133
+ ensureDir(wolfDir);
134
+ ensureDir(path.join(wolfDir, "hooks"));
135
+ // Find templates directory
136
+ const actualTemplatesDir = findTemplatesDir();
137
+ // --- Template files ---
138
+ let createdCount = 0;
139
+ let skippedCount = 0;
140
+ for (const file of ALWAYS_OVERWRITE) {
141
+ writeTemplateFile(actualTemplatesDir, wolfDir, file);
142
+ createdCount++;
143
+ }
144
+ for (const file of CREATE_IF_MISSING) {
145
+ const destPath = path.join(wolfDir, file);
146
+ if (fs.existsSync(destPath)) {
147
+ skippedCount++;
148
+ }
149
+ else {
150
+ writeTemplateFile(actualTemplatesDir, wolfDir, file);
151
+ createdCount++;
152
+ }
153
+ }
154
+ // --- Cerebrum: seed project info only if fresh ---
155
+ if (!isUpgrade) {
156
+ seedCerebrum(wolfDir, projectRoot);
157
+ seedIdentity(wolfDir, projectRoot);
158
+ }
159
+ // --- Token ledger: set created_at only if empty ---
160
+ const ledgerPath = path.join(wolfDir, "token-ledger.json");
161
+ const ledger = readJSON(ledgerPath, {});
162
+ if (!ledger.created_at) {
163
+ ledger.created_at = new Date().toISOString();
164
+ writeJSON(ledgerPath, ledger);
165
+ }
166
+ // --- Hook scripts: always update (bug fixes, new features) ---
167
+ copyHookScripts(wolfDir);
168
+ // --- Claude settings: replace OpenWolf hooks (upgrade old paths) ---
169
+ const claudeDir = path.join(projectRoot, ".claude");
170
+ ensureDir(claudeDir);
171
+ const settingsPath = path.join(claudeDir, "settings.json");
172
+ if (fs.existsSync(settingsPath)) {
173
+ const existing = readJSON(settingsPath, {});
174
+ const merged = replaceOpenWolfHooks(existing, HOOK_SETTINGS);
175
+ writeJSON(settingsPath, merged);
176
+ }
177
+ else {
178
+ writeJSON(settingsPath, HOOK_SETTINGS);
179
+ }
180
+ // --- Claude rules: always update ---
181
+ const rulesDir = path.join(claudeDir, "rules");
182
+ ensureDir(rulesDir);
183
+ const rulesContent = readTemplateContent("claude-rules-openwolf.md", actualTemplatesDir);
184
+ writeText(path.join(rulesDir, "openwolf.md"), rulesContent);
185
+ // --- CLAUDE.md: add snippet if missing ---
186
+ const claudeMdPath = path.join(projectRoot, "CLAUDE.md");
187
+ const snippetContent = readTemplateContent("claude-md-snippet.md", actualTemplatesDir);
188
+ if (fs.existsSync(claudeMdPath)) {
189
+ const existing = readText(claudeMdPath);
190
+ if (!existing.includes("OpenWolf")) {
191
+ writeText(claudeMdPath, snippetContent + "\n\n" + existing);
192
+ }
193
+ }
194
+ else {
195
+ writeText(claudeMdPath, snippetContent);
196
+ }
197
+ // --- Anatomy scan: only on fresh init ---
198
+ let fileCount = 0;
199
+ if (!isUpgrade) {
200
+ try {
201
+ fileCount = scanProject(wolfDir, projectRoot);
202
+ }
203
+ catch {
204
+ console.log(" Anatomy scan deferred — will run on first session.");
205
+ }
206
+ }
207
+ else {
208
+ // On upgrade, read existing count
209
+ try {
210
+ const anatomyContent = readText(path.join(wolfDir, "anatomy.md"));
211
+ const m = anatomyContent.match(/Files:\s*(\d+)/);
212
+ fileCount = m ? parseInt(m[1], 10) : 0;
213
+ }
214
+ catch {
215
+ fileCount = 0;
216
+ }
217
+ }
218
+ // --- Daemon ---
219
+ let daemonStatus = "start manually with: openwolf daemon start";
220
+ try {
221
+ const pm2Cmd = isWindows() ? "where pm2" : "which pm2";
222
+ execSync(pm2Cmd, { stdio: "ignore" });
223
+ const name = `openwolf-${path.basename(projectRoot)}`;
224
+ // Resolve daemon script relative to openwolf's install dir, not the target project
225
+ const daemonScript = path.resolve(__dirname, "..", "daemon", "wolf-daemon.js");
226
+ try {
227
+ execSync(`pm2 start "${daemonScript}" --name ${name} --cwd "${projectRoot}"`, {
228
+ stdio: "ignore",
229
+ env: { ...process.env, OPENWOLF_PROJECT_ROOT: projectRoot },
230
+ });
231
+ execSync("pm2 save", { stdio: "ignore" });
232
+ daemonStatus = "running via pm2";
233
+ }
234
+ catch {
235
+ daemonStatus = "pm2 found but daemon start failed. Try: openwolf daemon start";
236
+ }
237
+ }
238
+ catch {
239
+ daemonStatus = "pm2 not found. Install with: pnpm add -g pm2";
240
+ }
241
+ // --- Register in central registry (skip if this IS the openwolf source repo) ---
242
+ try {
243
+ const projectName = detectProjectName(projectRoot);
244
+ if (projectName === "openwolf") {
245
+ // Don't register the openwolf dev repo — it would get updated by `openwolf update`
246
+ }
247
+ else {
248
+ registerProject(projectRoot, projectName, version);
249
+ }
250
+ }
251
+ catch {
252
+ // Non-fatal — registry is a convenience feature
253
+ }
254
+ // --- Summary ---
255
+ console.log("");
256
+ if (isUpgrade) {
257
+ console.log(` ✓ OpenWolf upgraded to v${version}`);
258
+ console.log(` ✓ All .wolf data preserved (${skippedCount} files: cerebrum, memory, anatomy, buglog, ledger)`);
259
+ console.log(` ✓ Hook scripts updated (6 hooks)`);
260
+ console.log(` ✓ ${createdCount} config files updated`);
261
+ console.log(` ✓ Anatomy: ${fileCount} files tracked (unchanged)`);
262
+ }
263
+ else {
264
+ console.log(` ✓ OpenWolf v${version} initialized`);
265
+ console.log(` ✓ .wolf/ created with ${createdCount} files`);
266
+ console.log(` ✓ Claude Code hooks registered (6 hooks)`);
267
+ console.log(` ✓ CLAUDE.md updated`);
268
+ console.log(` ✓ .claude/rules/openwolf.md created`);
269
+ console.log(` ✓ Anatomy scan: ${fileCount} files indexed`);
270
+ }
271
+ console.log(` ✓ Daemon: ${daemonStatus}`);
272
+ console.log("");
273
+ console.log(" You're ready. Just use 'claude' as normal — OpenWolf is watching.");
274
+ console.log("");
275
+ }
276
+ // ─── Helpers ─────────────────────────────────────────────────
277
+ function findTemplatesDir() {
278
+ const candidates = [
279
+ path.resolve(__dirname, "..", "..", "..", "src", "templates"),
280
+ path.resolve(__dirname, "..", "..", "src", "templates"),
281
+ path.resolve(__dirname, "..", "templates"),
282
+ path.resolve(__dirname, "templates"),
283
+ ];
284
+ for (const dir of candidates) {
285
+ if (fs.existsSync(dir))
286
+ return dir;
287
+ }
288
+ return candidates[0]; // fallback — generateTemplate will handle missing files
289
+ }
290
+ function writeTemplateFile(templatesDir, wolfDir, file) {
291
+ const srcPath = path.join(templatesDir, file);
292
+ const destPath = path.join(wolfDir, file);
293
+ if (fs.existsSync(srcPath)) {
294
+ fs.copyFileSync(srcPath, destPath);
295
+ }
296
+ else {
297
+ generateTemplate(destPath, file);
298
+ }
299
+ }
300
+ function readTemplateContent(filename, templatesDir) {
301
+ const filePath = path.join(templatesDir, filename);
302
+ if (fs.existsSync(filePath)) {
303
+ return fs.readFileSync(filePath, "utf-8");
304
+ }
305
+ return getEmbeddedTemplate(filename);
306
+ }
307
+ function getEmbeddedTemplate(filename) {
308
+ const templates = {
309
+ "claude-md-snippet.md": `# OpenWolf\n\n@.wolf/OPENWOLF.md\n\nThis project uses OpenWolf for context management. Read and follow .wolf/OPENWOLF.md every session. Check .wolf/cerebrum.md before generating code. Check .wolf/anatomy.md before reading files.`,
310
+ "claude-rules-openwolf.md": `---\ndescription: OpenWolf protocol enforcement — active on all files\nglobs: **/*\n---\n\n- Check .wolf/anatomy.md before reading any project file\n- Check .wolf/cerebrum.md Do-Not-Repeat list before generating code\n- After writing or editing files, update .wolf/anatomy.md and append to .wolf/memory.md\n- After receiving a user correction, update .wolf/cerebrum.md immediately (Preferences, Learnings, or Do-Not-Repeat)\n- LEARN from every interaction: if you discover a convention, user preference, or project pattern, add it to .wolf/cerebrum.md. Low threshold — when in doubt, log it.\n- BEFORE fixing any bug or error: read .wolf/buglog.json for known fixes\n- AFTER fixing any bug, error, failed test, failed build, or user-reported problem: ALWAYS log to .wolf/buglog.json with error_message, root_cause, fix, and tags\n- If you edit a file more than twice in a session, that likely indicates a bug — log it to .wolf/buglog.json\n- When the user asks to check/evaluate UI design: run \`openwolf designqc\` to capture screenshots, then read them from .wolf/designqc-captures/\n- When the user asks to change/pick/migrate UI framework: read .wolf/reframe-frameworks.md, ask decision questions, recommend a framework, then execute with the framework's prompt`,
311
+ };
312
+ return templates[filename] ?? "";
313
+ }
314
+ function generateTemplate(destPath, file) {
315
+ const templates = {
316
+ "OPENWOLF.md": `# OpenWolf Operating Protocol\n\nYou are working in an OpenWolf-managed project. These rules apply every turn.\n\n## File Navigation\n\n1. Check \`.wolf/anatomy.md\` BEFORE reading any file.\n2. If the description is sufficient, do NOT read the full file.\n3. If a file is not in anatomy.md, search with Grep/Glob.\n\n## Code Generation\n\n1. Read \`.wolf/cerebrum.md\` and respect every entry.\n2. Check \`## Do-Not-Repeat\` section.\n\n## After Actions\n\n1. Append to \`.wolf/memory.md\`.\n2. After file changes: update \`.wolf/anatomy.md\`.\n\n## Token Discipline\n\n- Never re-read a file already read this session.\n- Prefer anatomy.md descriptions over full reads.\n`,
317
+ "identity.md": `# Identity\n\n- **Name:** Wolf\n- **Role:** AI development assistant for this project\n- **Tone:** Direct, concise, technically precise\n`,
318
+ "cerebrum.md": `# Cerebrum\n\n> OpenWolf's learning memory.\n\n## User Preferences\n\n## Key Learnings\n\n## Do-Not-Repeat\n\n## Decision Log\n`,
319
+ "memory.md": `# Memory\n\n> Chronological action log.\n`,
320
+ "anatomy.md": `# anatomy.md\n\n> Project structure index. Pending initial scan.\n`,
321
+ "config.json": JSON.stringify({
322
+ version: 1,
323
+ openwolf: {
324
+ enabled: true,
325
+ anatomy: { auto_scan_on_init: true, rescan_interval_hours: 6, max_description_length: 100, max_files: 500, exclude_patterns: ["node_modules", ".git", "dist", "build", ".wolf", ".next", ".nuxt", "coverage", "__pycache__", ".cache", "target", ".vscode", ".idea", ".turbo", ".vercel", ".netlify", ".output", "*.min.js", "*.min.css"] },
326
+ token_audit: { enabled: true, report_frequency: "weekly", waste_threshold_percent: 15, chars_per_token_code: 3.5, chars_per_token_prose: 4.0 },
327
+ cron: { enabled: true, max_retry_attempts: 3, dead_letter_enabled: true, heartbeat_interval_minutes: 30, use_claude_p: true, api_key_env: null },
328
+ memory: { consolidation_after_days: 7, max_entries_before_consolidation: 200 },
329
+ cerebrum: { max_tokens: 2000, reflection_frequency: "weekly" },
330
+ daemon: { port: 18790, log_level: "info" },
331
+ dashboard: { enabled: true, port: 18791 },
332
+ designqc: { enabled: true, viewports: [{ name: "desktop", width: 1440, height: 900 }, { name: "mobile", width: 375, height: 812 }], max_screenshots: 6, chrome_path: null },
333
+ },
334
+ }, null, 2),
335
+ "token-ledger.json": JSON.stringify({ version: 1, created_at: "", lifetime: { total_tokens_estimated: 0, total_reads: 0, total_writes: 0, total_sessions: 0, anatomy_hits: 0, anatomy_misses: 0, repeated_reads_blocked: 0, estimated_savings_vs_bare_cli: 0 }, sessions: [], daemon_usage: [], waste_flags: [], optimization_report: { last_generated: null, patterns: [] } }, null, 2),
336
+ "buglog.json": JSON.stringify({ version: 1, bugs: [] }, null, 2),
337
+ "cron-manifest.json": JSON.stringify({ version: 1, tasks: [] }, null, 2),
338
+ "cron-state.json": JSON.stringify({ last_heartbeat: null, engine_status: "initialized", execution_log: [], dead_letter_queue: [], upcoming: [] }, null, 2),
339
+ "designqc-report.json": JSON.stringify({ captured_at: null, captures: [], total_size_kb: 0, estimated_tokens: 0 }, null, 2),
340
+ "suggestions.json": JSON.stringify({ suggestions: [], generated_at: null }, null, 2),
341
+ };
342
+ const content = templates[file] ?? "";
343
+ fs.writeFileSync(destPath, content, "utf-8");
344
+ }
345
+ function seedCerebrum(wolfDir, projectRoot) {
346
+ const projectName = detectProjectName(projectRoot);
347
+ const projectDescription = detectProjectDescription(projectRoot);
348
+ if (!projectName && !projectDescription)
349
+ return;
350
+ const cerebrumPath = path.join(wolfDir, "cerebrum.md");
351
+ let cerebrum = readText(cerebrumPath);
352
+ const projectInfo = [
353
+ `- **Project:** ${projectName || path.basename(projectRoot)}`,
354
+ projectDescription ? `- **Description:** ${projectDescription}` : "",
355
+ ].filter(Boolean).join("\n");
356
+ // Insert after ## Key Learnings section
357
+ cerebrum = cerebrum.replace(/## Key Learnings\n\n<!-- Project-specific conventions discovered during development\. -->/, `## Key Learnings\n\n${projectInfo}`);
358
+ // Fallback: if the comment wasn't found (embedded template), try simpler pattern
359
+ if (!cerebrum.includes("**Project:**")) {
360
+ cerebrum = cerebrum.replace(/## Key Learnings\n/, `## Key Learnings\n\n${projectInfo}\n`);
361
+ }
362
+ cerebrum = cerebrum.replace(/Last updated: —/, `Last updated: ${new Date().toISOString().slice(0, 10)}`);
363
+ writeText(cerebrumPath, cerebrum);
364
+ }
365
+ function seedIdentity(wolfDir, projectRoot) {
366
+ const projectName = detectProjectName(projectRoot);
367
+ if (!projectName)
368
+ return;
369
+ const identityPath = path.join(wolfDir, "identity.md");
370
+ let content = readText(identityPath);
371
+ content = content.replace(/\*\*Name:\*\* Wolf/, `**Name:** ${projectName}`);
372
+ content = content.replace(/\*\*Role:\*\* AI development assistant for this project/, `**Role:** AI development assistant for ${projectName}`);
373
+ writeText(identityPath, content);
374
+ }
375
+ function copyHookScripts(wolfDir) {
376
+ const hooksDir = path.join(wolfDir, "hooks");
377
+ ensureDir(hooksDir);
378
+ // Look for compiled hooks in multiple possible locations relative to __dirname
379
+ // __dirname at runtime is dist/src/cli/ so ../hooks = dist/src/hooks/
380
+ const candidates = [
381
+ path.join(__dirname, "..", "hooks"), // dist/src/hooks (from tsc main build)
382
+ path.resolve(__dirname, "..", "..", "hooks"), // dist/hooks (from tsconfig.hooks.json)
383
+ path.resolve(__dirname, "..", "..", "dist", "hooks"), // fallback
384
+ ];
385
+ const srcHooksDir = path.resolve(__dirname, "..", "..", "src", "hooks");
386
+ let sourceDir = "";
387
+ for (const candidate of candidates) {
388
+ if (fs.existsSync(candidate) && fs.existsSync(path.join(candidate, "shared.js"))) {
389
+ sourceDir = candidate;
390
+ break;
391
+ }
392
+ }
393
+ const hookFiles = [
394
+ "session-start.js",
395
+ "pre-read.js",
396
+ "pre-write.js",
397
+ "post-read.js",
398
+ "post-write.js",
399
+ "stop.js",
400
+ "shared.js",
401
+ ];
402
+ let copiedAny = false;
403
+ if (sourceDir) {
404
+ for (const file of hookFiles) {
405
+ const src = path.join(sourceDir, file);
406
+ if (fs.existsSync(src)) {
407
+ fs.copyFileSync(src, path.join(hooksDir, file));
408
+ copiedAny = true;
409
+ }
410
+ }
411
+ }
412
+ else if (fs.existsSync(srcHooksDir)) {
413
+ // Dev mode: compile TS hooks inline using a simple copy with note
414
+ // In practice, user should run `pnpm build:hooks` first
415
+ for (const file of hookFiles) {
416
+ const tsFile = file.replace(".js", ".ts");
417
+ const src = path.join(srcHooksDir, tsFile);
418
+ if (fs.existsSync(src)) {
419
+ const loaderContent = `#!/usr/bin/env node\n// Auto-generated by openwolf init — run 'pnpm build:hooks' for compiled version\nimport("${src.replace(/\\/g, "/")}");\n`;
420
+ fs.writeFileSync(path.join(hooksDir, file), loaderContent, "utf-8");
421
+ copiedAny = true;
422
+ }
423
+ }
424
+ }
425
+ if (!copiedAny) {
426
+ console.warn(" ⚠ Could not find compiled hook scripts. Run 'pnpm build:hooks' and re-run init.");
427
+ }
428
+ // Always write a package.json with type:module so ESM hooks work in any project
429
+ const hooksPkgPath = path.join(hooksDir, "package.json");
430
+ fs.writeFileSync(hooksPkgPath, JSON.stringify({ type: "module" }, null, 2) + "\n", "utf-8");
431
+ }
432
+ /**
433
+ * Replace all OpenWolf hook entries in settings.json with the current version.
434
+ * Removes old-style relative-path hooks and inserts the new $CLAUDE_PROJECT_DIR hooks.
435
+ * Preserves any non-OpenWolf hooks the user may have added.
436
+ */
437
+ function replaceOpenWolfHooks(existing, hookSettings) {
438
+ const merged = { ...existing };
439
+ if (!merged.hooks) {
440
+ merged.hooks = {};
441
+ }
442
+ const hooks = merged.hooks;
443
+ for (const [event, newMatchers] of Object.entries(hookSettings.hooks)) {
444
+ if (!hooks[event]) {
445
+ hooks[event] = [];
446
+ }
447
+ // Remove any existing OpenWolf hook entries (match by .wolf/hooks/ in command)
448
+ hooks[event] = hooks[event].filter((entry) => {
449
+ const isOpenWolfHook = entry.hooks?.some((h) => h.command && h.command.includes(".wolf/hooks/"));
450
+ return !isOpenWolfHook;
451
+ });
452
+ // Add the new OpenWolf hooks
453
+ for (const matcher of newMatchers) {
454
+ hooks[event].push(matcher);
455
+ }
456
+ }
457
+ return merged;
458
+ }
459
+ function detectProjectName(projectRoot) {
460
+ // Try package.json
461
+ const pkgPath = path.join(projectRoot, "package.json");
462
+ try {
463
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
464
+ if (pkg.name)
465
+ return pkg.name;
466
+ }
467
+ catch { }
468
+ // Try Cargo.toml
469
+ try {
470
+ const cargo = fs.readFileSync(path.join(projectRoot, "Cargo.toml"), "utf-8");
471
+ const m = cargo.match(/^name\s*=\s*"([^"]+)"/m);
472
+ if (m)
473
+ return m[1];
474
+ }
475
+ catch { }
476
+ // Try pyproject.toml
477
+ try {
478
+ const py = fs.readFileSync(path.join(projectRoot, "pyproject.toml"), "utf-8");
479
+ const m = py.match(/^name\s*=\s*"([^"]+)"/m);
480
+ if (m)
481
+ return m[1];
482
+ }
483
+ catch { }
484
+ return path.basename(projectRoot);
485
+ }
486
+ function detectProjectDescription(projectRoot) {
487
+ // Try package.json
488
+ try {
489
+ const pkg = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf-8"));
490
+ if (pkg.description)
491
+ return pkg.description;
492
+ }
493
+ catch { }
494
+ // Try README first line/paragraph
495
+ for (const readme of ["README.md", "readme.md", "README.rst", "README.txt"]) {
496
+ try {
497
+ const content = fs.readFileSync(path.join(projectRoot, readme), "utf-8");
498
+ const lines = content.split("\n").filter(l => l.trim() && !l.startsWith("#") && !l.startsWith("=") && !l.startsWith("-") && !l.startsWith("!["));
499
+ if (lines.length > 0)
500
+ return lines[0].trim().slice(0, 200);
501
+ }
502
+ catch { }
503
+ }
504
+ return "";
505
+ }
506
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Central registry of all OpenWolf-managed projects.
3
+ * Stored at ~/.openwolf/registry.json
4
+ */
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ import * as os from "node:os";
8
+ export function getRegistryDir() {
9
+ return path.join(os.homedir(), ".openwolf");
10
+ }
11
+ export function getRegistryPath() {
12
+ return path.join(getRegistryDir(), "registry.json");
13
+ }
14
+ export function readRegistry() {
15
+ const registryPath = getRegistryPath();
16
+ try {
17
+ const raw = fs.readFileSync(registryPath, "utf-8");
18
+ return JSON.parse(raw);
19
+ }
20
+ catch {
21
+ return { version: 1, projects: [] };
22
+ }
23
+ }
24
+ export function writeRegistry(registry) {
25
+ const dir = getRegistryDir();
26
+ if (!fs.existsSync(dir)) {
27
+ fs.mkdirSync(dir, { recursive: true });
28
+ }
29
+ fs.writeFileSync(getRegistryPath(), JSON.stringify(registry, null, 2), "utf-8");
30
+ }
31
+ /**
32
+ * Register a project in the central registry.
33
+ * Updates existing entry if the project root matches.
34
+ */
35
+ export function registerProject(projectRoot, name, version) {
36
+ const registry = readRegistry();
37
+ const normalized = normalizePath(projectRoot);
38
+ const now = new Date().toISOString();
39
+ const existing = registry.projects.find(p => normalizePath(p.root) === normalized);
40
+ if (existing) {
41
+ existing.name = name;
42
+ existing.last_updated = now;
43
+ existing.version = version;
44
+ }
45
+ else {
46
+ registry.projects.push({
47
+ root: projectRoot,
48
+ name,
49
+ registered_at: now,
50
+ last_updated: now,
51
+ version,
52
+ });
53
+ }
54
+ writeRegistry(registry);
55
+ }
56
+ /**
57
+ * Remove a project from the registry (e.g., if the directory no longer exists).
58
+ */
59
+ export function unregisterProject(projectRoot) {
60
+ const registry = readRegistry();
61
+ const normalized = normalizePath(projectRoot);
62
+ registry.projects = registry.projects.filter(p => normalizePath(p.root) !== normalized);
63
+ writeRegistry(registry);
64
+ }
65
+ /**
66
+ * Get all registered projects, optionally filtering out ones that no longer exist.
67
+ */
68
+ export function getRegisteredProjects(validateExists = false) {
69
+ const registry = readRegistry();
70
+ if (!validateExists)
71
+ return registry.projects;
72
+ const valid = [];
73
+ const removed = [];
74
+ for (const project of registry.projects) {
75
+ const wolfDir = path.join(project.root, ".wolf");
76
+ if (fs.existsSync(wolfDir)) {
77
+ valid.push(project);
78
+ }
79
+ else {
80
+ removed.push(project.root);
81
+ }
82
+ }
83
+ // Clean up stale entries
84
+ if (removed.length > 0) {
85
+ registry.projects = valid;
86
+ writeRegistry(registry);
87
+ }
88
+ return valid;
89
+ }
90
+ function normalizePath(p) {
91
+ return p.replace(/\\/g, "/").toLowerCase();
92
+ }
93
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cli/registry.ts"],"names":[],"mappings":"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"}