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.
Files changed (127) hide show
  1. package/CHANGELOG.md +386 -0
  2. package/LICENSE +663 -0
  3. package/NOTICE +48 -0
  4. package/README.md +283 -0
  5. package/dist/bin/openwolf.js +10 -0
  6. package/dist/bin/openwolf.js.map +1 -0
  7. package/dist/dashboard/assets/AISuggestions-DHXOgHMM.js +9 -0
  8. package/dist/dashboard/assets/ActivityTimeline-BXLwacZV.js +1 -0
  9. package/dist/dashboard/assets/AnatomyBrowser-CUyC8M2I.js +1 -0
  10. package/dist/dashboard/assets/BugLog-Bxvy1sPW.js +1 -0
  11. package/dist/dashboard/assets/CerebrumViewer-DCySVmzA.js +1 -0
  12. package/dist/dashboard/assets/CronStatus-BA4fmQX3.js +1 -0
  13. package/dist/dashboard/assets/DesignQC-BhNEKryS.js +1 -0
  14. package/dist/dashboard/assets/MemoryViewer-0y9lsDUO.js +1 -0
  15. package/dist/dashboard/assets/ProjectOverview-CC51rVRe.js +1 -0
  16. package/dist/dashboard/assets/StatusBadge-4NJI_F2G.js +1 -0
  17. package/dist/dashboard/assets/TokenUsage-7pCxlnCX.js +55 -0
  18. package/dist/dashboard/assets/index-4O5rk-qB.css +2 -0
  19. package/dist/dashboard/assets/index-jfgWxxsn.js +13 -0
  20. package/dist/dashboard/assets/utils-BqE_aDxV.js +1 -0
  21. package/dist/dashboard/index.html +16 -0
  22. package/dist/hooks/post-read.js +85 -0
  23. package/dist/hooks/post-write.js +520 -0
  24. package/dist/hooks/pre-read.js +107 -0
  25. package/dist/hooks/pre-write.js +120 -0
  26. package/dist/hooks/session-start.js +76 -0
  27. package/dist/hooks/shared.js +0 -0
  28. package/dist/hooks/stop.js +219 -0
  29. package/dist/src/buglog/bug-matcher.js +3 -0
  30. package/dist/src/buglog/bug-matcher.js.map +1 -0
  31. package/dist/src/buglog/bug-tracker.js +89 -0
  32. package/dist/src/buglog/bug-tracker.js.map +1 -0
  33. package/dist/src/cli/bug-cmd.js +31 -0
  34. package/dist/src/cli/bug-cmd.js.map +1 -0
  35. package/dist/src/cli/cron-cmd.js +107 -0
  36. package/dist/src/cli/cron-cmd.js.map +1 -0
  37. package/dist/src/cli/daemon-cmd.js +180 -0
  38. package/dist/src/cli/daemon-cmd.js.map +1 -0
  39. package/dist/src/cli/dashboard.js +88 -0
  40. package/dist/src/cli/dashboard.js.map +1 -0
  41. package/dist/src/cli/designqc-cmd.js +31 -0
  42. package/dist/src/cli/designqc-cmd.js.map +1 -0
  43. package/dist/src/cli/doctor-cmd.js +94 -0
  44. package/dist/src/cli/doctor-cmd.js.map +1 -0
  45. package/dist/src/cli/index.js +158 -0
  46. package/dist/src/cli/index.js.map +1 -0
  47. package/dist/src/cli/init.js +493 -0
  48. package/dist/src/cli/init.js.map +1 -0
  49. package/dist/src/cli/registry.js +93 -0
  50. package/dist/src/cli/registry.js.map +1 -0
  51. package/dist/src/cli/scan.js +39 -0
  52. package/dist/src/cli/scan.js.map +1 -0
  53. package/dist/src/cli/status.js +98 -0
  54. package/dist/src/cli/status.js.map +1 -0
  55. package/dist/src/cli/update.js +435 -0
  56. package/dist/src/cli/update.js.map +1 -0
  57. package/dist/src/daemon/cron-engine.js +321 -0
  58. package/dist/src/daemon/cron-engine.js.map +1 -0
  59. package/dist/src/daemon/file-watcher.js +64 -0
  60. package/dist/src/daemon/file-watcher.js.map +1 -0
  61. package/dist/src/daemon/health.js +23 -0
  62. package/dist/src/daemon/health.js.map +1 -0
  63. package/dist/src/daemon/wolf-daemon.js +440 -0
  64. package/dist/src/daemon/wolf-daemon.js.map +1 -0
  65. package/dist/src/designqc/designqc-capture.js +278 -0
  66. package/dist/src/designqc/designqc-capture.js.map +1 -0
  67. package/dist/src/designqc/designqc-engine.js +159 -0
  68. package/dist/src/designqc/designqc-engine.js.map +1 -0
  69. package/dist/src/designqc/designqc-types.js +5 -0
  70. package/dist/src/designqc/designqc-types.js.map +1 -0
  71. package/dist/src/hooks/post-read.js +86 -0
  72. package/dist/src/hooks/post-read.js.map +1 -0
  73. package/dist/src/hooks/post-write.js +521 -0
  74. package/dist/src/hooks/post-write.js.map +1 -0
  75. package/dist/src/hooks/pre-read.js +108 -0
  76. package/dist/src/hooks/pre-read.js.map +1 -0
  77. package/dist/src/hooks/pre-write.js +121 -0
  78. package/dist/src/hooks/pre-write.js.map +1 -0
  79. package/dist/src/hooks/session-start.js +77 -0
  80. package/dist/src/hooks/session-start.js.map +1 -0
  81. package/dist/src/hooks/shared.js +0 -0
  82. package/dist/src/hooks/shared.js.map +1 -0
  83. package/dist/src/hooks/stop.js +220 -0
  84. package/dist/src/hooks/stop.js.map +1 -0
  85. package/dist/src/scanner/anatomy-scanner.js +278 -0
  86. package/dist/src/scanner/anatomy-scanner.js.map +1 -0
  87. package/dist/src/scanner/description-extractor.js +1007 -0
  88. package/dist/src/scanner/description-extractor.js.map +1 -0
  89. package/dist/src/scanner/project-root.js +52 -0
  90. package/dist/src/scanner/project-root.js.map +1 -0
  91. package/dist/src/tracker/token-estimator.js +20 -0
  92. package/dist/src/tracker/token-estimator.js.map +1 -0
  93. package/dist/src/tracker/token-ledger.js +55 -0
  94. package/dist/src/tracker/token-ledger.js.map +1 -0
  95. package/dist/src/tracker/waste-detector.js +101 -0
  96. package/dist/src/tracker/waste-detector.js.map +1 -0
  97. package/dist/src/utils/dashboard-auth.js +50 -0
  98. package/dist/src/utils/dashboard-auth.js.map +1 -0
  99. package/dist/src/utils/fs-safe.js +135 -0
  100. package/dist/src/utils/fs-safe.js.map +1 -0
  101. package/dist/src/utils/hooks-deploy.js +70 -0
  102. package/dist/src/utils/hooks-deploy.js.map +1 -0
  103. package/dist/src/utils/logger.js +48 -0
  104. package/dist/src/utils/logger.js.map +1 -0
  105. package/dist/src/utils/maintenance.js +385 -0
  106. package/dist/src/utils/maintenance.js.map +1 -0
  107. package/dist/src/utils/paths.js +23 -0
  108. package/dist/src/utils/paths.js.map +1 -0
  109. package/dist/src/utils/platform.js +14 -0
  110. package/dist/src/utils/platform.js.map +1 -0
  111. package/dist/src/utils/seed.js +61 -0
  112. package/dist/src/utils/seed.js.map +1 -0
  113. package/package.json +82 -0
  114. package/src/templates/OPENWOLF.md +147 -0
  115. package/src/templates/STATUS.md +48 -0
  116. package/src/templates/anatomy.md +5 -0
  117. package/src/templates/buglog.json +4 -0
  118. package/src/templates/cerebrum.md +22 -0
  119. package/src/templates/claude-md-snippet.md +5 -0
  120. package/src/templates/claude-rules-openwolf.md +17 -0
  121. package/src/templates/config.json +83 -0
  122. package/src/templates/cron-manifest.json +97 -0
  123. package/src/templates/cron-state.json +7 -0
  124. package/src/templates/identity.md +9 -0
  125. package/src/templates/memory.md +4 -0
  126. package/src/templates/reframe-frameworks.md +597 -0
  127. 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"}