vigiles 2.0.0 → 2.2.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 (184) hide show
  1. package/README.md +182 -134
  2. package/dist/action-gate.d.ts +28 -0
  3. package/dist/action-gate.js +73 -0
  4. package/dist/cli.js +705 -230
  5. package/dist/community-skills.d.ts +22 -0
  6. package/dist/community-skills.js +86 -0
  7. package/dist/compile-generator.d.ts +48 -0
  8. package/dist/compile-generator.js +322 -0
  9. package/dist/compile.d.ts +4 -0
  10. package/dist/compile.js +239 -45
  11. package/dist/coverage.d.ts +56 -0
  12. package/dist/coverage.js +178 -0
  13. package/dist/doc-refs.d.ts +60 -0
  14. package/dist/doc-refs.js +246 -0
  15. package/dist/eval.d.ts +62 -0
  16. package/dist/eval.js +174 -0
  17. package/dist/evolve.js +60 -125
  18. package/dist/frontmatter.d.ts +75 -0
  19. package/dist/frontmatter.js +263 -0
  20. package/dist/generate-schema.d.ts +51 -0
  21. package/dist/generate-schema.js +125 -0
  22. package/dist/generate-types.js +39 -1
  23. package/dist/harness-test.d.ts +38 -0
  24. package/dist/harness-test.js +129 -0
  25. package/dist/hash.d.ts +8 -0
  26. package/dist/hash.js +16 -0
  27. package/dist/inline.d.ts +22 -4
  28. package/dist/inline.js +60 -13
  29. package/dist/integrity.d.ts +29 -0
  30. package/dist/integrity.js +44 -0
  31. package/dist/linters.d.ts +5 -3
  32. package/dist/linters.js +144 -4
  33. package/dist/mock-model.d.ts +31 -0
  34. package/dist/mock-model.js +189 -0
  35. package/dist/orphans.d.ts +52 -0
  36. package/dist/orphans.js +124 -0
  37. package/dist/proofs.js +22 -16
  38. package/dist/refs.d.ts +44 -0
  39. package/dist/refs.js +144 -0
  40. package/dist/session.d.ts +97 -0
  41. package/dist/session.js +306 -0
  42. package/dist/sidecar.d.ts +35 -0
  43. package/dist/sidecar.js +102 -0
  44. package/dist/skill-driver.d.ts +77 -0
  45. package/dist/skill-driver.js +76 -0
  46. package/dist/skill-runtime.d.ts +101 -0
  47. package/dist/skill-runtime.js +289 -0
  48. package/dist/skill-test.d.ts +47 -0
  49. package/dist/skill-test.js +77 -0
  50. package/dist/spec.d.ts +119 -13
  51. package/dist/spec.js +51 -4
  52. package/dist/symbols.d.ts +30 -0
  53. package/dist/symbols.js +142 -0
  54. package/dist/test-utils.d.ts +8 -0
  55. package/dist/test-utils.js +41 -0
  56. package/dist/types.d.ts +34 -8
  57. package/dist/types.js +19 -0
  58. package/dist/validate.js +5 -3
  59. package/package.json +26 -5
  60. package/.claude/settings.json +0 -46
  61. package/.claude/settings.local.json +0 -8
  62. package/.github/workflows/ci.yml +0 -81
  63. package/.prettierignore +0 -1
  64. package/.vigiles/generated.d.ts +0 -205
  65. package/CLAUDE.md +0 -95
  66. package/CLAUDE.md.spec.ts +0 -142
  67. package/CONTRIBUTING.md +0 -121
  68. package/dist/action.d.ts.map +0 -1
  69. package/dist/action.js.map +0 -1
  70. package/dist/cli.d.ts.map +0 -1
  71. package/dist/cli.js.map +0 -1
  72. package/dist/cli.test.d.ts +0 -2
  73. package/dist/cli.test.d.ts.map +0 -1
  74. package/dist/cli.test.js +0 -650
  75. package/dist/cli.test.js.map +0 -1
  76. package/dist/compile.d.ts.map +0 -1
  77. package/dist/compile.js.map +0 -1
  78. package/dist/evolve.d.ts.map +0 -1
  79. package/dist/evolve.js.map +0 -1
  80. package/dist/freshness.d.ts +0 -67
  81. package/dist/freshness.d.ts.map +0 -1
  82. package/dist/freshness.js +0 -244
  83. package/dist/freshness.js.map +0 -1
  84. package/dist/freshness.test.d.ts +0 -2
  85. package/dist/freshness.test.d.ts.map +0 -1
  86. package/dist/freshness.test.js +0 -356
  87. package/dist/freshness.test.js.map +0 -1
  88. package/dist/generate-types.d.ts.map +0 -1
  89. package/dist/generate-types.js.map +0 -1
  90. package/dist/inline.d.ts.map +0 -1
  91. package/dist/inline.js.map +0 -1
  92. package/dist/inline.test.d.ts +0 -5
  93. package/dist/inline.test.d.ts.map +0 -1
  94. package/dist/inline.test.js +0 -152
  95. package/dist/inline.test.js.map +0 -1
  96. package/dist/linters.d.ts.map +0 -1
  97. package/dist/linters.js.map +0 -1
  98. package/dist/proofs.d.ts.map +0 -1
  99. package/dist/proofs.js.map +0 -1
  100. package/dist/proofs.test.d.ts +0 -9
  101. package/dist/proofs.test.d.ts.map +0 -1
  102. package/dist/proofs.test.js +0 -952
  103. package/dist/proofs.test.js.map +0 -1
  104. package/dist/spec.d.ts.map +0 -1
  105. package/dist/spec.js.map +0 -1
  106. package/dist/spec.test.d.ts +0 -2
  107. package/dist/spec.test.d.ts.map +0 -1
  108. package/dist/spec.test.js +0 -1222
  109. package/dist/spec.test.js.map +0 -1
  110. package/dist/types.d.ts.map +0 -1
  111. package/dist/types.js.map +0 -1
  112. package/dist/validate.d.ts.map +0 -1
  113. package/dist/validate.js.map +0 -1
  114. package/dist/validate.test.d.ts +0 -2
  115. package/dist/validate.test.d.ts.map +0 -1
  116. package/dist/validate.test.js +0 -531
  117. package/dist/validate.test.js.map +0 -1
  118. package/docs/agent-setup.md +0 -85
  119. package/docs/agent-workflows.md +0 -103
  120. package/docs/comparison.md +0 -71
  121. package/docs/freshness.md +0 -124
  122. package/docs/inline-mode.md +0 -119
  123. package/docs/linter-support.md +0 -166
  124. package/docs/spec-format.md +0 -194
  125. package/eslint.config.mjs +0 -79
  126. package/examples/CLAUDE.md +0 -54
  127. package/examples/CLAUDE.md.spec.ts +0 -65
  128. package/examples/SKILL.md +0 -50
  129. package/examples/SKILL.md.spec.ts +0 -57
  130. package/fixtures/example-project/CLAUDE.md +0 -11
  131. package/fixtures/example-project/package.json +0 -9
  132. package/fixtures/example-project/src/index.ts +0 -3
  133. package/fixtures/example-project/src/utils.test.ts +0 -2
  134. package/fixtures/example-project/src/utils.ts +0 -3
  135. package/logo.png +0 -0
  136. package/research/adoption-strategy.md +0 -111
  137. package/research/agent-integration.md +0 -145
  138. package/research/ai-code-quality.md +0 -197
  139. package/research/code-search-for-agents.md +0 -313
  140. package/research/competitive-landscape.md +0 -163
  141. package/research/doc-freshness.md +0 -516
  142. package/research/executable-specs.md +0 -368
  143. package/research/feature-ideas.md +0 -464
  144. package/research/formal-proofs-for-agents.md +0 -338
  145. package/research/fp-for-agent-harness.md +0 -150
  146. package/research/fp-for-deterministic-ai.md +0 -131
  147. package/research/self-evolving-specs.md +0 -298
  148. package/schemas/claude-md-strict.yml +0 -18
  149. package/schemas/claude-md.yml +0 -6
  150. package/schemas/skill-strict.yml +0 -12
  151. package/schemas/skill.yml +0 -5
  152. package/skills/audit-feedback-loop/SKILL.md +0 -76
  153. package/skills/edit-spec/SKILL.md +0 -131
  154. package/skills/enforce-rules-format/SKILL.md +0 -71
  155. package/skills/generate-logo/SKILL.md +0 -102
  156. package/skills/generate-rule/SKILL.md +0 -90
  157. package/skills/linter-docs/clippy.md +0 -241
  158. package/skills/linter-docs/eslint.md +0 -384
  159. package/skills/linter-docs/pylint.md +0 -288
  160. package/skills/linter-docs/rubocop.md +0 -277
  161. package/skills/linter-docs/ruff.md +0 -187
  162. package/skills/linter-docs/stylelint.md +0 -247
  163. package/skills/migrate-to-spec/SKILL.md +0 -124
  164. package/skills/pr-to-lint-rule/SKILL.md +0 -97
  165. package/skills/strengthen/SKILL.md +0 -168
  166. package/src/action.ts +0 -214
  167. package/src/cli.test.ts +0 -914
  168. package/src/cli.ts +0 -1631
  169. package/src/compile.ts +0 -691
  170. package/src/evolve.ts +0 -781
  171. package/src/freshness.test.ts +0 -449
  172. package/src/freshness.ts +0 -299
  173. package/src/generate-types.ts +0 -448
  174. package/src/inline.test.ts +0 -206
  175. package/src/inline.ts +0 -164
  176. package/src/linters.ts +0 -739
  177. package/src/proofs.test.ts +0 -1314
  178. package/src/proofs.ts +0 -849
  179. package/src/spec.test.ts +0 -1471
  180. package/src/spec.ts +0 -427
  181. package/src/types.ts +0 -117
  182. package/src/validate.test.ts +0 -701
  183. package/src/validate.ts +0 -381
  184. package/tsconfig.json +0 -23
package/src/action.ts DELETED
@@ -1,214 +0,0 @@
1
- /**
2
- * GitHub Action entry point for vigiles.
3
- *
4
- * Runs `compile` or `audit` depending on the action input.
5
- */
6
-
7
- import { writeFileSync, existsSync } from "node:fs";
8
- import { resolve } from "node:path";
9
- import { spawnSync } from "node:child_process";
10
- import { globSync } from "glob";
11
-
12
- import { compileClaude, compileSkill, addHash } from "./compile.js";
13
- import type { ClaudeSpec, SkillSpec } from "./spec.js";
14
-
15
- // ---------------------------------------------------------------------------
16
- // Read action inputs
17
- // ---------------------------------------------------------------------------
18
-
19
- const command = process.env["INPUT_COMMAND"] ?? "audit";
20
- const pathsInput = process.env["INPUT_PATHS"];
21
- const maxRulesInput =
22
- process.env["INPUT_MAX-RULES"] ?? process.env["INPUT_MAX_RULES"];
23
- const catalogOnly =
24
- (process.env["INPUT_CATALOG-ONLY"] ??
25
- process.env["INPUT_CATALOG_ONLY"] ??
26
- "false") === "true";
27
-
28
- const maxRules = maxRulesInput ? Number(maxRulesInput) : undefined;
29
-
30
- // ---------------------------------------------------------------------------
31
- // Spec loading (from compiled dist/)
32
- // ---------------------------------------------------------------------------
33
-
34
- async function loadSpec(
35
- specPath: string,
36
- ): Promise<ClaudeSpec | SkillSpec | null> {
37
- // Try several resolution strategies:
38
- // 1. Replace /src/ with /dist/ (standard TS project layout)
39
- // 2. Look under dist/ directly (root-level specs like CLAUDE.md.spec.ts)
40
- // 3. Use the .js extension in-place (pre-compiled specs)
41
- const jsName = specPath.replace(/\.ts$/, ".js");
42
- const candidates = [
43
- resolve(process.cwd(), jsName.replace(/\/src\//, "/dist/")),
44
- resolve(process.cwd(), "dist", jsName),
45
- resolve(process.cwd(), jsName),
46
- ];
47
- // Deduplicate (candidate 1 and 3 may match when there's no /src/)
48
- const unique = [...new Set(candidates)];
49
-
50
- for (const distPath of unique) {
51
- if (!existsSync(distPath)) continue;
52
- try {
53
- const mod = (await import(distPath)) as {
54
- default: ClaudeSpec | SkillSpec | { default: ClaudeSpec | SkillSpec };
55
- };
56
- // CJS modules (TypeScript with module: "Node16", no "type":
57
- // "module") produce `exports["default"] = spec`, so dynamic
58
- // import wraps it as `{ default: { default: spec } }`. Unwrap
59
- // the double-default when present.
60
- const raw = mod.default;
61
- if (raw && typeof raw === "object" && "default" in raw) {
62
- return (raw as { default: ClaudeSpec | SkillSpec }).default;
63
- }
64
- return raw;
65
- } catch {
66
- continue;
67
- }
68
- }
69
- return null;
70
- }
71
-
72
- // ---------------------------------------------------------------------------
73
- // Commands
74
- // ---------------------------------------------------------------------------
75
-
76
- async function runCompile(): Promise<boolean> {
77
- const specs = pathsInput
78
- ? pathsInput
79
- .split(",")
80
- .map((p) => p.trim())
81
- .filter(Boolean)
82
- : globSync("**/*.spec.ts", { ignore: ["node_modules/**", "dist/**"] });
83
-
84
- if (specs.length === 0) {
85
- console.log("No .spec.ts files found.");
86
- return true;
87
- }
88
-
89
- let allValid = true;
90
- const basePath = process.cwd();
91
-
92
- for (const specPath of specs) {
93
- const spec = await loadSpec(specPath);
94
- if (!spec) {
95
- console.log(`::error file=${specPath}::Failed to load spec`);
96
- allValid = false;
97
- continue;
98
- }
99
-
100
- if (spec._specType === "claude") {
101
- const primaryOutput = specPath.replace(/\.spec\.ts$/, "");
102
- const { markdown, errors, targets } = compileClaude(spec, {
103
- basePath,
104
- specFile: specPath,
105
- maxRules,
106
- catalogOnly,
107
- });
108
-
109
- if (errors.length > 0) {
110
- for (const err of errors) {
111
- console.log(`::error file=${specPath}::${err.message}`);
112
- }
113
- allValid = false;
114
- }
115
-
116
- // Write primary target
117
- writeFileSync(resolve(basePath, primaryOutput), markdown);
118
- const outputNames = [primaryOutput];
119
-
120
- // Write additional targets with swapped heading + recomputed hash
121
- for (const t of targets.slice(1)) {
122
- const body = markdown
123
- .replace(/^<!-- vigiles:[^\n]+\n\n?/, "")
124
- .replace(/^# [^\n]+/, `# ${t}`);
125
- const additional = addHash(body, specPath);
126
- const dir = primaryOutput.substring(
127
- 0,
128
- primaryOutput.lastIndexOf("/") + 1,
129
- );
130
- const targetPath = dir + t;
131
- writeFileSync(resolve(basePath, targetPath), additional);
132
- outputNames.push(targetPath);
133
- }
134
-
135
- console.log(`Compiled: ${specPath} → ${outputNames.join(", ")}`);
136
- } else if (spec._specType === "skill") {
137
- const outputPath = specPath.replace(/\.spec\.ts$/, "");
138
- const { markdown, errors } = compileSkill(spec, {
139
- basePath,
140
- specFile: specPath,
141
- });
142
-
143
- if (errors.length > 0) {
144
- for (const err of errors) {
145
- console.log(`::error file=${specPath}::${err.message}`);
146
- }
147
- allValid = false;
148
- }
149
- writeFileSync(resolve(basePath, outputPath), markdown);
150
- console.log(`Compiled: ${specPath} → ${outputPath}`);
151
- }
152
- }
153
-
154
- return allValid;
155
- }
156
-
157
- function runAudit(): boolean {
158
- // Delegate to the CLI so the action always runs the full audit flow
159
- // (hash verification, spec validation, duplicate detection, coverage
160
- // report, strengthen suggestions). Previously this only ran
161
- // checkFileHash, which silently skipped everything else.
162
- const files = pathsInput
163
- ? pathsInput
164
- .split(",")
165
- .map((p) => p.trim())
166
- .filter(Boolean)
167
- : [];
168
-
169
- const cliPath = resolve(__dirname, "cli.js");
170
- const args = ["audit", ...files];
171
- const result = spawnSync(process.execPath, [cliPath, ...args], {
172
- stdio: "inherit",
173
- env: {
174
- ...process.env,
175
- // Ensure the CLI emits GitHub annotations during the action run
176
- GITHUB_ACTIONS: process.env.GITHUB_ACTIONS ?? "true",
177
- },
178
- });
179
-
180
- if (result.error) {
181
- console.log(
182
- `::error::Failed to run vigiles audit: ${result.error.message}`,
183
- );
184
- return false;
185
- }
186
-
187
- // Exit codes: 0 clean, 1 warnings, 2 hard errors.
188
- return result.status === 0;
189
- }
190
-
191
- // ---------------------------------------------------------------------------
192
- // Main
193
- // ---------------------------------------------------------------------------
194
-
195
- void (async () => {
196
- let valid: boolean;
197
- if (command === "compile") {
198
- valid = await runCompile();
199
- } else if (command === "audit") {
200
- valid = runAudit();
201
- } else {
202
- console.log(
203
- `::error::Unknown vigiles command "${command}". Valid commands: compile, audit.`,
204
- );
205
- process.exit(1);
206
- }
207
-
208
- console.log(`::set-output name=valid::${String(valid)}`);
209
-
210
- if (!valid) {
211
- console.log("::error::vigiles failed — see errors above");
212
- process.exit(1);
213
- }
214
- })();