openwolf-enhanced 1.9.3
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/CHANGELOG.md +386 -0
- package/LICENSE +663 -0
- package/NOTICE +48 -0
- package/README.md +283 -0
- package/dist/bin/openwolf.js +10 -0
- package/dist/bin/openwolf.js.map +1 -0
- package/dist/dashboard/assets/AISuggestions-DHXOgHMM.js +9 -0
- package/dist/dashboard/assets/ActivityTimeline-BXLwacZV.js +1 -0
- package/dist/dashboard/assets/AnatomyBrowser-CUyC8M2I.js +1 -0
- package/dist/dashboard/assets/BugLog-Bxvy1sPW.js +1 -0
- package/dist/dashboard/assets/CerebrumViewer-DCySVmzA.js +1 -0
- package/dist/dashboard/assets/CronStatus-BA4fmQX3.js +1 -0
- package/dist/dashboard/assets/DesignQC-BhNEKryS.js +1 -0
- package/dist/dashboard/assets/MemoryViewer-0y9lsDUO.js +1 -0
- package/dist/dashboard/assets/ProjectOverview-CC51rVRe.js +1 -0
- package/dist/dashboard/assets/StatusBadge-4NJI_F2G.js +1 -0
- package/dist/dashboard/assets/TokenUsage-7pCxlnCX.js +55 -0
- package/dist/dashboard/assets/index-4O5rk-qB.css +2 -0
- package/dist/dashboard/assets/index-jfgWxxsn.js +13 -0
- package/dist/dashboard/assets/utils-BqE_aDxV.js +1 -0
- package/dist/dashboard/index.html +16 -0
- package/dist/hooks/post-read.js +85 -0
- package/dist/hooks/post-write.js +520 -0
- package/dist/hooks/pre-read.js +107 -0
- package/dist/hooks/pre-write.js +120 -0
- package/dist/hooks/session-start.js +76 -0
- package/dist/hooks/shared.js +0 -0
- package/dist/hooks/stop.js +219 -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 +89 -0
- package/dist/src/buglog/bug-tracker.js.map +1 -0
- package/dist/src/cli/bug-cmd.js +31 -0
- package/dist/src/cli/bug-cmd.js.map +1 -0
- package/dist/src/cli/cron-cmd.js +107 -0
- package/dist/src/cli/cron-cmd.js.map +1 -0
- package/dist/src/cli/daemon-cmd.js +180 -0
- package/dist/src/cli/daemon-cmd.js.map +1 -0
- package/dist/src/cli/dashboard.js +88 -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/doctor-cmd.js +94 -0
- package/dist/src/cli/doctor-cmd.js.map +1 -0
- package/dist/src/cli/index.js +158 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/init.js +493 -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 +98 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/update.js +435 -0
- package/dist/src/cli/update.js.map +1 -0
- package/dist/src/daemon/cron-engine.js +321 -0
- package/dist/src/daemon/cron-engine.js.map +1 -0
- package/dist/src/daemon/file-watcher.js +64 -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 +440 -0
- package/dist/src/daemon/wolf-daemon.js.map +1 -0
- package/dist/src/designqc/designqc-capture.js +278 -0
- package/dist/src/designqc/designqc-capture.js.map +1 -0
- package/dist/src/designqc/designqc-engine.js +159 -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 +86 -0
- package/dist/src/hooks/post-read.js.map +1 -0
- package/dist/src/hooks/post-write.js +521 -0
- package/dist/src/hooks/post-write.js.map +1 -0
- package/dist/src/hooks/pre-read.js +108 -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 +0 -0
- package/dist/src/hooks/shared.js.map +1 -0
- package/dist/src/hooks/stop.js +220 -0
- package/dist/src/hooks/stop.js.map +1 -0
- package/dist/src/scanner/anatomy-scanner.js +278 -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 +52 -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 +55 -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/dashboard-auth.js +50 -0
- package/dist/src/utils/dashboard-auth.js.map +1 -0
- package/dist/src/utils/fs-safe.js +135 -0
- package/dist/src/utils/fs-safe.js.map +1 -0
- package/dist/src/utils/hooks-deploy.js +70 -0
- package/dist/src/utils/hooks-deploy.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/maintenance.js +385 -0
- package/dist/src/utils/maintenance.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/dist/src/utils/seed.js +61 -0
- package/dist/src/utils/seed.js.map +1 -0
- package/package.json +82 -0
- package/src/templates/OPENWOLF.md +147 -0
- package/src/templates/STATUS.md +48 -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 +17 -0
- package/src/templates/config.json +83 -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 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-deploy.js","sourceRoot":"","sources":["../../../src/utils/hooks-deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,kBAAkB;IAClB,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,SAAS;IACT,WAAW;CACZ,CAAC;AAEF,iGAAiG;AACjG,SAAS,kBAAkB;IACzB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,kDAAkD;QAChG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAQ,4CAA4C;KAC3F,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpB,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC7C,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACzF,CAAC;IAED,8DAA8D;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAE5F,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
const LEVEL_ORDER = {
|
|
4
|
+
debug: 0,
|
|
5
|
+
info: 1,
|
|
6
|
+
warn: 2,
|
|
7
|
+
error: 3,
|
|
8
|
+
};
|
|
9
|
+
export class Logger {
|
|
10
|
+
logFile;
|
|
11
|
+
level;
|
|
12
|
+
constructor(logFile, level = "info") {
|
|
13
|
+
this.logFile = logFile;
|
|
14
|
+
this.level = level;
|
|
15
|
+
if (logFile) {
|
|
16
|
+
const dir = path.dirname(logFile);
|
|
17
|
+
if (!fs.existsSync(dir)) {
|
|
18
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
shouldLog(level) {
|
|
23
|
+
return LEVEL_ORDER[level] >= LEVEL_ORDER[this.level];
|
|
24
|
+
}
|
|
25
|
+
format(level, message) {
|
|
26
|
+
const ts = new Date().toISOString();
|
|
27
|
+
return `[${ts}] [${level.toUpperCase()}] ${message}`;
|
|
28
|
+
}
|
|
29
|
+
write(level, message) {
|
|
30
|
+
if (!this.shouldLog(level))
|
|
31
|
+
return;
|
|
32
|
+
const line = this.format(level, message);
|
|
33
|
+
if (level === "error") {
|
|
34
|
+
console.error(line);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.log(line);
|
|
38
|
+
}
|
|
39
|
+
if (this.logFile) {
|
|
40
|
+
fs.appendFileSync(this.logFile, line + "\n", "utf-8");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
debug(msg) { this.write("debug", msg); }
|
|
44
|
+
info(msg) { this.write("info", msg); }
|
|
45
|
+
warn(msg) { this.write("warn", msg); }
|
|
46
|
+
error(msg) { this.write("error", msg); }
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,OAAO,MAAM;IACT,OAAO,CAAgB;IACvB,KAAK,CAAW;IAExB,YAAY,OAAsB,EAAE,KAAK,GAAa,MAAM;QAC1D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,KAAe;QAC/B,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAEO,MAAM,CAAC,KAAe,EAAE,OAAe;QAC7C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;IACvD,CAAC;IAEO,KAAK,CAAC,KAAe,EAAE,OAAe;QAC5C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACpD,KAAK,CAAC,GAAW,IAAU,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CACvD"}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { readJSON, writeJSON, readText, writeText } from "./fs-safe.js";
|
|
4
|
+
export const DEFAULT_RETENTION = {
|
|
5
|
+
token_ledger_max_sessions: 200,
|
|
6
|
+
session_io_max: 100,
|
|
7
|
+
buglog_max_entries: 200,
|
|
8
|
+
backups_keep: 10,
|
|
9
|
+
memory_consolidate_after_days: 7,
|
|
10
|
+
memory_max_bytes: 262144, // 256 KB
|
|
11
|
+
daemon_log_max_bytes: 524288, // 512 KB
|
|
12
|
+
};
|
|
13
|
+
export function getRetention(wolfDir) {
|
|
14
|
+
const cfg = readJSON(path.join(wolfDir, "config.json"), {});
|
|
15
|
+
return { ...DEFAULT_RETENTION, ...(cfg.openwolf?.retention ?? {}) };
|
|
16
|
+
}
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// .wolfignore matcher (mirror of hooks/shared.ts — separate build roots).
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
export function makeIgnoreMatcher(patterns) {
|
|
21
|
+
const pats = patterns
|
|
22
|
+
.map((p) => p.trim())
|
|
23
|
+
.filter((p) => p && !p.startsWith("#") && !p.startsWith("!"));
|
|
24
|
+
if (pats.length === 0)
|
|
25
|
+
return () => false;
|
|
26
|
+
return (relPath) => {
|
|
27
|
+
const norm = relPath.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
28
|
+
const parts = norm.split("/");
|
|
29
|
+
const base = parts[parts.length - 1];
|
|
30
|
+
for (const raw of pats) {
|
|
31
|
+
const pat = raw.replace(/\/+$/, "");
|
|
32
|
+
if (norm === pat || base === pat)
|
|
33
|
+
return true;
|
|
34
|
+
if (parts.includes(pat))
|
|
35
|
+
return true;
|
|
36
|
+
if (pat.startsWith("*.") && norm.endsWith(pat.slice(1)))
|
|
37
|
+
return true;
|
|
38
|
+
if (norm.startsWith(pat + "/"))
|
|
39
|
+
return true;
|
|
40
|
+
if (pat.includes("*")) {
|
|
41
|
+
const re = new RegExp("^" +
|
|
42
|
+
pat
|
|
43
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
44
|
+
.replace(/\*\*/g, " ")
|
|
45
|
+
.replace(/\*/g, "[^/]*")
|
|
46
|
+
.replace(/ /g, ".*") +
|
|
47
|
+
"$");
|
|
48
|
+
if (re.test(norm) || re.test(base))
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function loadWolfignore(projectRoot) {
|
|
56
|
+
try {
|
|
57
|
+
const content = fs.readFileSync(path.join(projectRoot, ".wolfignore"), "utf-8");
|
|
58
|
+
return makeIgnoreMatcher(content.split("\n"));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return () => false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Combined ignore matcher: honors .gitignore AND .wolfignore (upstream #15).
|
|
65
|
+
export function loadIgnore(projectRoot) {
|
|
66
|
+
const lines = [];
|
|
67
|
+
for (const f of [".gitignore", ".wolfignore"]) {
|
|
68
|
+
try {
|
|
69
|
+
lines.push(...fs.readFileSync(path.join(projectRoot, f), "utf-8").split("\n"));
|
|
70
|
+
}
|
|
71
|
+
catch { /* absent */ }
|
|
72
|
+
}
|
|
73
|
+
return makeIgnoreMatcher(lines);
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Size helpers
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
export function humanBytes(n) {
|
|
79
|
+
if (n < 1024)
|
|
80
|
+
return `${n} B`;
|
|
81
|
+
if (n < 1024 * 1024)
|
|
82
|
+
return `${(n / 1024).toFixed(1)} KB`;
|
|
83
|
+
return `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
84
|
+
}
|
|
85
|
+
export function fileSize(p) {
|
|
86
|
+
try {
|
|
87
|
+
return fs.statSync(p).size;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function dirSize(dir) {
|
|
94
|
+
let total = 0;
|
|
95
|
+
let entries;
|
|
96
|
+
try {
|
|
97
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
for (const e of entries) {
|
|
103
|
+
const full = path.join(dir, e.name);
|
|
104
|
+
if (e.isDirectory())
|
|
105
|
+
total += dirSize(full);
|
|
106
|
+
else
|
|
107
|
+
total += fileSize(full);
|
|
108
|
+
}
|
|
109
|
+
return total;
|
|
110
|
+
}
|
|
111
|
+
// Per-item footprint of a .wolf directory plus soft-limit warnings.
|
|
112
|
+
export function footprint(wolfDir, ret) {
|
|
113
|
+
const items = [];
|
|
114
|
+
const warnings = [];
|
|
115
|
+
const push = (name, warn) => {
|
|
116
|
+
const full = path.join(wolfDir, name);
|
|
117
|
+
const bytes = fs.existsSync(full)
|
|
118
|
+
? fs.statSync(full).isDirectory()
|
|
119
|
+
? dirSize(full)
|
|
120
|
+
: fileSize(full)
|
|
121
|
+
: 0;
|
|
122
|
+
if (bytes > 0)
|
|
123
|
+
items.push({ name, bytes, warn });
|
|
124
|
+
if (warn && bytes > 0)
|
|
125
|
+
warnings.push(`${name}: ${humanBytes(bytes)} — ${warn}`);
|
|
126
|
+
};
|
|
127
|
+
// Live files that can grow
|
|
128
|
+
const ledgerBytes = fileSize(path.join(wolfDir, "token-ledger.json"));
|
|
129
|
+
items.push({ name: "token-ledger.json", bytes: ledgerBytes });
|
|
130
|
+
if (ledgerBytes > 3 * 1024 * 1024) {
|
|
131
|
+
warnings.push(`token-ledger.json: ${humanBytes(ledgerBytes)} — run 'openwolf doctor' to compact`);
|
|
132
|
+
}
|
|
133
|
+
const memBytes = fileSize(path.join(wolfDir, "memory.md"));
|
|
134
|
+
items.push({ name: "memory.md", bytes: memBytes });
|
|
135
|
+
if (memBytes > ret.memory_max_bytes) {
|
|
136
|
+
warnings.push(`memory.md: ${humanBytes(memBytes)} — exceeds ${humanBytes(ret.memory_max_bytes)}, consolidate with 'openwolf doctor'`);
|
|
137
|
+
}
|
|
138
|
+
const bugBytes = fileSize(path.join(wolfDir, "buglog.json"));
|
|
139
|
+
items.push({ name: "buglog.json", bytes: bugBytes });
|
|
140
|
+
for (const f of ["anatomy.md", "cerebrum.md", "cron-state.json"]) {
|
|
141
|
+
const b = fileSize(path.join(wolfDir, f));
|
|
142
|
+
if (b > 0)
|
|
143
|
+
items.push({ name: f, bytes: b });
|
|
144
|
+
}
|
|
145
|
+
const logBytes = fileSize(path.join(wolfDir, "daemon.log"));
|
|
146
|
+
if (logBytes > 0) {
|
|
147
|
+
items.push({ name: "daemon.log", bytes: logBytes });
|
|
148
|
+
if (logBytes > ret.daemon_log_max_bytes) {
|
|
149
|
+
warnings.push(`daemon.log: ${humanBytes(logBytes)} — rotate with 'openwolf doctor'`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Directories
|
|
153
|
+
const backupsDir = path.join(wolfDir, "backups");
|
|
154
|
+
if (fs.existsSync(backupsDir)) {
|
|
155
|
+
const count = safeReaddir(backupsDir).length;
|
|
156
|
+
const b = dirSize(backupsDir);
|
|
157
|
+
items.push({ name: `backups/ (${count})`, bytes: b });
|
|
158
|
+
if (count > ret.backups_keep) {
|
|
159
|
+
warnings.push(`backups/: ${count} kept — prune to ${ret.backups_keep} with 'openwolf doctor'`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const capturesDir = path.join(wolfDir, "designqc-captures");
|
|
163
|
+
if (fs.existsSync(capturesDir)) {
|
|
164
|
+
items.push({ name: "designqc-captures/", bytes: dirSize(capturesDir) });
|
|
165
|
+
}
|
|
166
|
+
items.sort((a, b) => b.bytes - a.bytes);
|
|
167
|
+
return { total: dirSize(wolfDir), items, warnings };
|
|
168
|
+
}
|
|
169
|
+
function safeReaddir(dir) {
|
|
170
|
+
try {
|
|
171
|
+
return fs.readdirSync(dir);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const noop = (name) => ({ changed: false, before: 0, after: 0, detail: `${name}: nothing to do` });
|
|
178
|
+
export function compactLedger(wolfDir, ret) {
|
|
179
|
+
const p = path.join(wolfDir, "token-ledger.json");
|
|
180
|
+
if (!fs.existsSync(p))
|
|
181
|
+
return noop("token-ledger");
|
|
182
|
+
const before = fileSize(p);
|
|
183
|
+
const ledger = readJSON(p, {});
|
|
184
|
+
if (!Array.isArray(ledger.sessions))
|
|
185
|
+
return noop("token-ledger");
|
|
186
|
+
let changed = false;
|
|
187
|
+
for (const s of ledger.sessions) {
|
|
188
|
+
if (Array.isArray(s.reads) && s.reads.length > ret.session_io_max) {
|
|
189
|
+
s.reads = s.reads.slice(-ret.session_io_max);
|
|
190
|
+
changed = true;
|
|
191
|
+
}
|
|
192
|
+
if (Array.isArray(s.writes) && s.writes.length > ret.session_io_max) {
|
|
193
|
+
s.writes = s.writes.slice(-ret.session_io_max);
|
|
194
|
+
changed = true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (ledger.sessions.length > ret.token_ledger_max_sessions) {
|
|
198
|
+
ledger.sessions = ledger.sessions.slice(-ret.token_ledger_max_sessions);
|
|
199
|
+
changed = true;
|
|
200
|
+
}
|
|
201
|
+
if (!changed)
|
|
202
|
+
return { changed: false, before, after: before, detail: `token-ledger: within limits (${before ? humanBytes(before) : "0"})` };
|
|
203
|
+
writeJSON(p, ledger);
|
|
204
|
+
const after = fileSize(p);
|
|
205
|
+
return { changed: true, before, after, detail: `token-ledger: ${ledger.sessions.length} sessions kept, ${humanBytes(before)} → ${humanBytes(after)}` };
|
|
206
|
+
}
|
|
207
|
+
// Summarize sessions older than `olderThanDays` down to a single line each.
|
|
208
|
+
// Mirrors the daemon's consolidateMemory so it also runs without the daemon.
|
|
209
|
+
export function consolidateMemory(wolfDir, olderThanDays) {
|
|
210
|
+
const p = path.join(wolfDir, "memory.md");
|
|
211
|
+
const content = readText(p);
|
|
212
|
+
if (!content)
|
|
213
|
+
return noop("memory");
|
|
214
|
+
const before = Buffer.byteLength(content, "utf-8");
|
|
215
|
+
const cutoff = new Date();
|
|
216
|
+
cutoff.setDate(cutoff.getDate() - olderThanDays);
|
|
217
|
+
const lines = content.split("\n");
|
|
218
|
+
const out = [];
|
|
219
|
+
let inOld = false;
|
|
220
|
+
let oldLines = [];
|
|
221
|
+
let consolidated = 0;
|
|
222
|
+
const flush = () => {
|
|
223
|
+
if (inOld && oldLines.length > 0) {
|
|
224
|
+
// Already-consolidated blocks are kept verbatim → idempotent, preserves counts.
|
|
225
|
+
if (oldLines.some((l) => l.startsWith("> Consolidated session"))) {
|
|
226
|
+
for (const l of oldLines)
|
|
227
|
+
out.push(l);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const actions = oldLines.filter((l) => l.startsWith("|") && !l.startsWith("|--") && !/^\|\s*Time/i.test(l)).length;
|
|
231
|
+
out.push(`> Consolidated session (${actions} actions)`);
|
|
232
|
+
out.push("");
|
|
233
|
+
consolidated++;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
for (const line of lines) {
|
|
237
|
+
const m = line.match(/^## Session: (\d{4}-\d{2}-\d{2})/);
|
|
238
|
+
if (m) {
|
|
239
|
+
flush();
|
|
240
|
+
const d = new Date(m[1]);
|
|
241
|
+
inOld = d < cutoff;
|
|
242
|
+
oldLines = [];
|
|
243
|
+
out.push(line);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (inOld)
|
|
247
|
+
oldLines.push(line);
|
|
248
|
+
else
|
|
249
|
+
out.push(line);
|
|
250
|
+
}
|
|
251
|
+
flush();
|
|
252
|
+
const result = out.join("\n");
|
|
253
|
+
const after = Buffer.byteLength(result, "utf-8");
|
|
254
|
+
if (after >= before || consolidated === 0)
|
|
255
|
+
return { changed: false, before, after: before, detail: `memory.md: no sessions older than ${olderThanDays}d` };
|
|
256
|
+
writeText(p, result);
|
|
257
|
+
return { changed: true, before, after, detail: `memory.md: ${consolidated} old sessions consolidated, ${humanBytes(before)} → ${humanBytes(after)}` };
|
|
258
|
+
}
|
|
259
|
+
// Merge auto-detected duplicates (same basename + same category) and cap the total.
|
|
260
|
+
export function dedupeAndCapBuglog(wolfDir, max) {
|
|
261
|
+
const p = path.join(wolfDir, "buglog.json");
|
|
262
|
+
if (!fs.existsSync(p))
|
|
263
|
+
return noop("buglog");
|
|
264
|
+
const before = fileSize(p);
|
|
265
|
+
// Tolerate legacy bare-array buglogs ([...]) as well as {version, bugs:[]}.
|
|
266
|
+
const raw = readJSON(p, { version: 1, bugs: [] });
|
|
267
|
+
const wasArray = Array.isArray(raw);
|
|
268
|
+
const log = wasArray
|
|
269
|
+
? { version: 1, bugs: raw }
|
|
270
|
+
: raw;
|
|
271
|
+
const bugs = Array.isArray(log.bugs) ? log.bugs : [];
|
|
272
|
+
const startCount = bugs.length;
|
|
273
|
+
const key = (b) => `${path.basename(b.file || "")}::${(b.tags || []).filter((t) => t !== "auto-detected").sort().join(",")}`;
|
|
274
|
+
const merged = new Map();
|
|
275
|
+
const manual = [];
|
|
276
|
+
for (const b of bugs) {
|
|
277
|
+
// Only fold auto-detected entries; keep manual bugs untouched and un-deduped.
|
|
278
|
+
if (!(b.tags || []).includes("auto-detected")) {
|
|
279
|
+
manual.push(b);
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
const k = key(b);
|
|
283
|
+
const prev = merged.get(k);
|
|
284
|
+
if (prev) {
|
|
285
|
+
prev.occurrences = (prev.occurrences ?? 1) + (b.occurrences ?? 1);
|
|
286
|
+
if (b.last_seen && (!prev.last_seen || b.last_seen > prev.last_seen))
|
|
287
|
+
prev.last_seen = b.last_seen;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
merged.set(k, { ...b });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
let result = [...manual, ...merged.values()];
|
|
294
|
+
if (result.length > max)
|
|
295
|
+
result = result.slice(-max);
|
|
296
|
+
// No change AND already in the canonical object form → nothing to do.
|
|
297
|
+
if (result.length === startCount && !wasArray) {
|
|
298
|
+
return { changed: false, before, after: before, detail: `buglog: ${startCount} entries, within limits` };
|
|
299
|
+
}
|
|
300
|
+
writeJSON(p, { version: log.version ?? 1, bugs: result });
|
|
301
|
+
const after = fileSize(p);
|
|
302
|
+
const note = wasArray ? " (migrated legacy array → {version,bugs})" : "";
|
|
303
|
+
return { changed: true, before, after, detail: `buglog: ${startCount} → ${result.length} entries${note}, ${humanBytes(before)} → ${humanBytes(after)}` };
|
|
304
|
+
}
|
|
305
|
+
export function pruneBackups(wolfDir, keep) {
|
|
306
|
+
const dir = path.join(wolfDir, "backups");
|
|
307
|
+
if (!fs.existsSync(dir))
|
|
308
|
+
return noop("backups");
|
|
309
|
+
const before = dirSize(dir);
|
|
310
|
+
const entries = safeReaddir(dir)
|
|
311
|
+
.map((n) => ({ name: n, full: path.join(dir, n) }))
|
|
312
|
+
.filter((e) => {
|
|
313
|
+
try {
|
|
314
|
+
return fs.statSync(e.full).isDirectory();
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
.sort((a, b) => a.name.localeCompare(b.name)); // stamped names sort chronologically
|
|
321
|
+
if (entries.length <= keep)
|
|
322
|
+
return { changed: false, before, after: before, detail: `backups: ${entries.length} kept, within limit (${keep})` };
|
|
323
|
+
const toRemove = entries.slice(0, entries.length - keep);
|
|
324
|
+
for (const e of toRemove) {
|
|
325
|
+
try {
|
|
326
|
+
fs.rmSync(e.full, { recursive: true, force: true });
|
|
327
|
+
}
|
|
328
|
+
catch { }
|
|
329
|
+
}
|
|
330
|
+
const after = dirSize(dir);
|
|
331
|
+
return { changed: true, before, after, detail: `backups: removed ${toRemove.length}, kept ${keep} (${humanBytes(before)} → ${humanBytes(after)})` };
|
|
332
|
+
}
|
|
333
|
+
export function cleanTmp(wolfDir) {
|
|
334
|
+
let removed = 0;
|
|
335
|
+
let freed = 0;
|
|
336
|
+
const walk = (dir) => {
|
|
337
|
+
for (const n of safeReaddir(dir)) {
|
|
338
|
+
const full = path.join(dir, n);
|
|
339
|
+
let st;
|
|
340
|
+
try {
|
|
341
|
+
st = fs.statSync(full);
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (st.isDirectory()) {
|
|
347
|
+
if (n !== "backups")
|
|
348
|
+
walk(full);
|
|
349
|
+
}
|
|
350
|
+
else if (n.endsWith(".tmp")) {
|
|
351
|
+
freed += st.size;
|
|
352
|
+
try {
|
|
353
|
+
fs.unlinkSync(full);
|
|
354
|
+
removed++;
|
|
355
|
+
}
|
|
356
|
+
catch { }
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
walk(wolfDir);
|
|
361
|
+
if (removed === 0)
|
|
362
|
+
return noop("tmp files");
|
|
363
|
+
return { changed: true, before: freed, after: 0, detail: `tmp: removed ${removed} stale .tmp file(s) (${humanBytes(freed)})` };
|
|
364
|
+
}
|
|
365
|
+
export function rotateDaemonLog(wolfDir, maxBytes) {
|
|
366
|
+
const p = path.join(wolfDir, "daemon.log");
|
|
367
|
+
if (!fs.existsSync(p))
|
|
368
|
+
return noop("daemon.log");
|
|
369
|
+
const before = fileSize(p);
|
|
370
|
+
if (before <= maxBytes)
|
|
371
|
+
return { changed: false, before, after: before, detail: `daemon.log: ${humanBytes(before)}, within limit` };
|
|
372
|
+
// Keep the tail (most recent half of the limit).
|
|
373
|
+
try {
|
|
374
|
+
const content = readText(p);
|
|
375
|
+
const keep = content.slice(-Math.floor(maxBytes / 2));
|
|
376
|
+
const trimmed = keep.slice(keep.indexOf("\n") + 1); // start at a clean line boundary
|
|
377
|
+
writeText(p, `> [rotated by openwolf doctor]\n${trimmed}`);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return noop("daemon.log");
|
|
381
|
+
}
|
|
382
|
+
const after = fileSize(p);
|
|
383
|
+
return { changed: true, before, after, detail: `daemon.log: rotated ${humanBytes(before)} → ${humanBytes(after)}` };
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=maintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../../src/utils/maintenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
export function normalizePath(p) {
|
|
4
|
+
return p.replace(/\\/g, "/");
|
|
5
|
+
}
|
|
6
|
+
export function getWolfDir(from) {
|
|
7
|
+
const base = from ?? process.cwd();
|
|
8
|
+
return path.join(base, ".wolf");
|
|
9
|
+
}
|
|
10
|
+
export function resolveWolfFile(file, from) {
|
|
11
|
+
return path.join(getWolfDir(from), file);
|
|
12
|
+
}
|
|
13
|
+
export function ensureDir(dir) {
|
|
14
|
+
if (!fs.existsSync(dir)) {
|
|
15
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function relativeToCwd(filePath, cwd) {
|
|
19
|
+
const base = cwd ?? process.cwd();
|
|
20
|
+
const rel = path.relative(base, filePath);
|
|
21
|
+
return normalizePath(rel);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,MAAM,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAa;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,GAAY;IAC1D,MAAM,IAAI,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as os from "node:os";
|
|
2
|
+
export function isWindows() {
|
|
3
|
+
return os.platform() === "win32";
|
|
4
|
+
}
|
|
5
|
+
export function isMac() {
|
|
6
|
+
return os.platform() === "darwin";
|
|
7
|
+
}
|
|
8
|
+
export function isLinux() {
|
|
9
|
+
return os.platform() === "linux";
|
|
10
|
+
}
|
|
11
|
+
export function whichCommand() {
|
|
12
|
+
return isWindows() ? "where" : "which";
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seeding user-data files from templates.
|
|
3
|
+
*
|
|
4
|
+
* `USER_DATA_FILES` are never overwritten — but "never overwrite" was implemented as "never
|
|
5
|
+
* touch", so a project initialised before a file was introduced never received it at all. The
|
|
6
|
+
* concrete casualty was `STATUS.md` (added in 1.4.0): projects created earlier had none, while
|
|
7
|
+
* `OPENWOLF.md` instructed the agent to read it first.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
import { readText, writeText, safeCopyFile } from "./fs-safe.js";
|
|
12
|
+
/** Best-effort project name from the usual manifests, falling back to the directory name. */
|
|
13
|
+
export function detectProjectName(projectRoot) {
|
|
14
|
+
try {
|
|
15
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf-8"));
|
|
16
|
+
if (pkg.name)
|
|
17
|
+
return pkg.name;
|
|
18
|
+
}
|
|
19
|
+
catch { }
|
|
20
|
+
for (const manifest of ["Cargo.toml", "pyproject.toml"]) {
|
|
21
|
+
try {
|
|
22
|
+
const text = fs.readFileSync(path.join(projectRoot, manifest), "utf-8");
|
|
23
|
+
const m = text.match(/^name\s*=\s*"([^"]+)"/m);
|
|
24
|
+
if (m)
|
|
25
|
+
return m[1];
|
|
26
|
+
}
|
|
27
|
+
catch { }
|
|
28
|
+
}
|
|
29
|
+
return path.basename(projectRoot);
|
|
30
|
+
}
|
|
31
|
+
/** Substitute `{{PROJECT_NAME}}` / `{{DATE}}` in an already-written template file. */
|
|
32
|
+
export function applyTemplatePlaceholders(filePath, projectRoot) {
|
|
33
|
+
if (!fs.existsSync(filePath))
|
|
34
|
+
return;
|
|
35
|
+
const projectName = detectProjectName(projectRoot);
|
|
36
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
37
|
+
const content = readText(filePath)
|
|
38
|
+
.replace(/\{\{PROJECT_NAME\}\}/g, projectName)
|
|
39
|
+
.replace(/\{\{DATE\}\}/g, date);
|
|
40
|
+
writeText(filePath, content);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Copy any `files` that are missing from `wolfDir` out of `templatesDir`, then substitute
|
|
44
|
+
* placeholders. Existing files are left strictly alone. Returns the names actually seeded.
|
|
45
|
+
*/
|
|
46
|
+
export function seedMissingUserData(wolfDir, projectRoot, templatesDir, files) {
|
|
47
|
+
const seeded = [];
|
|
48
|
+
for (const file of files) {
|
|
49
|
+
const dest = path.join(wolfDir, file);
|
|
50
|
+
if (fs.existsSync(dest))
|
|
51
|
+
continue;
|
|
52
|
+
const src = path.join(templatesDir, file);
|
|
53
|
+
if (!fs.existsSync(src))
|
|
54
|
+
continue; // no template for this one (e.g. designqc-report.json)
|
|
55
|
+
safeCopyFile(src, dest);
|
|
56
|
+
applyTemplatePlaceholders(dest, projectRoot);
|
|
57
|
+
seeded.push(file);
|
|
58
|
+
}
|
|
59
|
+
return seeded;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/utils/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjE,6FAA6F;AAC7F,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACzF,IAAI,GAAG,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,KAAK,MAAM,QAAQ,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YACxE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC/C,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,WAAmB;IAC7E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IACrC,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;SAC/B,OAAO,CAAC,uBAAuB,EAAE,WAAW,CAAC;SAC7C,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,WAAmB,EACnB,YAAoB,EACpB,KAAe;IAEf,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,uDAAuD;QAC1F,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxB,yBAAyB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|