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,39 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { findProjectRoot } from "../scanner/project-root.js";
4
+ import { scanProject, buildAnatomy } from "../scanner/anatomy-scanner.js";
5
+ export async function scanCommand(options) {
6
+ const projectRoot = findProjectRoot();
7
+ const wolfDir = path.join(projectRoot, ".wolf");
8
+ if (!fs.existsSync(wolfDir)) {
9
+ console.log("OpenWolf not initialized. Run: openwolf init");
10
+ return;
11
+ }
12
+ if (options.check) {
13
+ const { content: newContent } = buildAnatomy(wolfDir, projectRoot);
14
+ const anatomyPath = path.join(wolfDir, "anatomy.md");
15
+ let existingContent = "";
16
+ try {
17
+ existingContent = fs.readFileSync(anatomyPath, "utf-8");
18
+ }
19
+ catch {
20
+ // File doesn't exist — anatomy is out of date
21
+ }
22
+ // Strip the timestamp line before comparing, since it changes every scan
23
+ const stripTimestamp = (s) => s.replace(/^> Auto-maintained by OpenWolf\. Last scanned: .+$/m, "");
24
+ if (stripTimestamp(existingContent) === stripTimestamp(newContent)) {
25
+ console.log("Anatomy is up to date");
26
+ return;
27
+ }
28
+ else {
29
+ console.log("Anatomy is out of date. Run `openwolf scan` to update.");
30
+ process.exit(1);
31
+ }
32
+ }
33
+ console.log("Scanning project...");
34
+ const startTime = Date.now();
35
+ const fileCount = scanProject(wolfDir, projectRoot);
36
+ const elapsed = Date.now() - startTime;
37
+ console.log(` ✓ Anatomy scan complete: ${fileCount} files indexed in ${elapsed}ms`);
38
+ }
39
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/cli/scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B;IAC5D,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEhD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAEnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;QAED,yEAAyE;QACzE,MAAM,cAAc,GAAG,CAAC,CAAS,EAAU,EAAE,CAC3C,CAAC,CAAC,OAAO,CAAC,qDAAqD,EAAE,EAAE,CAAC,CAAC;QAEvE,IAAI,cAAc,CAAC,eAAe,CAAC,KAAK,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,8BAA8B,SAAS,qBAAqB,OAAO,IAAI,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,85 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { findProjectRoot } from "../scanner/project-root.js";
4
+ import { readJSON, readText } from "../utils/fs-safe.js";
5
+ export async function statusCommand() {
6
+ const projectRoot = findProjectRoot();
7
+ const wolfDir = path.join(projectRoot, ".wolf");
8
+ if (!fs.existsSync(wolfDir)) {
9
+ console.log("OpenWolf not initialized. Run: openwolf init");
10
+ return;
11
+ }
12
+ console.log("OpenWolf Status");
13
+ console.log("===============\n");
14
+ // File integrity check
15
+ const requiredFiles = [
16
+ "OPENWOLF.md", "identity.md", "cerebrum.md", "memory.md",
17
+ "anatomy.md", "config.json", "token-ledger.json", "buglog.json",
18
+ "cron-manifest.json", "cron-state.json",
19
+ ];
20
+ let missingCount = 0;
21
+ for (const file of requiredFiles) {
22
+ const exists = fs.existsSync(path.join(wolfDir, file));
23
+ if (!exists) {
24
+ console.log(` ✗ Missing: .wolf/${file}`);
25
+ missingCount++;
26
+ }
27
+ }
28
+ if (missingCount === 0) {
29
+ console.log(` ✓ All ${requiredFiles.length} core files present`);
30
+ }
31
+ // Hook scripts check
32
+ const hookFiles = [
33
+ "session-start.js", "pre-read.js", "pre-write.js",
34
+ "post-read.js", "post-write.js", "stop.js", "shared.js",
35
+ ];
36
+ const hooksDir = path.join(wolfDir, "hooks");
37
+ let hooksMissing = 0;
38
+ for (const file of hookFiles) {
39
+ if (!fs.existsSync(path.join(hooksDir, file)))
40
+ hooksMissing++;
41
+ }
42
+ if (hooksMissing === 0) {
43
+ console.log(` ✓ All ${hookFiles.length} hook scripts present`);
44
+ }
45
+ else {
46
+ console.log(` ✗ Missing ${hooksMissing} hook scripts`);
47
+ }
48
+ // Claude settings check
49
+ const settingsPath = path.join(projectRoot, ".claude", "settings.json");
50
+ if (fs.existsSync(settingsPath)) {
51
+ const settings = readJSON(settingsPath, {});
52
+ const hooks = settings.hooks;
53
+ if (hooks) {
54
+ const hookCount = Object.values(hooks).reduce((sum, arr) => sum + arr.length, 0);
55
+ console.log(` ✓ Claude Code hooks registered (${hookCount} matchers)`);
56
+ }
57
+ }
58
+ else {
59
+ console.log(" ✗ .claude/settings.json not found");
60
+ }
61
+ // Token ledger stats
62
+ const ledger = readJSON(path.join(wolfDir, "token-ledger.json"), {
63
+ lifetime: { total_sessions: 0, total_reads: 0, total_writes: 0, total_tokens_estimated: 0, estimated_savings_vs_bare_cli: 0 },
64
+ });
65
+ console.log(`\nToken Stats:`);
66
+ console.log(` Sessions: ${ledger.lifetime.total_sessions}`);
67
+ console.log(` Total reads: ${ledger.lifetime.total_reads}`);
68
+ console.log(` Total writes: ${ledger.lifetime.total_writes}`);
69
+ console.log(` Tokens tracked: ~${ledger.lifetime.total_tokens_estimated.toLocaleString()}`);
70
+ console.log(` Estimated savings: ~${ledger.lifetime.estimated_savings_vs_bare_cli.toLocaleString()} tokens`);
71
+ // Anatomy stats
72
+ const anatomyContent = readText(path.join(wolfDir, "anatomy.md"));
73
+ const entryCount = (anatomyContent.match(/^- `/gm) || []).length;
74
+ console.log(`\nAnatomy: ${entryCount} files tracked`);
75
+ // Cron state
76
+ const cronState = readJSON(path.join(wolfDir, "cron-state.json"), { engine_status: "unknown", last_heartbeat: null });
77
+ console.log(`\nDaemon: ${cronState.engine_status}`);
78
+ if (cronState.last_heartbeat) {
79
+ const elapsed = Date.now() - new Date(cronState.last_heartbeat).getTime();
80
+ const mins = Math.floor(elapsed / 60000);
81
+ console.log(` Last heartbeat: ${mins} minutes ago`);
82
+ }
83
+ console.log("");
84
+ }
85
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,414 @@
1
+ /**
2
+ * openwolf update — Update all registered OpenWolf projects.
3
+ *
4
+ * For each project:
5
+ * 1. Creates a timestamped backup in .wolf/backups/
6
+ * 2. Updates hooks, templates, protocol files, and claude rules
7
+ * 3. Preserves all user data (cerebrum, memory, anatomy, buglog, ledger)
8
+ * 4. Reports results per project
9
+ */
10
+ import * as fs from "node:fs";
11
+ import * as path from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ import { getRegisteredProjects, registerProject } from "./registry.js";
14
+ import { readJSON, writeJSON, readText, writeText } from "../utils/fs-safe.js";
15
+ import { ensureDir } from "../utils/paths.js";
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+ function getVersion() {
19
+ try {
20
+ const pkgPath = path.resolve(__dirname, "../../../package.json");
21
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
22
+ return pkg.version || "unknown";
23
+ }
24
+ catch {
25
+ return "unknown";
26
+ }
27
+ }
28
+ // Files that are safe to overwrite (protocol/config)
29
+ const ALWAYS_OVERWRITE = ["OPENWOLF.md", "config.json", "reframe-frameworks.md"];
30
+ // Files that contain user data — NEVER overwrite, only create if missing
31
+ const USER_DATA_FILES = [
32
+ "identity.md", "cerebrum.md", "memory.md", "anatomy.md",
33
+ "token-ledger.json", "buglog.json", "cron-manifest.json", "cron-state.json",
34
+ "suggestions.json", "designqc-report.json",
35
+ ];
36
+ // Files to include in backup
37
+ const BACKUP_FILES = [
38
+ ...ALWAYS_OVERWRITE,
39
+ ...USER_DATA_FILES,
40
+ ];
41
+ const HOOK_SETTINGS = {
42
+ hooks: {
43
+ SessionStart: [{ matcher: "", hooks: [{ type: "command", command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/session-start.js"', timeout: 5 }] }],
44
+ PreToolUse: [
45
+ { matcher: "Read", hooks: [{ type: "command", command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/pre-read.js"', timeout: 5 }] },
46
+ { matcher: "Write|Edit|MultiEdit", hooks: [{ type: "command", command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/pre-write.js"', timeout: 5 }] },
47
+ ],
48
+ PostToolUse: [
49
+ { matcher: "Read", hooks: [{ type: "command", command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/post-read.js"', timeout: 5 }] },
50
+ { matcher: "Write|Edit|MultiEdit", hooks: [{ type: "command", command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/post-write.js"', timeout: 10 }] },
51
+ ],
52
+ Stop: [{ matcher: "", hooks: [{ type: "command", command: 'node "$CLAUDE_PROJECT_DIR/.wolf/hooks/stop.js"', timeout: 10 }] }],
53
+ },
54
+ };
55
+ export async function updateCommand(options) {
56
+ const version = getVersion();
57
+ const projects = getRegisteredProjects(true);
58
+ if (projects.length === 0) {
59
+ console.log("No registered OpenWolf projects found.");
60
+ console.log("Run 'openwolf init' in a project directory to register it.");
61
+ return;
62
+ }
63
+ // Filter to specific project if requested
64
+ let targets = projects;
65
+ if (options.project) {
66
+ const search = options.project.toLowerCase();
67
+ targets = projects.filter(p => p.name.toLowerCase().includes(search) ||
68
+ p.root.toLowerCase().includes(search));
69
+ if (targets.length === 0) {
70
+ console.log(`No registered project matching "${options.project}".`);
71
+ console.log("Registered projects:");
72
+ for (const p of projects) {
73
+ console.log(` - ${p.name} (${p.root})`);
74
+ }
75
+ return;
76
+ }
77
+ }
78
+ console.log(`OpenWolf v${version} — updating ${targets.length} project(s)${options.dryRun ? " (dry run)" : ""}...\n`);
79
+ const results = [];
80
+ for (const project of targets) {
81
+ const result = await updateProject(project, version, options.dryRun ?? false);
82
+ results.push(result);
83
+ }
84
+ // Summary
85
+ console.log("\n─── Update Summary ───");
86
+ const updated = results.filter(r => r.status === "updated");
87
+ const skipped = results.filter(r => r.status === "skipped");
88
+ const errors = results.filter(r => r.status === "error");
89
+ if (updated.length > 0) {
90
+ console.log(`\n ✓ Updated (${updated.length}):`);
91
+ for (const r of updated) {
92
+ console.log(` ${r.project.name} — ${r.message}`);
93
+ }
94
+ }
95
+ if (skipped.length > 0) {
96
+ console.log(`\n ○ Skipped (${skipped.length}):`);
97
+ for (const r of skipped) {
98
+ console.log(` ${r.project.name} — ${r.message}`);
99
+ }
100
+ }
101
+ if (errors.length > 0) {
102
+ console.log(`\n ✗ Errors (${errors.length}):`);
103
+ for (const r of errors) {
104
+ console.log(` ${r.project.name} — ${r.message}`);
105
+ }
106
+ }
107
+ console.log("");
108
+ }
109
+ async function updateProject(project, version, dryRun) {
110
+ const { root, name } = project;
111
+ const wolfDir = path.join(root, ".wolf");
112
+ // Validate project still exists
113
+ if (!fs.existsSync(wolfDir)) {
114
+ return { project, status: "skipped", message: ".wolf/ directory not found" };
115
+ }
116
+ // Never update the openwolf source repo itself
117
+ if (name === "openwolf") {
118
+ return { project, status: "skipped", message: "openwolf source repo — skipped" };
119
+ }
120
+ console.log(` ${name} (${root})`);
121
+ // Already at this version?
122
+ if (project.version === version) {
123
+ console.log(` Already at v${version} — updating hooks/templates anyway`);
124
+ }
125
+ if (dryRun) {
126
+ console.log(` [dry run] Would backup, update hooks, templates, rules`);
127
+ return { project, status: "updated", message: `would update to v${version}` };
128
+ }
129
+ try {
130
+ // 1. Create backup
131
+ const backupDir = createBackup(wolfDir);
132
+ console.log(` ✓ Backup: ${path.basename(backupDir)}`);
133
+ // 2. Update template files (OPENWOLF.md, config.json)
134
+ const templatesDir = findTemplatesDir();
135
+ for (const file of ALWAYS_OVERWRITE) {
136
+ const srcPath = path.join(templatesDir, file);
137
+ const destPath = path.join(wolfDir, file);
138
+ if (fs.existsSync(srcPath)) {
139
+ fs.copyFileSync(srcPath, destPath);
140
+ }
141
+ }
142
+ console.log(` ✓ Templates updated (${ALWAYS_OVERWRITE.join(", ")})`);
143
+ // 3. Update hook scripts
144
+ copyHookScripts(wolfDir);
145
+ console.log(` ✓ Hook scripts updated`);
146
+ // 4. Update .claude/settings.json hooks
147
+ const claudeDir = path.join(root, ".claude");
148
+ ensureDir(claudeDir);
149
+ const settingsPath = path.join(claudeDir, "settings.json");
150
+ if (fs.existsSync(settingsPath)) {
151
+ const existing = readJSON(settingsPath, {});
152
+ const merged = replaceOpenWolfHooks(existing, HOOK_SETTINGS);
153
+ writeJSON(settingsPath, merged);
154
+ }
155
+ else {
156
+ writeJSON(settingsPath, HOOK_SETTINGS);
157
+ }
158
+ console.log(` ✓ Claude settings updated`);
159
+ // 5. Update .claude/rules/openwolf.md
160
+ const rulesDir = path.join(claudeDir, "rules");
161
+ ensureDir(rulesDir);
162
+ const rulesContent = readTemplateContent("claude-rules-openwolf.md", templatesDir);
163
+ writeText(path.join(rulesDir, "openwolf.md"), rulesContent);
164
+ console.log(` ✓ Claude rules updated`);
165
+ // 6. Update CLAUDE.md snippet if it references OpenWolf
166
+ const claudeMdPath = path.join(root, "CLAUDE.md");
167
+ const snippetContent = readTemplateContent("claude-md-snippet.md", templatesDir);
168
+ if (fs.existsSync(claudeMdPath)) {
169
+ const existing = readText(claudeMdPath);
170
+ if (!existing.includes("OpenWolf")) {
171
+ writeText(claudeMdPath, snippetContent + "\n\n" + existing);
172
+ console.log(` ✓ CLAUDE.md updated`);
173
+ }
174
+ }
175
+ // 7. Clean up stale .tmp files
176
+ try {
177
+ const files = fs.readdirSync(wolfDir);
178
+ let cleaned = 0;
179
+ for (const f of files) {
180
+ if (f.endsWith(".tmp")) {
181
+ try {
182
+ fs.unlinkSync(path.join(wolfDir, f));
183
+ cleaned++;
184
+ }
185
+ catch { }
186
+ }
187
+ }
188
+ if (cleaned > 0)
189
+ console.log(` ✓ Cleaned ${cleaned} stale .tmp file(s)`);
190
+ }
191
+ catch { }
192
+ // 8. Update registry entry
193
+ registerProject(root, name, version);
194
+ return {
195
+ project,
196
+ status: "updated",
197
+ backupDir,
198
+ message: `v${project.version} → v${version}`,
199
+ };
200
+ }
201
+ catch (err) {
202
+ const msg = err instanceof Error ? err.message : String(err);
203
+ return { project, status: "error", message: msg };
204
+ }
205
+ }
206
+ /**
207
+ * Create a timestamped backup of all .wolf files into .wolf/backups/YYYY-MM-DD_HHMMSS/
208
+ */
209
+ function createBackup(wolfDir) {
210
+ const now = new Date();
211
+ const stamp = now.toISOString().replace(/[:.]/g, "").slice(0, 15); // 20260315T013000
212
+ const backupDir = path.join(wolfDir, "backups", stamp);
213
+ ensureDir(backupDir);
214
+ // Backup all relevant files
215
+ for (const file of BACKUP_FILES) {
216
+ const src = path.join(wolfDir, file);
217
+ if (fs.existsSync(src)) {
218
+ fs.copyFileSync(src, path.join(backupDir, file));
219
+ }
220
+ }
221
+ // Also backup hooks
222
+ const hooksDir = path.join(wolfDir, "hooks");
223
+ if (fs.existsSync(hooksDir)) {
224
+ const hooksBackup = path.join(backupDir, "hooks");
225
+ ensureDir(hooksBackup);
226
+ try {
227
+ const hookFiles = fs.readdirSync(hooksDir);
228
+ for (const f of hookFiles) {
229
+ const src = path.join(hooksDir, f);
230
+ if (fs.statSync(src).isFile()) {
231
+ fs.copyFileSync(src, path.join(hooksBackup, f));
232
+ }
233
+ }
234
+ }
235
+ catch { }
236
+ }
237
+ // Also backup .claude/settings.json and rules
238
+ const projectRoot = path.dirname(wolfDir);
239
+ const claudeSettings = path.join(projectRoot, ".claude", "settings.json");
240
+ if (fs.existsSync(claudeSettings)) {
241
+ const claudeBackup = path.join(backupDir, ".claude");
242
+ ensureDir(claudeBackup);
243
+ fs.copyFileSync(claudeSettings, path.join(claudeBackup, "settings.json"));
244
+ }
245
+ const claudeRules = path.join(projectRoot, ".claude", "rules", "openwolf.md");
246
+ if (fs.existsSync(claudeRules)) {
247
+ const rulesBackup = path.join(backupDir, ".claude", "rules");
248
+ ensureDir(rulesBackup);
249
+ fs.copyFileSync(claudeRules, path.join(rulesBackup, "openwolf.md"));
250
+ }
251
+ return backupDir;
252
+ }
253
+ // ─── Shared helpers (extracted from init.ts patterns) ─────────────
254
+ function findTemplatesDir() {
255
+ const candidates = [
256
+ path.resolve(__dirname, "..", "..", "..", "src", "templates"),
257
+ path.resolve(__dirname, "..", "..", "src", "templates"),
258
+ path.resolve(__dirname, "..", "templates"),
259
+ path.resolve(__dirname, "templates"),
260
+ ];
261
+ for (const dir of candidates) {
262
+ if (fs.existsSync(dir))
263
+ return dir;
264
+ }
265
+ return candidates[0];
266
+ }
267
+ function readTemplateContent(filename, templatesDir) {
268
+ const filePath = path.join(templatesDir, filename);
269
+ if (fs.existsSync(filePath)) {
270
+ return fs.readFileSync(filePath, "utf-8");
271
+ }
272
+ const templates = {
273
+ "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.`,
274
+ "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`,
275
+ };
276
+ return templates[filename] ?? "";
277
+ }
278
+ function copyHookScripts(wolfDir) {
279
+ const hooksDir = path.join(wolfDir, "hooks");
280
+ ensureDir(hooksDir);
281
+ const candidates = [
282
+ path.join(__dirname, "..", "hooks"),
283
+ path.resolve(__dirname, "..", "..", "hooks"),
284
+ path.resolve(__dirname, "..", "..", "dist", "hooks"),
285
+ ];
286
+ let sourceDir = "";
287
+ for (const candidate of candidates) {
288
+ if (fs.existsSync(candidate) && fs.existsSync(path.join(candidate, "shared.js"))) {
289
+ sourceDir = candidate;
290
+ break;
291
+ }
292
+ }
293
+ const hookFiles = [
294
+ "session-start.js", "pre-read.js", "pre-write.js",
295
+ "post-read.js", "post-write.js", "stop.js", "shared.js",
296
+ ];
297
+ if (sourceDir) {
298
+ for (const file of hookFiles) {
299
+ const src = path.join(sourceDir, file);
300
+ if (fs.existsSync(src)) {
301
+ fs.copyFileSync(src, path.join(hooksDir, file));
302
+ }
303
+ }
304
+ }
305
+ // Always ensure package.json with type:module
306
+ const hooksPkgPath = path.join(hooksDir, "package.json");
307
+ fs.writeFileSync(hooksPkgPath, JSON.stringify({ type: "module" }, null, 2) + "\n", "utf-8");
308
+ }
309
+ function replaceOpenWolfHooks(existing, hookSettings) {
310
+ const merged = { ...existing };
311
+ if (!merged.hooks)
312
+ merged.hooks = {};
313
+ const hooks = merged.hooks;
314
+ for (const [event, newMatchers] of Object.entries(hookSettings.hooks)) {
315
+ if (!hooks[event])
316
+ hooks[event] = [];
317
+ // Remove existing OpenWolf hook entries
318
+ hooks[event] = hooks[event].filter((entry) => {
319
+ const isOpenWolfHook = entry.hooks?.some((h) => h.command && h.command.includes(".wolf/hooks/"));
320
+ return !isOpenWolfHook;
321
+ });
322
+ // Add new OpenWolf hooks
323
+ for (const matcher of newMatchers) {
324
+ hooks[event].push(matcher);
325
+ }
326
+ }
327
+ return merged;
328
+ }
329
+ /**
330
+ * List all registered projects (for `openwolf update --list`)
331
+ */
332
+ export function listProjects() {
333
+ const projects = getRegisteredProjects(true);
334
+ if (projects.length === 0) {
335
+ console.log("No registered OpenWolf projects.");
336
+ console.log("Run 'openwolf init' in a project directory to register it.");
337
+ return;
338
+ }
339
+ console.log(`Registered OpenWolf projects (${projects.length}):\n`);
340
+ for (const p of projects) {
341
+ const age = Math.floor((Date.now() - new Date(p.last_updated).getTime()) / (1000 * 60 * 60 * 24));
342
+ console.log(` ${p.name}`);
343
+ console.log(` Path: ${p.root}`);
344
+ console.log(` Version: ${p.version} | Updated: ${age}d ago`);
345
+ console.log("");
346
+ }
347
+ }
348
+ /**
349
+ * Restore a project's .wolf from a backup
350
+ */
351
+ export function restoreCommand(backupName) {
352
+ const wolfDir = path.join(process.cwd(), ".wolf");
353
+ const backupsDir = path.join(wolfDir, "backups");
354
+ if (!fs.existsSync(backupsDir)) {
355
+ console.log("No backups found for this project.");
356
+ return;
357
+ }
358
+ const backups = fs.readdirSync(backupsDir)
359
+ .filter(d => fs.statSync(path.join(backupsDir, d)).isDirectory())
360
+ .sort()
361
+ .reverse();
362
+ if (backups.length === 0) {
363
+ console.log("No backups found.");
364
+ return;
365
+ }
366
+ if (!backupName) {
367
+ console.log(`Available backups (${backups.length}):\n`);
368
+ for (const b of backups) {
369
+ const files = fs.readdirSync(path.join(backupsDir, b)).filter(f => !fs.statSync(path.join(backupsDir, b, f)).isDirectory());
370
+ console.log(` ${b} (${files.length} files)`);
371
+ }
372
+ console.log(`\nTo restore: openwolf restore <backup-name>`);
373
+ return;
374
+ }
375
+ const backupDir = path.join(backupsDir, backupName);
376
+ if (!fs.existsSync(backupDir)) {
377
+ console.log(`Backup "${backupName}" not found.`);
378
+ return;
379
+ }
380
+ // Restore files
381
+ const files = fs.readdirSync(backupDir).filter(f => fs.statSync(path.join(backupDir, f)).isFile());
382
+ for (const file of files) {
383
+ fs.copyFileSync(path.join(backupDir, file), path.join(wolfDir, file));
384
+ }
385
+ // Restore hooks if present
386
+ const hooksBackup = path.join(backupDir, "hooks");
387
+ if (fs.existsSync(hooksBackup)) {
388
+ const hookFiles = fs.readdirSync(hooksBackup);
389
+ const hooksDir = path.join(wolfDir, "hooks");
390
+ ensureDir(hooksDir);
391
+ for (const f of hookFiles) {
392
+ fs.copyFileSync(path.join(hooksBackup, f), path.join(hooksDir, f));
393
+ }
394
+ }
395
+ // Restore .claude settings if present
396
+ const claudeBackup = path.join(backupDir, ".claude");
397
+ if (fs.existsSync(claudeBackup)) {
398
+ const projectRoot = path.dirname(wolfDir);
399
+ const settingsBackup = path.join(claudeBackup, "settings.json");
400
+ if (fs.existsSync(settingsBackup)) {
401
+ const dest = path.join(projectRoot, ".claude", "settings.json");
402
+ ensureDir(path.dirname(dest));
403
+ fs.copyFileSync(settingsBackup, dest);
404
+ }
405
+ const rulesBackup = path.join(claudeBackup, "rules", "openwolf.md");
406
+ if (fs.existsSync(rulesBackup)) {
407
+ const dest = path.join(projectRoot, ".claude", "rules", "openwolf.md");
408
+ ensureDir(path.dirname(dest));
409
+ fs.copyFileSync(rulesBackup, dest);
410
+ }
411
+ }
412
+ console.log(`Restored ${files.length} files from backup "${backupName}".`);
413
+ }
414
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/update.ts"],"names":[],"mappings":"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"}