vigiles 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/.claude/settings.json +46 -0
  2. package/.claude/settings.local.json +8 -0
  3. package/.claude-plugin/hooks/post-edit.sh +34 -0
  4. package/.claude-plugin/hooks/pre-edit.sh +40 -0
  5. package/.claude-plugin/hooks/session-start.sh +38 -0
  6. package/.claude-plugin/marketplace.json +14 -0
  7. package/.claude-plugin/plugin.json +47 -0
  8. package/.github/workflows/ci.yml +81 -0
  9. package/.prettierignore +1 -0
  10. package/.vigiles/generated.d.ts +205 -0
  11. package/CLAUDE.md +95 -0
  12. package/CLAUDE.md.spec.ts +142 -0
  13. package/CONTRIBUTING.md +121 -0
  14. package/LICENSE +21 -0
  15. package/README.md +377 -0
  16. package/action.yml +25 -0
  17. package/dist/action.d.ts +7 -0
  18. package/dist/action.d.ts.map +1 -0
  19. package/dist/action.js +180 -0
  20. package/dist/action.js.map +1 -0
  21. package/dist/cli.d.ts +12 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +1267 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/cli.test.d.ts +2 -0
  26. package/dist/cli.test.d.ts.map +1 -0
  27. package/dist/cli.test.js +650 -0
  28. package/dist/cli.test.js.map +1 -0
  29. package/dist/compile.d.ts +101 -0
  30. package/dist/compile.d.ts.map +1 -0
  31. package/dist/compile.js +503 -0
  32. package/dist/compile.js.map +1 -0
  33. package/dist/evolve.d.ts +132 -0
  34. package/dist/evolve.d.ts.map +1 -0
  35. package/dist/evolve.js +599 -0
  36. package/dist/evolve.js.map +1 -0
  37. package/dist/freshness.d.ts +67 -0
  38. package/dist/freshness.d.ts.map +1 -0
  39. package/dist/freshness.js +244 -0
  40. package/dist/freshness.js.map +1 -0
  41. package/dist/freshness.test.d.ts +2 -0
  42. package/dist/freshness.test.d.ts.map +1 -0
  43. package/dist/freshness.test.js +356 -0
  44. package/dist/freshness.test.js.map +1 -0
  45. package/dist/generate-types.d.ts +34 -0
  46. package/dist/generate-types.d.ts.map +1 -0
  47. package/dist/generate-types.js +381 -0
  48. package/dist/generate-types.js.map +1 -0
  49. package/dist/inline.d.ts +58 -0
  50. package/dist/inline.d.ts.map +1 -0
  51. package/dist/inline.js +142 -0
  52. package/dist/inline.js.map +1 -0
  53. package/dist/inline.test.d.ts +5 -0
  54. package/dist/inline.test.d.ts.map +1 -0
  55. package/dist/inline.test.js +152 -0
  56. package/dist/inline.test.js.map +1 -0
  57. package/dist/linters.d.ts +38 -0
  58. package/dist/linters.d.ts.map +1 -0
  59. package/dist/linters.js +588 -0
  60. package/dist/linters.js.map +1 -0
  61. package/dist/proofs.d.ts +272 -0
  62. package/dist/proofs.d.ts.map +1 -0
  63. package/dist/proofs.js +622 -0
  64. package/dist/proofs.js.map +1 -0
  65. package/dist/proofs.test.d.ts +9 -0
  66. package/dist/proofs.test.d.ts.map +1 -0
  67. package/dist/proofs.test.js +952 -0
  68. package/dist/proofs.test.js.map +1 -0
  69. package/dist/spec.d.ts +258 -0
  70. package/dist/spec.d.ts.map +1 -0
  71. package/dist/spec.js +113 -0
  72. package/dist/spec.js.map +1 -0
  73. package/dist/spec.test.d.ts +2 -0
  74. package/dist/spec.test.d.ts.map +1 -0
  75. package/dist/spec.test.js +1222 -0
  76. package/dist/spec.test.js.map +1 -0
  77. package/dist/types.d.ts +101 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +3 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/validate.d.ts +10 -0
  82. package/dist/validate.d.ts.map +1 -0
  83. package/dist/validate.js +286 -0
  84. package/dist/validate.js.map +1 -0
  85. package/dist/validate.test.d.ts +2 -0
  86. package/dist/validate.test.d.ts.map +1 -0
  87. package/dist/validate.test.js +531 -0
  88. package/dist/validate.test.js.map +1 -0
  89. package/docs/agent-setup.md +85 -0
  90. package/docs/agent-workflows.md +103 -0
  91. package/docs/comparison.md +71 -0
  92. package/docs/freshness.md +124 -0
  93. package/docs/inline-mode.md +119 -0
  94. package/docs/linter-support.md +166 -0
  95. package/docs/spec-format.md +194 -0
  96. package/eslint.config.mjs +79 -0
  97. package/examples/CLAUDE.md +54 -0
  98. package/examples/CLAUDE.md.spec.ts +65 -0
  99. package/examples/SKILL.md +50 -0
  100. package/examples/SKILL.md.spec.ts +57 -0
  101. package/fixtures/example-project/CLAUDE.md +11 -0
  102. package/fixtures/example-project/package.json +9 -0
  103. package/fixtures/example-project/src/index.ts +3 -0
  104. package/fixtures/example-project/src/utils.test.ts +2 -0
  105. package/fixtures/example-project/src/utils.ts +3 -0
  106. package/logo.png +0 -0
  107. package/package.json +42 -0
  108. package/research/adoption-strategy.md +111 -0
  109. package/research/agent-integration.md +145 -0
  110. package/research/ai-code-quality.md +197 -0
  111. package/research/code-search-for-agents.md +313 -0
  112. package/research/competitive-landscape.md +163 -0
  113. package/research/doc-freshness.md +516 -0
  114. package/research/executable-specs.md +368 -0
  115. package/research/feature-ideas.md +464 -0
  116. package/research/formal-proofs-for-agents.md +338 -0
  117. package/research/fp-for-agent-harness.md +150 -0
  118. package/research/fp-for-deterministic-ai.md +131 -0
  119. package/research/self-evolving-specs.md +298 -0
  120. package/schemas/claude-md-strict.yml +18 -0
  121. package/schemas/claude-md.yml +6 -0
  122. package/schemas/skill-strict.yml +12 -0
  123. package/schemas/skill.yml +5 -0
  124. package/skills/audit-feedback-loop/SKILL.md +76 -0
  125. package/skills/edit-spec/SKILL.md +131 -0
  126. package/skills/enforce-rules-format/SKILL.md +71 -0
  127. package/skills/generate-logo/SKILL.md +102 -0
  128. package/skills/generate-rule/SKILL.md +90 -0
  129. package/skills/linter-docs/clippy.md +241 -0
  130. package/skills/linter-docs/eslint.md +384 -0
  131. package/skills/linter-docs/pylint.md +288 -0
  132. package/skills/linter-docs/rubocop.md +277 -0
  133. package/skills/linter-docs/ruff.md +187 -0
  134. package/skills/linter-docs/stylelint.md +247 -0
  135. package/skills/migrate-to-spec/SKILL.md +124 -0
  136. package/skills/pr-to-lint-rule/SKILL.md +97 -0
  137. package/skills/strengthen/SKILL.md +168 -0
  138. package/src/action.ts +214 -0
  139. package/src/cli.test.ts +914 -0
  140. package/src/cli.ts +1631 -0
  141. package/src/compile.ts +691 -0
  142. package/src/evolve.ts +781 -0
  143. package/src/freshness.test.ts +449 -0
  144. package/src/freshness.ts +299 -0
  145. package/src/generate-types.ts +448 -0
  146. package/src/inline.test.ts +206 -0
  147. package/src/inline.ts +164 -0
  148. package/src/linters.ts +739 -0
  149. package/src/proofs.test.ts +1314 -0
  150. package/src/proofs.ts +849 -0
  151. package/src/spec.test.ts +1471 -0
  152. package/src/spec.ts +427 -0
  153. package/src/types.ts +117 -0
  154. package/src/validate.test.ts +701 -0
  155. package/src/validate.ts +381 -0
  156. package/tsconfig.json +23 -0
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const node_os_1 = require("node:os");
11
+ const node_crypto_1 = require("node:crypto");
12
+ const freshness_js_1 = require("./freshness.js");
13
+ // ---------------------------------------------------------------------------
14
+ // Helpers
15
+ // ---------------------------------------------------------------------------
16
+ function makeTmpDir() {
17
+ return (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "vigiles-freshness-"));
18
+ }
19
+ function makeSpec(overrides) {
20
+ return {
21
+ _specType: "claude",
22
+ rules: {},
23
+ ...overrides,
24
+ };
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // detectLockFiles
28
+ // ---------------------------------------------------------------------------
29
+ (0, node_test_1.describe)("detectLockFiles", () => {
30
+ let tmpDir;
31
+ (0, node_test_1.before)(() => {
32
+ tmpDir = makeTmpDir();
33
+ });
34
+ (0, node_test_1.after)(() => {
35
+ (0, node_fs_1.rmSync)(tmpDir, { recursive: true, force: true });
36
+ });
37
+ (0, node_test_1.it)("returns empty array when no lock files exist", () => {
38
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
39
+ strict_1.default.deepEqual(result, []);
40
+ });
41
+ (0, node_test_1.it)("detects package-lock.json", () => {
42
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "package-lock.json"), "{}");
43
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
44
+ strict_1.default.ok(result.includes("package-lock.json"));
45
+ });
46
+ (0, node_test_1.it)("detects yarn.lock", () => {
47
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "yarn.lock"), "");
48
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
49
+ strict_1.default.ok(result.includes("yarn.lock"));
50
+ });
51
+ (0, node_test_1.it)("detects pnpm-lock.yaml", () => {
52
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "pnpm-lock.yaml"), "");
53
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
54
+ strict_1.default.ok(result.includes("pnpm-lock.yaml"));
55
+ });
56
+ (0, node_test_1.it)("detects bun.lockb", () => {
57
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "bun.lockb"), "");
58
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
59
+ strict_1.default.ok(result.includes("bun.lockb"));
60
+ });
61
+ (0, node_test_1.it)("detects Gemfile.lock", () => {
62
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "Gemfile.lock"), "");
63
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
64
+ strict_1.default.ok(result.includes("Gemfile.lock"));
65
+ });
66
+ (0, node_test_1.it)("detects poetry.lock", () => {
67
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "poetry.lock"), "");
68
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
69
+ strict_1.default.ok(result.includes("poetry.lock"));
70
+ });
71
+ (0, node_test_1.it)("detects uv.lock", () => {
72
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "uv.lock"), "");
73
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
74
+ strict_1.default.ok(result.includes("uv.lock"));
75
+ });
76
+ (0, node_test_1.it)("detects pdm.lock", () => {
77
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "pdm.lock"), "");
78
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
79
+ strict_1.default.ok(result.includes("pdm.lock"));
80
+ });
81
+ (0, node_test_1.it)("detects Cargo.lock", () => {
82
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "Cargo.lock"), "");
83
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
84
+ strict_1.default.ok(result.includes("Cargo.lock"));
85
+ });
86
+ (0, node_test_1.it)("detects go.sum", () => {
87
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "go.sum"), "");
88
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
89
+ strict_1.default.ok(result.includes("go.sum"));
90
+ });
91
+ (0, node_test_1.it)("detects composer.lock", () => {
92
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "composer.lock"), "{}");
93
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
94
+ strict_1.default.ok(result.includes("composer.lock"));
95
+ });
96
+ (0, node_test_1.it)("detects packages.lock.json (.NET)", () => {
97
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "packages.lock.json"), "{}");
98
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
99
+ strict_1.default.ok(result.includes("packages.lock.json"));
100
+ });
101
+ (0, node_test_1.it)("detects Package.resolved (Swift)", () => {
102
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "Package.resolved"), "{}");
103
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
104
+ strict_1.default.ok(result.includes("Package.resolved"));
105
+ });
106
+ (0, node_test_1.it)("detects mix.lock (Elixir)", () => {
107
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "mix.lock"), "");
108
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
109
+ strict_1.default.ok(result.includes("mix.lock"));
110
+ });
111
+ (0, node_test_1.it)("detects requirements.txt", () => {
112
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "requirements.txt"), "flask==2.0");
113
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
114
+ strict_1.default.ok(result.includes("requirements.txt"));
115
+ });
116
+ (0, node_test_1.it)("returns multiple lock files for polyglot projects", () => {
117
+ // tmpDir already has all the above files
118
+ const result = (0, freshness_js_1.detectLockFiles)(tmpDir);
119
+ strict_1.default.ok(result.length > 5, `Expected many lock files, got ${result.length}`);
120
+ });
121
+ });
122
+ // ---------------------------------------------------------------------------
123
+ // detectLinterConfigs
124
+ // ---------------------------------------------------------------------------
125
+ (0, node_test_1.describe)("detectLinterConfigs", () => {
126
+ let tmpDir;
127
+ (0, node_test_1.before)(() => {
128
+ tmpDir = makeTmpDir();
129
+ });
130
+ (0, node_test_1.after)(() => {
131
+ (0, node_fs_1.rmSync)(tmpDir, { recursive: true, force: true });
132
+ });
133
+ (0, node_test_1.it)("returns empty array when no configs exist", () => {
134
+ const result = (0, freshness_js_1.detectLinterConfigs)(tmpDir);
135
+ strict_1.default.deepEqual(result, []);
136
+ });
137
+ (0, node_test_1.it)("detects eslint.config.mjs", () => {
138
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "eslint.config.mjs"), "export default [];");
139
+ const result = (0, freshness_js_1.detectLinterConfigs)(tmpDir);
140
+ strict_1.default.ok(result.includes("eslint.config.mjs"));
141
+ });
142
+ (0, node_test_1.it)("detects .rubocop.yml", () => {
143
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, ".rubocop.yml"), "---");
144
+ const result = (0, freshness_js_1.detectLinterConfigs)(tmpDir);
145
+ strict_1.default.ok(result.includes(".rubocop.yml"));
146
+ });
147
+ (0, node_test_1.it)("detects pyproject.toml", () => {
148
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "pyproject.toml"), "[tool.ruff]");
149
+ const result = (0, freshness_js_1.detectLinterConfigs)(tmpDir);
150
+ strict_1.default.ok(result.includes("pyproject.toml"));
151
+ });
152
+ (0, node_test_1.it)("detects .pylintrc", () => {
153
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, ".pylintrc"), "[MAIN]");
154
+ const result = (0, freshness_js_1.detectLinterConfigs)(tmpDir);
155
+ strict_1.default.ok(result.includes(".pylintrc"));
156
+ });
157
+ (0, node_test_1.it)("detects Cargo.toml", () => {
158
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "Cargo.toml"), "[package]");
159
+ const result = (0, freshness_js_1.detectLinterConfigs)(tmpDir);
160
+ strict_1.default.ok(result.includes("Cargo.toml"));
161
+ });
162
+ });
163
+ // ---------------------------------------------------------------------------
164
+ // discoverInputs
165
+ // ---------------------------------------------------------------------------
166
+ (0, node_test_1.describe)("discoverInputs", () => {
167
+ let tmpDir;
168
+ (0, node_test_1.before)(() => {
169
+ tmpDir = makeTmpDir();
170
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "CLAUDE.md.spec.ts"), "export default {};");
171
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "package.json"), JSON.stringify({ name: "test", scripts: {} }));
172
+ });
173
+ (0, node_test_1.after)(() => {
174
+ (0, node_fs_1.rmSync)(tmpDir, { recursive: true, force: true });
175
+ });
176
+ (0, node_test_1.it)("always includes the spec file", () => {
177
+ const spec = makeSpec();
178
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir);
179
+ strict_1.default.ok(result.files.includes("CLAUDE.md.spec.ts"));
180
+ });
181
+ (0, node_test_1.it)("includes package.json when present", () => {
182
+ const spec = makeSpec();
183
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir);
184
+ strict_1.default.ok(result.files.includes("package.json"));
185
+ });
186
+ (0, node_test_1.it)("includes keyFiles from spec", () => {
187
+ const spec = makeSpec({
188
+ keyFiles: { "src/index.ts": "Entry point" },
189
+ });
190
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir);
191
+ strict_1.default.ok(result.files.includes("src/index.ts"));
192
+ });
193
+ (0, node_test_1.it)("includes extra configured inputs", () => {
194
+ const spec = makeSpec();
195
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir, [
196
+ "../../yarn.lock",
197
+ ]);
198
+ strict_1.default.ok(result.files.includes("../../yarn.lock"));
199
+ });
200
+ (0, node_test_1.it)("includes detected linter configs", () => {
201
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "eslint.config.mjs"), "export default [];");
202
+ const spec = makeSpec();
203
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir);
204
+ strict_1.default.ok(result.files.includes("eslint.config.mjs"));
205
+ strict_1.default.ok(result.linterConfigs.includes("eslint.config.mjs"));
206
+ });
207
+ (0, node_test_1.it)("includes detected lock files", () => {
208
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "package-lock.json"), "{}");
209
+ const spec = makeSpec();
210
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir);
211
+ strict_1.default.ok(result.files.includes("package-lock.json"));
212
+ strict_1.default.ok(result.lockFiles.includes("package-lock.json"));
213
+ });
214
+ (0, node_test_1.it)("includes .vigiles/generated.d.ts when present", () => {
215
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(tmpDir, ".vigiles"), { recursive: true });
216
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, ".vigiles/generated.d.ts"), "// types");
217
+ const spec = makeSpec();
218
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir);
219
+ strict_1.default.ok(result.files.includes(".vigiles/generated.d.ts"));
220
+ });
221
+ (0, node_test_1.it)("returns sorted file list", () => {
222
+ const spec = makeSpec();
223
+ const result = (0, freshness_js_1.discoverInputs)("CLAUDE.md.spec.ts", spec, tmpDir);
224
+ const sorted = [...result.files].sort();
225
+ strict_1.default.deepEqual(result.files, sorted);
226
+ });
227
+ });
228
+ // ---------------------------------------------------------------------------
229
+ // computeInputHash
230
+ // ---------------------------------------------------------------------------
231
+ (0, node_test_1.describe)("computeInputHash", () => {
232
+ let tmpDir;
233
+ (0, node_test_1.before)(() => {
234
+ tmpDir = makeTmpDir();
235
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "a.txt"), "hello");
236
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "b.txt"), "world");
237
+ });
238
+ (0, node_test_1.after)(() => {
239
+ (0, node_fs_1.rmSync)(tmpDir, { recursive: true, force: true });
240
+ });
241
+ (0, node_test_1.it)("returns a 16-char hex string", () => {
242
+ const hash = (0, freshness_js_1.computeInputHash)(["a.txt", "b.txt"], tmpDir);
243
+ strict_1.default.match(hash, /^[a-f0-9]{16}$/);
244
+ });
245
+ (0, node_test_1.it)("returns same hash for same inputs", () => {
246
+ const h1 = (0, freshness_js_1.computeInputHash)(["a.txt", "b.txt"], tmpDir);
247
+ const h2 = (0, freshness_js_1.computeInputHash)(["a.txt", "b.txt"], tmpDir);
248
+ strict_1.default.equal(h1, h2);
249
+ });
250
+ (0, node_test_1.it)("changes when file content changes", () => {
251
+ const h1 = (0, freshness_js_1.computeInputHash)(["a.txt"], tmpDir);
252
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "a.txt"), "changed");
253
+ const h2 = (0, freshness_js_1.computeInputHash)(["a.txt"], tmpDir);
254
+ strict_1.default.notEqual(h1, h2);
255
+ });
256
+ (0, node_test_1.it)("changes when a file is deleted", () => {
257
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "c.txt"), "temp");
258
+ const h1 = (0, freshness_js_1.computeInputHash)(["c.txt"], tmpDir);
259
+ (0, node_fs_1.rmSync)((0, node_path_1.join)(tmpDir, "c.txt"));
260
+ const h2 = (0, freshness_js_1.computeInputHash)(["c.txt"], tmpDir);
261
+ strict_1.default.notEqual(h1, h2);
262
+ });
263
+ });
264
+ // ---------------------------------------------------------------------------
265
+ // addInputHash / extractInputHash
266
+ // ---------------------------------------------------------------------------
267
+ (0, node_test_1.describe)("addInputHash / extractInputHash", () => {
268
+ (0, node_test_1.it)("embeds hash after sha256 comment", () => {
269
+ const md = "<!-- vigiles:sha256:abc123 compiled from X.spec.ts -->\n\n# Doc\n";
270
+ const result = (0, freshness_js_1.addInputHash)(md, "deadbeef12345678");
271
+ strict_1.default.ok(result.includes("<!-- vigiles:inputs:deadbeef12345678 -->"));
272
+ // sha256 line should still be first
273
+ strict_1.default.ok(result.startsWith("<!-- vigiles:sha256:"));
274
+ });
275
+ (0, node_test_1.it)("extracts embedded input hash", () => {
276
+ const md = "<!-- vigiles:sha256:abc123 compiled from X.spec.ts -->\n<!-- vigiles:inputs:deadbeef12345678 -->\n\n# Doc\n";
277
+ const hash = (0, freshness_js_1.extractInputHash)(md);
278
+ strict_1.default.equal(hash, "deadbeef12345678");
279
+ });
280
+ (0, node_test_1.it)("returns null when no input hash present", () => {
281
+ const md = "<!-- vigiles:sha256:abc123 compiled from X.spec.ts -->\n\n# Doc\n";
282
+ const hash = (0, freshness_js_1.extractInputHash)(md);
283
+ strict_1.default.equal(hash, null);
284
+ });
285
+ });
286
+ // ---------------------------------------------------------------------------
287
+ // checkOutputHashFreshness
288
+ // ---------------------------------------------------------------------------
289
+ (0, node_test_1.describe)("checkOutputHashFreshness", () => {
290
+ (0, node_test_1.it)("returns fresh for hand-written file (no hash)", () => {
291
+ const result = (0, freshness_js_1.checkOutputHashFreshness)("# CLAUDE.md\n\nSome content.\n");
292
+ strict_1.default.equal(result.fresh, true);
293
+ strict_1.default.equal(result.mode, "output-hash");
294
+ });
295
+ (0, node_test_1.it)("returns fresh when hash matches", () => {
296
+ // Build a valid hashed file
297
+ const body = "# CLAUDE.md\n\nContent.\n";
298
+ const hash = (0, node_crypto_1.createHash)("sha256").update(body).digest("hex").slice(0, 16);
299
+ const content = `<!-- vigiles:sha256:${hash} compiled from CLAUDE.md.spec.ts -->\n\n${body}`;
300
+ const result = (0, freshness_js_1.checkOutputHashFreshness)(content);
301
+ strict_1.default.equal(result.fresh, true);
302
+ });
303
+ (0, node_test_1.it)("returns stale when hash mismatches", () => {
304
+ const content = "<!-- vigiles:sha256:0000000000000000 compiled from CLAUDE.md.spec.ts -->\n\n# CLAUDE.md\n\nEdited.\n";
305
+ const result = (0, freshness_js_1.checkOutputHashFreshness)(content);
306
+ strict_1.default.equal(result.fresh, false);
307
+ strict_1.default.equal(result.mode, "output-hash");
308
+ });
309
+ });
310
+ // ---------------------------------------------------------------------------
311
+ // checkInputHashFreshness
312
+ // ---------------------------------------------------------------------------
313
+ (0, node_test_1.describe)("checkInputHashFreshness", () => {
314
+ let tmpDir;
315
+ (0, node_test_1.before)(() => {
316
+ tmpDir = makeTmpDir();
317
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "spec.ts"), "export default {};");
318
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "config.js"), "module.exports = {};");
319
+ });
320
+ (0, node_test_1.after)(() => {
321
+ (0, node_fs_1.rmSync)(tmpDir, { recursive: true, force: true });
322
+ });
323
+ (0, node_test_1.it)("returns stale when no input hash is stored", () => {
324
+ const content = "<!-- vigiles:sha256:abc compiled from spec.ts -->\n\n# Doc\n";
325
+ const result = (0, freshness_js_1.checkInputHashFreshness)(content, ["spec.ts"], tmpDir);
326
+ strict_1.default.equal(result.fresh, false);
327
+ strict_1.default.equal(result.mode, "input-hash");
328
+ });
329
+ (0, node_test_1.it)("returns fresh when input hash matches", () => {
330
+ const files = ["spec.ts", "config.js"];
331
+ const hash = (0, freshness_js_1.computeInputHash)(files, tmpDir);
332
+ const content = `<!-- vigiles:sha256:abc compiled from spec.ts -->\n<!-- vigiles:inputs:${hash} -->\n\n# Doc\n`;
333
+ const result = (0, freshness_js_1.checkInputHashFreshness)(content, files, tmpDir);
334
+ strict_1.default.equal(result.fresh, true);
335
+ });
336
+ (0, node_test_1.it)("returns stale when input file changes", () => {
337
+ const files = ["spec.ts", "config.js"];
338
+ const hash = (0, freshness_js_1.computeInputHash)(files, tmpDir);
339
+ const content = `<!-- vigiles:sha256:abc compiled from spec.ts -->\n<!-- vigiles:inputs:${hash} -->\n\n# Doc\n`;
340
+ // Change an input file
341
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "config.js"), "module.exports = { changed: true };");
342
+ const result = (0, freshness_js_1.checkInputHashFreshness)(content, files, tmpDir);
343
+ strict_1.default.equal(result.fresh, false);
344
+ });
345
+ (0, node_test_1.it)("reports deleted files", () => {
346
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(tmpDir, "temp.txt"), "exists");
347
+ const files = ["spec.ts", "temp.txt"];
348
+ const hash = (0, freshness_js_1.computeInputHash)(files, tmpDir);
349
+ const content = `<!-- vigiles:sha256:abc compiled from spec.ts -->\n<!-- vigiles:inputs:${hash} -->\n\n# Doc\n`;
350
+ (0, node_fs_1.rmSync)((0, node_path_1.join)(tmpDir, "temp.txt"));
351
+ const result = (0, freshness_js_1.checkInputHashFreshness)(content, files, tmpDir);
352
+ strict_1.default.equal(result.fresh, false);
353
+ strict_1.default.ok(result.changedFiles?.some((f) => f.includes("temp.txt")));
354
+ });
355
+ });
356
+ //# sourceMappingURL=freshness.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freshness.test.js","sourceRoot":"","sources":["../src/freshness.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * vigiles generate-types — emit .d.ts with type unions from actual project state.
3
+ *
4
+ * Scans linter configs, package.json, and filesystem to generate TypeScript
5
+ * types that the compiler uses to PROVE references are valid at authoring time.
6
+ *
7
+ * Generated types:
8
+ * - EslintRule / StylelintRule / RuffRule / ... — enabled rules per linter
9
+ * - NpmScript — scripts from package.json
10
+ * - ProjectFile — files in the project (scoped to src/ by default)
11
+ */
12
+ interface DiscoveredRules {
13
+ linter: string;
14
+ rules: string[];
15
+ via: string;
16
+ }
17
+ export interface GenerateTypesOptions {
18
+ basePath?: string;
19
+ fileGlobs?: string[];
20
+ }
21
+ export interface GenerateTypesResult {
22
+ dts: string;
23
+ linters: DiscoveredRules[];
24
+ scripts: string[];
25
+ files: string[];
26
+ }
27
+ /**
28
+ * Generate .d.ts content with type unions from actual project state.
29
+ *
30
+ * Scans all available linters, package.json scripts, and project files.
31
+ */
32
+ export declare function generateTypes(options?: GenerateTypesOptions): GenerateTypesResult;
33
+ export {};
34
+ //# sourceMappingURL=generate-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-types.d.ts","sourceRoot":"","sources":["../src/generate-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6CH,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AA8OD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAmIrB"}