@lsctech/polaris 0.1.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 (316) hide show
  1. package/README.md +87 -0
  2. package/dist/__mocks__/tool-server-linear.js +34 -0
  3. package/dist/cli/adopt-approve.js +60 -0
  4. package/dist/cli/adopt-cognition.js +199 -0
  5. package/dist/cli/adopt-instructions.js +143 -0
  6. package/dist/cli/adopt-rules.js +169 -0
  7. package/dist/cli/adopt-scan.js +25 -0
  8. package/dist/cli/adopt-smartdocs.js +192 -0
  9. package/dist/cli/adoption-inventory.js +350 -0
  10. package/dist/cli/adoption-plan.js +222 -0
  11. package/dist/cli/args.js +28 -0
  12. package/dist/cli/args.test.js +30 -0
  13. package/dist/cli/branding.js +41 -0
  14. package/dist/cli/graph.js +358 -0
  15. package/dist/cli/index.js +127 -0
  16. package/dist/cli/index.test.js +162 -0
  17. package/dist/cli/init-detect.js +61 -0
  18. package/dist/cli/init.js +492 -0
  19. package/dist/cli/init.test.js +259 -0
  20. package/dist/cli/librarian.js +32 -0
  21. package/dist/cli/medic.js +96 -0
  22. package/dist/cli/startup.test.js +23 -0
  23. package/dist/cli/tracker.js +130 -0
  24. package/dist/cli/tracker.test.js +126 -0
  25. package/dist/cli/version.js +10 -0
  26. package/dist/cli/version.test.js +11 -0
  27. package/dist/cli/worker.js +287 -0
  28. package/dist/cluster-state/fixtures/test-clusters.json +19 -0
  29. package/dist/cluster-state/store.js +302 -0
  30. package/dist/cluster-state/store.test.js +145 -0
  31. package/dist/cluster-state/types.js +2 -0
  32. package/dist/cognition/archive.js +158 -0
  33. package/dist/cognition/closeout-librarian-types.js +161 -0
  34. package/dist/cognition/cognition.test.js +623 -0
  35. package/dist/cognition/index.js +41 -0
  36. package/dist/cognition/librarian-dispatch.js +391 -0
  37. package/dist/cognition/librarian-dispatch.test.js +247 -0
  38. package/dist/cognition/librarian-packet.js +313 -0
  39. package/dist/cognition/librarian-types.js +57 -0
  40. package/dist/cognition/route-cognition-delta.js +350 -0
  41. package/dist/cognition/summary-delta.js +279 -0
  42. package/dist/cognition/validate.js +162 -0
  43. package/dist/config/defaults.js +98 -0
  44. package/dist/config/doctor.js +273 -0
  45. package/dist/config/index.js +14 -0
  46. package/dist/config/loader.js +58 -0
  47. package/dist/config/provider-detect.js +60 -0
  48. package/dist/config/provider-detect.test.js +119 -0
  49. package/dist/config/schema.js +2 -0
  50. package/dist/config/show.js +44 -0
  51. package/dist/config/show.test.js +42 -0
  52. package/dist/config/validator.js +675 -0
  53. package/dist/config/validator.test.js +77 -0
  54. package/dist/docs/canon-check.js +334 -0
  55. package/dist/docs/canon-check.test.js +207 -0
  56. package/dist/docs/doctrine.js +133 -0
  57. package/dist/docs/doctrine.test.js +139 -0
  58. package/dist/docs/index.js +168 -0
  59. package/dist/docs/index.test.js +83 -0
  60. package/dist/docs/ingest.js +295 -0
  61. package/dist/docs/ingest.test.js +71 -0
  62. package/dist/docs/migrate.js +165 -0
  63. package/dist/docs/migrate.test.js +136 -0
  64. package/dist/docs/seed-instructions.js +147 -0
  65. package/dist/docs/seed-instructions.test.js +137 -0
  66. package/dist/docs/validate-instructions.js +267 -0
  67. package/dist/docs/validate-instructions.test.js +238 -0
  68. package/dist/finalize/artifact-policy.js +214 -0
  69. package/dist/finalize/artifact-policy.test.js +84 -0
  70. package/dist/finalize/delivery-integrity.js +141 -0
  71. package/dist/finalize/finalize.test.js +210 -0
  72. package/dist/finalize/github.js +41 -0
  73. package/dist/finalize/index.js +474 -0
  74. package/dist/finalize/linear.js +213 -0
  75. package/dist/finalize/run-report.js +47 -0
  76. package/dist/finalize/steps/01-map-update.js +11 -0
  77. package/dist/finalize/steps/02-map-validate.js +11 -0
  78. package/dist/finalize/steps/03-schema-validate.js +11 -0
  79. package/dist/finalize/steps/04-run-checks.js +118 -0
  80. package/dist/finalize/steps/05-generate-report.js +14 -0
  81. package/dist/finalize/steps/06-commit.js +39 -0
  82. package/dist/finalize/steps/07-push.js +10 -0
  83. package/dist/finalize/steps/08-create-pr.js +9 -0
  84. package/dist/finalize/steps/09-update-state.js +9 -0
  85. package/dist/finalize/steps/10-append-jsonl.js +23 -0
  86. package/dist/finalize/steps/11-update-linear.js +22 -0
  87. package/dist/finalize/steps/12-archive.js +21 -0
  88. package/dist/graph/adapter/c/adapter.js +45 -0
  89. package/dist/graph/adapter/c/extract.js +135 -0
  90. package/dist/graph/adapter/c/index.js +10 -0
  91. package/dist/graph/adapter/c/runtime.js +67 -0
  92. package/dist/graph/adapter/cpp/adapter.js +45 -0
  93. package/dist/graph/adapter/cpp/extract.js +159 -0
  94. package/dist/graph/adapter/cpp/index.js +10 -0
  95. package/dist/graph/adapter/cpp/runtime.js +61 -0
  96. package/dist/graph/adapter/csharp/adapter.js +45 -0
  97. package/dist/graph/adapter/csharp/extract.js +127 -0
  98. package/dist/graph/adapter/csharp/index.js +10 -0
  99. package/dist/graph/adapter/csharp/runtime.js +61 -0
  100. package/dist/graph/adapter/dart/adapter.js +56 -0
  101. package/dist/graph/adapter/dart/extract.js +130 -0
  102. package/dist/graph/adapter/dart/index.js +10 -0
  103. package/dist/graph/adapter/dart/runtime.js +61 -0
  104. package/dist/graph/adapter/go/adapter.js +45 -0
  105. package/dist/graph/adapter/go/extract.js +112 -0
  106. package/dist/graph/adapter/go/index.js +10 -0
  107. package/dist/graph/adapter/go/runtime.js +58 -0
  108. package/dist/graph/adapter/kotlin-java/extract-common.js +83 -0
  109. package/dist/graph/adapter/kotlin-java/index.js +15 -0
  110. package/dist/graph/adapter/kotlin-java/java-adapter.js +45 -0
  111. package/dist/graph/adapter/kotlin-java/java-extract.js +42 -0
  112. package/dist/graph/adapter/kotlin-java/kotlin-adapter.js +48 -0
  113. package/dist/graph/adapter/kotlin-java/kotlin-extract.js +58 -0
  114. package/dist/graph/adapter/kotlin-java/runtime.js +75 -0
  115. package/dist/graph/adapter/python/adapter.js +45 -0
  116. package/dist/graph/adapter/python/extract.js +121 -0
  117. package/dist/graph/adapter/python/index.js +10 -0
  118. package/dist/graph/adapter/python/runtime.js +70 -0
  119. package/dist/graph/adapter/registry.js +82 -0
  120. package/dist/graph/adapter/rust/adapter.js +45 -0
  121. package/dist/graph/adapter/rust/extract.js +110 -0
  122. package/dist/graph/adapter/rust/index.js +10 -0
  123. package/dist/graph/adapter/rust/runtime.js +74 -0
  124. package/dist/graph/adapter/shell/adapter.js +34 -0
  125. package/dist/graph/adapter/shell/extract.js +98 -0
  126. package/dist/graph/adapter/shell/index.js +8 -0
  127. package/dist/graph/adapter/svelte/adapter.js +91 -0
  128. package/dist/graph/adapter/svelte/extract.js +41 -0
  129. package/dist/graph/adapter/svelte/index.js +8 -0
  130. package/dist/graph/adapter/swift/adapter.js +45 -0
  131. package/dist/graph/adapter/swift/extract.js +120 -0
  132. package/dist/graph/adapter/swift/index.js +10 -0
  133. package/dist/graph/adapter/swift/runtime.js +70 -0
  134. package/dist/graph/adapter/types.js +2 -0
  135. package/dist/graph/adapter/typescript-javascript/adapter.js +72 -0
  136. package/dist/graph/adapter/typescript-javascript/extract.js +115 -0
  137. package/dist/graph/adapter/typescript-javascript/index.js +10 -0
  138. package/dist/graph/adapter/typescript-javascript/runtime.js +97 -0
  139. package/dist/graph/capability/index.js +105 -0
  140. package/dist/graph/governance.js +104 -0
  141. package/dist/graph/parser/extract.js +5 -0
  142. package/dist/graph/parser/loader.js +2 -0
  143. package/dist/graph/parser/pipeline.js +194 -0
  144. package/dist/graph/query/index.js +277 -0
  145. package/dist/graph/query/types.js +5 -0
  146. package/dist/graph/resolver/build-edges.js +211 -0
  147. package/dist/graph/resolver/index.js +23 -0
  148. package/dist/graph/resolver/resolve-imports.js +168 -0
  149. package/dist/graph/store/adapter.js +132 -0
  150. package/dist/graph/store/queries.js +124 -0
  151. package/dist/graph/store/types.js +4 -0
  152. package/dist/ignore/defaults.js +41 -0
  153. package/dist/ignore/parser.js +39 -0
  154. package/dist/lint/map-reference-validator.js +72 -0
  155. package/dist/loop/abort.js +188 -0
  156. package/dist/loop/abort.test.js +151 -0
  157. package/dist/loop/adapters/__tests__/terminal-cli.test.js +92 -0
  158. package/dist/loop/adapters/agent-subtask.js +137 -0
  159. package/dist/loop/adapters/agent-subtask.test.js +151 -0
  160. package/dist/loop/adapters/cli-subtask-bridge.js +108 -0
  161. package/dist/loop/adapters/index.js +9 -0
  162. package/dist/loop/adapters/registry.js +17 -0
  163. package/dist/loop/adapters/terminal-cli.js +403 -0
  164. package/dist/loop/adapters/types.js +2 -0
  165. package/dist/loop/adapters/worker-instructions.js +85 -0
  166. package/dist/loop/body-parser.js +226 -0
  167. package/dist/loop/bootstrap-packet.js +97 -0
  168. package/dist/loop/bootstrap-packet.test.js +171 -0
  169. package/dist/loop/branch-governance.js +54 -0
  170. package/dist/loop/budget.js +63 -0
  171. package/dist/loop/budget.test.js +163 -0
  172. package/dist/loop/checkpoint.js +325 -0
  173. package/dist/loop/compact-return.js +59 -0
  174. package/dist/loop/continue.js +645 -0
  175. package/dist/loop/continue.test.js +337 -0
  176. package/dist/loop/dispatch-boundary.js +335 -0
  177. package/dist/loop/dispatch-state.js +223 -0
  178. package/dist/loop/dispatch-state.test.js +186 -0
  179. package/dist/loop/dispatch.js +1236 -0
  180. package/dist/loop/dispatch.test.js +499 -0
  181. package/dist/loop/ephemeral-smoke.test.js +160 -0
  182. package/dist/loop/evidence-backfill.js +216 -0
  183. package/dist/loop/execution-adapter.js +141 -0
  184. package/dist/loop/execution-adapter.test.js +66 -0
  185. package/dist/loop/finalize-evidence.js +169 -0
  186. package/dist/loop/git-custody.js +250 -0
  187. package/dist/loop/impl-packet-input.js +38 -0
  188. package/dist/loop/index.js +270 -0
  189. package/dist/loop/ledger.js +49 -0
  190. package/dist/loop/ledger.test.js +127 -0
  191. package/dist/loop/lifecycle-dispatch.js +348 -0
  192. package/dist/loop/lifecycle-dispatch.test.js +318 -0
  193. package/dist/loop/lifecycle.js +93 -0
  194. package/dist/loop/lifecycle.test.js +150 -0
  195. package/dist/loop/orphan-recovery.js +276 -0
  196. package/dist/loop/orphan-recovery.test.js +236 -0
  197. package/dist/loop/parent.js +1566 -0
  198. package/dist/loop/parent.test.js +738 -0
  199. package/dist/loop/provider-sealed-packet.test.js +164 -0
  200. package/dist/loop/resume.js +295 -0
  201. package/dist/loop/resume.test.js +172 -0
  202. package/dist/loop/run-bootstrap.js +234 -0
  203. package/dist/loop/run-preflight.js +203 -0
  204. package/dist/loop/status.js +665 -0
  205. package/dist/loop/status.test.js +235 -0
  206. package/dist/loop/wait.js +86 -0
  207. package/dist/loop/worker-packet.js +406 -0
  208. package/dist/loop/worker-packet.test.js +243 -0
  209. package/dist/loop/worker-prompt.js +260 -0
  210. package/dist/loop/worker-prompt.test.js +247 -0
  211. package/dist/loop/worker.js +498 -0
  212. package/dist/loop/worker.test.js +372 -0
  213. package/dist/map/atlas.js +77 -0
  214. package/dist/map/backfill.js +171 -0
  215. package/dist/map/backfill.test.js +120 -0
  216. package/dist/map/index.js +255 -0
  217. package/dist/map/inference.js +73 -0
  218. package/dist/map/inference.test.js +35 -0
  219. package/dist/map/query.js +157 -0
  220. package/dist/map/query.test.js +174 -0
  221. package/dist/map/update.js +355 -0
  222. package/dist/map/update.test.js +67 -0
  223. package/dist/map/validate.js +153 -0
  224. package/dist/map/validate.test.js +90 -0
  225. package/dist/map/welfare.js +86 -0
  226. package/dist/mcp/lib/invoke.js +35 -0
  227. package/dist/mcp/lib/redact.js +24 -0
  228. package/dist/mcp/lib/redact.test.js +112 -0
  229. package/dist/mcp/lib/root.js +41 -0
  230. package/dist/mcp/lib/root.test.js +114 -0
  231. package/dist/mcp/server.js +15 -0
  232. package/dist/mcp/tools/claim-child.js +119 -0
  233. package/dist/mcp/tools/claim-child.test.js +69 -0
  234. package/dist/mcp/tools/current-state.js +73 -0
  235. package/dist/mcp/tools/current-state.test.js +114 -0
  236. package/dist/mcp/tools/dispatch-result.js +186 -0
  237. package/dist/mcp/tools/dispatch-result.test.js +109 -0
  238. package/dist/mcp/tools/index.js +222 -0
  239. package/dist/mcp/tools/index.test.js +172 -0
  240. package/dist/mcp/tools/linear.js +74 -0
  241. package/dist/mcp/tools/loop-continue.js +159 -0
  242. package/dist/mcp/tools/loop-continue.test.js +186 -0
  243. package/dist/mcp/tools/loop-dry-run.js +15 -0
  244. package/dist/mcp/tools/status.js +65 -0
  245. package/dist/medic/chart-id.js +75 -0
  246. package/dist/medic/chart-schema.js +139 -0
  247. package/dist/runs/index.js +119 -0
  248. package/dist/runs/index.test.js +184 -0
  249. package/dist/runs/ledger-tail.js +15 -0
  250. package/dist/runs/list.js +29 -0
  251. package/dist/runs/reconcile.js +74 -0
  252. package/dist/runs/show.js +10 -0
  253. package/dist/runtime/audit/logger.js +15 -0
  254. package/dist/runtime/audit/reader.js +42 -0
  255. package/dist/runtime/checkpoint.js +89 -0
  256. package/dist/runtime/continuation/confirmed.js +225 -0
  257. package/dist/runtime/continuation/confirmed.test.js +421 -0
  258. package/dist/runtime/continuation/dry-run.js +74 -0
  259. package/dist/runtime/execution-window.js +106 -0
  260. package/dist/runtime/scheduling/child-selector.js +16 -0
  261. package/dist/runtime/state.js +43 -0
  262. package/dist/runtime/status.js +46 -0
  263. package/dist/runtime/verification/envelope.js +80 -0
  264. package/dist/runtime/verification/fingerprint.js +26 -0
  265. package/dist/skill-packet/cli.test.js +105 -0
  266. package/dist/skill-packet/generator.js +225 -0
  267. package/dist/skill-packet/generator.test.js +159 -0
  268. package/dist/skill-packet/index.js +49 -0
  269. package/dist/skill-packet/types.js +2 -0
  270. package/dist/smartdocs-engine/audit.js +194 -0
  271. package/dist/smartdocs-engine/audit.test.js +122 -0
  272. package/dist/smartdocs-engine/canon-check.js +340 -0
  273. package/dist/smartdocs-engine/canon-check.test.js +234 -0
  274. package/dist/smartdocs-engine/doctrine.js +633 -0
  275. package/dist/smartdocs-engine/doctrine.test.js +374 -0
  276. package/dist/smartdocs-engine/index.js +456 -0
  277. package/dist/smartdocs-engine/index.test.js +82 -0
  278. package/dist/smartdocs-engine/ingest.js +495 -0
  279. package/dist/smartdocs-engine/ingest.test.js +163 -0
  280. package/dist/smartdocs-engine/migrate.js +217 -0
  281. package/dist/smartdocs-engine/migrate.test.js +200 -0
  282. package/dist/smartdocs-engine/seed-instructions.js +335 -0
  283. package/dist/smartdocs-engine/seed-instructions.test.js +275 -0
  284. package/dist/smartdocs-engine/smartdoc-ignore.js +258 -0
  285. package/dist/smartdocs-engine/smartdoc-ignore.test.js +146 -0
  286. package/dist/smartdocs-engine/validate-instructions.js +366 -0
  287. package/dist/smartdocs-engine/validate-instructions.test.js +283 -0
  288. package/dist/tracker/adapters/github/index.js +305 -0
  289. package/dist/tracker/adapters/jira/index.js +293 -0
  290. package/dist/tracker/adapters/linear/http-errors.test.js +51 -0
  291. package/dist/tracker/adapters/linear/index.js +621 -0
  292. package/dist/tracker/adapters/linear/index.test.js +238 -0
  293. package/dist/tracker/adapters/linear.js +50 -0
  294. package/dist/tracker/adapters/local/index.js +10 -0
  295. package/dist/tracker/adapters/local-file/index.js +159 -0
  296. package/dist/tracker/adapters/mcp-bridge.js +158 -0
  297. package/dist/tracker/adapters/mcp-bridge.test.js +12 -0
  298. package/dist/tracker/adapters/spec/index.js +146 -0
  299. package/dist/tracker/capabilities.js +2 -0
  300. package/dist/tracker/index.js +49 -0
  301. package/dist/tracker/lifecycle-policy.js +139 -0
  302. package/dist/tracker/lifecycle-transition.js +164 -0
  303. package/dist/tracker/local-graph.js +98 -0
  304. package/dist/tracker/migration.js +56 -0
  305. package/dist/tracker/schema.js +86 -0
  306. package/dist/tracker/sync/index.js +404 -0
  307. package/dist/tracker/sync/queue-store.js +95 -0
  308. package/dist/tracker/sync/queue-store.test.js +104 -0
  309. package/dist/tracker/types.js +11 -0
  310. package/dist/types/linear.js +3 -0
  311. package/dist/types/result-packet.js +12 -0
  312. package/dist/types/runtime-state.js +2 -0
  313. package/dist/types/work-contract.js +2 -0
  314. package/dist/utils/monotonic-timestamp.js +13 -0
  315. package/dist/utils/monotonic-timestamp.test.js +19 -0
  316. package/package.json +64 -0
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTreeSitterRuntime = loadTreeSitterRuntime;
4
+ let cachedRuntime = null;
5
+ let cachedRuntimePromise = null;
6
+ async function loadTreeSitterRuntime() {
7
+ if (cachedRuntime) {
8
+ return cachedRuntime;
9
+ }
10
+ if (cachedRuntimePromise) {
11
+ return await cachedRuntimePromise;
12
+ }
13
+ cachedRuntimePromise = (async () => {
14
+ const loaded = await loadTreeSitterModules();
15
+ const parser = new loaded.parserConstructor();
16
+ parser.setLanguage(loaded.language);
17
+ const runtime = {
18
+ parse(source) {
19
+ return parser.parse(source);
20
+ },
21
+ };
22
+ cachedRuntime = runtime;
23
+ cachedRuntimePromise = null;
24
+ return runtime;
25
+ })();
26
+ return await cachedRuntimePromise;
27
+ }
28
+ async function loadTreeSitterModules() {
29
+ const dynamicImport = createDynamicImporter();
30
+ const [treeSitterModule, swiftModule] = await Promise.all([
31
+ dynamicImport("tree-sitter"),
32
+ dynamicImport("tree-sitter-swift"),
33
+ ]);
34
+ return {
35
+ parserConstructor: resolveParserConstructor(treeSitterModule),
36
+ language: resolveGrammar(swiftModule, "tree-sitter-swift"),
37
+ };
38
+ }
39
+ function createDynamicImporter() {
40
+ const importer = new Function("specifier", "return import(specifier);");
41
+ return (specifier) => importer(specifier);
42
+ }
43
+ function resolveParserConstructor(moduleValue) {
44
+ if (typeof moduleValue === "function") {
45
+ return moduleValue;
46
+ }
47
+ if (moduleValue && typeof moduleValue === "object") {
48
+ const directDefault = moduleValue.default;
49
+ if (typeof directDefault === "function") {
50
+ return directDefault;
51
+ }
52
+ const namedParser = moduleValue.Parser;
53
+ if (typeof namedParser === "function") {
54
+ return namedParser;
55
+ }
56
+ }
57
+ throw new Error("Unable to resolve tree-sitter parser constructor.");
58
+ }
59
+ function resolveGrammar(moduleValue, packageName) {
60
+ if (moduleValue && typeof moduleValue === "object") {
61
+ const directDefault = moduleValue.default;
62
+ if (directDefault) {
63
+ return directDefault;
64
+ }
65
+ }
66
+ if (moduleValue) {
67
+ return moduleValue;
68
+ }
69
+ throw new Error(`Unable to resolve ${packageName} grammar.`);
70
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeScriptJavaScriptAdapter = void 0;
4
+ exports.createTypeScriptJavaScriptAdapter = createTypeScriptJavaScriptAdapter;
5
+ const node_path_1 = require("node:path");
6
+ const extract_js_1 = require("./extract.js");
7
+ const runtime_js_1 = require("./runtime.js");
8
+ const DEFAULT_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"];
9
+ class TypeScriptJavaScriptAdapter {
10
+ loadRuntime;
11
+ languageId = "typescript-javascript";
12
+ fileExtensions = DEFAULT_EXTENSIONS;
13
+ confidence = "high";
14
+ limitations = [
15
+ "Extracts declaration-level symbols only (functions, classes, methods, imports).",
16
+ "Does not resolve runtime module graph semantics beyond extension normalization.",
17
+ ];
18
+ constructor(loadRuntime) {
19
+ this.loadRuntime = loadRuntime;
20
+ }
21
+ async extractSymbols(filePath, source) {
22
+ const language = detectLanguage(filePath);
23
+ if (!language) {
24
+ throw new Error(`Unsupported TypeScript/JavaScript file extension: ${(0, node_path_1.extname)(filePath)}`);
25
+ }
26
+ const runtime = await this.loadRuntime();
27
+ const tree = runtime.parse(source, language);
28
+ return (0, extract_js_1.extractTypeScriptJavaScriptSymbolsFromTree)(tree, language);
29
+ }
30
+ resolveImportSpecifier(specifier, context) {
31
+ if (specifier.length === 0) {
32
+ return null;
33
+ }
34
+ if (!specifier.startsWith(".")) {
35
+ return specifier;
36
+ }
37
+ if ((0, node_path_1.extname)(specifier).length > 0) {
38
+ return specifier;
39
+ }
40
+ const candidateExtensions = context.candidateExtensions?.length
41
+ ? context.candidateExtensions
42
+ : [preferredExtensionForFile(context.fromFilePath)];
43
+ return `${specifier}${candidateExtensions[0]}`;
44
+ }
45
+ }
46
+ exports.TypeScriptJavaScriptAdapter = TypeScriptJavaScriptAdapter;
47
+ function createTypeScriptJavaScriptAdapter(options = {}) {
48
+ return new TypeScriptJavaScriptAdapter(options.loadRuntime ?? runtime_js_1.loadTreeSitterRuntime);
49
+ }
50
+ function detectLanguage(filePath) {
51
+ const extension = (0, node_path_1.extname)(filePath).toLowerCase();
52
+ if (extension === ".ts" || extension === ".tsx") {
53
+ return "typescript";
54
+ }
55
+ if (extension === ".js" ||
56
+ extension === ".jsx" ||
57
+ extension === ".mjs" ||
58
+ extension === ".cjs") {
59
+ return "javascript";
60
+ }
61
+ return null;
62
+ }
63
+ function preferredExtensionForFile(filePath) {
64
+ const extension = (0, node_path_1.extname)(filePath).toLowerCase();
65
+ if (extension === ".ts" || extension === ".tsx") {
66
+ return ".ts";
67
+ }
68
+ if (extension === ".js" || extension === ".jsx" || extension === ".mjs" || extension === ".cjs") {
69
+ return ".js";
70
+ }
71
+ return ".ts";
72
+ }
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractTypeScriptJavaScriptSymbolsFromTree = extractTypeScriptJavaScriptSymbolsFromTree;
4
+ function extractTypeScriptJavaScriptSymbolsFromTree(tree, language) {
5
+ const symbols = [];
6
+ walkNode(tree.rootNode, symbols);
7
+ const deduped = dedupeSymbols(symbols);
8
+ deduped.sort(compareExtractedSymbols);
9
+ return {
10
+ language,
11
+ symbols: deduped,
12
+ };
13
+ }
14
+ function walkNode(node, output) {
15
+ const current = toExtractedSymbol(node);
16
+ if (current) {
17
+ output.push(current);
18
+ }
19
+ for (const child of node.namedChildren ?? []) {
20
+ walkNode(child, output);
21
+ }
22
+ }
23
+ function toExtractedSymbol(node) {
24
+ switch (node.type) {
25
+ case "function_declaration":
26
+ return buildSymbol(node, "function", extractIdentifierName(node), sanitizeSignature(node.text));
27
+ case "class_declaration":
28
+ return buildSymbol(node, "class", extractIdentifierName(node), null);
29
+ case "method_definition":
30
+ case "method_signature":
31
+ case "abstract_method_signature":
32
+ return buildSymbol(node, "method", extractIdentifierName(node), sanitizeSignature(node.text));
33
+ case "import_statement":
34
+ return buildSymbol(node, "import", extractImportSource(node), null);
35
+ default:
36
+ return null;
37
+ }
38
+ }
39
+ function buildSymbol(node, kind, name, signature) {
40
+ if (!name) {
41
+ return null;
42
+ }
43
+ return {
44
+ kind,
45
+ name,
46
+ signature,
47
+ exported: isExported(node),
48
+ startLine: node.startPosition.row + 1,
49
+ startColumn: node.startPosition.column,
50
+ endLine: node.endPosition.row + 1,
51
+ endColumn: node.endPosition.column,
52
+ };
53
+ }
54
+ function extractIdentifierName(node) {
55
+ const byField = node.childForFieldName?.("name");
56
+ if (byField?.text) {
57
+ return byField.text.trim();
58
+ }
59
+ for (const child of node.namedChildren ?? []) {
60
+ if (IDENTIFIER_NODE_TYPES.has(child.type) && child.text.trim().length > 0) {
61
+ return child.text.trim();
62
+ }
63
+ }
64
+ return null;
65
+ }
66
+ function extractImportSource(node) {
67
+ const sourceNode = node.childForFieldName?.("source");
68
+ const raw = sourceNode?.text ?? node.text;
69
+ const match = raw.match(/["']([^"']+)["']/);
70
+ return match?.[1] ?? null;
71
+ }
72
+ function isExported(node) {
73
+ if (node.type.startsWith("export_")) {
74
+ return true;
75
+ }
76
+ if (node.text.startsWith("export ")) {
77
+ return true;
78
+ }
79
+ let current = node.parent ?? null;
80
+ while (current) {
81
+ if (current.type.startsWith("export_")) {
82
+ return true;
83
+ }
84
+ current = current.parent ?? null;
85
+ }
86
+ return false;
87
+ }
88
+ function sanitizeSignature(signature) {
89
+ const compact = signature.replace(/\s+/g, " ").trim();
90
+ return compact.length === 0 ? null : compact;
91
+ }
92
+ function dedupeSymbols(symbols) {
93
+ const byFingerprint = new Map();
94
+ for (const symbol of symbols) {
95
+ const fingerprint = [
96
+ symbol.kind,
97
+ symbol.name,
98
+ symbol.startLine,
99
+ symbol.startColumn,
100
+ symbol.endLine,
101
+ symbol.endColumn,
102
+ ].join(":");
103
+ byFingerprint.set(fingerprint, symbol);
104
+ }
105
+ return Array.from(byFingerprint.values());
106
+ }
107
+ function compareExtractedSymbols(left, right) {
108
+ return (left.startLine - right.startLine ||
109
+ left.startColumn - right.startColumn ||
110
+ left.endLine - right.endLine ||
111
+ left.endColumn - right.endColumn ||
112
+ left.kind.localeCompare(right.kind) ||
113
+ left.name.localeCompare(right.name));
114
+ }
115
+ const IDENTIFIER_NODE_TYPES = new Set(["identifier", "property_identifier", "private_property_identifier"]);
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTreeSitterRuntime = exports.extractTypeScriptJavaScriptSymbolsFromTree = exports.TypeScriptJavaScriptAdapter = exports.createTypeScriptJavaScriptAdapter = void 0;
4
+ var adapter_js_1 = require("./adapter.js");
5
+ Object.defineProperty(exports, "createTypeScriptJavaScriptAdapter", { enumerable: true, get: function () { return adapter_js_1.createTypeScriptJavaScriptAdapter; } });
6
+ Object.defineProperty(exports, "TypeScriptJavaScriptAdapter", { enumerable: true, get: function () { return adapter_js_1.TypeScriptJavaScriptAdapter; } });
7
+ var extract_js_1 = require("./extract.js");
8
+ Object.defineProperty(exports, "extractTypeScriptJavaScriptSymbolsFromTree", { enumerable: true, get: function () { return extract_js_1.extractTypeScriptJavaScriptSymbolsFromTree; } });
9
+ var runtime_js_1 = require("./runtime.js");
10
+ Object.defineProperty(exports, "loadTreeSitterRuntime", { enumerable: true, get: function () { return runtime_js_1.loadTreeSitterRuntime; } });
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTreeSitterRuntime = loadTreeSitterRuntime;
4
+ let cachedRuntime = null;
5
+ async function loadTreeSitterRuntime() {
6
+ if (cachedRuntime) {
7
+ return cachedRuntime;
8
+ }
9
+ const loaded = await loadTreeSitterModules();
10
+ const parserByLanguage = new Map();
11
+ cachedRuntime = {
12
+ parse(source, language) {
13
+ const parser = getOrCreateParser(language, loaded, parserByLanguage);
14
+ return parser.parse(source);
15
+ },
16
+ };
17
+ return cachedRuntime;
18
+ }
19
+ function getOrCreateParser(language, loaded, parserByLanguage) {
20
+ const existing = parserByLanguage.get(language);
21
+ if (existing) {
22
+ return existing;
23
+ }
24
+ const parser = new loaded.parserConstructor();
25
+ const grammar = loaded.languages[language];
26
+ parser.setLanguage(grammar);
27
+ parserByLanguage.set(language, parser);
28
+ return parser;
29
+ }
30
+ async function loadTreeSitterModules() {
31
+ const dynamicImport = createDynamicImporter();
32
+ const [treeSitterModule, typeScriptModule, javaScriptModule] = await Promise.all([
33
+ dynamicImport("tree-sitter"),
34
+ dynamicImport("@tree-sitter/typescript"),
35
+ dynamicImport("@tree-sitter/javascript"),
36
+ ]);
37
+ const parserConstructor = resolveParserConstructor(treeSitterModule);
38
+ const typeScriptGrammar = resolveTypeScriptGrammar(typeScriptModule);
39
+ const javaScriptGrammar = resolveJavaScriptGrammar(javaScriptModule);
40
+ return {
41
+ parserConstructor,
42
+ languages: {
43
+ typescript: typeScriptGrammar,
44
+ javascript: javaScriptGrammar,
45
+ },
46
+ };
47
+ }
48
+ function createDynamicImporter() {
49
+ const importer = new Function("specifier", "return import(specifier);");
50
+ return (specifier) => importer(specifier);
51
+ }
52
+ function resolveParserConstructor(moduleValue) {
53
+ if (typeof moduleValue === "function") {
54
+ return moduleValue;
55
+ }
56
+ if (moduleValue && typeof moduleValue === "object") {
57
+ const directDefault = moduleValue.default;
58
+ if (typeof directDefault === "function") {
59
+ return directDefault;
60
+ }
61
+ const namedParser = moduleValue.Parser;
62
+ if (typeof namedParser === "function") {
63
+ return namedParser;
64
+ }
65
+ }
66
+ throw new Error("Unable to resolve tree-sitter parser constructor.");
67
+ }
68
+ function resolveTypeScriptGrammar(moduleValue) {
69
+ if (moduleValue && typeof moduleValue === "object") {
70
+ const direct = moduleValue;
71
+ if (direct.typescript) {
72
+ return direct.typescript;
73
+ }
74
+ if (direct.default && typeof direct.default === "object" && "typescript" in direct.default) {
75
+ return direct.default.typescript;
76
+ }
77
+ if (direct.default) {
78
+ return direct.default;
79
+ }
80
+ }
81
+ throw new Error("Unable to resolve @tree-sitter/typescript grammar.");
82
+ }
83
+ function resolveJavaScriptGrammar(moduleValue) {
84
+ if (moduleValue && typeof moduleValue === "object") {
85
+ const direct = moduleValue;
86
+ if (direct.javascript) {
87
+ return direct.javascript;
88
+ }
89
+ if (direct.default && typeof direct.default === "object" && "javascript" in direct.default) {
90
+ return direct.default.javascript;
91
+ }
92
+ if (direct.default) {
93
+ return direct.default;
94
+ }
95
+ }
96
+ throw new Error("Unable to resolve @tree-sitter/javascript grammar.");
97
+ }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphCapabilityRegistry = void 0;
4
+ class GraphCapabilityRegistry {
5
+ coverage = new Map();
6
+ supportedLanguages;
7
+ unsupportedExtensions = new Set();
8
+ fallbackFileCount = 0;
9
+ constructor(supportedLanguages) {
10
+ this.supportedLanguages = Array.from(new Set(supportedLanguages)).sort((left, right) => left.localeCompare(right));
11
+ for (const languageId of this.supportedLanguages) {
12
+ this.coverage.set(languageId, createEmptyCoverageEntry());
13
+ }
14
+ }
15
+ static unsupportedLanguageId(extension) {
16
+ return `unsupported:${normalizeExtension(extension)}`;
17
+ }
18
+ noteUnsupportedExtension(extension) {
19
+ this.unsupportedExtensions.add(normalizeExtension(extension));
20
+ }
21
+ recordSymbolLevel(languageId, symbolsExtracted, warnings = []) {
22
+ const entry = this.ensureEntry(languageId);
23
+ entry.filesDiscovered += 1;
24
+ entry.filesSymbolLevel += 1;
25
+ entry.symbolsExtracted += symbolsExtracted;
26
+ for (const warning of warnings) {
27
+ entry.warnings.push(warning);
28
+ }
29
+ }
30
+ recordFileLevel(languageId, warnings = []) {
31
+ const entry = this.ensureEntry(languageId);
32
+ entry.filesDiscovered += 1;
33
+ entry.filesFileLevel += 1;
34
+ this.fallbackFileCount += 1;
35
+ for (const warning of warnings) {
36
+ entry.warnings.push(warning);
37
+ }
38
+ }
39
+ recordFailure(languageId, warning) {
40
+ const entry = this.ensureEntry(languageId);
41
+ entry.filesDiscovered += 1;
42
+ entry.filesFailed += 1;
43
+ entry.warnings.push(warning);
44
+ }
45
+ buildReport() {
46
+ const entries = Array.from(this.coverage.entries()).sort(([left], [right]) => left.localeCompare(right));
47
+ const coverage = {};
48
+ let filesDiscovered = 0;
49
+ let filesSymbolLevel = 0;
50
+ let filesFileLevel = 0;
51
+ for (const [languageId, entry] of entries) {
52
+ coverage[languageId] = {
53
+ filesDiscovered: entry.filesDiscovered,
54
+ filesSymbolLevel: entry.filesSymbolLevel,
55
+ filesFileLevel: entry.filesFileLevel,
56
+ filesFailed: entry.filesFailed,
57
+ symbolsExtracted: entry.symbolsExtracted,
58
+ warnings: [...entry.warnings],
59
+ };
60
+ filesDiscovered += entry.filesDiscovered;
61
+ filesSymbolLevel += entry.filesSymbolLevel;
62
+ filesFileLevel += entry.filesFileLevel;
63
+ }
64
+ return {
65
+ supportedLanguages: [...this.supportedLanguages],
66
+ coverage,
67
+ unsupportedExtensions: Array.from(this.unsupportedExtensions).sort((left, right) => left.localeCompare(right)),
68
+ fallbackFileCount: this.fallbackFileCount,
69
+ symbolLevelPercent: toPercent(filesSymbolLevel, filesDiscovered),
70
+ totalCoveragePercent: toPercent(filesSymbolLevel + filesFileLevel, filesDiscovered),
71
+ };
72
+ }
73
+ ensureEntry(languageId) {
74
+ let entry = this.coverage.get(languageId);
75
+ if (!entry) {
76
+ entry = createEmptyCoverageEntry();
77
+ this.coverage.set(languageId, entry);
78
+ }
79
+ return entry;
80
+ }
81
+ }
82
+ exports.GraphCapabilityRegistry = GraphCapabilityRegistry;
83
+ function createEmptyCoverageEntry() {
84
+ return {
85
+ filesDiscovered: 0,
86
+ filesSymbolLevel: 0,
87
+ filesFileLevel: 0,
88
+ filesFailed: 0,
89
+ symbolsExtracted: 0,
90
+ warnings: [],
91
+ };
92
+ }
93
+ function normalizeExtension(extension) {
94
+ const normalized = extension.trim().toLowerCase();
95
+ if (!normalized) {
96
+ return "<none>";
97
+ }
98
+ return normalized.startsWith(".") ? normalized : `.${normalized}`;
99
+ }
100
+ function toPercent(coveredFiles, discoveredFiles) {
101
+ if (discoveredFiles <= 0) {
102
+ return 0;
103
+ }
104
+ return Math.round((coveredFiles / discoveredFiles) * 1000) / 10;
105
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.writeGraphNotices = writeGraphNotices;
4
+ exports.checkGraphInvalidation = checkGraphInvalidation;
5
+ exports.recordGraphGovernanceState = recordGraphGovernanceState;
6
+ exports.hashConfig = hashConfig;
7
+ exports.resolveHeadCommit = resolveHeadCommit;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const node_child_process_1 = require("node:child_process");
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = require("node:path");
12
+ const DEFAULT_GRAPH_OUTPUT_PATH = ".polaris/graph";
13
+ const DEFAULT_INVALIDATION_TRIGGERS = [
14
+ "repo-change",
15
+ "config-change",
16
+ ];
17
+ const NOTICES_FILE_NAME = "NOTICES";
18
+ const GOVERNANCE_STATE_FILE = "governance-state.json";
19
+ function writeGraphNotices(outputPath, notices) {
20
+ const absoluteOutputPath = (0, node_path_1.resolve)(outputPath);
21
+ const noticesPath = (0, node_path_1.resolve)(absoluteOutputPath, NOTICES_FILE_NAME);
22
+ const content = buildNoticesContent(notices);
23
+ (0, node_fs_1.mkdirSync)(absoluteOutputPath, { recursive: true });
24
+ if ((0, node_fs_1.existsSync)(noticesPath)) {
25
+ const existing = (0, node_fs_1.readFileSync)(noticesPath, "utf-8");
26
+ if (existing === content) {
27
+ return;
28
+ }
29
+ }
30
+ (0, node_fs_1.writeFileSync)(noticesPath, content, "utf-8");
31
+ }
32
+ function checkGraphInvalidation(config, repoRoot) {
33
+ const graphOutputPath = (0, node_path_1.resolve)(repoRoot, config.graph?.outputPath ?? DEFAULT_GRAPH_OUTPUT_PATH);
34
+ const triggers = config.graph?.invalidationTriggers ?? DEFAULT_INVALIDATION_TRIGGERS;
35
+ const currentState = {
36
+ configHash: hashConfig(config),
37
+ headCommit: resolveHeadCommit(repoRoot),
38
+ };
39
+ const previousState = readGovernanceState(graphOutputPath);
40
+ if (previousState && triggers.includes("config-change") && previousState.configHash !== currentState.configHash) {
41
+ return { stale: true, reason: "config-change" };
42
+ }
43
+ if (previousState && triggers.includes("repo-change") && previousState.headCommit !== currentState.headCommit) {
44
+ return { stale: true, reason: "repo-change" };
45
+ }
46
+ return { stale: false };
47
+ }
48
+ function recordGraphGovernanceState(graphOutputPath, state) {
49
+ writeGovernanceState(graphOutputPath, state);
50
+ }
51
+ function buildNoticesContent(notices) {
52
+ const cleaned = [...new Set(notices.map((notice) => notice.trim()).filter((notice) => notice.length > 0))];
53
+ if (cleaned.length === 0) {
54
+ return "# NOTICES\n\nNo third-party attributions recorded.\n";
55
+ }
56
+ return `# NOTICES\n\n${cleaned.join("\n\n")}\n`;
57
+ }
58
+ function hashConfig(config) {
59
+ const normalized = stableSerialize(config);
60
+ return (0, node_crypto_1.createHash)("sha256").update(normalized, "utf-8").digest("hex");
61
+ }
62
+ function stableSerialize(value) {
63
+ if (value === null || typeof value !== "object") {
64
+ return JSON.stringify(value);
65
+ }
66
+ if (Array.isArray(value)) {
67
+ return `[${value.map((entry) => stableSerialize(entry)).join(",")}]`;
68
+ }
69
+ const record = value;
70
+ const keys = Object.keys(record).sort((a, b) => a.localeCompare(b));
71
+ const pairs = keys.map((key) => `${JSON.stringify(key)}:${stableSerialize(record[key])}`);
72
+ return `{${pairs.join(",")}}`;
73
+ }
74
+ function resolveHeadCommit(repoRoot) {
75
+ return (0, node_child_process_1.execFileSync)("git", ["rev-parse", "HEAD"], {
76
+ cwd: repoRoot,
77
+ encoding: "utf-8",
78
+ }).trim();
79
+ }
80
+ function readGovernanceState(graphOutputPath) {
81
+ const statePath = (0, node_path_1.resolve)(graphOutputPath, GOVERNANCE_STATE_FILE);
82
+ if (!(0, node_fs_1.existsSync)(statePath)) {
83
+ return null;
84
+ }
85
+ let parsed;
86
+ try {
87
+ parsed = JSON.parse((0, node_fs_1.readFileSync)(statePath, "utf-8"));
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ if (typeof parsed.configHash !== "string" || typeof parsed.headCommit !== "string") {
93
+ return null;
94
+ }
95
+ return {
96
+ configHash: parsed.configHash,
97
+ headCommit: parsed.headCommit,
98
+ };
99
+ }
100
+ function writeGovernanceState(graphOutputPath, state) {
101
+ const statePath = (0, node_path_1.resolve)(graphOutputPath, GOVERNANCE_STATE_FILE);
102
+ (0, node_fs_1.mkdirSync)(graphOutputPath, { recursive: true });
103
+ (0, node_fs_1.writeFileSync)(statePath, `${JSON.stringify(state, null, 2)}\n`, "utf-8");
104
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractSymbolsFromTree = void 0;
4
+ var extract_js_1 = require("../adapter/typescript-javascript/extract.js");
5
+ Object.defineProperty(exports, "extractSymbolsFromTree", { enumerable: true, get: function () { return extract_js_1.extractTypeScriptJavaScriptSymbolsFromTree; } });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });