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.
- package/LICENSE +663 -0
- package/README.md +232 -0
- package/dist/bin/openwolf.js +10 -0
- package/dist/bin/openwolf.js.map +1 -0
- package/dist/dashboard/assets/AISuggestions-DzE-DQkR.js +1 -0
- package/dist/dashboard/assets/ActivityTimeline-DGVjujnt.js +1 -0
- package/dist/dashboard/assets/AnatomyBrowser-S-2rmYtw.js +1 -0
- package/dist/dashboard/assets/BugLog-CG2zDHJc.js +1 -0
- package/dist/dashboard/assets/CerebrumViewer-Dlgoy69U.js +1 -0
- package/dist/dashboard/assets/CronStatus-DxUF1iW_.js +1 -0
- package/dist/dashboard/assets/DesignQC-BGXn_aq8.js +1 -0
- package/dist/dashboard/assets/MemoryViewer-CGqkTyvQ.js +1 -0
- package/dist/dashboard/assets/ProjectOverview-DlFhu69i.js +1 -0
- package/dist/dashboard/assets/TokenUsage-DDsQiVIq.js +68 -0
- package/dist/dashboard/assets/index-CzK9GUjV.css +1 -0
- package/dist/dashboard/assets/index-PYeNGjkN.js +52 -0
- package/dist/dashboard/index.html +16 -0
- package/dist/hooks/post-read.js +68 -0
- package/dist/hooks/post-write.js +502 -0
- package/dist/hooks/pre-read.js +79 -0
- package/dist/hooks/pre-write.js +120 -0
- package/dist/hooks/session-start.js +76 -0
- package/dist/hooks/shared.js +613 -0
- package/dist/hooks/stop.js +146 -0
- package/dist/src/buglog/bug-matcher.js +3 -0
- package/dist/src/buglog/bug-matcher.js.map +1 -0
- package/dist/src/buglog/bug-tracker.js +81 -0
- package/dist/src/buglog/bug-tracker.js.map +1 -0
- package/dist/src/cli/bug-cmd.js +28 -0
- package/dist/src/cli/bug-cmd.js.map +1 -0
- package/dist/src/cli/cron-cmd.js +106 -0
- package/dist/src/cli/cron-cmd.js.map +1 -0
- package/dist/src/cli/daemon-cmd.js +177 -0
- package/dist/src/cli/daemon-cmd.js.map +1 -0
- package/dist/src/cli/dashboard.js +84 -0
- package/dist/src/cli/dashboard.js.map +1 -0
- package/dist/src/cli/designqc-cmd.js +31 -0
- package/dist/src/cli/designqc-cmd.js.map +1 -0
- package/dist/src/cli/index.js +149 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/init.js +506 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/registry.js +93 -0
- package/dist/src/cli/registry.js.map +1 -0
- package/dist/src/cli/scan.js +39 -0
- package/dist/src/cli/scan.js.map +1 -0
- package/dist/src/cli/status.js +85 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/update.js +414 -0
- package/dist/src/cli/update.js.map +1 -0
- package/dist/src/daemon/cron-engine.js +300 -0
- package/dist/src/daemon/cron-engine.js.map +1 -0
- package/dist/src/daemon/file-watcher.js +53 -0
- package/dist/src/daemon/file-watcher.js.map +1 -0
- package/dist/src/daemon/health.js +23 -0
- package/dist/src/daemon/health.js.map +1 -0
- package/dist/src/daemon/wolf-daemon.js +294 -0
- package/dist/src/daemon/wolf-daemon.js.map +1 -0
- package/dist/src/designqc/designqc-capture.js +235 -0
- package/dist/src/designqc/designqc-capture.js.map +1 -0
- package/dist/src/designqc/designqc-engine.js +141 -0
- package/dist/src/designqc/designqc-engine.js.map +1 -0
- package/dist/src/designqc/designqc-types.js +5 -0
- package/dist/src/designqc/designqc-types.js.map +1 -0
- package/dist/src/hooks/post-read.js +69 -0
- package/dist/src/hooks/post-read.js.map +1 -0
- package/dist/src/hooks/post-write.js +503 -0
- package/dist/src/hooks/post-write.js.map +1 -0
- package/dist/src/hooks/pre-read.js +80 -0
- package/dist/src/hooks/pre-read.js.map +1 -0
- package/dist/src/hooks/pre-write.js +121 -0
- package/dist/src/hooks/pre-write.js.map +1 -0
- package/dist/src/hooks/session-start.js +77 -0
- package/dist/src/hooks/session-start.js.map +1 -0
- package/dist/src/hooks/shared.js +614 -0
- package/dist/src/hooks/shared.js.map +1 -0
- package/dist/src/hooks/stop.js +147 -0
- package/dist/src/hooks/stop.js.map +1 -0
- package/dist/src/scanner/anatomy-scanner.js +260 -0
- package/dist/src/scanner/anatomy-scanner.js.map +1 -0
- package/dist/src/scanner/description-extractor.js +1007 -0
- package/dist/src/scanner/description-extractor.js.map +1 -0
- package/dist/src/scanner/project-root.js +42 -0
- package/dist/src/scanner/project-root.js.map +1 -0
- package/dist/src/tracker/token-estimator.js +20 -0
- package/dist/src/tracker/token-estimator.js.map +1 -0
- package/dist/src/tracker/token-ledger.js +45 -0
- package/dist/src/tracker/token-ledger.js.map +1 -0
- package/dist/src/tracker/waste-detector.js +101 -0
- package/dist/src/tracker/waste-detector.js.map +1 -0
- package/dist/src/utils/fs-safe.js +74 -0
- package/dist/src/utils/fs-safe.js.map +1 -0
- package/dist/src/utils/logger.js +48 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/paths.js +23 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/platform.js +14 -0
- package/dist/src/utils/platform.js.map +1 -0
- package/package.json +77 -0
- package/src/templates/OPENWOLF.md +135 -0
- package/src/templates/anatomy.md +5 -0
- package/src/templates/buglog.json +4 -0
- package/src/templates/cerebrum.md +22 -0
- package/src/templates/claude-md-snippet.md +5 -0
- package/src/templates/claude-rules-openwolf.md +15 -0
- package/src/templates/config.json +73 -0
- package/src/templates/cron-manifest.json +97 -0
- package/src/templates/cron-state.json +7 -0
- package/src/templates/identity.md +9 -0
- package/src/templates/memory.md +4 -0
- package/src/templates/reframe-frameworks.md +597 -0
- 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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"}
|