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,152 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for the inline-rule parser.
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const node_test_1 = require("node:test");
10
+ const strict_1 = __importDefault(require("node:assert/strict"));
11
+ const inline_js_1 = require("./inline.js");
12
+ (0, node_test_1.describe)("parseInlineRules", () => {
13
+ (0, node_test_1.it)("extracts a single enforce comment", () => {
14
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`# Project
15
+
16
+ <!-- vigiles:enforce eslint/no-console "Use structured logger" -->
17
+
18
+ ## Logging
19
+
20
+ All output through logger.ts.
21
+ `);
22
+ strict_1.default.equal(errors.length, 0);
23
+ strict_1.default.equal(rules.length, 1);
24
+ strict_1.default.equal(rules[0].linterRule, "eslint/no-console");
25
+ strict_1.default.equal(rules[0].why, "Use structured logger");
26
+ strict_1.default.equal(rules[0].line, 3);
27
+ });
28
+ (0, node_test_1.it)("extracts multiple enforce comments and tracks line numbers", () => {
29
+ const content = `# Doc
30
+ <!-- vigiles:enforce eslint/no-console "a" -->
31
+ text
32
+ <!-- vigiles:enforce ruff/F401 "b" -->
33
+ `;
34
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(content);
35
+ strict_1.default.equal(errors.length, 0);
36
+ strict_1.default.equal(rules.length, 2);
37
+ strict_1.default.equal(rules[0].linterRule, "eslint/no-console");
38
+ strict_1.default.equal(rules[0].line, 2);
39
+ strict_1.default.equal(rules[1].linterRule, "ruff/F401");
40
+ strict_1.default.equal(rules[1].line, 4);
41
+ });
42
+ (0, node_test_1.it)("supports plugin-scoped rule names with slashes", () => {
43
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`<!-- vigiles:enforce eslint/@typescript-eslint/no-floating-promises "Await or void" -->`);
44
+ strict_1.default.equal(errors.length, 0);
45
+ strict_1.default.equal(rules.length, 1);
46
+ strict_1.default.equal(rules[0].linterRule, "eslint/@typescript-eslint/no-floating-promises");
47
+ });
48
+ (0, node_test_1.it)("reports malformed vigiles:enforce as a parse error", () => {
49
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`<!-- vigiles:enforce eslint/no-console no quotes here -->`);
50
+ strict_1.default.equal(rules.length, 0);
51
+ strict_1.default.equal(errors.length, 1);
52
+ strict_1.default.match(errors[0].message, /Malformed vigiles:enforce/);
53
+ });
54
+ (0, node_test_1.it)("reports unknown vigiles markers", () => {
55
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`<!-- vigiles:strengthen eslint/no-console -->`);
56
+ strict_1.default.equal(rules.length, 0);
57
+ strict_1.default.equal(errors.length, 1);
58
+ strict_1.default.match(errors[0].message, /Unknown vigiles marker "strengthen"/);
59
+ });
60
+ (0, node_test_1.it)("returns empty results for a file with no vigiles comments", () => {
61
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`# Plain\n\nJust prose, no rules.\n`);
62
+ strict_1.default.equal(rules.length, 0);
63
+ strict_1.default.equal(errors.length, 0);
64
+ });
65
+ (0, node_test_1.it)("skips the compiled-file hash marker without reporting an error", () => {
66
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`<!-- vigiles:sha256:abc123 compiled from CLAUDE.md.spec.ts -->
67
+ # Project
68
+ <!-- vigiles:enforce eslint/no-console "why" -->
69
+ `);
70
+ strict_1.default.equal(errors.length, 0, JSON.stringify(errors));
71
+ strict_1.default.equal(rules.length, 1);
72
+ });
73
+ (0, node_test_1.it)("ignores vigiles:enforce markers inside fenced code blocks", () => {
74
+ // Illustrative example in docs/inline-mode.md would otherwise get
75
+ // picked up as a live rule.
76
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`# Docs
77
+
78
+ Example usage:
79
+
80
+ \`\`\`md
81
+ <!-- vigiles:enforce eslint/no-console "Use structured logger" -->
82
+ <!-- vigiles:enforce ruff/F401 "No unused imports" -->
83
+ \`\`\`
84
+
85
+ And a real one outside the fence:
86
+
87
+ <!-- vigiles:enforce eslint/no-eval "Never eval user input" -->
88
+ `);
89
+ strict_1.default.equal(errors.length, 0, JSON.stringify(errors));
90
+ strict_1.default.equal(rules.length, 1);
91
+ strict_1.default.equal(rules[0].linterRule, "eslint/no-eval");
92
+ });
93
+ (0, node_test_1.it)("ignores markers inside tilde-fenced code blocks", () => {
94
+ const { rules } = (0, inline_js_1.parseInlineRules)(`~~~md
95
+ <!-- vigiles:enforce eslint/no-console "inside fence" -->
96
+ ~~~
97
+ <!-- vigiles:enforce eslint/no-eval "outside fence" -->
98
+ `);
99
+ strict_1.default.equal(rules.length, 1);
100
+ strict_1.default.equal(rules[0].linterRule, "eslint/no-eval");
101
+ });
102
+ (0, node_test_1.it)("ignores markers inside inline code spans in prose", () => {
103
+ // Prose that describes the syntax with a backtick-wrapped example
104
+ // must not trigger "malformed vigiles:enforce".
105
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`You add \`<!-- vigiles:enforce eslint/no-console "why" -->\` comments to adopt gradually.
106
+
107
+ Real rule below:
108
+
109
+ <!-- vigiles:enforce eslint/no-eval "Never eval" -->
110
+ `);
111
+ strict_1.default.equal(errors.length, 0, JSON.stringify(errors));
112
+ strict_1.default.equal(rules.length, 1);
113
+ strict_1.default.equal(rules[0].linterRule, "eslint/no-eval");
114
+ });
115
+ (0, node_test_1.it)("ignores ellipsis placeholders inside inline code spans", () => {
116
+ const { rules, errors } = (0, inline_js_1.parseInlineRules)(`You add \`<!-- vigiles:enforce ... -->\` comments to adopt gradually.
117
+ `);
118
+ strict_1.default.equal(errors.length, 0, JSON.stringify(errors));
119
+ strict_1.default.equal(rules.length, 0);
120
+ });
121
+ (0, node_test_1.it)("handles nested backtick fences of different lengths", () => {
122
+ // Opening with 4 backticks, closing with 3 inside should NOT close
123
+ // the outer block — only a 4+ backtick close matches.
124
+ const { rules } = (0, inline_js_1.parseInlineRules)(`\`\`\`\`md
125
+ \`\`\`
126
+ <!-- vigiles:enforce eslint/no-console "inside outer" -->
127
+ \`\`\`
128
+ \`\`\`\`
129
+ <!-- vigiles:enforce eslint/no-eval "outside" -->
130
+ `);
131
+ strict_1.default.equal(rules.length, 1);
132
+ strict_1.default.equal(rules[0].linterRule, "eslint/no-eval");
133
+ });
134
+ });
135
+ (0, node_test_1.describe)("hasInlineRules", () => {
136
+ (0, node_test_1.it)("returns true when a valid enforce comment exists", () => {
137
+ strict_1.default.equal((0, inline_js_1.hasInlineRules)(`<!-- vigiles:enforce eslint/no-console "why" -->`), true);
138
+ });
139
+ (0, node_test_1.it)("returns false for plain markdown", () => {
140
+ strict_1.default.equal((0, inline_js_1.hasInlineRules)(`# Title\n\nparagraph\n`), false);
141
+ });
142
+ (0, node_test_1.it)("returns false for a malformed marker", () => {
143
+ strict_1.default.equal((0, inline_js_1.hasInlineRules)(`<!-- vigiles:enforce eslint/no-console no-quotes -->`), false);
144
+ });
145
+ (0, node_test_1.it)("returns false for markers trapped inside fenced code blocks", () => {
146
+ strict_1.default.equal((0, inline_js_1.hasInlineRules)(`# Docs\n\n\`\`\`md\n<!-- vigiles:enforce eslint/no-console "x" -->\n\`\`\`\n`), false);
147
+ });
148
+ (0, node_test_1.it)("returns true only for parseable rules outside fences", () => {
149
+ strict_1.default.equal((0, inline_js_1.hasInlineRules)(`\`\`\`md\n<!-- vigiles:enforce eslint/no-console "inside" -->\n\`\`\`\n<!-- vigiles:enforce eslint/no-eval "outside" -->\n`), true);
150
+ });
151
+ });
152
+ //# sourceMappingURL=inline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline.test.js","sourceRoot":"","sources":["../src/inline.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Linter cross-referencing engine.
3
+ *
4
+ * Verifies that linter rule references (e.g., "eslint/no-console") point to
5
+ * real rules that exist and are enabled in project config. Supports:
6
+ * ESLint, Stylelint (Node API), Ruff, Clippy, Pylint, RuboCop (CLI).
7
+ *
8
+ * This is the core moat — no other tool resolves rules against 6 linter APIs
9
+ * and checks config-enabled status.
10
+ */
11
+ export type ConfigEnabledStatus = "enabled" | "disabled" | "unknown";
12
+ export interface LinterCheckResult {
13
+ exists: boolean;
14
+ enabled: ConfigEnabledStatus;
15
+ linter: string;
16
+ rule: string;
17
+ error?: string;
18
+ }
19
+ export interface DetectedLinter {
20
+ name: string;
21
+ ruleCount?: number;
22
+ via?: string;
23
+ }
24
+ /** @internal */ export declare function extractLinterName(enforcedBy: string): string;
25
+ /** @internal */ export declare function extractRuleName(enforcedBy: string): string | null;
26
+ /**
27
+ * Check a single linter rule reference (e.g., "eslint/no-console").
28
+ *
29
+ * Verifies: (1) rule exists in linter, (2) rule is enabled in project config.
30
+ * Returns a result with exists/enabled status.
31
+ */
32
+ export declare function checkLinterRule(enforcedBy: string, basePath: string, options?: {
33
+ catalogOnly?: boolean;
34
+ linters?: Record<string, {
35
+ rulesDir?: string | string[];
36
+ }>;
37
+ }): LinterCheckResult;
38
+ //# sourceMappingURL=linters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linters.d.ts","sourceRoot":"","sources":["../src/linters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAYD,gBAAgB,CAAC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO7E;AAED,gBAAgB,CAAC,wBAAgB,eAAe,CAC9C,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CASf;AAqmBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5D,GACA,iBAAiB,CA6BnB"}