@vpxa/aikit 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (649) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1207 -0
  3. package/bin/aikit.mjs +10 -0
  4. package/package.json +92 -0
  5. package/packages/aikit-client/dist/direct-client.d.ts +37 -0
  6. package/packages/aikit-client/dist/direct-client.js +1 -0
  7. package/packages/aikit-client/dist/index.d.ts +5 -0
  8. package/packages/aikit-client/dist/index.js +1 -0
  9. package/packages/aikit-client/dist/mcp-client.d.ts +19 -0
  10. package/packages/aikit-client/dist/mcp-client.js +4 -0
  11. package/packages/aikit-client/dist/parsers.d.ts +35 -0
  12. package/packages/aikit-client/dist/parsers.js +2 -0
  13. package/packages/aikit-client/dist/types.d.ts +62 -0
  14. package/packages/aikit-client/dist/types.js +1 -0
  15. package/packages/analyzers/dist/blast-radius-analyzer.d.ts +19 -0
  16. package/packages/analyzers/dist/blast-radius-analyzer.js +6 -0
  17. package/packages/analyzers/dist/dependency-analyzer.d.ts +32 -0
  18. package/packages/analyzers/dist/dependency-analyzer.js +8 -0
  19. package/packages/analyzers/dist/diagram-generator.d.ts +16 -0
  20. package/packages/analyzers/dist/diagram-generator.js +2 -0
  21. package/packages/analyzers/dist/entry-point-analyzer.d.ts +40 -0
  22. package/packages/analyzers/dist/entry-point-analyzer.js +4 -0
  23. package/packages/analyzers/dist/index.d.ts +12 -0
  24. package/packages/analyzers/dist/index.js +1 -0
  25. package/packages/analyzers/dist/knowledge-producer.d.ts +40 -0
  26. package/packages/analyzers/dist/knowledge-producer.js +26 -0
  27. package/packages/analyzers/dist/pattern-analyzer.d.ts +15 -0
  28. package/packages/analyzers/dist/pattern-analyzer.js +2 -0
  29. package/packages/analyzers/dist/regex-call-graph.d.ts +10 -0
  30. package/packages/analyzers/dist/regex-call-graph.js +1 -0
  31. package/packages/analyzers/dist/structure-analyzer.d.ts +19 -0
  32. package/packages/analyzers/dist/structure-analyzer.js +4 -0
  33. package/packages/analyzers/dist/symbol-analyzer.d.ts +14 -0
  34. package/packages/analyzers/dist/symbol-analyzer.js +9 -0
  35. package/packages/analyzers/dist/ts-call-graph.d.ts +29 -0
  36. package/packages/analyzers/dist/ts-call-graph.js +1 -0
  37. package/packages/analyzers/dist/types.d.ts +110 -0
  38. package/packages/analyzers/dist/types.js +1 -0
  39. package/packages/chunker/dist/call-graph-extractor.d.ts +25 -0
  40. package/packages/chunker/dist/call-graph-extractor.js +1 -0
  41. package/packages/chunker/dist/chunker-factory.d.ts +19 -0
  42. package/packages/chunker/dist/chunker-factory.js +1 -0
  43. package/packages/chunker/dist/chunker.interface.d.ts +13 -0
  44. package/packages/chunker/dist/chunker.interface.js +1 -0
  45. package/packages/chunker/dist/code-chunker.d.ts +17 -0
  46. package/packages/chunker/dist/code-chunker.js +11 -0
  47. package/packages/chunker/dist/extractors/call-extractor.d.ts +24 -0
  48. package/packages/chunker/dist/extractors/call-extractor.js +1 -0
  49. package/packages/chunker/dist/extractors/entry-point-detector.d.ts +14 -0
  50. package/packages/chunker/dist/extractors/entry-point-detector.js +1 -0
  51. package/packages/chunker/dist/extractors/import-extractor.d.ts +14 -0
  52. package/packages/chunker/dist/extractors/import-extractor.js +1 -0
  53. package/packages/chunker/dist/extractors/pattern-detector.d.ts +14 -0
  54. package/packages/chunker/dist/extractors/pattern-detector.js +1 -0
  55. package/packages/chunker/dist/extractors/scope-resolver.d.ts +26 -0
  56. package/packages/chunker/dist/extractors/scope-resolver.js +1 -0
  57. package/packages/chunker/dist/extractors/symbol-extractor.d.ts +14 -0
  58. package/packages/chunker/dist/extractors/symbol-extractor.js +3 -0
  59. package/packages/chunker/dist/extractors/types.d.ts +44 -0
  60. package/packages/chunker/dist/extractors/types.js +1 -0
  61. package/packages/chunker/dist/generic-chunker.d.ts +15 -0
  62. package/packages/chunker/dist/generic-chunker.js +5 -0
  63. package/packages/chunker/dist/index.d.ts +19 -0
  64. package/packages/chunker/dist/index.js +1 -0
  65. package/packages/chunker/dist/markdown-chunker.d.ts +17 -0
  66. package/packages/chunker/dist/markdown-chunker.js +3 -0
  67. package/packages/chunker/dist/wasm/languages.d.ts +18 -0
  68. package/packages/chunker/dist/wasm/languages.js +1 -0
  69. package/packages/chunker/dist/wasm/query-executor.d.ts +70 -0
  70. package/packages/chunker/dist/wasm/query-executor.js +1 -0
  71. package/packages/chunker/dist/wasm/runtime.d.ts +44 -0
  72. package/packages/chunker/dist/wasm/runtime.js +1 -0
  73. package/packages/chunker/dist/wasm/types.d.ts +84 -0
  74. package/packages/chunker/dist/wasm/types.js +1 -0
  75. package/packages/chunker/dist/wasm-chunker.d.ts +23 -0
  76. package/packages/chunker/dist/wasm-chunker.js +6 -0
  77. package/packages/chunker/src/queries/go/calls.scm +11 -0
  78. package/packages/chunker/src/queries/go/entry-points.scm +20 -0
  79. package/packages/chunker/src/queries/go/imports.scm +6 -0
  80. package/packages/chunker/src/queries/go/patterns.scm +25 -0
  81. package/packages/chunker/src/queries/go/symbols.scm +26 -0
  82. package/packages/chunker/src/queries/java/calls.scm +10 -0
  83. package/packages/chunker/src/queries/java/entry-points.scm +27 -0
  84. package/packages/chunker/src/queries/java/imports.scm +11 -0
  85. package/packages/chunker/src/queries/java/patterns.scm +27 -0
  86. package/packages/chunker/src/queries/java/symbols.scm +28 -0
  87. package/packages/chunker/src/queries/javascript/calls.scm +21 -0
  88. package/packages/chunker/src/queries/javascript/entry-points.scm +31 -0
  89. package/packages/chunker/src/queries/javascript/imports.scm +32 -0
  90. package/packages/chunker/src/queries/javascript/patterns.scm +28 -0
  91. package/packages/chunker/src/queries/javascript/symbols.scm +52 -0
  92. package/packages/chunker/src/queries/python/calls.scm +11 -0
  93. package/packages/chunker/src/queries/python/entry-points.scm +21 -0
  94. package/packages/chunker/src/queries/python/imports.scm +14 -0
  95. package/packages/chunker/src/queries/python/patterns.scm +25 -0
  96. package/packages/chunker/src/queries/python/symbols.scm +17 -0
  97. package/packages/chunker/src/queries/rust/calls.scm +20 -0
  98. package/packages/chunker/src/queries/rust/entry-points.scm +7 -0
  99. package/packages/chunker/src/queries/rust/imports.scm +26 -0
  100. package/packages/chunker/src/queries/rust/patterns.scm +18 -0
  101. package/packages/chunker/src/queries/rust/symbols.scm +73 -0
  102. package/packages/chunker/src/queries/typescript/calls.scm +21 -0
  103. package/packages/chunker/src/queries/typescript/entry-points.scm +48 -0
  104. package/packages/chunker/src/queries/typescript/imports.scm +35 -0
  105. package/packages/chunker/src/queries/typescript/patterns.scm +47 -0
  106. package/packages/chunker/src/queries/typescript/symbols.scm +79 -0
  107. package/packages/chunker/wasm/tree-sitter-c.wasm +0 -0
  108. package/packages/chunker/wasm/tree-sitter-c_sharp.wasm +0 -0
  109. package/packages/chunker/wasm/tree-sitter-cpp.wasm +0 -0
  110. package/packages/chunker/wasm/tree-sitter-go.wasm +0 -0
  111. package/packages/chunker/wasm/tree-sitter-java.wasm +0 -0
  112. package/packages/chunker/wasm/tree-sitter-javascript.wasm +0 -0
  113. package/packages/chunker/wasm/tree-sitter-kotlin.wasm +0 -0
  114. package/packages/chunker/wasm/tree-sitter-php.wasm +0 -0
  115. package/packages/chunker/wasm/tree-sitter-python.wasm +0 -0
  116. package/packages/chunker/wasm/tree-sitter-ruby.wasm +0 -0
  117. package/packages/chunker/wasm/tree-sitter-rust.wasm +0 -0
  118. package/packages/chunker/wasm/tree-sitter-scala.wasm +0 -0
  119. package/packages/chunker/wasm/tree-sitter-swift.wasm +0 -0
  120. package/packages/chunker/wasm/tree-sitter-typescript.wasm +0 -0
  121. package/packages/chunker/wasm/tree-sitter.wasm +0 -0
  122. package/packages/cli/dist/aikit-init.d.ts +54 -0
  123. package/packages/cli/dist/aikit-init.js +1 -0
  124. package/packages/cli/dist/commands/analyze.d.ts +6 -0
  125. package/packages/cli/dist/commands/analyze.js +2 -0
  126. package/packages/cli/dist/commands/context-cmds.d.ts +6 -0
  127. package/packages/cli/dist/commands/context-cmds.js +1 -0
  128. package/packages/cli/dist/commands/environment.d.ts +6 -0
  129. package/packages/cli/dist/commands/environment.js +1 -0
  130. package/packages/cli/dist/commands/execution.d.ts +6 -0
  131. package/packages/cli/dist/commands/execution.js +1 -0
  132. package/packages/cli/dist/commands/flow.d.ts +6 -0
  133. package/packages/cli/dist/commands/flow.js +1 -0
  134. package/packages/cli/dist/commands/graph.d.ts +6 -0
  135. package/packages/cli/dist/commands/graph.js +6 -0
  136. package/packages/cli/dist/commands/init/adapters.d.ts +28 -0
  137. package/packages/cli/dist/commands/init/adapters.js +1 -0
  138. package/packages/cli/dist/commands/init/config.d.ts +10 -0
  139. package/packages/cli/dist/commands/init/config.js +3 -0
  140. package/packages/cli/dist/commands/init/constants.d.ts +41 -0
  141. package/packages/cli/dist/commands/init/constants.js +1 -0
  142. package/packages/cli/dist/commands/init/curated.d.ts +7 -0
  143. package/packages/cli/dist/commands/init/curated.js +1 -0
  144. package/packages/cli/dist/commands/init/frontmatter.d.ts +54 -0
  145. package/packages/cli/dist/commands/init/frontmatter.js +2 -0
  146. package/packages/cli/dist/commands/init/index.d.ts +36 -0
  147. package/packages/cli/dist/commands/init/index.js +5 -0
  148. package/packages/cli/dist/commands/init/manifest.d.ts +71 -0
  149. package/packages/cli/dist/commands/init/manifest.js +1 -0
  150. package/packages/cli/dist/commands/init/scaffold.d.ts +46 -0
  151. package/packages/cli/dist/commands/init/scaffold.js +1 -0
  152. package/packages/cli/dist/commands/init/templates.d.ts +9 -0
  153. package/packages/cli/dist/commands/init/templates.js +194 -0
  154. package/packages/cli/dist/commands/init/user.d.ts +61 -0
  155. package/packages/cli/dist/commands/init/user.js +5 -0
  156. package/packages/cli/dist/commands/knowledge.d.ts +6 -0
  157. package/packages/cli/dist/commands/knowledge.js +1 -0
  158. package/packages/cli/dist/commands/search.d.ts +6 -0
  159. package/packages/cli/dist/commands/search.js +1 -0
  160. package/packages/cli/dist/commands/system.d.ts +6 -0
  161. package/packages/cli/dist/commands/system.js +4 -0
  162. package/packages/cli/dist/commands/upgrade.d.ts +6 -0
  163. package/packages/cli/dist/commands/upgrade.js +1 -0
  164. package/packages/cli/dist/commands/workspace.d.ts +6 -0
  165. package/packages/cli/dist/commands/workspace.js +1 -0
  166. package/packages/cli/dist/context.d.ts +7 -0
  167. package/packages/cli/dist/context.js +1 -0
  168. package/packages/cli/dist/helpers.d.ts +55 -0
  169. package/packages/cli/dist/helpers.js +5 -0
  170. package/packages/cli/dist/index.d.ts +10 -0
  171. package/packages/cli/dist/index.js +3 -0
  172. package/packages/cli/dist/types.d.ts +9 -0
  173. package/packages/cli/dist/types.js +1 -0
  174. package/packages/core/dist/constants.d.ts +74 -0
  175. package/packages/core/dist/constants.js +1 -0
  176. package/packages/core/dist/content-detector.d.ts +13 -0
  177. package/packages/core/dist/content-detector.js +1 -0
  178. package/packages/core/dist/errors.d.ts +20 -0
  179. package/packages/core/dist/errors.js +1 -0
  180. package/packages/core/dist/global-registry.d.ts +63 -0
  181. package/packages/core/dist/global-registry.js +1 -0
  182. package/packages/core/dist/index.d.ts +7 -0
  183. package/packages/core/dist/index.js +1 -0
  184. package/packages/core/dist/logger.d.ts +32 -0
  185. package/packages/core/dist/logger.js +1 -0
  186. package/packages/core/dist/types.d.ts +133 -0
  187. package/packages/core/dist/types.js +1 -0
  188. package/packages/dashboard/dist/assets/index-BjA4YODs.js +21 -0
  189. package/packages/dashboard/dist/assets/index-BjA4YODs.js.map +1 -0
  190. package/packages/dashboard/dist/assets/index-CHpVij2M.css +1 -0
  191. package/packages/dashboard/dist/index.html +18 -0
  192. package/packages/elicitation/dist/build.d.ts +14 -0
  193. package/packages/elicitation/dist/build.js +1 -0
  194. package/packages/elicitation/dist/fields.d.ts +32 -0
  195. package/packages/elicitation/dist/fields.js +1 -0
  196. package/packages/elicitation/dist/index.d.ts +5 -0
  197. package/packages/elicitation/dist/index.js +1 -0
  198. package/packages/elicitation/dist/normalize.d.ts +15 -0
  199. package/packages/elicitation/dist/normalize.js +1 -0
  200. package/packages/elicitation/dist/types.d.ts +88 -0
  201. package/packages/elicitation/dist/types.js +1 -0
  202. package/packages/embeddings/dist/embedder.interface.d.ts +26 -0
  203. package/packages/embeddings/dist/embedder.interface.js +1 -0
  204. package/packages/embeddings/dist/index.d.ts +3 -0
  205. package/packages/embeddings/dist/index.js +1 -0
  206. package/packages/embeddings/dist/onnx-embedder.d.ts +22 -0
  207. package/packages/embeddings/dist/onnx-embedder.js +1 -0
  208. package/packages/enterprise-bridge/dist/cache.d.ts +28 -0
  209. package/packages/enterprise-bridge/dist/cache.js +1 -0
  210. package/packages/enterprise-bridge/dist/er-client.d.ts +37 -0
  211. package/packages/enterprise-bridge/dist/er-client.js +1 -0
  212. package/packages/enterprise-bridge/dist/evolution-collector.d.ts +62 -0
  213. package/packages/enterprise-bridge/dist/evolution-collector.js +1 -0
  214. package/packages/enterprise-bridge/dist/index.d.ts +8 -0
  215. package/packages/enterprise-bridge/dist/index.js +1 -0
  216. package/packages/enterprise-bridge/dist/policy-store.d.ts +45 -0
  217. package/packages/enterprise-bridge/dist/policy-store.js +1 -0
  218. package/packages/enterprise-bridge/dist/push-adapter.d.ts +23 -0
  219. package/packages/enterprise-bridge/dist/push-adapter.js +1 -0
  220. package/packages/enterprise-bridge/dist/result-merger.d.ts +14 -0
  221. package/packages/enterprise-bridge/dist/result-merger.js +1 -0
  222. package/packages/enterprise-bridge/dist/types.d.ts +81 -0
  223. package/packages/enterprise-bridge/dist/types.js +1 -0
  224. package/packages/flows/dist/adapters/claude-plugin.d.ts +12 -0
  225. package/packages/flows/dist/adapters/claude-plugin.js +1 -0
  226. package/packages/flows/dist/adapters/copilot.d.ts +10 -0
  227. package/packages/flows/dist/adapters/copilot.js +1 -0
  228. package/packages/flows/dist/adapters/index.d.ts +11 -0
  229. package/packages/flows/dist/adapters/index.js +1 -0
  230. package/packages/flows/dist/adapters/native.d.ts +10 -0
  231. package/packages/flows/dist/adapters/native.js +1 -0
  232. package/packages/flows/dist/builtins.d.ts +16 -0
  233. package/packages/flows/dist/builtins.js +1 -0
  234. package/packages/flows/dist/foundation.d.ts +20 -0
  235. package/packages/flows/dist/foundation.js +11 -0
  236. package/packages/flows/dist/git.d.ts +34 -0
  237. package/packages/flows/dist/git.js +1 -0
  238. package/packages/flows/dist/index.d.ts +12 -0
  239. package/packages/flows/dist/index.js +1 -0
  240. package/packages/flows/dist/loader.d.ts +13 -0
  241. package/packages/flows/dist/loader.js +2 -0
  242. package/packages/flows/dist/registry.d.ts +23 -0
  243. package/packages/flows/dist/registry.js +1 -0
  244. package/packages/flows/dist/state-machine.d.ts +23 -0
  245. package/packages/flows/dist/state-machine.js +1 -0
  246. package/packages/flows/dist/symlinks.d.ts +17 -0
  247. package/packages/flows/dist/symlinks.js +1 -0
  248. package/packages/flows/dist/types.d.ts +112 -0
  249. package/packages/flows/dist/types.js +1 -0
  250. package/packages/indexer/dist/file-hasher.d.ts +13 -0
  251. package/packages/indexer/dist/file-hasher.js +1 -0
  252. package/packages/indexer/dist/filesystem-crawler.d.ts +29 -0
  253. package/packages/indexer/dist/filesystem-crawler.js +1 -0
  254. package/packages/indexer/dist/graph-extractor.d.ts +18 -0
  255. package/packages/indexer/dist/graph-extractor.js +1 -0
  256. package/packages/indexer/dist/hash-cache.d.ts +24 -0
  257. package/packages/indexer/dist/hash-cache.js +1 -0
  258. package/packages/indexer/dist/incremental-indexer.d.ts +56 -0
  259. package/packages/indexer/dist/incremental-indexer.js +1 -0
  260. package/packages/indexer/dist/index.d.ts +6 -0
  261. package/packages/indexer/dist/index.js +1 -0
  262. package/packages/present/dist/index.html +709 -0
  263. package/packages/server/dist/api.d.ts +3 -0
  264. package/packages/server/dist/api.js +1 -0
  265. package/packages/server/dist/auto-gc.d.ts +30 -0
  266. package/packages/server/dist/auto-gc.js +1 -0
  267. package/packages/server/dist/completions.d.ts +14 -0
  268. package/packages/server/dist/completions.js +1 -0
  269. package/packages/server/dist/config.d.ts +14 -0
  270. package/packages/server/dist/config.js +1 -0
  271. package/packages/server/dist/cross-workspace.d.ts +43 -0
  272. package/packages/server/dist/cross-workspace.js +1 -0
  273. package/packages/server/dist/curated-manager.d.ts +92 -0
  274. package/packages/server/dist/curated-manager.js +5 -0
  275. package/packages/server/dist/dashboard-static.d.ts +27 -0
  276. package/packages/server/dist/dashboard-static.js +1 -0
  277. package/packages/server/dist/elicitor.d.ts +18 -0
  278. package/packages/server/dist/elicitor.js +1 -0
  279. package/packages/server/dist/index.d.ts +1 -0
  280. package/packages/server/dist/index.js +1 -0
  281. package/packages/server/dist/mcp-logging.d.ts +11 -0
  282. package/packages/server/dist/mcp-logging.js +1 -0
  283. package/packages/server/dist/output-schemas.d.ts +242 -0
  284. package/packages/server/dist/output-schemas.js +1 -0
  285. package/packages/server/dist/prompts.d.ts +13 -0
  286. package/packages/server/dist/prompts.js +13 -0
  287. package/packages/server/dist/replay-interceptor.d.ts +23 -0
  288. package/packages/server/dist/replay-interceptor.js +1 -0
  289. package/packages/server/dist/resource-links.d.ts +34 -0
  290. package/packages/server/dist/resource-links.js +1 -0
  291. package/packages/server/dist/resources/curated-resources.d.ts +13 -0
  292. package/packages/server/dist/resources/curated-resources.js +2 -0
  293. package/packages/server/dist/resources/resource-notifier.d.ts +45 -0
  294. package/packages/server/dist/resources/resource-notifier.js +1 -0
  295. package/packages/server/dist/resources/resources.d.ts +8 -0
  296. package/packages/server/dist/resources/resources.js +2 -0
  297. package/packages/server/dist/sampling.d.ts +41 -0
  298. package/packages/server/dist/sampling.js +2 -0
  299. package/packages/server/dist/server.d.ts +47 -0
  300. package/packages/server/dist/server.js +3 -0
  301. package/packages/server/dist/structured-content-guard.d.ts +26 -0
  302. package/packages/server/dist/structured-content-guard.js +1 -0
  303. package/packages/server/dist/task-manager.d.ts +40 -0
  304. package/packages/server/dist/task-manager.js +1 -0
  305. package/packages/server/dist/tool-metadata.d.ts +38 -0
  306. package/packages/server/dist/tool-metadata.js +1 -0
  307. package/packages/server/dist/tool-prefix.d.ts +12 -0
  308. package/packages/server/dist/tool-prefix.js +1 -0
  309. package/packages/server/dist/tools/analyze.tools.d.ts +14 -0
  310. package/packages/server/dist/tools/analyze.tools.js +8 -0
  311. package/packages/server/dist/tools/audit.tool.d.ts +8 -0
  312. package/packages/server/dist/tools/audit.tool.js +1 -0
  313. package/packages/server/dist/tools/brainstorm.tool.d.ts +7 -0
  314. package/packages/server/dist/tools/brainstorm.tool.js +9 -0
  315. package/packages/server/dist/tools/bridge.tools.d.ts +34 -0
  316. package/packages/server/dist/tools/bridge.tools.js +15 -0
  317. package/packages/server/dist/tools/context.tools.d.ts +15 -0
  318. package/packages/server/dist/tools/context.tools.js +10 -0
  319. package/packages/server/dist/tools/evolution.tools.d.ts +7 -0
  320. package/packages/server/dist/tools/evolution.tools.js +5 -0
  321. package/packages/server/dist/tools/execution.tools.d.ts +14 -0
  322. package/packages/server/dist/tools/execution.tools.js +4 -0
  323. package/packages/server/dist/tools/flow.tools.d.ts +7 -0
  324. package/packages/server/dist/tools/flow.tools.js +1 -0
  325. package/packages/server/dist/tools/forge.tools.d.ts +13 -0
  326. package/packages/server/dist/tools/forge.tools.js +10 -0
  327. package/packages/server/dist/tools/forget.tool.d.ts +8 -0
  328. package/packages/server/dist/tools/forget.tool.js +1 -0
  329. package/packages/server/dist/tools/graph.tool.d.ts +7 -0
  330. package/packages/server/dist/tools/graph.tool.js +5 -0
  331. package/packages/server/dist/tools/infra.tools.d.ts +10 -0
  332. package/packages/server/dist/tools/infra.tools.js +5 -0
  333. package/packages/server/dist/tools/list.tool.d.ts +7 -0
  334. package/packages/server/dist/tools/list.tool.js +2 -0
  335. package/packages/server/dist/tools/lookup.tool.d.ts +7 -0
  336. package/packages/server/dist/tools/lookup.tool.js +3 -0
  337. package/packages/server/dist/tools/manipulation.tools.d.ts +10 -0
  338. package/packages/server/dist/tools/manipulation.tools.js +4 -0
  339. package/packages/server/dist/tools/onboard.tool.d.ts +9 -0
  340. package/packages/server/dist/tools/onboard.tool.js +2 -0
  341. package/packages/server/dist/tools/persistence.tools.d.ts +10 -0
  342. package/packages/server/dist/tools/persistence.tools.js +5 -0
  343. package/packages/server/dist/tools/policy.tools.d.ts +7 -0
  344. package/packages/server/dist/tools/policy.tools.js +3 -0
  345. package/packages/server/dist/tools/present/browser.d.ts +4 -0
  346. package/packages/server/dist/tools/present/browser.js +93 -0
  347. package/packages/server/dist/tools/present/helpers.d.ts +18 -0
  348. package/packages/server/dist/tools/present/helpers.js +1 -0
  349. package/packages/server/dist/tools/present/html.d.ts +18 -0
  350. package/packages/server/dist/tools/present/html.js +5 -0
  351. package/packages/server/dist/tools/present/index.d.ts +2 -0
  352. package/packages/server/dist/tools/present/index.js +1 -0
  353. package/packages/server/dist/tools/present/markdown.d.ts +17 -0
  354. package/packages/server/dist/tools/present/markdown.js +8 -0
  355. package/packages/server/dist/tools/present/templates.d.ts +14 -0
  356. package/packages/server/dist/tools/present/templates.js +472 -0
  357. package/packages/server/dist/tools/present/tool.d.ts +27 -0
  358. package/packages/server/dist/tools/present/tool.js +19 -0
  359. package/packages/server/dist/tools/present-blocks.d.ts +46 -0
  360. package/packages/server/dist/tools/present-blocks.js +27 -0
  361. package/packages/server/dist/tools/present-charts.d.ts +31 -0
  362. package/packages/server/dist/tools/present-charts.js +34 -0
  363. package/packages/server/dist/tools/present-theme.d.ts +14 -0
  364. package/packages/server/dist/tools/present-theme.js +395 -0
  365. package/packages/server/dist/tools/present-utils.d.ts +11 -0
  366. package/packages/server/dist/tools/present-utils.js +1 -0
  367. package/packages/server/dist/tools/present.tool.d.ts +2 -0
  368. package/packages/server/dist/tools/present.tool.js +1 -0
  369. package/packages/server/dist/tools/produce.tool.d.ts +7 -0
  370. package/packages/server/dist/tools/produce.tool.js +4 -0
  371. package/packages/server/dist/tools/read.tool.d.ts +7 -0
  372. package/packages/server/dist/tools/read.tool.js +2 -0
  373. package/packages/server/dist/tools/reindex.tool.d.ts +11 -0
  374. package/packages/server/dist/tools/reindex.tool.js +3 -0
  375. package/packages/server/dist/tools/remember.tool.d.ts +9 -0
  376. package/packages/server/dist/tools/remember.tool.js +4 -0
  377. package/packages/server/dist/tools/replay.tool.d.ts +6 -0
  378. package/packages/server/dist/tools/replay.tool.js +3 -0
  379. package/packages/server/dist/tools/restore.tool.d.ts +6 -0
  380. package/packages/server/dist/tools/restore.tool.js +3 -0
  381. package/packages/server/dist/tools/search.tool.d.ts +11 -0
  382. package/packages/server/dist/tools/search.tool.js +10 -0
  383. package/packages/server/dist/tools/status.tool.d.ts +20 -0
  384. package/packages/server/dist/tools/status.tool.js +3 -0
  385. package/packages/server/dist/tools/update.tool.d.ts +8 -0
  386. package/packages/server/dist/tools/update.tool.js +1 -0
  387. package/packages/server/dist/tools/utility.tools.d.ts +15 -0
  388. package/packages/server/dist/tools/utility.tools.js +13 -0
  389. package/packages/server/dist/version-check.d.ts +32 -0
  390. package/packages/server/dist/version-check.js +1 -0
  391. package/packages/store/dist/graph-store.interface.d.ts +118 -0
  392. package/packages/store/dist/graph-store.interface.js +1 -0
  393. package/packages/store/dist/index.d.ts +6 -0
  394. package/packages/store/dist/index.js +1 -0
  395. package/packages/store/dist/lance-store.d.ts +44 -0
  396. package/packages/store/dist/lance-store.js +1 -0
  397. package/packages/store/dist/sqlite-graph-store.d.ts +45 -0
  398. package/packages/store/dist/sqlite-graph-store.js +58 -0
  399. package/packages/store/dist/store-factory.d.ts +12 -0
  400. package/packages/store/dist/store-factory.js +1 -0
  401. package/packages/store/dist/store.interface.d.ts +54 -0
  402. package/packages/store/dist/store.interface.js +1 -0
  403. package/packages/tools/dist/audit.d.ts +65 -0
  404. package/packages/tools/dist/audit.js +6 -0
  405. package/packages/tools/dist/batch.d.ts +23 -0
  406. package/packages/tools/dist/batch.js +1 -0
  407. package/packages/tools/dist/changelog.d.ts +36 -0
  408. package/packages/tools/dist/changelog.js +2 -0
  409. package/packages/tools/dist/check.d.ts +48 -0
  410. package/packages/tools/dist/check.js +2 -0
  411. package/packages/tools/dist/checkpoint.d.ts +19 -0
  412. package/packages/tools/dist/checkpoint.js +1 -0
  413. package/packages/tools/dist/codemod.d.ts +39 -0
  414. package/packages/tools/dist/codemod.js +2 -0
  415. package/packages/tools/dist/compact.d.ts +41 -0
  416. package/packages/tools/dist/compact.js +3 -0
  417. package/packages/tools/dist/config-extractor.d.ts +9 -0
  418. package/packages/tools/dist/config-extractor.js +7 -0
  419. package/packages/tools/dist/data-transform.d.ts +12 -0
  420. package/packages/tools/dist/data-transform.js +1 -0
  421. package/packages/tools/dist/dead-symbols.d.ts +28 -0
  422. package/packages/tools/dist/dead-symbols.js +2 -0
  423. package/packages/tools/dist/delegate.d.ts +36 -0
  424. package/packages/tools/dist/delegate.js +1 -0
  425. package/packages/tools/dist/diagram-builder.d.ts +9 -0
  426. package/packages/tools/dist/diagram-builder.js +9 -0
  427. package/packages/tools/dist/diff-parse.d.ts +28 -0
  428. package/packages/tools/dist/diff-parse.js +3 -0
  429. package/packages/tools/dist/digest.d.ts +50 -0
  430. package/packages/tools/dist/digest.js +6 -0
  431. package/packages/tools/dist/dogfood-log.d.ts +49 -0
  432. package/packages/tools/dist/dogfood-log.js +2 -0
  433. package/packages/tools/dist/encode.d.ts +16 -0
  434. package/packages/tools/dist/encode.js +1 -0
  435. package/packages/tools/dist/env-info.d.ts +30 -0
  436. package/packages/tools/dist/env-info.js +1 -0
  437. package/packages/tools/dist/eval.d.ts +15 -0
  438. package/packages/tools/dist/eval.js +2 -0
  439. package/packages/tools/dist/evidence-map.d.ts +92 -0
  440. package/packages/tools/dist/evidence-map.js +2 -0
  441. package/packages/tools/dist/file-cache.d.ts +41 -0
  442. package/packages/tools/dist/file-cache.js +3 -0
  443. package/packages/tools/dist/file-summary.d.ts +52 -0
  444. package/packages/tools/dist/file-summary.js +2 -0
  445. package/packages/tools/dist/file-walk.d.ts +6 -0
  446. package/packages/tools/dist/file-walk.js +1 -0
  447. package/packages/tools/dist/find-examples.d.ts +29 -0
  448. package/packages/tools/dist/find-examples.js +3 -0
  449. package/packages/tools/dist/find.d.ts +49 -0
  450. package/packages/tools/dist/find.js +1 -0
  451. package/packages/tools/dist/forge-classify.d.ts +44 -0
  452. package/packages/tools/dist/forge-classify.js +2 -0
  453. package/packages/tools/dist/forge-ground.d.ts +61 -0
  454. package/packages/tools/dist/forge-ground.js +1 -0
  455. package/packages/tools/dist/git-context.d.ts +25 -0
  456. package/packages/tools/dist/git-context.js +3 -0
  457. package/packages/tools/dist/graph-query.d.ts +86 -0
  458. package/packages/tools/dist/graph-query.js +1 -0
  459. package/packages/tools/dist/guide.d.ts +25 -0
  460. package/packages/tools/dist/guide.js +1 -0
  461. package/packages/tools/dist/health.d.ts +16 -0
  462. package/packages/tools/dist/health.js +2 -0
  463. package/packages/tools/dist/http-request.d.ts +25 -0
  464. package/packages/tools/dist/http-request.js +1 -0
  465. package/packages/tools/dist/index.d.ts +57 -0
  466. package/packages/tools/dist/index.js +1 -0
  467. package/packages/tools/dist/lane.d.ts +41 -0
  468. package/packages/tools/dist/lane.js +6 -0
  469. package/packages/tools/dist/measure.d.ts +42 -0
  470. package/packages/tools/dist/measure.js +2 -0
  471. package/packages/tools/dist/onboard-utils.d.ts +12 -0
  472. package/packages/tools/dist/onboard-utils.js +1 -0
  473. package/packages/tools/dist/onboard.d.ts +50 -0
  474. package/packages/tools/dist/onboard.js +18 -0
  475. package/packages/tools/dist/parse-output.d.ts +82 -0
  476. package/packages/tools/dist/parse-output.js +2 -0
  477. package/packages/tools/dist/path-resolver.d.ts +14 -0
  478. package/packages/tools/dist/path-resolver.js +1 -0
  479. package/packages/tools/dist/process-manager.d.ts +20 -0
  480. package/packages/tools/dist/process-manager.js +1 -0
  481. package/packages/tools/dist/queue.d.ts +40 -0
  482. package/packages/tools/dist/queue.js +1 -0
  483. package/packages/tools/dist/regex-test.d.ts +33 -0
  484. package/packages/tools/dist/regex-test.js +1 -0
  485. package/packages/tools/dist/regex-utils.d.ts +8 -0
  486. package/packages/tools/dist/regex-utils.js +1 -0
  487. package/packages/tools/dist/rename.d.ts +31 -0
  488. package/packages/tools/dist/rename.js +2 -0
  489. package/packages/tools/dist/replay.d.ts +59 -0
  490. package/packages/tools/dist/replay.js +4 -0
  491. package/packages/tools/dist/response-envelope.d.ts +43 -0
  492. package/packages/tools/dist/response-envelope.js +1 -0
  493. package/packages/tools/dist/restore-points.d.ts +22 -0
  494. package/packages/tools/dist/restore-points.js +1 -0
  495. package/packages/tools/dist/schema-validate.d.ts +25 -0
  496. package/packages/tools/dist/schema-validate.js +1 -0
  497. package/packages/tools/dist/scope-map.d.ts +51 -0
  498. package/packages/tools/dist/scope-map.js +1 -0
  499. package/packages/tools/dist/snippet.d.ts +35 -0
  500. package/packages/tools/dist/snippet.js +1 -0
  501. package/packages/tools/dist/stash.d.ts +14 -0
  502. package/packages/tools/dist/stash.js +1 -0
  503. package/packages/tools/dist/stratum-card.d.ts +30 -0
  504. package/packages/tools/dist/stratum-card.js +4 -0
  505. package/packages/tools/dist/symbol.d.ts +45 -0
  506. package/packages/tools/dist/symbol.js +3 -0
  507. package/packages/tools/dist/synthesis-engine.d.ts +13 -0
  508. package/packages/tools/dist/synthesis-engine.js +6 -0
  509. package/packages/tools/dist/test-run.d.ts +28 -0
  510. package/packages/tools/dist/test-run.js +2 -0
  511. package/packages/tools/dist/text-utils.d.ts +24 -0
  512. package/packages/tools/dist/text-utils.js +2 -0
  513. package/packages/tools/dist/time-utils.d.ts +20 -0
  514. package/packages/tools/dist/time-utils.js +1 -0
  515. package/packages/tools/dist/trace.d.ts +29 -0
  516. package/packages/tools/dist/trace.js +2 -0
  517. package/packages/tools/dist/truncation.d.ts +33 -0
  518. package/packages/tools/dist/truncation.js +7 -0
  519. package/packages/tools/dist/watch.d.ts +32 -0
  520. package/packages/tools/dist/watch.js +1 -0
  521. package/packages/tools/dist/web-fetch.d.ts +47 -0
  522. package/packages/tools/dist/web-fetch.js +8 -0
  523. package/packages/tools/dist/web-search.d.ts +25 -0
  524. package/packages/tools/dist/web-search.js +1 -0
  525. package/packages/tools/dist/workset.d.ts +47 -0
  526. package/packages/tools/dist/workset.js +1 -0
  527. package/packages/tui/dist/App-DU2KEylW.js +2 -0
  528. package/packages/tui/dist/App.d.ts +13 -0
  529. package/packages/tui/dist/App.js +2 -0
  530. package/packages/tui/dist/CuratedPanel-BIamXLNy.js +2 -0
  531. package/packages/tui/dist/LogPanel-Bo8a8QXB.js +3 -0
  532. package/packages/tui/dist/SearchPanel-CpJGczAc.js +2 -0
  533. package/packages/tui/dist/StatusPanel-BAbUxyqQ.js +2 -0
  534. package/packages/tui/dist/chunk-D6axbAb-.js +2 -0
  535. package/packages/tui/dist/devtools-DMOZMn70.js +7 -0
  536. package/packages/tui/dist/hooks/useKBClient.d.ts +9 -0
  537. package/packages/tui/dist/hooks/useKBClient.js +2 -0
  538. package/packages/tui/dist/hooks/usePolling.d.ts +8 -0
  539. package/packages/tui/dist/hooks/usePolling.js +2 -0
  540. package/packages/tui/dist/index-BXafekwr.d.ts +64 -0
  541. package/packages/tui/dist/index.d.ts +7 -0
  542. package/packages/tui/dist/index.js +2 -0
  543. package/packages/tui/dist/jsx-runtime-y6Gdq5PZ.js +294 -0
  544. package/packages/tui/dist/panels/CuratedPanel.d.ts +7 -0
  545. package/packages/tui/dist/panels/CuratedPanel.js +2 -0
  546. package/packages/tui/dist/panels/LogPanel.d.ts +7 -0
  547. package/packages/tui/dist/panels/LogPanel.js +2 -0
  548. package/packages/tui/dist/panels/SearchPanel.d.ts +7 -0
  549. package/packages/tui/dist/panels/SearchPanel.js +2 -0
  550. package/packages/tui/dist/panels/StatusPanel.d.ts +7 -0
  551. package/packages/tui/dist/panels/StatusPanel.js +2 -0
  552. package/packages/tui/dist/react-D__J1GQe.js +24 -0
  553. package/packages/tui/dist/useKBClient-C35iA4uG.js +2 -0
  554. package/packages/tui/dist/usePolling-BbjnRWgx.js +2 -0
  555. package/scaffold/README.md +192 -0
  556. package/scaffold/adapters/claude-code.mjs +56 -0
  557. package/scaffold/adapters/copilot.mjs +270 -0
  558. package/scaffold/definitions/agents.mjs +189 -0
  559. package/scaffold/definitions/bodies.mjs +487 -0
  560. package/scaffold/definitions/hooks.mjs +43 -0
  561. package/scaffold/definitions/models.mjs +56 -0
  562. package/scaffold/definitions/plugins.mjs +38 -0
  563. package/scaffold/definitions/prompts.mjs +145 -0
  564. package/scaffold/definitions/protocols.mjs +679 -0
  565. package/scaffold/definitions/tools.mjs +229 -0
  566. package/scaffold/flows/aikit-advanced/flow.json +60 -0
  567. package/scaffold/flows/aikit-advanced/skills/execute/SKILL.md +124 -0
  568. package/scaffold/flows/aikit-advanced/skills/plan/SKILL.md +100 -0
  569. package/scaffold/flows/aikit-advanced/skills/spec/SKILL.md +100 -0
  570. package/scaffold/flows/aikit-advanced/skills/task/SKILL.md +99 -0
  571. package/scaffold/flows/aikit-advanced/skills/verify/SKILL.md +122 -0
  572. package/scaffold/flows/aikit-basic/flow.json +36 -0
  573. package/scaffold/flows/aikit-basic/skills/assess/SKILL.md +82 -0
  574. package/scaffold/flows/aikit-basic/skills/implement/SKILL.md +105 -0
  575. package/scaffold/flows/aikit-basic/skills/verify/SKILL.md +96 -0
  576. package/scaffold/general/agents/Architect-Reviewer-Alpha.agent.md +21 -0
  577. package/scaffold/general/agents/Architect-Reviewer-Beta.agent.md +21 -0
  578. package/scaffold/general/agents/Code-Reviewer-Alpha.agent.md +12 -0
  579. package/scaffold/general/agents/Code-Reviewer-Beta.agent.md +12 -0
  580. package/scaffold/general/agents/Debugger.agent.md +34 -0
  581. package/scaffold/general/agents/Documenter.agent.md +53 -0
  582. package/scaffold/general/agents/Explorer.agent.md +63 -0
  583. package/scaffold/general/agents/Frontend.agent.md +29 -0
  584. package/scaffold/general/agents/Implementer.agent.md +33 -0
  585. package/scaffold/general/agents/Orchestrator.agent.md +149 -0
  586. package/scaffold/general/agents/Planner.agent.md +79 -0
  587. package/scaffold/general/agents/README.md +57 -0
  588. package/scaffold/general/agents/Refactor.agent.md +36 -0
  589. package/scaffold/general/agents/Researcher-Alpha.agent.md +20 -0
  590. package/scaffold/general/agents/Researcher-Beta.agent.md +20 -0
  591. package/scaffold/general/agents/Researcher-Delta.agent.md +20 -0
  592. package/scaffold/general/agents/Researcher-Gamma.agent.md +20 -0
  593. package/scaffold/general/agents/Security.agent.md +55 -0
  594. package/scaffold/general/agents/_shared/architect-reviewer-base.md +60 -0
  595. package/scaffold/general/agents/_shared/code-agent-base.md +262 -0
  596. package/scaffold/general/agents/_shared/code-reviewer-base.md +64 -0
  597. package/scaffold/general/agents/_shared/decision-protocol.md +27 -0
  598. package/scaffold/general/agents/_shared/forge-protocol.md +90 -0
  599. package/scaffold/general/agents/_shared/researcher-base.md +101 -0
  600. package/scaffold/general/agents/templates/adr-template.md +28 -0
  601. package/scaffold/general/agents/templates/execution-state.md +26 -0
  602. package/scaffold/general/prompts/ask.prompt.md +21 -0
  603. package/scaffold/general/prompts/debug.prompt.md +25 -0
  604. package/scaffold/general/prompts/design.prompt.md +23 -0
  605. package/scaffold/general/prompts/implement.prompt.md +26 -0
  606. package/scaffold/general/prompts/plan.prompt.md +25 -0
  607. package/scaffold/general/prompts/review.prompt.md +32 -0
  608. package/scaffold/general/skills/adr-skill/SKILL.md +329 -0
  609. package/scaffold/general/skills/adr-skill/assets/templates/adr-madr.md +89 -0
  610. package/scaffold/general/skills/adr-skill/assets/templates/adr-readme.md +20 -0
  611. package/scaffold/general/skills/adr-skill/assets/templates/adr-simple.md +46 -0
  612. package/scaffold/general/skills/adr-skill/references/adr-conventions.md +95 -0
  613. package/scaffold/general/skills/adr-skill/references/examples.md +193 -0
  614. package/scaffold/general/skills/adr-skill/references/review-checklist.md +77 -0
  615. package/scaffold/general/skills/adr-skill/references/template-variants.md +52 -0
  616. package/scaffold/general/skills/adr-skill/scripts/bootstrap_adr.js +259 -0
  617. package/scaffold/general/skills/adr-skill/scripts/new_adr.js +391 -0
  618. package/scaffold/general/skills/adr-skill/scripts/set_adr_status.js +169 -0
  619. package/scaffold/general/skills/aikit/SKILL.md +521 -0
  620. package/scaffold/general/skills/brainstorming/SKILL.md +259 -0
  621. package/scaffold/general/skills/brainstorming/scripts/frame-template.html +365 -0
  622. package/scaffold/general/skills/brainstorming/scripts/helper.js +216 -0
  623. package/scaffold/general/skills/brainstorming/scripts/server.cjs +9 -0
  624. package/scaffold/general/skills/brainstorming/scripts/server.src.cjs +249 -0
  625. package/scaffold/general/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  626. package/scaffold/general/skills/brainstorming/visual-companion.md +430 -0
  627. package/scaffold/general/skills/c4-architecture/SKILL.md +295 -0
  628. package/scaffold/general/skills/c4-architecture/references/advanced-patterns.md +552 -0
  629. package/scaffold/general/skills/c4-architecture/references/c4-syntax.md +492 -0
  630. package/scaffold/general/skills/c4-architecture/references/common-mistakes.md +437 -0
  631. package/scaffold/general/skills/lesson-learned/SKILL.md +105 -0
  632. package/scaffold/general/skills/lesson-learned/references/anti-patterns.md +55 -0
  633. package/scaffold/general/skills/lesson-learned/references/se-principles.md +109 -0
  634. package/scaffold/general/skills/multi-agents-development/SKILL.md +435 -0
  635. package/scaffold/general/skills/multi-agents-development/architecture-review-prompt.md +81 -0
  636. package/scaffold/general/skills/multi-agents-development/code-quality-review-prompt.md +91 -0
  637. package/scaffold/general/skills/multi-agents-development/implementer-prompt.md +93 -0
  638. package/scaffold/general/skills/multi-agents-development/parallel-dispatch-example.md +167 -0
  639. package/scaffold/general/skills/multi-agents-development/spec-review-prompt.md +81 -0
  640. package/scaffold/general/skills/present/SKILL.md +424 -0
  641. package/scaffold/general/skills/requirements-clarity/SKILL.md +324 -0
  642. package/scaffold/general/skills/session-handoff/SKILL.md +189 -0
  643. package/scaffold/general/skills/session-handoff/references/handoff-template.md +139 -0
  644. package/scaffold/general/skills/session-handoff/references/resume-checklist.md +80 -0
  645. package/scaffold/general/skills/session-handoff/scripts/check_staleness.js +269 -0
  646. package/scaffold/general/skills/session-handoff/scripts/create_handoff.js +299 -0
  647. package/scaffold/general/skills/session-handoff/scripts/list_handoffs.js +113 -0
  648. package/scaffold/general/skills/session-handoff/scripts/validate_handoff.js +241 -0
  649. package/scaffold/generate.mjs +82 -0
@@ -0,0 +1,259 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Bootstrap ADRs in a repo:
4
+ * - create ADR directory
5
+ * - create adr/README.md (index) using a template
6
+ * - create first ADR: "Adopt architecture decision records"
7
+ */
8
+
9
+ const fs = require('node:fs');
10
+ const path = require('node:path');
11
+
12
+ function die(msg) {
13
+ process.stderr.write(`${msg}\n`);
14
+ process.exit(1);
15
+ }
16
+
17
+ function parseArgs(argv) {
18
+ const out = {
19
+ repoRoot: '.',
20
+ dir: 'adr',
21
+ forceIndex: false,
22
+ indexFile: null,
23
+ firstTitle: 'Adopt architecture decision records',
24
+ firstStatus: 'accepted',
25
+ deciders: '',
26
+ technicalStory: '',
27
+ strategy: 'date',
28
+ json: false,
29
+ };
30
+
31
+ for (let i = 2; i < argv.length; i++) {
32
+ const a = argv[i];
33
+ const next = () => {
34
+ if (i + 1 >= argv.length) die(`Missing value for ${a}`);
35
+ return argv[++i];
36
+ };
37
+
38
+ if (a === '--repo-root') out.repoRoot = next();
39
+ else if (a === '--dir') out.dir = next();
40
+ else if (a === '--force-index') out.forceIndex = true;
41
+ else if (a === '--index-file') out.indexFile = next();
42
+ else if (a === '--first-title') out.firstTitle = next();
43
+ else if (a === '--first-status') out.firstStatus = next();
44
+ else if (a === '--deciders') out.deciders = next();
45
+ else if (a === '--technical-story') out.technicalStory = next();
46
+ else if (a === '--strategy') out.strategy = next();
47
+ else if (a === '--json') out.json = true;
48
+ else if (a === '--help' || a === '-h') {
49
+ process.stdout.write(
50
+ [
51
+ 'Usage: node bootstrap_adr.js [options]',
52
+ '',
53
+ 'Options:',
54
+ ' --repo-root <path> Repo root (default: .)',
55
+ ' --dir <path> ADR directory (default: adr)',
56
+ ' --index-file <path> Override index file path (relative to repo root unless absolute)',
57
+ ' --force-index Overwrite index file if it exists',
58
+ ' --first-title <text> Title for initial ADR',
59
+ ' --first-status <text> Status for initial ADR (default: accepted)',
60
+ ' --strategy date|slug|auto Filename strategy for initial ADR (default: date)',
61
+ ' --json Output machine-readable JSON (default: off)',
62
+ '',
63
+ ].join('\n'),
64
+ );
65
+ process.exit(0);
66
+ } else {
67
+ die(`Unknown arg: ${a}`);
68
+ }
69
+ }
70
+
71
+ if (!['auto', 'date', 'slug'].includes(out.strategy)) die(`Invalid --strategy: ${out.strategy}`);
72
+ return out;
73
+ }
74
+
75
+ function loadReadmeTemplate() {
76
+ const skillRoot = path.resolve(__dirname, '..');
77
+ const templatePath = path.join(skillRoot, 'assets', 'templates', 'adr-readme.md');
78
+ if (!fs.existsSync(templatePath)) die(`README template not found: ${templatePath}`);
79
+ return fs.readFileSync(templatePath, 'utf8');
80
+ }
81
+
82
+ function writeIndex(indexFile, adrDirName, { force }) {
83
+ if (fs.existsSync(indexFile) && !force) return;
84
+ const content = loadReadmeTemplate().replaceAll('{ADR_DIR}', adrDirName);
85
+ fs.mkdirSync(path.dirname(indexFile), { recursive: true });
86
+ fs.writeFileSync(indexFile, `${content.trimEnd()}\n`, 'utf8');
87
+ }
88
+
89
+ function slugify(text) {
90
+ const t = String(text || '')
91
+ .trim()
92
+ .toLowerCase();
93
+ const noQuotes = t.replace(/['"`]/g, '');
94
+ const dashed = noQuotes.replace(/[^a-z0-9]+/g, '-').replace(/-{2,}/g, '-');
95
+ const trimmed = dashed.replace(/^-+/, '').replace(/-+$/, '');
96
+ return trimmed || 'decision';
97
+ }
98
+
99
+ function toPosix(p) {
100
+ return p.split(path.sep).join('/');
101
+ }
102
+
103
+ function generateFirstAdr({ title, status, date, deciders, adrDir }) {
104
+ const deciderLine = deciders
105
+ ? String(deciders)
106
+ .split(',')
107
+ .map((s) => s.trim())
108
+ .filter(Boolean)
109
+ .join(', ')
110
+ : '';
111
+
112
+ return `---
113
+ status: ${status}
114
+ date: ${date}
115
+ decision-makers: ${deciderLine}
116
+ ---
117
+
118
+ # ${title}
119
+
120
+ ## Context and Problem Statement
121
+
122
+ Architecture decisions in this project are made implicitly — through code, conversations, and tribal knowledge. When a new contributor (human or AI agent) joins the codebase, there is no record of *why* things are built the way they are. This makes it hard to:
123
+
124
+ - Understand whether a pattern is intentional or accidental
125
+ - Know if a past decision still applies or has been superseded
126
+ - Avoid relitigating decisions that were already carefully considered
127
+
128
+ We need a lightweight, version-controlled way to capture decisions where the code lives.
129
+
130
+ ## Decision
131
+
132
+ Adopt Architecture Decision Records (ADRs) using the MADR 4.0 format, stored in \`${adrDir}/\`.
133
+
134
+ Conventions:
135
+ - One ADR per file, named \`YYYY-MM-DD-title-with-dashes.md\`
136
+ - New ADRs start as \`proposed\`, move to \`accepted\` or \`rejected\`
137
+ - Superseded ADRs link to their replacement
138
+ - ADRs are written to be self-contained — a coding agent should be able to read one and implement the decision without further context
139
+
140
+ ## Consequences
141
+
142
+ * Good, because decisions are discoverable and version-controlled alongside the code
143
+ * Good, because new contributors (human or agent) can understand the "why" behind architecture choices
144
+ * Good, because the team builds a shared decision log that prevents relitigating settled questions
145
+ * Bad, because writing ADRs takes time — though a good ADR saves more time than it costs
146
+ * Neutral, because ADRs require periodic review to mark outdated decisions as deprecated or superseded
147
+
148
+ ## Alternatives Considered
149
+
150
+ * No formal records: Continue making decisions in conversations and code comments. Rejected because context is lost and decisions get relitigated.
151
+ * Wiki or Notion pages: Capture decisions outside the repo. Rejected because they drift out of sync with the code and are not version-controlled.
152
+ * Lightweight RFCs: More heavyweight process with formal review cycles. Rejected as overkill for most decisions — ADRs can scale up to RFC-level detail when needed.
153
+ `;
154
+ }
155
+
156
+ function updateIndexFile(indexFile, { relLink, title, status, date }) {
157
+ if (!fs.existsSync(indexFile)) return;
158
+ const content = fs.readFileSync(indexFile, 'utf8');
159
+ if (content.includes(relLink)) return;
160
+
161
+ const entryLine = `- [${title}](${relLink}) (${status}, ${date})`;
162
+
163
+ // Append after "## ADRs" heading if found, otherwise append at end
164
+ const normalized = content.replace(/\r\n/g, '\n');
165
+ const lines = normalized.split('\n');
166
+ const headingIdx = lines.findIndex((l) => /^##\s+ADRs\s*$/i.test(l));
167
+
168
+ if (headingIdx !== -1) {
169
+ // Insert after the heading (and any blank line after it)
170
+ let insertAt = headingIdx + 1;
171
+ while (insertAt < lines.length && lines[insertAt].trim() === '') insertAt++;
172
+ lines.splice(insertAt, 0, entryLine);
173
+ } else {
174
+ lines.push(entryLine);
175
+ }
176
+
177
+ fs.writeFileSync(indexFile, lines.join('\n'), 'utf8');
178
+ }
179
+
180
+ function main() {
181
+ const args = parseArgs(process.argv);
182
+
183
+ const repoRoot = path.resolve(process.cwd(), args.repoRoot);
184
+ if (!fs.existsSync(repoRoot)) die(`Repo root does not exist: ${repoRoot}`);
185
+
186
+ const adrDir = path.resolve(repoRoot, args.dir);
187
+ fs.mkdirSync(adrDir, { recursive: true });
188
+
189
+ const indexFile = args.indexFile
190
+ ? path.isAbsolute(args.indexFile)
191
+ ? args.indexFile
192
+ : path.resolve(repoRoot, args.indexFile)
193
+ : path.join(adrDir, 'README.md');
194
+
195
+ const indexExistedBefore = fs.existsSync(indexFile);
196
+ writeIndex(indexFile, args.dir, { force: args.forceIndex });
197
+ const indexWritten = fs.existsSync(indexFile) && (!indexExistedBefore || args.forceIndex);
198
+
199
+ // Create the first ADR as a filled-out decision (not a blank template).
200
+ const relIndex = path.isAbsolute(indexFile) ? path.relative(repoRoot, indexFile) : indexFile;
201
+ const today = new Date().toISOString().slice(0, 10);
202
+
203
+ const firstAdrContent = generateFirstAdr({
204
+ title: args.firstTitle,
205
+ status: args.firstStatus,
206
+ date: today,
207
+ deciders: args.deciders,
208
+ adrDir: args.dir,
209
+ });
210
+
211
+ // Determine filename using same logic as new_adr.js
212
+ const strategy = args.strategy === 'auto' ? 'date' : args.strategy;
213
+ let firstAdrFilename;
214
+ if (strategy === 'date') {
215
+ firstAdrFilename = `${today}-${slugify(args.firstTitle)}.md`;
216
+ } else {
217
+ firstAdrFilename = `${slugify(args.firstTitle)}.md`;
218
+ }
219
+ const firstAdrPath = path.join(adrDir, firstAdrFilename);
220
+ fs.writeFileSync(firstAdrPath, `${firstAdrContent.trimEnd()}\n`, 'utf8');
221
+
222
+ // Update index
223
+ const relLink = toPosix(path.relative(path.dirname(indexFile), firstAdrPath));
224
+ updateIndexFile(indexFile, {
225
+ relLink,
226
+ title: args.firstTitle,
227
+ status: args.firstStatus,
228
+ date: today,
229
+ });
230
+
231
+ if (args.json) {
232
+ const payload = {
233
+ repoRoot,
234
+ adrDir,
235
+ adrDirRelPath: toPosix(path.relative(repoRoot, adrDir)),
236
+ indexPath: indexFile,
237
+ indexRelPath: toPosix(relIndex),
238
+ indexExistedBefore,
239
+ indexWritten,
240
+ firstAdr: {
241
+ createdAdrPath: firstAdrPath,
242
+ createdAdrRelPath: toPosix(path.relative(repoRoot, firstAdrPath)),
243
+ title: args.firstTitle,
244
+ status: args.firstStatus,
245
+ strategy,
246
+ date: today,
247
+ },
248
+ date: today,
249
+ };
250
+ process.stdout.write(`${JSON.stringify(payload)}\n`);
251
+ return;
252
+ }
253
+
254
+ process.stdout.write(`${firstAdrPath}\n`);
255
+ process.stdout.write(`Bootstrapped ADRs at ${adrDir} (${today})\n`);
256
+ process.stdout.write(`Index: ${indexFile}\n`);
257
+ }
258
+
259
+ main();
@@ -0,0 +1,391 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Create a new ADR markdown file using repo conventions and a template.
4
+ *
5
+ * Design goals:
6
+ * - Safe defaults (auto-detect adr directory + numbering)
7
+ * - No external deps
8
+ * - Works even if the repo has no ADRs yet
9
+ */
10
+
11
+ const fs = require('node:fs');
12
+ const path = require('node:path');
13
+
14
+ function die(msg) {
15
+ process.stderr.write(`${msg}\n`);
16
+ process.exit(1);
17
+ }
18
+
19
+ function slugify(text) {
20
+ const t = String(text || '')
21
+ .trim()
22
+ .toLowerCase();
23
+ const noQuotes = t.replace(/['"`]/g, '');
24
+ const dashed = noQuotes.replace(/[^a-z0-9]+/g, '-').replace(/-{2,}/g, '-');
25
+ const trimmed = dashed.replace(/^-+/, '').replace(/-+$/, '');
26
+ return trimmed || 'decision';
27
+ }
28
+
29
+ function toPosix(p) {
30
+ return p.split(path.sep).join('/');
31
+ }
32
+
33
+ function parseArgs(argv) {
34
+ const out = {
35
+ repoRoot: '.',
36
+ dir: null,
37
+ noCreateDir: false,
38
+ title: null,
39
+ status: 'proposed',
40
+ template: 'simple', // simple | madr
41
+ strategy: 'auto', // auto | date | slug
42
+ deciders: '',
43
+ consulted: '',
44
+ informed: '',
45
+ technicalStory: '',
46
+ chosenOption: '',
47
+ updateIndex: false,
48
+ indexFile: null,
49
+ json: false,
50
+ };
51
+
52
+ for (let i = 2; i < argv.length; i++) {
53
+ const a = argv[i];
54
+ const next = () => {
55
+ if (i + 1 >= argv.length) die(`Missing value for ${a}`);
56
+ return argv[++i];
57
+ };
58
+
59
+ if (a === '--repo-root') out.repoRoot = next();
60
+ else if (a === '--dir') out.dir = next();
61
+ else if (a === '--no-create-dir') out.noCreateDir = true;
62
+ else if (a === '--title') out.title = next();
63
+ else if (a === '--status') out.status = next();
64
+ else if (a === '--template') out.template = next();
65
+ else if (a === '--strategy') out.strategy = next();
66
+ else if (a === '--deciders') out.deciders = next();
67
+ else if (a === '--consulted') out.consulted = next();
68
+ else if (a === '--informed') out.informed = next();
69
+ else if (a === '--technical-story') out.technicalStory = next();
70
+ else if (a === '--chosen-option') out.chosenOption = next();
71
+ else if (a === '--update-index') out.updateIndex = true;
72
+ else if (a === '--index-file') out.indexFile = next();
73
+ else if (a === '--json') out.json = true;
74
+ else if (a === '--help' || a === '-h') {
75
+ process.stdout.write(
76
+ [
77
+ 'Usage: node new_adr.js --title "Choose database" [options]',
78
+ '',
79
+ 'Options:',
80
+ ' --repo-root <path> Repo root (default: .)',
81
+ ' --dir <path> ADR directory (default: auto-detect, else adr/)',
82
+ ' --no-create-dir Do not create ADR directory if missing',
83
+ ' --status <value> ADR status (default: proposed)',
84
+ ' --template simple|madr Template (default: simple)',
85
+ ' --strategy auto|date|slug Filename strategy (default: auto)',
86
+ ' --deciders "a,b" Deciders list',
87
+ ' --consulted "a,b" Consulted experts (RACI)',
88
+ ' --informed "a,b" Informed stakeholders (RACI)',
89
+ ' --technical-story <x> Issue/ticket/PR link or short ref',
90
+ ' --chosen-option <x> MADR template: chosen option label',
91
+ ' --update-index Update adr/README.md (or existing index)',
92
+ ' --index-file <path> Override index file (relative to repo root unless absolute)',
93
+ ' --json Output machine-readable JSON (default: off)',
94
+ '',
95
+ ].join('\n'),
96
+ );
97
+ process.exit(0);
98
+ } else {
99
+ die(`Unknown arg: ${a}`);
100
+ }
101
+ }
102
+
103
+ if (!out.title) die('Missing required --title');
104
+
105
+ if (!['simple', 'madr'].includes(out.template)) die(`Invalid --template: ${out.template}`);
106
+ if (!['auto', 'date', 'slug'].includes(out.strategy)) die(`Invalid --strategy: ${out.strategy}`);
107
+
108
+ return out;
109
+ }
110
+
111
+ function detectAdrDir(repoRoot) {
112
+ const candidates = [
113
+ path.join(repoRoot, 'contributing', 'decisions'),
114
+ path.join(repoRoot, 'docs', 'decisions'),
115
+ path.join(repoRoot, 'adr'),
116
+ path.join(repoRoot, 'docs', 'adr'),
117
+ path.join(repoRoot, 'docs', 'adrs'),
118
+ path.join(repoRoot, 'decisions'),
119
+ ];
120
+ for (const p of candidates) {
121
+ try {
122
+ if (fs.statSync(p).isDirectory()) return p;
123
+ } catch {
124
+ // ignore
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+
130
+ function listMdFiles(dir) {
131
+ let entries = [];
132
+ try {
133
+ entries = fs.readdirSync(dir, { withFileTypes: true });
134
+ } catch {
135
+ return [];
136
+ }
137
+ return entries
138
+ .filter((e) => e.isFile() && e.name.toLowerCase().endsWith('.md'))
139
+ .map((e) => e.name);
140
+ }
141
+
142
+ function detectStrategy(adrDir) {
143
+ const md = listMdFiles(adrDir);
144
+ for (const name of md) {
145
+ if (/^\d{4}-\d{2}-\d{2}-/.test(name)) return 'date';
146
+ }
147
+ if (md.length > 0) return 'slug';
148
+ return 'date';
149
+ }
150
+
151
+ function todayISO() {
152
+ return new Date().toISOString().slice(0, 10);
153
+ }
154
+
155
+ function loadTemplate(templateName) {
156
+ const skillRoot = path.resolve(__dirname, '..');
157
+ const templatePath = path.join(skillRoot, 'assets', 'templates', `adr-${templateName}.md`);
158
+ if (!fs.existsSync(templatePath)) die(`Template not found: ${templatePath}`);
159
+ return fs.readFileSync(templatePath, 'utf8');
160
+ }
161
+
162
+ function renderTemplate(raw, vars) {
163
+ // Handle YAML front matter placeholders (quoted and unquoted)
164
+ let out = raw;
165
+
166
+ // YAML front matter fields — replace the whole placeholder pattern
167
+ // e.g. status: "{proposed | accepted | ...}" → status: proposed
168
+ out = out.replace(/^(status:\s*)["']?\{[^}]*\}["']?\s*$/m, `$1${vars.status}`);
169
+ out = out.replace(/^(date:\s*)\{[^}]*\}\s*$/m, `$1${vars.date}`);
170
+ out = out.replace(/^(decision-makers:\s*)["']?\{[^}]*\}["']?\s*$/m, `$1${vars.deciders || ''}`);
171
+
172
+ // consulted / informed: replace if a value was provided, otherwise remove the
173
+ // entire line so we don't leak placeholder text like "{list everyone...}"
174
+ if (vars.consulted) {
175
+ out = out.replace(/^(consulted:\s*)["']?\{[^}]*\}["']?\s*$/m, `$1${vars.consulted}`);
176
+ } else {
177
+ out = out.replace(/^consulted:\s*["']?\{[^}]*\}["']?\s*\n/m, '');
178
+ }
179
+ if (vars.informed) {
180
+ out = out.replace(/^(informed:\s*)["']?\{[^}]*\}["']?\s*$/m, `$1${vars.informed}`);
181
+ } else {
182
+ out = out.replace(/^informed:\s*["']?\{[^}]*\}["']?\s*\n/m, '');
183
+ }
184
+
185
+ // Replace MADR-style heading placeholder
186
+ out = out.replace(/^(#\s+)\{short title[^}]*\}\s*$/m, `$1${vars.title}`);
187
+
188
+ // Inline placeholders (title in heading, etc.)
189
+ out = out
190
+ .replaceAll('{TITLE}', vars.title)
191
+ .replaceAll('{STATUS}', vars.status)
192
+ .replaceAll('{DATE}', vars.date)
193
+ .replaceAll('{DECIDERS}', vars.deciders)
194
+ .replaceAll('{TECHNICAL_STORY}', vars.technicalStory)
195
+ .replaceAll('{CHOSEN_OPTION}', vars.chosenOption);
196
+
197
+ return out;
198
+ }
199
+
200
+ function chooseIndexFile(adrDir) {
201
+ for (const name of ['README.md', 'index.md']) {
202
+ const p = path.join(adrDir, name);
203
+ if (fs.existsSync(p)) return p;
204
+ }
205
+ return path.join(adrDir, 'README.md');
206
+ }
207
+
208
+ function insertIndexEntryUnderHeading(lines, headingRegex, entryLine) {
209
+ // Returns { lines, inserted }
210
+ const headingIndex = lines.findIndex((l) => headingRegex.test(l));
211
+ if (headingIndex === -1) return { lines, inserted: false };
212
+
213
+ let sectionEnd = lines.length;
214
+ for (let i = headingIndex + 1; i < lines.length; i++) {
215
+ if (/^##\s+/.test(lines[i])) {
216
+ sectionEnd = i;
217
+ break;
218
+ }
219
+ }
220
+
221
+ // Prefer inserting at end of list in this section if there is a list.
222
+ let lastListItem = -1;
223
+ for (let i = sectionEnd - 1; i > headingIndex; i--) {
224
+ if (/^[-*]\s+/.test(lines[i])) {
225
+ lastListItem = i;
226
+ break;
227
+ }
228
+ }
229
+
230
+ const insertAt = lastListItem !== -1 ? lastListItem + 1 : sectionEnd;
231
+
232
+ const out = [...lines];
233
+
234
+ // Ensure there's a blank line after the heading if we're inserting immediately after it.
235
+ if (insertAt === headingIndex + 1 && out[insertAt] !== '') {
236
+ out.splice(insertAt, 0, '');
237
+ }
238
+
239
+ out.splice(insertAt, 0, entryLine);
240
+ return { lines: out, inserted: true };
241
+ }
242
+
243
+ function updateIndex(indexFile, { relLink, title, status, date }) {
244
+ let content = '';
245
+ if (fs.existsSync(indexFile)) content = fs.readFileSync(indexFile, 'utf8');
246
+ else content = '# ADR Log\n\n';
247
+
248
+ if (content.includes(relLink)) return false;
249
+
250
+ const normalized = content.replace(/\r\n/g, '\n');
251
+ const hadTrailingNewline = normalized.endsWith('\n');
252
+ let lines = normalized.split('\n');
253
+ // Normalize away the trailing empty split element so insertion math is sane.
254
+ if (hadTrailingNewline && lines.length > 0 && lines[lines.length - 1] === '') {
255
+ lines = lines.slice(0, -1);
256
+ }
257
+ const entryLine = `- [${title}](${relLink}) (${status}, ${date})`;
258
+
259
+ // Prefer inserting under "## ADRs" if it exists, otherwise append at EOF.
260
+ const r = insertIndexEntryUnderHeading(lines, /^##\s+ADRs\s*$/i, entryLine);
261
+ const nextLines = r.inserted ? r.lines : [...lines, entryLine];
262
+
263
+ let next = nextLines.join('\n');
264
+ if (hadTrailingNewline) next += '\n';
265
+
266
+ fs.mkdirSync(path.dirname(indexFile), { recursive: true });
267
+ fs.writeFileSync(indexFile, next, 'utf8');
268
+ return true;
269
+ }
270
+
271
+ function main() {
272
+ const args = parseArgs(process.argv);
273
+
274
+ const repoRoot = path.resolve(process.cwd(), args.repoRoot);
275
+ if (!fs.existsSync(repoRoot)) die(`Repo root does not exist: ${repoRoot}`);
276
+
277
+ let adrDir;
278
+ if (args.dir) adrDir = path.resolve(repoRoot, args.dir);
279
+ else adrDir = detectAdrDir(repoRoot) || path.join(repoRoot, 'adr');
280
+
281
+ if (!fs.existsSync(adrDir)) {
282
+ if (args.noCreateDir) die(`ADR directory does not exist: ${adrDir}`);
283
+ fs.mkdirSync(adrDir, { recursive: true });
284
+ }
285
+
286
+ let strategy = args.strategy;
287
+ if (strategy === 'auto') strategy = detectStrategy(adrDir);
288
+
289
+ const title = String(args.title).trim();
290
+ const slug = slugify(title);
291
+
292
+ const today = todayISO();
293
+
294
+ let filename;
295
+ if (strategy === 'date') {
296
+ filename = `${today}-${slug}.md`;
297
+ } else {
298
+ filename = `${slug}.md`;
299
+ }
300
+
301
+ let out = path.join(adrDir, filename);
302
+ if (fs.existsSync(out)) {
303
+ if (strategy === 'date') die(`ADR already exists: ${out}`);
304
+ let i = 2;
305
+ while (true) {
306
+ const candidate = path.join(adrDir, `${slug}-${i}.md`);
307
+ if (!fs.existsSync(candidate)) {
308
+ out = candidate;
309
+ break;
310
+ }
311
+ i++;
312
+ }
313
+ }
314
+
315
+ const deciders = String(args.deciders || '')
316
+ .split(',')
317
+ .map((s) => s.trim())
318
+ .filter(Boolean)
319
+ .join(', ');
320
+
321
+ const consulted = String(args.consulted || '')
322
+ .split(',')
323
+ .map((s) => s.trim())
324
+ .filter(Boolean)
325
+ .join(', ');
326
+ const informed = String(args.informed || '')
327
+ .split(',')
328
+ .map((s) => s.trim())
329
+ .filter(Boolean)
330
+ .join(', ');
331
+
332
+ const raw = loadTemplate(args.template);
333
+ const rendered = renderTemplate(raw, {
334
+ title,
335
+ status: String(args.status).trim(),
336
+ date: today,
337
+ deciders,
338
+ consulted,
339
+ informed,
340
+ technicalStory: String(args.technicalStory || '').trim(),
341
+ chosenOption: String(args.chosenOption || '').trim(),
342
+ });
343
+
344
+ fs.writeFileSync(out, `${rendered.trimEnd()}\n`, 'utf8');
345
+
346
+ let updatedIndexPath = null;
347
+ let indexChanged = false;
348
+
349
+ if (args.updateIndex) {
350
+ let indexFile;
351
+ if (args.indexFile) {
352
+ indexFile = path.isAbsolute(args.indexFile)
353
+ ? args.indexFile
354
+ : path.resolve(repoRoot, args.indexFile);
355
+ } else {
356
+ indexFile = chooseIndexFile(adrDir);
357
+ }
358
+
359
+ const relLink = toPosix(path.relative(path.dirname(indexFile), out));
360
+ indexChanged = updateIndex(indexFile, {
361
+ relLink,
362
+ title,
363
+ status: String(args.status).trim(),
364
+ date: today,
365
+ });
366
+ updatedIndexPath = indexFile;
367
+ }
368
+
369
+ if (args.json) {
370
+ const payload = {
371
+ repoRoot,
372
+ adrDir,
373
+ createdAdrPath: out,
374
+ createdAdrRelPath: toPosix(path.relative(repoRoot, out)),
375
+ title,
376
+ status: String(args.status).trim(),
377
+ template: args.template,
378
+ strategy,
379
+ date: today,
380
+ indexUpdated: Boolean(updatedIndexPath),
381
+ indexChanged,
382
+ indexPath: updatedIndexPath,
383
+ indexRelPath: updatedIndexPath ? toPosix(path.relative(repoRoot, updatedIndexPath)) : null,
384
+ };
385
+ process.stdout.write(`${JSON.stringify(payload)}\n`);
386
+ } else {
387
+ process.stdout.write(`${out}\n`);
388
+ }
389
+ }
390
+
391
+ main();