@googlarz/agents-sync 1.4.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 (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +507 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +267 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config/loader.d.ts +9 -0
  8. package/dist/config/loader.d.ts.map +1 -0
  9. package/dist/config/loader.js +55 -0
  10. package/dist/config/loader.js.map +1 -0
  11. package/dist/config/schema.d.ts +69 -0
  12. package/dist/config/schema.d.ts.map +1 -0
  13. package/dist/config/schema.js +33 -0
  14. package/dist/config/schema.js.map +1 -0
  15. package/dist/derivers/aider.d.ts +19 -0
  16. package/dist/derivers/aider.d.ts.map +1 -0
  17. package/dist/derivers/aider.js +117 -0
  18. package/dist/derivers/aider.js.map +1 -0
  19. package/dist/derivers/claude.d.ts +19 -0
  20. package/dist/derivers/claude.d.ts.map +1 -0
  21. package/dist/derivers/claude.js +93 -0
  22. package/dist/derivers/claude.js.map +1 -0
  23. package/dist/derivers/cline.d.ts +17 -0
  24. package/dist/derivers/cline.d.ts.map +1 -0
  25. package/dist/derivers/cline.js +92 -0
  26. package/dist/derivers/cline.js.map +1 -0
  27. package/dist/derivers/copilot.d.ts +16 -0
  28. package/dist/derivers/copilot.d.ts.map +1 -0
  29. package/dist/derivers/copilot.js +162 -0
  30. package/dist/derivers/copilot.js.map +1 -0
  31. package/dist/derivers/cursor.d.ts +16 -0
  32. package/dist/derivers/cursor.d.ts.map +1 -0
  33. package/dist/derivers/cursor.js +121 -0
  34. package/dist/derivers/cursor.js.map +1 -0
  35. package/dist/derivers/gemini.d.ts +19 -0
  36. package/dist/derivers/gemini.d.ts.map +1 -0
  37. package/dist/derivers/gemini.js +33 -0
  38. package/dist/derivers/gemini.js.map +1 -0
  39. package/dist/derivers/index.d.ts +33 -0
  40. package/dist/derivers/index.d.ts.map +1 -0
  41. package/dist/derivers/index.js +134 -0
  42. package/dist/derivers/index.js.map +1 -0
  43. package/dist/derivers/merger.d.ts +36 -0
  44. package/dist/derivers/merger.d.ts.map +1 -0
  45. package/dist/derivers/merger.js +83 -0
  46. package/dist/derivers/merger.js.map +1 -0
  47. package/dist/derivers/roo.d.ts +18 -0
  48. package/dist/derivers/roo.d.ts.map +1 -0
  49. package/dist/derivers/roo.js +92 -0
  50. package/dist/derivers/roo.js.map +1 -0
  51. package/dist/derivers/windsurf.d.ts +16 -0
  52. package/dist/derivers/windsurf.d.ts.map +1 -0
  53. package/dist/derivers/windsurf.js +91 -0
  54. package/dist/derivers/windsurf.js.map +1 -0
  55. package/dist/extractor/extractor.d.ts +4 -0
  56. package/dist/extractor/extractor.d.ts.map +1 -0
  57. package/dist/extractor/extractor.js +125 -0
  58. package/dist/extractor/extractor.js.map +1 -0
  59. package/dist/extractor/schema.d.ts +187 -0
  60. package/dist/extractor/schema.d.ts.map +1 -0
  61. package/dist/extractor/schema.js +44 -0
  62. package/dist/extractor/schema.js.map +1 -0
  63. package/dist/generator/agents-md.d.ts +6 -0
  64. package/dist/generator/agents-md.d.ts.map +1 -0
  65. package/dist/generator/agents-md.js +135 -0
  66. package/dist/generator/agents-md.js.map +1 -0
  67. package/dist/generator/validator.d.ts +7 -0
  68. package/dist/generator/validator.d.ts.map +1 -0
  69. package/dist/generator/validator.js +67 -0
  70. package/dist/generator/validator.js.map +1 -0
  71. package/dist/lib/claude-client.d.ts +11 -0
  72. package/dist/lib/claude-client.d.ts.map +1 -0
  73. package/dist/lib/claude-client.js +74 -0
  74. package/dist/lib/claude-client.js.map +1 -0
  75. package/dist/lib/errors.d.ts +10 -0
  76. package/dist/lib/errors.d.ts.map +1 -0
  77. package/dist/lib/errors.js +27 -0
  78. package/dist/lib/errors.js.map +1 -0
  79. package/dist/lib/file-utils.d.ts +7 -0
  80. package/dist/lib/file-utils.d.ts.map +1 -0
  81. package/dist/lib/file-utils.js +56 -0
  82. package/dist/lib/file-utils.js.map +1 -0
  83. package/dist/lib/token-estimate.d.ts +7 -0
  84. package/dist/lib/token-estimate.d.ts.map +1 -0
  85. package/dist/lib/token-estimate.js +15 -0
  86. package/dist/lib/token-estimate.js.map +1 -0
  87. package/dist/scanner/codegraph.d.ts +13 -0
  88. package/dist/scanner/codegraph.d.ts.map +1 -0
  89. package/dist/scanner/codegraph.js +65 -0
  90. package/dist/scanner/codegraph.js.map +1 -0
  91. package/dist/scanner/docs.d.ts +13 -0
  92. package/dist/scanner/docs.d.ts.map +1 -0
  93. package/dist/scanner/docs.js +63 -0
  94. package/dist/scanner/docs.js.map +1 -0
  95. package/dist/scanner/gotchas.d.ts +8 -0
  96. package/dist/scanner/gotchas.d.ts.map +1 -0
  97. package/dist/scanner/gotchas.js +107 -0
  98. package/dist/scanner/gotchas.js.map +1 -0
  99. package/dist/scanner/index.d.ts +26 -0
  100. package/dist/scanner/index.d.ts.map +1 -0
  101. package/dist/scanner/index.js +95 -0
  102. package/dist/scanner/index.js.map +1 -0
  103. package/dist/scanner/manifest.d.ts +13 -0
  104. package/dist/scanner/manifest.d.ts.map +1 -0
  105. package/dist/scanner/manifest.js +285 -0
  106. package/dist/scanner/manifest.js.map +1 -0
  107. package/dist/scanner/mcp.d.ts +12 -0
  108. package/dist/scanner/mcp.d.ts.map +1 -0
  109. package/dist/scanner/mcp.js +96 -0
  110. package/dist/scanner/mcp.js.map +1 -0
  111. package/dist/scanner/repomix.d.ts +11 -0
  112. package/dist/scanner/repomix.d.ts.map +1 -0
  113. package/dist/scanner/repomix.js +87 -0
  114. package/dist/scanner/repomix.js.map +1 -0
  115. package/dist/scanner/skills.d.ts +18 -0
  116. package/dist/scanner/skills.d.ts.map +1 -0
  117. package/dist/scanner/skills.js +100 -0
  118. package/dist/scanner/skills.js.map +1 -0
  119. package/dist/scanner/source.d.ts +13 -0
  120. package/dist/scanner/source.d.ts.map +1 -0
  121. package/dist/scanner/source.js +157 -0
  122. package/dist/scanner/source.js.map +1 -0
  123. package/dist/scanner/structure.d.ts +10 -0
  124. package/dist/scanner/structure.d.ts.map +1 -0
  125. package/dist/scanner/structure.js +168 -0
  126. package/dist/scanner/structure.js.map +1 -0
  127. package/dist/server.d.ts +2 -0
  128. package/dist/server.d.ts.map +1 -0
  129. package/dist/server.js +245 -0
  130. package/dist/server.js.map +1 -0
  131. package/dist/snapshot/drift.d.ts +28 -0
  132. package/dist/snapshot/drift.d.ts.map +1 -0
  133. package/dist/snapshot/drift.js +205 -0
  134. package/dist/snapshot/drift.js.map +1 -0
  135. package/dist/snapshot/schema.d.ts +94 -0
  136. package/dist/snapshot/schema.d.ts.map +1 -0
  137. package/dist/snapshot/schema.js +24 -0
  138. package/dist/snapshot/schema.js.map +1 -0
  139. package/dist/snapshot/writer.d.ts +17 -0
  140. package/dist/snapshot/writer.d.ts.map +1 -0
  141. package/dist/snapshot/writer.js +44 -0
  142. package/dist/snapshot/writer.js.map +1 -0
  143. package/dist/tools/drift.d.ts +15 -0
  144. package/dist/tools/drift.d.ts.map +1 -0
  145. package/dist/tools/drift.js +51 -0
  146. package/dist/tools/drift.js.map +1 -0
  147. package/dist/tools/export.d.ts +14 -0
  148. package/dist/tools/export.d.ts.map +1 -0
  149. package/dist/tools/export.js +53 -0
  150. package/dist/tools/export.js.map +1 -0
  151. package/dist/tools/init.d.ts +28 -0
  152. package/dist/tools/init.d.ts.map +1 -0
  153. package/dist/tools/init.js +103 -0
  154. package/dist/tools/init.js.map +1 -0
  155. package/dist/tools/lint.d.ts +24 -0
  156. package/dist/tools/lint.d.ts.map +1 -0
  157. package/dist/tools/lint.js +213 -0
  158. package/dist/tools/lint.js.map +1 -0
  159. package/dist/tools/scan-report.d.ts +14 -0
  160. package/dist/tools/scan-report.d.ts.map +1 -0
  161. package/dist/tools/scan-report.js +136 -0
  162. package/dist/tools/scan-report.js.map +1 -0
  163. package/dist/tools/status.d.ts +18 -0
  164. package/dist/tools/status.d.ts.map +1 -0
  165. package/dist/tools/status.js +38 -0
  166. package/dist/tools/status.js.map +1 -0
  167. package/dist/tools/sync.d.ts +22 -0
  168. package/dist/tools/sync.d.ts.map +1 -0
  169. package/dist/tools/sync.js +123 -0
  170. package/dist/tools/sync.js.map +1 -0
  171. package/dist/tools/validate.d.ts +22 -0
  172. package/dist/tools/validate.d.ts.map +1 -0
  173. package/dist/tools/validate.js +97 -0
  174. package/dist/tools/validate.js.map +1 -0
  175. package/docs/agents-md-spec.md +233 -0
  176. package/docs/examples/.clinerules +29 -0
  177. package/docs/examples/.cursorrules +19 -0
  178. package/docs/examples/.windsurfrules +14 -0
  179. package/docs/examples/AGENTS.md +97 -0
  180. package/docs/examples/CLAUDE.md +88 -0
  181. package/docs/examples/GEMINI.md +61 -0
  182. package/docs/examples/copilot-instructions.md +24 -0
  183. package/docs/github-action.yml +89 -0
  184. package/package.json +63 -0
  185. package/scripts/demo.sh +138 -0
  186. package/skill/SKILL.md +158 -0
@@ -0,0 +1,17 @@
1
+ import { type Snapshot, type ManagedFile } from "./schema.js";
2
+ export declare function sha256(content: string): string;
3
+ export declare function snapshotPath(projectPath: string): string;
4
+ export declare function loadSnapshot(projectPath: string): Promise<Snapshot | null>;
5
+ export declare function saveSnapshot(snapshot: Snapshot): Promise<void>;
6
+ export declare function buildSnapshot(params: {
7
+ projectPath: string;
8
+ manifestContent: string;
9
+ structureHash: string;
10
+ filesManaged: ManagedFile[];
11
+ language: string;
12
+ framework: string | null;
13
+ topLevelDirs: string[];
14
+ dependencyCount: number;
15
+ totalFiles: number;
16
+ }): Snapshot;
17
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/snapshot/writer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,WAAW,EAA+C,MAAM,aAAa,CAAC;AAE3G,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQhF;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,QAAQ,CAmBX"}
@@ -0,0 +1,44 @@
1
+ import crypto from "node:crypto";
2
+ import path from "node:path";
3
+ import { writeFileAtomic, readFileSafe } from "../lib/file-utils.js";
4
+ import { SnapshotSchema, SNAPSHOT_DIR, SNAPSHOT_FILE } from "./schema.js";
5
+ export function sha256(content) {
6
+ return crypto.createHash("sha256").update(content).digest("hex");
7
+ }
8
+ export function snapshotPath(projectPath) {
9
+ return path.join(projectPath, SNAPSHOT_DIR, SNAPSHOT_FILE);
10
+ }
11
+ export async function loadSnapshot(projectPath) {
12
+ const raw = await readFileSafe(snapshotPath(projectPath));
13
+ if (!raw)
14
+ return null;
15
+ try {
16
+ return SnapshotSchema.parse(JSON.parse(raw));
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ export async function saveSnapshot(snapshot) {
23
+ await writeFileAtomic(snapshotPath(snapshot.projectPath), JSON.stringify(snapshot, null, 2));
24
+ }
25
+ export function buildSnapshot(params) {
26
+ const manifestHash = sha256(params.manifestContent);
27
+ const codebaseHash = sha256(params.manifestContent + params.structureHash);
28
+ return {
29
+ version: "1.0",
30
+ syncedAt: new Date().toISOString(),
31
+ projectPath: params.projectPath,
32
+ codebaseHash,
33
+ manifestHash,
34
+ filesManaged: params.filesManaged,
35
+ meta: {
36
+ dependencyCount: params.dependencyCount,
37
+ topLevelDirs: params.topLevelDirs,
38
+ language: params.language,
39
+ framework: params.framework,
40
+ totalFiles: params.totalFiles,
41
+ },
42
+ };
43
+ }
44
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/snapshot/writer.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAmC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3G,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAkB;IACnD,MAAM,eAAe,CACnB,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAClC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAU7B;IACC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAE3E,OAAO;QACL,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAClC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY;QACZ,YAAY;QACZ,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,IAAI,EAAE;YACJ,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface DriftOptions {
2
+ projectPath: string;
3
+ }
4
+ export interface DriftToolResult {
5
+ hasSnapshot: boolean;
6
+ report: string;
7
+ maxSeverity?: string;
8
+ signalCount?: number;
9
+ daysSinceSync?: number;
10
+ recommendation?: string;
11
+ /** true when maxSeverity is HIGH — use to set CI exit code */
12
+ highDrift: boolean;
13
+ }
14
+ export declare function runDrift(options: DriftOptions): Promise<DriftToolResult>;
15
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/tools/drift.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAiD9E"}
@@ -0,0 +1,51 @@
1
+ import path from "node:path";
2
+ import { assertProjectDir, readFileSafe } from "../lib/file-utils.js";
3
+ import { scan } from "../scanner/index.js";
4
+ import { loadSnapshot } from "../snapshot/writer.js";
5
+ import { detectDrift, detectSemanticDrift, formatDriftReport } from "../snapshot/drift.js";
6
+ export async function runDrift(options) {
7
+ await assertProjectDir(options.projectPath);
8
+ const snapshot = await loadSnapshot(options.projectPath);
9
+ if (!snapshot) {
10
+ return {
11
+ hasSnapshot: false,
12
+ report: "No snapshot found. Run init first.",
13
+ highDrift: false,
14
+ };
15
+ }
16
+ const corpus = await scan(options.projectPath);
17
+ const result = detectDrift(snapshot, corpus);
18
+ if (!result.hasSnapshot) {
19
+ return { hasSnapshot: false, report: "No snapshot found. Run init first.", highDrift: false };
20
+ }
21
+ // Augment with semantic drift — contradictions between AGENTS.md claims and current stack
22
+ const agentsMd = await readFileSafe(path.join(options.projectPath, "AGENTS.md"));
23
+ if (agentsMd) {
24
+ const semanticSignals = detectSemanticDrift(agentsMd, corpus);
25
+ result.signals.push(...semanticSignals);
26
+ // Recompute maxSeverity after merging
27
+ if (semanticSignals.some((s) => s.severity === "HIGH"))
28
+ result.maxSeverity = "HIGH";
29
+ else if (semanticSignals.some((s) => s.severity === "MEDIUM") && result.maxSeverity === "NONE")
30
+ result.maxSeverity = "MEDIUM";
31
+ result.recommendation =
32
+ result.maxSeverity === "HIGH"
33
+ ? "Re-sync strongly recommended. Run: /agents-sync sync"
34
+ : result.maxSeverity === "MEDIUM"
35
+ ? "Re-sync recommended. Run: /agents-sync sync"
36
+ : result.maxSeverity === "LOW"
37
+ ? "Minor drift detected. Re-sync when convenient."
38
+ : `Up to date. Last synced ${result.daysSinceSync} day${result.daysSinceSync === 1 ? "" : "s"} ago.`;
39
+ }
40
+ const report = formatDriftReport(result);
41
+ return {
42
+ hasSnapshot: true,
43
+ report,
44
+ maxSeverity: result.maxSeverity,
45
+ signalCount: result.signals.length,
46
+ daysSinceSync: result.daysSinceSync,
47
+ recommendation: result.recommendation,
48
+ highDrift: result.maxSeverity === "HIGH",
49
+ };
50
+ }
51
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/tools/drift.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAoB,MAAM,sBAAsB,CAAC;AAiB7G,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAqB;IAClD,MAAM,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,oCAAoC;YAC5C,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACxB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAChG,CAAC;IAED,0FAA0F;IAC1F,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IACjF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,eAAe,GAAG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QACxC,sCAAsC;QACtC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;YAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;aAC/E,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM;YAC5F,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;QAChC,MAAM,CAAC,cAAc;YACnB,MAAM,CAAC,WAAW,KAAK,MAAM;gBAC3B,CAAC,CAAC,sDAAsD;gBACxD,CAAC,CAAC,MAAM,CAAC,WAAW,KAAK,QAAQ;oBACjC,CAAC,CAAC,6CAA6C;oBAC/C,CAAC,CAAC,MAAM,CAAC,WAAW,KAAK,KAAK;wBAC9B,CAAC,CAAC,gDAAgD;wBAClD,CAAC,CAAC,2BAA2B,MAAM,CAAC,aAAa,OAAO,MAAM,CAAC,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IAC3G,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEzC,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,MAAM;QACN,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;QAClC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,WAAW,KAAK,MAAM;KACzC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type ToolName } from "../derivers/index.js";
2
+ export interface ExportOptions {
3
+ projectPath: string;
4
+ tool: ToolName;
5
+ }
6
+ export interface ExportResult {
7
+ tool: ToolName;
8
+ path: string;
9
+ written: boolean;
10
+ report: string;
11
+ error?: string;
12
+ }
13
+ export declare function runExport(options: ExportOptions): Promise<ExportResult>;
14
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/tools/export.ts"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA6D7E"}
@@ -0,0 +1,53 @@
1
+ import path from "node:path";
2
+ import { assertProjectDir, readFileSafe } from "../lib/file-utils.js";
3
+ import { AgentsSyncError } from "../lib/errors.js";
4
+ import { loadSnapshot } from "../snapshot/writer.js";
5
+ import { deriveAll } from "../derivers/index.js";
6
+ export async function runExport(options) {
7
+ await assertProjectDir(options.projectPath);
8
+ const snapshot = await loadSnapshot(options.projectPath);
9
+ if (!snapshot) {
10
+ throw new AgentsSyncError("NO_SNAPSHOT", "No snapshot found. Cannot export without a prior sync.", "Run /agents-sync init first.");
11
+ }
12
+ const agentsMd = await readFileSafe(path.join(options.projectPath, "AGENTS.md"));
13
+ if (!agentsMd) {
14
+ throw new AgentsSyncError("NO_SNAPSHOT", "AGENTS.md not found. Cannot derive tool file without canonical source.", "Run /agents-sync init first.");
15
+ }
16
+ // Build minimal metadata from snapshot for re-derivation (no Claude API call)
17
+ const minimalMetadata = {
18
+ project: {
19
+ name: path.basename(options.projectPath),
20
+ description: "",
21
+ language: snapshot.meta.language,
22
+ framework: snapshot.meta.framework ?? undefined,
23
+ },
24
+ stack: { other: [] },
25
+ architecture: { keyDirs: {}, entryPoints: [] },
26
+ conventions: [],
27
+ gotchas: [],
28
+ boundaries: { alwaysDo: [], askFirst: [], never: [] },
29
+ testing: {},
30
+ deployment: { notes: [] },
31
+ };
32
+ const results = await deriveAll({
33
+ projectPath: options.projectPath,
34
+ agentsMdContent: agentsMd,
35
+ metadata: minimalMetadata,
36
+ tools: [options.tool],
37
+ });
38
+ const result = results.find((r) => r.tool === options.tool);
39
+ if (!result) {
40
+ return { tool: options.tool, path: "", written: false, report: `✗ ${options.tool}: No result from deriver`, error: "No result from deriver" };
41
+ }
42
+ const report = result.error
43
+ ? `✗ ${options.tool}: ${result.error}`
44
+ : `✓ ${options.tool} → ${result.path}`;
45
+ return {
46
+ tool: options.tool,
47
+ path: result.path,
48
+ written: result.written,
49
+ report,
50
+ error: result.error,
51
+ };
52
+ }
53
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/tools/export.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAiB,MAAM,sBAAsB,CAAC;AAgBhE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB;IACpD,MAAM,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,eAAe,CACvB,aAAa,EACb,wDAAwD,EACxD,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,eAAe,CACvB,aAAa,EACb,wEAAwE,EACxE,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,MAAM,eAAe,GAAoB;QACvC,OAAO,EAAE;YACP,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;YACxC,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ;YAChC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS;SAChD;QACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACpB,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QAC9C,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACrD,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;KAC1B,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,QAAQ;QACzB,QAAQ,EAAE,eAAe;QACzB,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;KACtB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,0BAA0B,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IAChJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK;QACzB,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE;QACtC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type ToolName } from "../derivers/index.js";
2
+ export interface InitOptions {
3
+ projectPath: string;
4
+ tools?: ToolName[];
5
+ dryRun?: boolean;
6
+ /** Path to a repomix output file to use as source corpus instead of filesystem sampling. */
7
+ repomixOutput?: string;
8
+ }
9
+ export interface InitResult {
10
+ success: boolean;
11
+ agentsMdPath: string;
12
+ filesWritten: {
13
+ tool: string;
14
+ path: string;
15
+ }[];
16
+ customSectionsPreserved: number;
17
+ /** Files that existed before init and whose content was preserved as a custom block. */
18
+ preservedExistingFiles: string[];
19
+ tokenUsage: {
20
+ input: number;
21
+ output: number;
22
+ cacheHit: number;
23
+ };
24
+ warnings: string[];
25
+ dryRun: boolean;
26
+ }
27
+ export declare function runInit(options: InitOptions): Promise<InitResult>;
28
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMhE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4FAA4F;IAC5F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/C,uBAAuB,EAAE,MAAM,CAAC;IAChC,wFAAwF;IACxF,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkHvE"}
@@ -0,0 +1,103 @@
1
+ import path from "node:path";
2
+ import { assertProjectDir, readFileSafe, writeFileAtomic } from "../lib/file-utils.js";
3
+ import { scan } from "../scanner/index.js";
4
+ import { extractMetadata } from "../extractor/extractor.js";
5
+ import { generateAgentsMd, appendMcpSection } from "../generator/agents-md.js";
6
+ import { validateAgentsMd } from "../generator/validator.js";
7
+ import { deriveAll } from "../derivers/index.js";
8
+ import { buildSnapshot, saveSnapshot, sha256 } from "../snapshot/writer.js";
9
+ import { isManagedByAgentsSync, injectCustomBlocks } from "../derivers/merger.js";
10
+ import { loadConfig, applyConfig } from "../config/loader.js";
11
+ export async function runInit(options) {
12
+ const { projectPath, tools, dryRun = false, repomixOutput } = options;
13
+ await assertProjectDir(projectPath);
14
+ // 1. Scan (optionally using repomix output as source corpus)
15
+ const corpus = await scan(projectPath, { repomixPath: repomixOutput });
16
+ // 2. Load team config (agents-sync.config.json) — non-fatal if missing
17
+ const config = await loadConfig(projectPath);
18
+ // 3. Extract metadata and merge config overrides
19
+ const rawMetadata = await extractMetadata(corpus);
20
+ const metadata = applyConfig(rawMetadata, config);
21
+ // 4. Resolve effective tool list: CLI flag > config > default (all)
22
+ const effectiveTools = tools ?? config?.tools;
23
+ // 5. Generate AGENTS.md, then append MCP section if servers detected
24
+ const agentsMd = appendMcpSection(await generateAgentsMd(metadata), corpus.mcp);
25
+ // 6. Validate
26
+ const validation = validateAgentsMd(agentsMd, corpus.structure.topLevelDirs);
27
+ const warnings = [...validation.warnings];
28
+ if (!validation.passed) {
29
+ warnings.push(...validation.failures.map((f) => `Quality check: ${f}`));
30
+ }
31
+ // 7. Write AGENTS.md — preserve existing unmanaged content as custom block
32
+ const agentsMdPath = path.join(projectPath, "AGENTS.md");
33
+ const preservedExistingFiles = [];
34
+ let agentsMdToWrite = agentsMd;
35
+ const existingAgentsMd = await readFileSafe(agentsMdPath);
36
+ if (existingAgentsMd && !isManagedByAgentsSync(existingAgentsMd)) {
37
+ const block = `\n<!-- Pre-existing AGENTS.md content preserved by agents-sync -->\n${existingAgentsMd}\n`;
38
+ agentsMdToWrite = injectCustomBlocks(agentsMd, [block]);
39
+ preservedExistingFiles.push("AGENTS.md");
40
+ warnings.push("AGENTS.md existed before init and was not managed — previous content preserved as a custom section.");
41
+ }
42
+ if (!dryRun) {
43
+ await writeFileAtomic(agentsMdPath, agentsMdToWrite);
44
+ }
45
+ // 8. Derive tool files (each deriver handles its own overwrite protection)
46
+ const derivations = await deriveAll({
47
+ projectPath,
48
+ agentsMdContent: agentsMdToWrite,
49
+ metadata,
50
+ tools: effectiveTools,
51
+ dryRun,
52
+ });
53
+ const filesWritten = derivations
54
+ .filter((d) => !d.error)
55
+ .map((d) => ({ tool: d.tool, path: d.path }));
56
+ const customSectionsPreserved = derivations.reduce((sum, d) => sum + (d.customBlocksPreserved ?? 0), 0);
57
+ for (const d of derivations) {
58
+ if (d.error)
59
+ warnings.push(`${d.tool}: ${d.error}`);
60
+ if (d.customBlocksPreserved > 0 && d.tool !== "agents-md") {
61
+ // Count preserved unmanaged files from derivers
62
+ // (loadUnmanagedFileAsCustomBlock wraps the whole file as 1 block)
63
+ preservedExistingFiles.push(d.path);
64
+ }
65
+ }
66
+ // 9. Save snapshot
67
+ if (!dryRun) {
68
+ const manifestContent = corpus.manifest.dependencies.join("\n") +
69
+ corpus.manifest.devDependencies.join("\n");
70
+ const managedFiles = [
71
+ { tool: "agents-md", path: agentsMdPath, sha256: sha256(agentsMdToWrite) },
72
+ ...derivations
73
+ .filter((d) => d.written && d.tool !== "agents-md")
74
+ .map((d) => ({ tool: d.tool, path: d.path, sha256: sha256("") })),
75
+ ];
76
+ const snapshot = buildSnapshot({
77
+ projectPath,
78
+ manifestContent,
79
+ structureHash: sha256(corpus.structure.topLevelDirs.join(",")),
80
+ filesManaged: managedFiles,
81
+ language: metadata.project.language,
82
+ framework: metadata.project.framework ?? null,
83
+ topLevelDirs: corpus.structure.topLevelDirs,
84
+ dependencyCount: corpus.manifest.dependencies.length,
85
+ totalFiles: corpus.structure.totalFileCount,
86
+ });
87
+ await saveSnapshot(snapshot);
88
+ }
89
+ if (!dryRun) {
90
+ warnings.push("Tip: add .agents-sync/ to your .gitignore");
91
+ }
92
+ return {
93
+ success: true,
94
+ agentsMdPath,
95
+ filesWritten,
96
+ customSectionsPreserved,
97
+ preservedExistingFiles,
98
+ tokenUsage: { input: 0, output: 0, cacheHit: 0 },
99
+ warnings,
100
+ dryRun,
101
+ };
102
+ }
103
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface LintOptions {
2
+ projectPath: string;
3
+ /** Exit non-zero on any violation (CI mode). */
4
+ strict?: boolean;
5
+ }
6
+ export interface LintViolation {
7
+ file: string;
8
+ line: number;
9
+ text: string;
10
+ }
11
+ export interface LintCheck {
12
+ rule: string;
13
+ checkable: boolean;
14
+ violations: LintViolation[];
15
+ skippedReason?: string;
16
+ }
17
+ export interface LintResult {
18
+ checks: LintCheck[];
19
+ totalViolations: number;
20
+ report: string;
21
+ passed: boolean;
22
+ }
23
+ export declare function runLint(options: LintOptions): Promise<LintResult>;
24
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAwLD,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAmDvE"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * agents-sync lint
3
+ *
4
+ * Parses the Never/Always/Boundaries sections of AGENTS.md and checks whether
5
+ * the codebase violates any mechanically-verifiable rules.
6
+ *
7
+ * Design principles:
8
+ * - Only report high-confidence violations (prefer false-negatives over false-positives)
9
+ * - Rules we cannot check are skipped gracefully, not errored
10
+ * - No AST parser required — grep-level checks only
11
+ */
12
+ import path from "node:path";
13
+ import fs from "node:fs/promises";
14
+ import fg from "fast-glob";
15
+ import { assertProjectDir, readFileSafe } from "../lib/file-utils.js";
16
+ // ─── Source file patterns ─────────────────────────────────────────────────────
17
+ const SOURCE_GLOBS = [
18
+ "**/*.{ts,tsx,js,jsx,mjs,cjs}",
19
+ "**/*.{py,rb,go,rs,java,kt,swift,php,cs}",
20
+ ];
21
+ const IGNORE_PATTERNS = [
22
+ "**/node_modules/**",
23
+ "**/.git/**",
24
+ "**/dist/**",
25
+ "**/build/**",
26
+ "**/__pycache__/**",
27
+ "**/.venv/**",
28
+ "**/target/**",
29
+ "**/.next/**",
30
+ "**/coverage/**",
31
+ "**/*.min.js",
32
+ "**/*.d.ts",
33
+ ];
34
+ const CHECKERS = [
35
+ // ── console.log ──────────────────────────────────────────────────────────────
36
+ {
37
+ matches: (r) => /console\.log/i.test(r),
38
+ check: async (_rule, _project, files) => grepFiles(files, /console\.log\s*\(/, ["**/*.test.*", "**/*.spec.*", "**/scripts/**"]),
39
+ },
40
+ // ── TypeScript `any` ─────────────────────────────────────────────────────────
41
+ {
42
+ matches: (r) => /\bany\b/.test(r) && /typescript|ts\b/i.test(r),
43
+ check: async (_rule, _project, files) => grepFiles(files.filter((f) => /\.(ts|tsx)$/.test(f.relPath)), /:\s*any\b/, ["**/*.test.*", "**/*.spec.*", "**/*.d.ts"]),
44
+ },
45
+ // ── `any` without qualifier (e.g. "never use `any`") ──────────────────────
46
+ {
47
+ matches: (r) => /\`any\`|"any"|use\s+any\b|type\s+any\b/i.test(r),
48
+ check: async (_rule, _project, files) => grepFiles(files.filter((f) => /\.(ts|tsx)$/.test(f.relPath)), /:\s*any\b/, ["**/*.test.*", "**/*.spec.*", "**/*.d.ts"]),
49
+ },
50
+ // ── Direct import of a named symbol ─────────────────────────────────────────
51
+ // Detects rules like "never import PrismaClient directly" or "never import X from Y"
52
+ {
53
+ matches: (r) => /import.+directly|never\s+import\s+\w|import\s+\w+\s+from/i.test(r),
54
+ check: async (rule, _project, files) => {
55
+ // Extract the symbol name (CamelCase word after "import")
56
+ const symbolMatch = /import\s+[`'"]?(\w+)[`'"]?\s+directly/i.exec(rule) ??
57
+ /never\s+import\s+[`'"]?(\w+)[`'"]?/i.exec(rule);
58
+ if (!symbolMatch)
59
+ return [];
60
+ const symbol = symbolMatch[1];
61
+ // Also try to extract the safe path (text inside parentheses or after "use")
62
+ const safePathMatch = /\(use\s+([^\)]+)\)|use\s+`([^`]+)`/i.exec(rule);
63
+ const safePath = safePathMatch?.[1] ?? safePathMatch?.[2];
64
+ return grepFiles(files, new RegExp(`import.*\\b${symbol}\\b.*from`), [], safePath ? [new RegExp(safePath.replace(/\//g, "\\/"))] : []);
65
+ },
66
+ },
67
+ // ── Default exports ──────────────────────────────────────────────────────────
68
+ {
69
+ matches: (r) => /default\s+export|export\s+default/i.test(r) && /never|no\s+default/i.test(r),
70
+ check: async (_rule, _project, files) => grepFiles(files.filter((f) => /\.(ts|tsx|js|jsx)$/.test(f.relPath)), /^export\s+default\b/m,
71
+ // Next.js pages and layouts are always allowed to use default exports
72
+ ["**/app/**", "**/pages/**"]),
73
+ },
74
+ // ── .env commit guard ────────────────────────────────────────────────────────
75
+ {
76
+ matches: (r) => /\.env/i.test(r) && /commit|git/i.test(r),
77
+ check: async (_rule, projectPath) => {
78
+ const gitignorePath = path.join(projectPath, ".gitignore");
79
+ const gitignore = await readFileSafe(gitignorePath);
80
+ if (!gitignore) {
81
+ return [{ file: ".gitignore", line: 0, text: ".gitignore not found — .env may not be protected" }];
82
+ }
83
+ const hasEnvEntry = /^\.env/m.test(gitignore);
84
+ if (!hasEnvEntry) {
85
+ return [{ file: ".gitignore", line: 0, text: '.env is not listed in .gitignore' }];
86
+ }
87
+ return [];
88
+ },
89
+ },
90
+ // ── process.env direct access (when convention says "use config module") ───
91
+ {
92
+ matches: (r) => /process\.env/i.test(r) && /never|directly/i.test(r),
93
+ check: async (_rule, _project, files) => grepFiles(files.filter((f) => /\.(ts|tsx|js|jsx)$/.test(f.relPath)), /process\.env\.\w+/, ["**/config/**", "**/*.config.*", "**/env.ts", "**/env.js"]),
94
+ },
95
+ ];
96
+ // ─── Grep helpers ─────────────────────────────────────────────────────────────
97
+ function grepFiles(files, pattern, skipGlobs = [], excludePatterns = []) {
98
+ const violations = [];
99
+ outer: for (const f of files) {
100
+ for (const skip of skipGlobs) {
101
+ // Strip glob wildcards and leading/trailing slashes, then do substring check
102
+ const seg = skip.replace(/\*\*/g, "").replace(/\*/g, "").replace(/^\/+|\/+$/g, "").replace(/\/+/g, "/");
103
+ if (seg && f.relPath.includes(seg))
104
+ continue outer;
105
+ }
106
+ for (let i = 0; i < f.lines.length; i++) {
107
+ const line = f.lines[i];
108
+ if (!pattern.test(line))
109
+ continue;
110
+ // If this line matches an exclusion pattern, skip it
111
+ if (excludePatterns.some((ex) => ex.test(line)))
112
+ continue;
113
+ violations.push({ file: f.relPath, line: i + 1, text: line.trim() });
114
+ if (violations.length >= 20)
115
+ return violations; // cap per-rule
116
+ }
117
+ }
118
+ return violations;
119
+ }
120
+ // ─── AGENTS.md parser ─────────────────────────────────────────────────────────
121
+ function extractNeverRules(agentsMdContent) {
122
+ const rules = [];
123
+ // Find the Never section (handles ### Never, ## Never, **Never**, etc.)
124
+ const neverMatch = /#{1,3}\s*Never\b([^#]*)/i.exec(agentsMdContent);
125
+ if (!neverMatch)
126
+ return rules;
127
+ const section = neverMatch[1];
128
+ for (const line of section.split("\n")) {
129
+ const item = line.replace(/^[-*•]\s*/, "").trim();
130
+ if (item.length > 4 && item.length < 300)
131
+ rules.push(item);
132
+ }
133
+ return rules;
134
+ }
135
+ // ─── Main ─────────────────────────────────────────────────────────────────────
136
+ export async function runLint(options) {
137
+ const { projectPath } = options;
138
+ await assertProjectDir(projectPath);
139
+ // Read AGENTS.md
140
+ const agentsMdPath = path.join(projectPath, "AGENTS.md");
141
+ const agentsMd = await readFileSafe(agentsMdPath);
142
+ if (!agentsMd) {
143
+ const report = "✗ AGENTS.md not found. Run agents-sync init first.";
144
+ return { checks: [], totalViolations: 0, report, passed: false };
145
+ }
146
+ const neverRules = extractNeverRules(agentsMd);
147
+ if (neverRules.length === 0) {
148
+ const report = "No 'Never' rules found in AGENTS.md — nothing to lint.";
149
+ return { checks: [], totalViolations: 0, report, passed: true };
150
+ }
151
+ // Load source files once (shared across all checks)
152
+ const relPaths = await fg(SOURCE_GLOBS, {
153
+ cwd: projectPath,
154
+ onlyFiles: true,
155
+ ignore: IGNORE_PATTERNS,
156
+ dot: false,
157
+ });
158
+ const sourceFiles = [];
159
+ for (const relPath of relPaths) {
160
+ const absPath = path.join(projectPath, relPath);
161
+ const content = await fs.readFile(absPath, "utf-8").catch(() => null);
162
+ if (!content || content.includes("\0"))
163
+ continue;
164
+ sourceFiles.push({ relPath, absPath, lines: content.split("\n") });
165
+ }
166
+ // Run checks
167
+ const checks = [];
168
+ for (const rule of neverRules) {
169
+ const checker = CHECKERS.find((c) => c.matches(rule));
170
+ if (!checker) {
171
+ checks.push({ rule, checkable: false, violations: [], skippedReason: "No automated check available" });
172
+ continue;
173
+ }
174
+ const violations = await checker.check(rule, projectPath, sourceFiles);
175
+ checks.push({ rule, checkable: true, violations });
176
+ }
177
+ const totalViolations = checks.reduce((n, c) => n + c.violations.length, 0);
178
+ const passed = totalViolations === 0;
179
+ const report = buildReport(checks, totalViolations);
180
+ return { checks, totalViolations, report, passed };
181
+ }
182
+ function buildReport(checks, totalViolations) {
183
+ const NO_COLOR = process.env.NO_COLOR === "1";
184
+ const c = (code, t) => (NO_COLOR ? t : `\x1b[${code}m${t}\x1b[0m`);
185
+ const lines = [];
186
+ lines.push(c("1", "agents-sync lint\n"));
187
+ for (const check of checks) {
188
+ if (!check.checkable) {
189
+ lines.push(`${c("2", "─")} ${c("2", check.rule)}`);
190
+ lines.push(` ${c("2", `↳ skipped: ${check.skippedReason}`)}`);
191
+ continue;
192
+ }
193
+ if (check.violations.length === 0) {
194
+ lines.push(`${c("32", "✓")} ${check.rule}`);
195
+ }
196
+ else {
197
+ lines.push(`${c("31;1", "✗")} ${check.rule} — ${c("31", String(check.violations.length))} violation${check.violations.length === 1 ? "" : "s"}`);
198
+ for (const v of check.violations) {
199
+ const loc = `${v.file}:${v.line}`.padEnd(45);
200
+ lines.push(` ${c("33", loc)} ${c("2", v.text.slice(0, 80))}`);
201
+ }
202
+ }
203
+ lines.push("");
204
+ }
205
+ if (totalViolations === 0) {
206
+ lines.push(c("32;1", "✓ No violations found."));
207
+ }
208
+ else {
209
+ lines.push(c("31;1", `${totalViolations} violation${totalViolations === 1 ? "" : "s"} found.`));
210
+ }
211
+ return lines.join("\n");
212
+ }
213
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/tools/lint.ts"],"names":[],"mappings":"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"}