vigiles 2.0.0 → 2.1.1

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 (160) hide show
  1. package/README.md +108 -131
  2. package/dist/cli.js +303 -161
  3. package/dist/compile.d.ts +1 -0
  4. package/dist/compile.js +22 -19
  5. package/dist/coverage.d.ts +56 -0
  6. package/dist/coverage.js +178 -0
  7. package/dist/doc-refs.d.ts +60 -0
  8. package/dist/doc-refs.js +246 -0
  9. package/dist/evolve.js +60 -125
  10. package/dist/frontmatter.d.ts +57 -0
  11. package/dist/frontmatter.js +190 -0
  12. package/dist/generate-schema.d.ts +51 -0
  13. package/dist/generate-schema.js +115 -0
  14. package/dist/generate-types.js +39 -1
  15. package/dist/hash.d.ts +8 -0
  16. package/dist/hash.js +16 -0
  17. package/dist/integrity.d.ts +29 -0
  18. package/dist/integrity.js +44 -0
  19. package/dist/linters.d.ts +5 -3
  20. package/dist/linters.js +116 -4
  21. package/dist/orphans.d.ts +52 -0
  22. package/dist/orphans.js +124 -0
  23. package/dist/proofs.js +22 -16
  24. package/dist/session.d.ts +97 -0
  25. package/dist/session.js +306 -0
  26. package/dist/sidecar.d.ts +35 -0
  27. package/dist/sidecar.js +102 -0
  28. package/dist/spec.d.ts +29 -9
  29. package/dist/spec.js +22 -4
  30. package/dist/test-utils.d.ts +8 -0
  31. package/dist/test-utils.js +41 -0
  32. package/dist/types.d.ts +34 -8
  33. package/dist/types.js +19 -0
  34. package/dist/validate.js +5 -3
  35. package/package.json +14 -2
  36. package/.claude/settings.json +0 -46
  37. package/.claude/settings.local.json +0 -8
  38. package/.github/workflows/ci.yml +0 -81
  39. package/.prettierignore +0 -1
  40. package/.vigiles/generated.d.ts +0 -205
  41. package/CLAUDE.md +0 -95
  42. package/CLAUDE.md.spec.ts +0 -142
  43. package/CONTRIBUTING.md +0 -121
  44. package/dist/action.d.ts.map +0 -1
  45. package/dist/action.js.map +0 -1
  46. package/dist/cli.d.ts.map +0 -1
  47. package/dist/cli.js.map +0 -1
  48. package/dist/cli.test.d.ts +0 -2
  49. package/dist/cli.test.d.ts.map +0 -1
  50. package/dist/cli.test.js +0 -650
  51. package/dist/cli.test.js.map +0 -1
  52. package/dist/compile.d.ts.map +0 -1
  53. package/dist/compile.js.map +0 -1
  54. package/dist/evolve.d.ts.map +0 -1
  55. package/dist/evolve.js.map +0 -1
  56. package/dist/freshness.d.ts +0 -67
  57. package/dist/freshness.d.ts.map +0 -1
  58. package/dist/freshness.js +0 -244
  59. package/dist/freshness.js.map +0 -1
  60. package/dist/freshness.test.d.ts +0 -2
  61. package/dist/freshness.test.d.ts.map +0 -1
  62. package/dist/freshness.test.js +0 -356
  63. package/dist/freshness.test.js.map +0 -1
  64. package/dist/generate-types.d.ts.map +0 -1
  65. package/dist/generate-types.js.map +0 -1
  66. package/dist/inline.d.ts.map +0 -1
  67. package/dist/inline.js.map +0 -1
  68. package/dist/inline.test.d.ts +0 -5
  69. package/dist/inline.test.d.ts.map +0 -1
  70. package/dist/inline.test.js +0 -152
  71. package/dist/inline.test.js.map +0 -1
  72. package/dist/linters.d.ts.map +0 -1
  73. package/dist/linters.js.map +0 -1
  74. package/dist/proofs.d.ts.map +0 -1
  75. package/dist/proofs.js.map +0 -1
  76. package/dist/proofs.test.d.ts +0 -9
  77. package/dist/proofs.test.d.ts.map +0 -1
  78. package/dist/proofs.test.js +0 -952
  79. package/dist/proofs.test.js.map +0 -1
  80. package/dist/spec.d.ts.map +0 -1
  81. package/dist/spec.js.map +0 -1
  82. package/dist/spec.test.d.ts +0 -2
  83. package/dist/spec.test.d.ts.map +0 -1
  84. package/dist/spec.test.js +0 -1222
  85. package/dist/spec.test.js.map +0 -1
  86. package/dist/types.d.ts.map +0 -1
  87. package/dist/types.js.map +0 -1
  88. package/dist/validate.d.ts.map +0 -1
  89. package/dist/validate.js.map +0 -1
  90. package/dist/validate.test.d.ts +0 -2
  91. package/dist/validate.test.d.ts.map +0 -1
  92. package/dist/validate.test.js +0 -531
  93. package/dist/validate.test.js.map +0 -1
  94. package/docs/agent-setup.md +0 -85
  95. package/docs/agent-workflows.md +0 -103
  96. package/docs/comparison.md +0 -71
  97. package/docs/freshness.md +0 -124
  98. package/docs/inline-mode.md +0 -119
  99. package/docs/linter-support.md +0 -166
  100. package/docs/spec-format.md +0 -194
  101. package/eslint.config.mjs +0 -79
  102. package/examples/CLAUDE.md +0 -54
  103. package/examples/CLAUDE.md.spec.ts +0 -65
  104. package/examples/SKILL.md +0 -50
  105. package/examples/SKILL.md.spec.ts +0 -57
  106. package/fixtures/example-project/CLAUDE.md +0 -11
  107. package/fixtures/example-project/package.json +0 -9
  108. package/fixtures/example-project/src/index.ts +0 -3
  109. package/fixtures/example-project/src/utils.test.ts +0 -2
  110. package/fixtures/example-project/src/utils.ts +0 -3
  111. package/logo.png +0 -0
  112. package/research/adoption-strategy.md +0 -111
  113. package/research/agent-integration.md +0 -145
  114. package/research/ai-code-quality.md +0 -197
  115. package/research/code-search-for-agents.md +0 -313
  116. package/research/competitive-landscape.md +0 -163
  117. package/research/doc-freshness.md +0 -516
  118. package/research/executable-specs.md +0 -368
  119. package/research/feature-ideas.md +0 -464
  120. package/research/formal-proofs-for-agents.md +0 -338
  121. package/research/fp-for-agent-harness.md +0 -150
  122. package/research/fp-for-deterministic-ai.md +0 -131
  123. package/research/self-evolving-specs.md +0 -298
  124. package/schemas/claude-md-strict.yml +0 -18
  125. package/schemas/claude-md.yml +0 -6
  126. package/schemas/skill-strict.yml +0 -12
  127. package/schemas/skill.yml +0 -5
  128. package/skills/audit-feedback-loop/SKILL.md +0 -76
  129. package/skills/edit-spec/SKILL.md +0 -131
  130. package/skills/enforce-rules-format/SKILL.md +0 -71
  131. package/skills/generate-logo/SKILL.md +0 -102
  132. package/skills/generate-rule/SKILL.md +0 -90
  133. package/skills/linter-docs/clippy.md +0 -241
  134. package/skills/linter-docs/eslint.md +0 -384
  135. package/skills/linter-docs/pylint.md +0 -288
  136. package/skills/linter-docs/rubocop.md +0 -277
  137. package/skills/linter-docs/ruff.md +0 -187
  138. package/skills/linter-docs/stylelint.md +0 -247
  139. package/skills/migrate-to-spec/SKILL.md +0 -124
  140. package/skills/pr-to-lint-rule/SKILL.md +0 -97
  141. package/skills/strengthen/SKILL.md +0 -168
  142. package/src/action.ts +0 -214
  143. package/src/cli.test.ts +0 -914
  144. package/src/cli.ts +0 -1631
  145. package/src/compile.ts +0 -691
  146. package/src/evolve.ts +0 -781
  147. package/src/freshness.test.ts +0 -449
  148. package/src/freshness.ts +0 -299
  149. package/src/generate-types.ts +0 -448
  150. package/src/inline.test.ts +0 -206
  151. package/src/inline.ts +0 -164
  152. package/src/linters.ts +0 -739
  153. package/src/proofs.test.ts +0 -1314
  154. package/src/proofs.ts +0 -849
  155. package/src/spec.test.ts +0 -1471
  156. package/src/spec.ts +0 -427
  157. package/src/types.ts +0 -117
  158. package/src/validate.test.ts +0 -701
  159. package/src/validate.ts +0 -381
  160. 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
- })();