@nac3/forge-cli 0.2.0-alpha.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 (561) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +371 -0
  3. package/dist/bin/yf.d.ts +5 -0
  4. package/dist/bin/yf.d.ts.map +1 -0
  5. package/dist/bin/yf.js +86 -0
  6. package/dist/bin/yf.js.map +1 -0
  7. package/dist/chat/claude.d.ts +100 -0
  8. package/dist/chat/claude.d.ts.map +1 -0
  9. package/dist/chat/claude.js +228 -0
  10. package/dist/chat/claude.js.map +1 -0
  11. package/dist/chat/ingest_session.d.ts +97 -0
  12. package/dist/chat/ingest_session.d.ts.map +1 -0
  13. package/dist/chat/ingest_session.js +99 -0
  14. package/dist/chat/ingest_session.js.map +1 -0
  15. package/dist/chat/panel.d.ts +15 -0
  16. package/dist/chat/panel.d.ts.map +1 -0
  17. package/dist/chat/panel.js +1526 -0
  18. package/dist/chat/panel.js.map +1 -0
  19. package/dist/chat/persistence.d.ts +37 -0
  20. package/dist/chat/persistence.d.ts.map +1 -0
  21. package/dist/chat/persistence.js +91 -0
  22. package/dist/chat/persistence.js.map +1 -0
  23. package/dist/chat/server.d.ts +34 -0
  24. package/dist/chat/server.d.ts.map +1 -0
  25. package/dist/chat/server.js +1540 -0
  26. package/dist/chat/server.js.map +1 -0
  27. package/dist/chat/spec_extract.d.ts +35 -0
  28. package/dist/chat/spec_extract.d.ts.map +1 -0
  29. package/dist/chat/spec_extract.js +152 -0
  30. package/dist/chat/spec_extract.js.map +1 -0
  31. package/dist/chat/spec_plan.d.ts +65 -0
  32. package/dist/chat/spec_plan.d.ts.map +1 -0
  33. package/dist/chat/spec_plan.js +160 -0
  34. package/dist/chat/spec_plan.js.map +1 -0
  35. package/dist/chat/spec_scaffold.d.ts +95 -0
  36. package/dist/chat/spec_scaffold.d.ts.map +1 -0
  37. package/dist/chat/spec_scaffold.js +220 -0
  38. package/dist/chat/spec_scaffold.js.map +1 -0
  39. package/dist/chat/tools/git.d.ts +59 -0
  40. package/dist/chat/tools/git.d.ts.map +1 -0
  41. package/dist/chat/tools/git.js +313 -0
  42. package/dist/chat/tools/git.js.map +1 -0
  43. package/dist/chat/tools/github.d.ts +59 -0
  44. package/dist/chat/tools/github.d.ts.map +1 -0
  45. package/dist/chat/tools/github.js +310 -0
  46. package/dist/chat/tools/github.js.map +1 -0
  47. package/dist/chat/tools/lifecycle.d.ts +82 -0
  48. package/dist/chat/tools/lifecycle.d.ts.map +1 -0
  49. package/dist/chat/tools/lifecycle.js +295 -0
  50. package/dist/chat/tools/lifecycle.js.map +1 -0
  51. package/dist/chat/tools/manual.d.ts +26 -0
  52. package/dist/chat/tools/manual.d.ts.map +1 -0
  53. package/dist/chat/tools/manual.js +164 -0
  54. package/dist/chat/tools/manual.js.map +1 -0
  55. package/dist/chat/tools/reader.d.ts +80 -0
  56. package/dist/chat/tools/reader.d.ts.map +1 -0
  57. package/dist/chat/tools/reader.js +471 -0
  58. package/dist/chat/tools/reader.js.map +1 -0
  59. package/dist/chat/tools.d.ts +106 -0
  60. package/dist/chat/tools.d.ts.map +1 -0
  61. package/dist/chat/tools.js +587 -0
  62. package/dist/chat/tools.js.map +1 -0
  63. package/dist/codegen/e2e.d.ts +106 -0
  64. package/dist/codegen/e2e.d.ts.map +1 -0
  65. package/dist/codegen/e2e.js +931 -0
  66. package/dist/codegen/e2e.js.map +1 -0
  67. package/dist/codegen/v3_flow_emit.d.ts +70 -0
  68. package/dist/codegen/v3_flow_emit.d.ts.map +1 -0
  69. package/dist/codegen/v3_flow_emit.js +225 -0
  70. package/dist/codegen/v3_flow_emit.js.map +1 -0
  71. package/dist/commands/_stub.d.ts +2 -0
  72. package/dist/commands/_stub.d.ts.map +1 -0
  73. package/dist/commands/_stub.js +21 -0
  74. package/dist/commands/_stub.js.map +1 -0
  75. package/dist/commands/app.d.ts +31 -0
  76. package/dist/commands/app.d.ts.map +1 -0
  77. package/dist/commands/app.js +331 -0
  78. package/dist/commands/app.js.map +1 -0
  79. package/dist/commands/chat.d.ts +18 -0
  80. package/dist/commands/chat.d.ts.map +1 -0
  81. package/dist/commands/chat.js +76 -0
  82. package/dist/commands/chat.js.map +1 -0
  83. package/dist/commands/deploy.d.ts +21 -0
  84. package/dist/commands/deploy.d.ts.map +1 -0
  85. package/dist/commands/deploy.js +121 -0
  86. package/dist/commands/deploy.js.map +1 -0
  87. package/dist/commands/doctor.d.ts +14 -0
  88. package/dist/commands/doctor.d.ts.map +1 -0
  89. package/dist/commands/doctor.js +280 -0
  90. package/dist/commands/doctor.js.map +1 -0
  91. package/dist/commands/figma.d.ts +32 -0
  92. package/dist/commands/figma.d.ts.map +1 -0
  93. package/dist/commands/figma.js +141 -0
  94. package/dist/commands/figma.js.map +1 -0
  95. package/dist/commands/gen-flow-tests.d.ts +8 -0
  96. package/dist/commands/gen-flow-tests.d.ts.map +1 -0
  97. package/dist/commands/gen-flow-tests.js +78 -0
  98. package/dist/commands/gen-flow-tests.js.map +1 -0
  99. package/dist/commands/gen-tests.d.ts +9 -0
  100. package/dist/commands/gen-tests.d.ts.map +1 -0
  101. package/dist/commands/gen-tests.js +118 -0
  102. package/dist/commands/gen-tests.js.map +1 -0
  103. package/dist/commands/license.d.ts +14 -0
  104. package/dist/commands/license.d.ts.map +1 -0
  105. package/dist/commands/license.js +182 -0
  106. package/dist/commands/license.js.map +1 -0
  107. package/dist/commands/log.d.ts +19 -0
  108. package/dist/commands/log.d.ts.map +1 -0
  109. package/dist/commands/log.js +101 -0
  110. package/dist/commands/log.js.map +1 -0
  111. package/dist/commands/migrate.d.ts +118 -0
  112. package/dist/commands/migrate.d.ts.map +1 -0
  113. package/dist/commands/migrate.js +1410 -0
  114. package/dist/commands/migrate.js.map +1 -0
  115. package/dist/commands/mobile.d.ts +27 -0
  116. package/dist/commands/mobile.d.ts.map +1 -0
  117. package/dist/commands/mobile.js +90 -0
  118. package/dist/commands/mobile.js.map +1 -0
  119. package/dist/commands/new.d.ts +32 -0
  120. package/dist/commands/new.d.ts.map +1 -0
  121. package/dist/commands/new.js +107 -0
  122. package/dist/commands/new.js.map +1 -0
  123. package/dist/commands/pilot.d.ts +8 -0
  124. package/dist/commands/pilot.d.ts.map +1 -0
  125. package/dist/commands/pilot.js +104 -0
  126. package/dist/commands/pilot.js.map +1 -0
  127. package/dist/commands/projects.d.ts +21 -0
  128. package/dist/commands/projects.d.ts.map +1 -0
  129. package/dist/commands/projects.js +238 -0
  130. package/dist/commands/projects.js.map +1 -0
  131. package/dist/commands/publish.d.ts +35 -0
  132. package/dist/commands/publish.d.ts.map +1 -0
  133. package/dist/commands/publish.js +194 -0
  134. package/dist/commands/publish.js.map +1 -0
  135. package/dist/commands/repo.d.ts +59 -0
  136. package/dist/commands/repo.d.ts.map +1 -0
  137. package/dist/commands/repo.js +178 -0
  138. package/dist/commands/repo.js.map +1 -0
  139. package/dist/commands/review-screens.d.ts +28 -0
  140. package/dist/commands/review-screens.d.ts.map +1 -0
  141. package/dist/commands/review-screens.js +345 -0
  142. package/dist/commands/review-screens.js.map +1 -0
  143. package/dist/commands/scenarios.d.ts +23 -0
  144. package/dist/commands/scenarios.d.ts.map +1 -0
  145. package/dist/commands/scenarios.js +304 -0
  146. package/dist/commands/scenarios.js.map +1 -0
  147. package/dist/commands/ship.d.ts +18 -0
  148. package/dist/commands/ship.d.ts.map +1 -0
  149. package/dist/commands/ship.js +41 -0
  150. package/dist/commands/ship.js.map +1 -0
  151. package/dist/commands/test.d.ts +29 -0
  152. package/dist/commands/test.d.ts.map +1 -0
  153. package/dist/commands/test.js +62 -0
  154. package/dist/commands/test.js.map +1 -0
  155. package/dist/commands/tunnel.d.ts +22 -0
  156. package/dist/commands/tunnel.d.ts.map +1 -0
  157. package/dist/commands/tunnel.js +77 -0
  158. package/dist/commands/tunnel.js.map +1 -0
  159. package/dist/commands/validate.d.ts +14 -0
  160. package/dist/commands/validate.d.ts.map +1 -0
  161. package/dist/commands/validate.js +51 -0
  162. package/dist/commands/validate.js.map +1 -0
  163. package/dist/commands/vault.d.ts +32 -0
  164. package/dist/commands/vault.d.ts.map +1 -0
  165. package/dist/commands/vault.js +489 -0
  166. package/dist/commands/vault.js.map +1 -0
  167. package/dist/commands/voice.d.ts +16 -0
  168. package/dist/commands/voice.d.ts.map +1 -0
  169. package/dist/commands/voice.js +69 -0
  170. package/dist/commands/voice.js.map +1 -0
  171. package/dist/core/cascade_router.d.ts +90 -0
  172. package/dist/core/cascade_router.d.ts.map +1 -0
  173. package/dist/core/cascade_router.js +131 -0
  174. package/dist/core/cascade_router.js.map +1 -0
  175. package/dist/core/cf_tunnel.d.ts +52 -0
  176. package/dist/core/cf_tunnel.d.ts.map +1 -0
  177. package/dist/core/cf_tunnel.js +134 -0
  178. package/dist/core/cf_tunnel.js.map +1 -0
  179. package/dist/core/gha_dispatcher.d.ts +48 -0
  180. package/dist/core/gha_dispatcher.d.ts.map +1 -0
  181. package/dist/core/gha_dispatcher.js +198 -0
  182. package/dist/core/gha_dispatcher.js.map +1 -0
  183. package/dist/core/logger.d.ts +89 -0
  184. package/dist/core/logger.d.ts.map +1 -0
  185. package/dist/core/logger.js +245 -0
  186. package/dist/core/logger.js.map +1 -0
  187. package/dist/core/mode.d.ts +26 -0
  188. package/dist/core/mode.d.ts.map +1 -0
  189. package/dist/core/mode.js +122 -0
  190. package/dist/core/mode.js.map +1 -0
  191. package/dist/core/pairing.d.ts +40 -0
  192. package/dist/core/pairing.d.ts.map +1 -0
  193. package/dist/core/pairing.js +145 -0
  194. package/dist/core/pairing.js.map +1 -0
  195. package/dist/core/pilot_setup.d.ts +29 -0
  196. package/dist/core/pilot_setup.d.ts.map +1 -0
  197. package/dist/core/pilot_setup.js +119 -0
  198. package/dist/core/pilot_setup.js.map +1 -0
  199. package/dist/core/polar.d.ts +81 -0
  200. package/dist/core/polar.d.ts.map +1 -0
  201. package/dist/core/polar.js +175 -0
  202. package/dist/core/polar.js.map +1 -0
  203. package/dist/core/project_picker.d.ts +56 -0
  204. package/dist/core/project_picker.d.ts.map +1 -0
  205. package/dist/core/project_picker.js +86 -0
  206. package/dist/core/project_picker.js.map +1 -0
  207. package/dist/core/projects.d.ts +58 -0
  208. package/dist/core/projects.d.ts.map +1 -0
  209. package/dist/core/projects.js +146 -0
  210. package/dist/core/projects.js.map +1 -0
  211. package/dist/core/projects_sync.d.ts +80 -0
  212. package/dist/core/projects_sync.d.ts.map +1 -0
  213. package/dist/core/projects_sync.js +278 -0
  214. package/dist/core/projects_sync.js.map +1 -0
  215. package/dist/core/remote_runner.d.ts +70 -0
  216. package/dist/core/remote_runner.d.ts.map +1 -0
  217. package/dist/core/remote_runner.js +133 -0
  218. package/dist/core/remote_runner.js.map +1 -0
  219. package/dist/core/repo_state.d.ts +24 -0
  220. package/dist/core/repo_state.d.ts.map +1 -0
  221. package/dist/core/repo_state.js +109 -0
  222. package/dist/core/repo_state.js.map +1 -0
  223. package/dist/core/target.d.ts +31 -0
  224. package/dist/core/target.d.ts.map +1 -0
  225. package/dist/core/target.js +121 -0
  226. package/dist/core/target.js.map +1 -0
  227. package/dist/deploy/aws.d.ts +43 -0
  228. package/dist/deploy/aws.d.ts.map +1 -0
  229. package/dist/deploy/aws.js +173 -0
  230. package/dist/deploy/aws.js.map +1 -0
  231. package/dist/figma/api.d.ts +35 -0
  232. package/dist/figma/api.d.ts.map +1 -0
  233. package/dist/figma/api.js +40 -0
  234. package/dist/figma/api.js.map +1 -0
  235. package/dist/figma/decorator.d.ts +74 -0
  236. package/dist/figma/decorator.d.ts.map +1 -0
  237. package/dist/figma/decorator.js +210 -0
  238. package/dist/figma/decorator.js.map +1 -0
  239. package/dist/figma/heuristics.d.ts +29 -0
  240. package/dist/figma/heuristics.d.ts.map +1 -0
  241. package/dist/figma/heuristics.js +110 -0
  242. package/dist/figma/heuristics.js.map +1 -0
  243. package/dist/figma/normalize.d.ts +33 -0
  244. package/dist/figma/normalize.d.ts.map +1 -0
  245. package/dist/figma/normalize.js +101 -0
  246. package/dist/figma/normalize.js.map +1 -0
  247. package/dist/figma/tokens.d.ts +23 -0
  248. package/dist/figma/tokens.d.ts.map +1 -0
  249. package/dist/figma/tokens.js +111 -0
  250. package/dist/figma/tokens.js.map +1 -0
  251. package/dist/figma/types.d.ts +118 -0
  252. package/dist/figma/types.d.ts.map +1 -0
  253. package/dist/figma/types.js +12 -0
  254. package/dist/figma/types.js.map +1 -0
  255. package/dist/i18n/index.d.ts +48 -0
  256. package/dist/i18n/index.d.ts.map +1 -0
  257. package/dist/i18n/index.js +135 -0
  258. package/dist/i18n/index.js.map +1 -0
  259. package/dist/i18n/types.d.ts +52 -0
  260. package/dist/i18n/types.d.ts.map +1 -0
  261. package/dist/i18n/types.js +85 -0
  262. package/dist/i18n/types.js.map +1 -0
  263. package/dist/index.d.ts +12 -0
  264. package/dist/index.d.ts.map +1 -0
  265. package/dist/index.js +11 -0
  266. package/dist/index.js.map +1 -0
  267. package/dist/lan/mdns_packet.d.ts +74 -0
  268. package/dist/lan/mdns_packet.d.ts.map +1 -0
  269. package/dist/lan/mdns_packet.js +247 -0
  270. package/dist/lan/mdns_packet.js.map +1 -0
  271. package/dist/lan/mdns_service.d.ts +102 -0
  272. package/dist/lan/mdns_service.d.ts.map +1 -0
  273. package/dist/lan/mdns_service.js +206 -0
  274. package/dist/lan/mdns_service.js.map +1 -0
  275. package/dist/license/activate.d.ts +33 -0
  276. package/dist/license/activate.d.ts.map +1 -0
  277. package/dist/license/activate.js +135 -0
  278. package/dist/license/activate.js.map +1 -0
  279. package/dist/license/fingerprint.d.ts +2 -0
  280. package/dist/license/fingerprint.d.ts.map +1 -0
  281. package/dist/license/fingerprint.js +29 -0
  282. package/dist/license/fingerprint.js.map +1 -0
  283. package/dist/license/hito4_client.d.ts +24 -0
  284. package/dist/license/hito4_client.d.ts.map +1 -0
  285. package/dist/license/hito4_client.js +103 -0
  286. package/dist/license/hito4_client.js.map +1 -0
  287. package/dist/license/index.d.ts +22 -0
  288. package/dist/license/index.d.ts.map +1 -0
  289. package/dist/license/index.js +125 -0
  290. package/dist/license/index.js.map +1 -0
  291. package/dist/license/types.d.ts +38 -0
  292. package/dist/license/types.d.ts.map +1 -0
  293. package/dist/license/types.js +9 -0
  294. package/dist/license/types.js.map +1 -0
  295. package/dist/migrate/ai-apply.d.ts +198 -0
  296. package/dist/migrate/ai-apply.d.ts.map +1 -0
  297. package/dist/migrate/ai-apply.js +833 -0
  298. package/dist/migrate/ai-apply.js.map +1 -0
  299. package/dist/migrate/ai-decorator.d.ts +87 -0
  300. package/dist/migrate/ai-decorator.d.ts.map +1 -0
  301. package/dist/migrate/ai-decorator.js +203 -0
  302. package/dist/migrate/ai-decorator.js.map +1 -0
  303. package/dist/migrate/apply.d.ts +28 -0
  304. package/dist/migrate/apply.d.ts.map +1 -0
  305. package/dist/migrate/apply.js +119 -0
  306. package/dist/migrate/apply.js.map +1 -0
  307. package/dist/migrate/audit.d.ts +9 -0
  308. package/dist/migrate/audit.d.ts.map +1 -0
  309. package/dist/migrate/audit.js +197 -0
  310. package/dist/migrate/audit.js.map +1 -0
  311. package/dist/migrate/diff.d.ts +28 -0
  312. package/dist/migrate/diff.d.ts.map +1 -0
  313. package/dist/migrate/diff.js +154 -0
  314. package/dist/migrate/diff.js.map +1 -0
  315. package/dist/migrate/html-orchestrator.d.ts +81 -0
  316. package/dist/migrate/html-orchestrator.d.ts.map +1 -0
  317. package/dist/migrate/html-orchestrator.js +233 -0
  318. package/dist/migrate/html-orchestrator.js.map +1 -0
  319. package/dist/migrate/html-walker.d.ts +93 -0
  320. package/dist/migrate/html-walker.d.ts.map +1 -0
  321. package/dist/migrate/html-walker.js +288 -0
  322. package/dist/migrate/html-walker.js.map +1 -0
  323. package/dist/migrate/js-template-walker.d.ts +118 -0
  324. package/dist/migrate/js-template-walker.d.ts.map +1 -0
  325. package/dist/migrate/js-template-walker.js +644 -0
  326. package/dist/migrate/js-template-walker.js.map +1 -0
  327. package/dist/migrate/manifest-validator.d.ts +30 -0
  328. package/dist/migrate/manifest-validator.d.ts.map +1 -0
  329. package/dist/migrate/manifest-validator.js +261 -0
  330. package/dist/migrate/manifest-validator.js.map +1 -0
  331. package/dist/migrate/overrides.d.ts +58 -0
  332. package/dist/migrate/overrides.d.ts.map +1 -0
  333. package/dist/migrate/overrides.js +193 -0
  334. package/dist/migrate/overrides.js.map +1 -0
  335. package/dist/migrate/plugin-scope.d.ts +42 -0
  336. package/dist/migrate/plugin-scope.d.ts.map +1 -0
  337. package/dist/migrate/plugin-scope.js +94 -0
  338. package/dist/migrate/plugin-scope.js.map +1 -0
  339. package/dist/migrate/types.d.ts +45 -0
  340. package/dist/migrate/types.d.ts.map +1 -0
  341. package/dist/migrate/types.js +9 -0
  342. package/dist/migrate/types.js.map +1 -0
  343. package/dist/migrate/verb-inference.d.ts +37 -0
  344. package/dist/migrate/verb-inference.d.ts.map +1 -0
  345. package/dist/migrate/verb-inference.js +274 -0
  346. package/dist/migrate/verb-inference.js.map +1 -0
  347. package/dist/nac3/attrs.d.ts +87 -0
  348. package/dist/nac3/attrs.d.ts.map +1 -0
  349. package/dist/nac3/attrs.js +134 -0
  350. package/dist/nac3/attrs.js.map +1 -0
  351. package/dist/nac3/scenario_dsl.d.ts +71 -0
  352. package/dist/nac3/scenario_dsl.d.ts.map +1 -0
  353. package/dist/nac3/scenario_dsl.js +191 -0
  354. package/dist/nac3/scenario_dsl.js.map +1 -0
  355. package/dist/nac3/tokens.d.ts +126 -0
  356. package/dist/nac3/tokens.d.ts.map +1 -0
  357. package/dist/nac3/tokens.js +138 -0
  358. package/dist/nac3/tokens.js.map +1 -0
  359. package/dist/reader/parsers/csv.d.ts +42 -0
  360. package/dist/reader/parsers/csv.d.ts.map +1 -0
  361. package/dist/reader/parsers/csv.js +221 -0
  362. package/dist/reader/parsers/csv.js.map +1 -0
  363. package/dist/reader/parsers/docx.d.ts +31 -0
  364. package/dist/reader/parsers/docx.d.ts.map +1 -0
  365. package/dist/reader/parsers/docx.js +51 -0
  366. package/dist/reader/parsers/docx.js.map +1 -0
  367. package/dist/reader/parsers/epub.d.ts +39 -0
  368. package/dist/reader/parsers/epub.d.ts.map +1 -0
  369. package/dist/reader/parsers/epub.js +265 -0
  370. package/dist/reader/parsers/epub.js.map +1 -0
  371. package/dist/reader/parsers/html.d.ts +40 -0
  372. package/dist/reader/parsers/html.d.ts.map +1 -0
  373. package/dist/reader/parsers/html.js +386 -0
  374. package/dist/reader/parsers/html.js.map +1 -0
  375. package/dist/reader/parsers/md.d.ts +30 -0
  376. package/dist/reader/parsers/md.d.ts.map +1 -0
  377. package/dist/reader/parsers/md.js +199 -0
  378. package/dist/reader/parsers/md.js.map +1 -0
  379. package/dist/reader/parsers/pdf.d.ts +39 -0
  380. package/dist/reader/parsers/pdf.d.ts.map +1 -0
  381. package/dist/reader/parsers/pdf.js +220 -0
  382. package/dist/reader/parsers/pdf.js.map +1 -0
  383. package/dist/reader/parsers/rtf.d.ts +37 -0
  384. package/dist/reader/parsers/rtf.d.ts.map +1 -0
  385. package/dist/reader/parsers/rtf.js +347 -0
  386. package/dist/reader/parsers/rtf.js.map +1 -0
  387. package/dist/reader/parsers/source.d.ts +32 -0
  388. package/dist/reader/parsers/source.d.ts.map +1 -0
  389. package/dist/reader/parsers/source.js +122 -0
  390. package/dist/reader/parsers/source.js.map +1 -0
  391. package/dist/reader/parsers/txt.d.ts +25 -0
  392. package/dist/reader/parsers/txt.d.ts.map +1 -0
  393. package/dist/reader/parsers/txt.js +56 -0
  394. package/dist/reader/parsers/txt.js.map +1 -0
  395. package/dist/reader/parsers/xlsx.d.ts +33 -0
  396. package/dist/reader/parsers/xlsx.d.ts.map +1 -0
  397. package/dist/reader/parsers/xlsx.js +143 -0
  398. package/dist/reader/parsers/xlsx.js.map +1 -0
  399. package/dist/reader/registry.d.ts +39 -0
  400. package/dist/reader/registry.d.ts.map +1 -0
  401. package/dist/reader/registry.js +172 -0
  402. package/dist/reader/registry.js.map +1 -0
  403. package/dist/reader/search.d.ts +27 -0
  404. package/dist/reader/search.d.ts.map +1 -0
  405. package/dist/reader/search.js +77 -0
  406. package/dist/reader/search.js.map +1 -0
  407. package/dist/reader/state.d.ts +56 -0
  408. package/dist/reader/state.d.ts.map +1 -0
  409. package/dist/reader/state.js +179 -0
  410. package/dist/reader/state.js.map +1 -0
  411. package/dist/reader/types.d.ts +119 -0
  412. package/dist/reader/types.d.ts.map +1 -0
  413. package/dist/reader/types.js +23 -0
  414. package/dist/reader/types.js.map +1 -0
  415. package/dist/ship/run.d.ts +26 -0
  416. package/dist/ship/run.d.ts.map +1 -0
  417. package/dist/ship/run.js +123 -0
  418. package/dist/ship/run.js.map +1 -0
  419. package/dist/template/index.d.ts +50 -0
  420. package/dist/template/index.d.ts.map +1 -0
  421. package/dist/template/index.js +140 -0
  422. package/dist/template/index.js.map +1 -0
  423. package/dist/ui/colors.d.ts +13 -0
  424. package/dist/ui/colors.d.ts.map +1 -0
  425. package/dist/ui/colors.js +26 -0
  426. package/dist/ui/colors.js.map +1 -0
  427. package/dist/validate/index.d.ts +19 -0
  428. package/dist/validate/index.d.ts.map +1 -0
  429. package/dist/validate/index.js +181 -0
  430. package/dist/validate/index.js.map +1 -0
  431. package/dist/vault/catalog.d.ts +55 -0
  432. package/dist/vault/catalog.d.ts.map +1 -0
  433. package/dist/vault/catalog.js +424 -0
  434. package/dist/vault/catalog.js.map +1 -0
  435. package/dist/vault/crypto.d.ts +82 -0
  436. package/dist/vault/crypto.d.ts.map +1 -0
  437. package/dist/vault/crypto.js +173 -0
  438. package/dist/vault/crypto.js.map +1 -0
  439. package/dist/vault/git_askpass.d.ts +26 -0
  440. package/dist/vault/git_askpass.d.ts.map +1 -0
  441. package/dist/vault/git_askpass.js +104 -0
  442. package/dist/vault/git_askpass.js.map +1 -0
  443. package/dist/vault/migrator.d.ts +57 -0
  444. package/dist/vault/migrator.d.ts.map +1 -0
  445. package/dist/vault/migrator.js +204 -0
  446. package/dist/vault/migrator.js.map +1 -0
  447. package/dist/vault/redactor.d.ts +73 -0
  448. package/dist/vault/redactor.d.ts.map +1 -0
  449. package/dist/vault/redactor.js +182 -0
  450. package/dist/vault/redactor.js.map +1 -0
  451. package/dist/vault/store.d.ts +132 -0
  452. package/dist/vault/store.d.ts.map +1 -0
  453. package/dist/vault/store.js +335 -0
  454. package/dist/vault/store.js.map +1 -0
  455. package/dist/version.d.ts +8 -0
  456. package/dist/version.d.ts.map +1 -0
  457. package/dist/version.js +8 -0
  458. package/dist/version.js.map +1 -0
  459. package/dist/voice/chunker.d.ts +43 -0
  460. package/dist/voice/chunker.d.ts.map +1 -0
  461. package/dist/voice/chunker.js +133 -0
  462. package/dist/voice/chunker.js.map +1 -0
  463. package/dist/voice/config.d.ts +14 -0
  464. package/dist/voice/config.d.ts.map +1 -0
  465. package/dist/voice/config.js +51 -0
  466. package/dist/voice/config.js.map +1 -0
  467. package/dist/voice/intents.d.ts +71 -0
  468. package/dist/voice/intents.d.ts.map +1 -0
  469. package/dist/voice/intents.js +0 -0
  470. package/dist/voice/intents.js.map +1 -0
  471. package/dist/voice/providers/elevenlabs.d.ts +53 -0
  472. package/dist/voice/providers/elevenlabs.d.ts.map +1 -0
  473. package/dist/voice/providers/elevenlabs.js +159 -0
  474. package/dist/voice/providers/elevenlabs.js.map +1 -0
  475. package/dist/voice/providers/google.d.ts +56 -0
  476. package/dist/voice/providers/google.d.ts.map +1 -0
  477. package/dist/voice/providers/google.js +253 -0
  478. package/dist/voice/providers/google.js.map +1 -0
  479. package/dist/voice/providers/whisper.d.ts +44 -0
  480. package/dist/voice/providers/whisper.d.ts.map +1 -0
  481. package/dist/voice/providers/whisper.js +179 -0
  482. package/dist/voice/providers/whisper.js.map +1 -0
  483. package/dist/voice/registry.d.ts +35 -0
  484. package/dist/voice/registry.d.ts.map +1 -0
  485. package/dist/voice/registry.js +48 -0
  486. package/dist/voice/registry.js.map +1 -0
  487. package/dist/voice/router.d.ts +62 -0
  488. package/dist/voice/router.d.ts.map +1 -0
  489. package/dist/voice/router.js +175 -0
  490. package/dist/voice/router.js.map +1 -0
  491. package/dist/voice/types.d.ts +116 -0
  492. package/dist/voice/types.d.ts.map +1 -0
  493. package/dist/voice/types.js +22 -0
  494. package/dist/voice/types.js.map +1 -0
  495. package/dist/voice/voiceprint/enrollment.d.ts +36 -0
  496. package/dist/voice/voiceprint/enrollment.d.ts.map +1 -0
  497. package/dist/voice/voiceprint/enrollment.js +71 -0
  498. package/dist/voice/voiceprint/enrollment.js.map +1 -0
  499. package/dist/voice/voiceprint/identify.d.ts +16 -0
  500. package/dist/voice/voiceprint/identify.d.ts.map +1 -0
  501. package/dist/voice/voiceprint/identify.js +20 -0
  502. package/dist/voice/voiceprint/identify.js.map +1 -0
  503. package/dist/voice/voiceprint/liveness.d.ts +90 -0
  504. package/dist/voice/voiceprint/liveness.d.ts.map +1 -0
  505. package/dist/voice/voiceprint/liveness.js +251 -0
  506. package/dist/voice/voiceprint/liveness.js.map +1 -0
  507. package/dist/voice/voiceprint/match.d.ts +54 -0
  508. package/dist/voice/voiceprint/match.d.ts.map +1 -0
  509. package/dist/voice/voiceprint/match.js +88 -0
  510. package/dist/voice/voiceprint/match.js.map +1 -0
  511. package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts +44 -0
  512. package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts.map +1 -0
  513. package/dist/voice/voiceprint/providers/local-mfcc-stub.js +92 -0
  514. package/dist/voice/voiceprint/providers/local-mfcc-stub.js.map +1 -0
  515. package/dist/voice/voiceprint/store.d.ts +60 -0
  516. package/dist/voice/voiceprint/store.d.ts.map +1 -0
  517. package/dist/voice/voiceprint/store.js +155 -0
  518. package/dist/voice/voiceprint/store.js.map +1 -0
  519. package/dist/voice/voiceprint/trust.d.ts +90 -0
  520. package/dist/voice/voiceprint/trust.d.ts.map +1 -0
  521. package/dist/voice/voiceprint/trust.js +150 -0
  522. package/dist/voice/voiceprint/trust.js.map +1 -0
  523. package/dist/voice/voiceprint/types.d.ts +100 -0
  524. package/dist/voice/voiceprint/types.d.ts.map +1 -0
  525. package/dist/voice/voiceprint/types.js +23 -0
  526. package/dist/voice/voiceprint/types.js.map +1 -0
  527. package/dist/voice/wake.d.ts +64 -0
  528. package/dist/voice/wake.d.ts.map +1 -0
  529. package/dist/voice/wake.js +143 -0
  530. package/dist/voice/wake.js.map +1 -0
  531. package/docs/manuals/manual.ar.html +91 -0
  532. package/docs/manuals/manual.de.html +100 -0
  533. package/docs/manuals/manual.en.html +118 -0
  534. package/docs/manuals/manual.es.html +120 -0
  535. package/docs/manuals/manual.fr.html +102 -0
  536. package/docs/manuals/manual.hi.html +93 -0
  537. package/docs/manuals/manual.it.html +93 -0
  538. package/docs/manuals/manual.ja.html +97 -0
  539. package/docs/manuals/manual.pt.html +103 -0
  540. package/docs/manuals/manual.zh.html +89 -0
  541. package/package.json +94 -0
  542. package/src/i18n/catalogs/ar.json +86 -0
  543. package/src/i18n/catalogs/de.json +86 -0
  544. package/src/i18n/catalogs/en.json +86 -0
  545. package/src/i18n/catalogs/es.json +86 -0
  546. package/src/i18n/catalogs/fr.json +86 -0
  547. package/src/i18n/catalogs/hi.json +86 -0
  548. package/src/i18n/catalogs/it.json +86 -0
  549. package/src/i18n/catalogs/ja.json +86 -0
  550. package/src/i18n/catalogs/pt.json +86 -0
  551. package/src/i18n/catalogs/zh.json +86 -0
  552. package/templates/react-app/README.md +43 -0
  553. package/templates/react-app/index.html +12 -0
  554. package/templates/react-app/package.json +35 -0
  555. package/templates/react-app/src/App.tsx +106 -0
  556. package/templates/react-app/src/main.tsx +21 -0
  557. package/templates/react-app/src/nac/manifest.ts +46 -0
  558. package/templates/react-app/src/styles.css +68 -0
  559. package/templates/react-app/tsconfig.json +19 -0
  560. package/templates/react-app/vite.config.ts +12 -0
  561. package/templates/react-app/yujin.forge.json +15 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Document reader subsystem -- type surface.
3
+ *
4
+ * The reader takes a document (txt / md / pdf / docx / html / rtf
5
+ * / epub / csv / xlsx / source code) and exposes a voice-driven
6
+ * interface to navigate, read aloud, search, recap, and bookmark.
7
+ *
8
+ * Pipeline:
9
+ * 1. detect format -> pick parser.
10
+ * 2. parser produces a NormalisedDocument (sections + paragraphs
11
+ * + non-text blocks like tables / code / images).
12
+ * 3. ReaderSession holds playback state (position, paused or
13
+ * reading, current bookmark) + a rolling 5-minute buffer of
14
+ * what was just read for recap.
15
+ * 4. Chat tools + voice intent routing drive the session.
16
+ *
17
+ * Pure types this slice. State machine + registry + parsers
18
+ * land in the following slices.
19
+ *
20
+ * ASCII-only.
21
+ */
22
+ /** Document format identifiers. Open string union so future
23
+ * formats slot in without breaking existing sessions. */
24
+ export type DocFormat = 'txt' | 'md' | 'pdf' | 'docx' | 'html' | 'rtf' | 'epub' | 'csv' | 'xlsx' | 'source' | string;
25
+ /** A leaf chunk of text the reader plays one at a time. */
26
+ export interface TextBlock {
27
+ kind: 'paragraph' | 'heading' | 'list_item' | 'quote' | 'caption';
28
+ /** 1-based heading level when kind=heading (otherwise 0). */
29
+ level: number;
30
+ /** Plain text contents. */
31
+ text: string;
32
+ /** Stable id within the document (assigned by the parser).
33
+ * Used for seek + bookmarks. */
34
+ id: string;
35
+ }
36
+ /** A non-text block the reader announces but does not read by
37
+ * default. The user can ask for it explicitly. */
38
+ export interface NonTextBlock {
39
+ kind: 'table' | 'code' | 'image' | 'figure' | 'formula';
40
+ /** Stable id. */
41
+ id: string;
42
+ /** A human-readable summary the reader speaks when it lands on
43
+ * the block, e.g. "tabla con 5 columnas y 12 filas". */
44
+ summary: string;
45
+ /** When `kind`='code', the language hint when known. */
46
+ language?: string;
47
+ /** Lazy-loaded content the user can request. The parser can
48
+ * pre-compute or leave it null and resolve on demand. */
49
+ content?: string;
50
+ }
51
+ export type Block = TextBlock | NonTextBlock;
52
+ /** Section is a heading + the list of blocks under it. */
53
+ export interface Section {
54
+ /** Stable id. */
55
+ id: string;
56
+ /** Heading text. Empty string when the section has no heading
57
+ * (e.g. the top-of-document section). */
58
+ heading: string;
59
+ /** 1-based level (1 = h1). 0 when no heading. */
60
+ level: number;
61
+ /** All blocks belonging to this section, in document order. */
62
+ blocks: Block[];
63
+ }
64
+ /** The normalised document a parser returns. */
65
+ export interface NormalisedDocument {
66
+ /** Path-friendly identifier for the document (slugified
67
+ * filename). */
68
+ id: string;
69
+ /** Original filename + format. */
70
+ filename: string;
71
+ format: DocFormat;
72
+ /** Total byte count of the source. Informational. */
73
+ bytes: number;
74
+ /** Document title. From the format's metadata or the first
75
+ * heading. */
76
+ title: string;
77
+ /** Author / creator when known. */
78
+ author?: string;
79
+ /** Language hint (BCP-47). */
80
+ language?: string;
81
+ /** Tree of sections in document order. */
82
+ sections: Section[];
83
+ }
84
+ /** A single reader session -- one document, one playback state. */
85
+ export interface ReaderSession {
86
+ doc: NormalisedDocument;
87
+ /** Current block id under the cursor. The reader plays this
88
+ * block next when resumed. */
89
+ cursor_block_id: string;
90
+ /** State of playback. */
91
+ state: 'idle' | 'reading' | 'paused' | 'searching';
92
+ /** User-set bookmarks keyed by name. */
93
+ bookmarks: Record<string, string>;
94
+ /** Last N text blocks already spoken, kept in order. Used by
95
+ * the recap tool to re-narrate the recent context. The limit
96
+ * is enforced in the playback module. */
97
+ recent_spoken: string[];
98
+ /** Playback speed multiplier. 1.0 = normal. */
99
+ speed: number;
100
+ }
101
+ /** Result of seeking. */
102
+ export interface SeekResult {
103
+ ok: boolean;
104
+ /** New cursor block id when ok, else null. */
105
+ new_cursor: string | null;
106
+ /** Reason when !ok (voice-readable). */
107
+ reason?: string;
108
+ }
109
+ /** Search hit. */
110
+ export interface SearchHit {
111
+ block_id: string;
112
+ section_id: string;
113
+ section_heading: string;
114
+ /** Snippet of the block centered on the match. */
115
+ snippet: string;
116
+ /** Character offset of the match within the block. */
117
+ offset: number;
118
+ }
119
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reader/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;0DAC0D;AAC1D,MAAM,MAAM,SAAS,GACjB,KAAK,GACL,IAAI,GACJ,KAAK,GACL,MAAM,GACN,MAAM,GACN,KAAK,GACL,MAAM,GACN,KAAK,GACL,MAAM,GACN,QAAQ,GACR,MAAM,CAAC;AAEX,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IAClE,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb;qCACiC;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;mDACmD;AACnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxD,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX;6DACyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;8DAC0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;AAE7C,0DAA0D;AAC1D,MAAM,WAAW,OAAO;IACtB,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX;8CAC0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC;qBACiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd;mBACe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,kBAAkB,CAAC;IACxB;mCAC+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;IACnD,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;8CAE0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,8CAA8C;IAC9C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kBAAkB;AAClB,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Document reader subsystem -- type surface.
3
+ *
4
+ * The reader takes a document (txt / md / pdf / docx / html / rtf
5
+ * / epub / csv / xlsx / source code) and exposes a voice-driven
6
+ * interface to navigate, read aloud, search, recap, and bookmark.
7
+ *
8
+ * Pipeline:
9
+ * 1. detect format -> pick parser.
10
+ * 2. parser produces a NormalisedDocument (sections + paragraphs
11
+ * + non-text blocks like tables / code / images).
12
+ * 3. ReaderSession holds playback state (position, paused or
13
+ * reading, current bookmark) + a rolling 5-minute buffer of
14
+ * what was just read for recap.
15
+ * 4. Chat tools + voice intent routing drive the session.
16
+ *
17
+ * Pure types this slice. State machine + registry + parsers
18
+ * land in the following slices.
19
+ *
20
+ * ASCII-only.
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reader/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -0,0 +1,26 @@
1
+ export type StepName = 'validate' | 'license' | 'test' | 'build';
2
+ export interface ShipStep {
3
+ name: StepName;
4
+ ok: boolean;
5
+ skipped: boolean;
6
+ detail: string;
7
+ /** ms duration of this step. */
8
+ ms: number;
9
+ }
10
+ export interface ShipResult {
11
+ steps: ShipStep[];
12
+ ok: boolean;
13
+ }
14
+ export interface ShipOptions {
15
+ projectRoot: string;
16
+ skipTests: boolean;
17
+ /** Test injection point. Defaults to spawn-based runner. */
18
+ runProcess?: (cmd: string, args: string[], cwd: string) => Promise<ProcessResult>;
19
+ }
20
+ export interface ProcessResult {
21
+ code: number;
22
+ stdoutTail: string;
23
+ stderrTail: string;
24
+ }
25
+ export declare function runShip(opts: ShipOptions): Promise<ShipResult>;
26
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/ship/run.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAK,QAAQ,CAAC;IAClB,EAAE,EAAO,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAG,MAAM,CAAC;IAChB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,EAAE,EAAK,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAI,OAAO,CAAC;IACrB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA8DpE"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Yujin Forge -- ship gate runner.
3
+ *
4
+ * Coordinates the pre-deploy gate:
5
+ * 1. validate (--strict) -- structural sanity
6
+ * 2. license check -- paid OR trial-active
7
+ * 3. npm test -- runs `npm test --silent` in the project
8
+ * 4. npm run build -- vite/tsc/etc as the project defines
9
+ *
10
+ * Each step yields a ShipStep result. The pipeline stops on the
11
+ * first failure unless --skip-tests is set (in which case step 3
12
+ * is skipped but still recorded). The caller (the ship command)
13
+ * renders results + sets process.exitCode.
14
+ *
15
+ * Process execution is delegated to a runner injected as a
16
+ * parameter so tests can stub child_process without spawning
17
+ * real processes.
18
+ */
19
+ import { spawn } from 'node:child_process';
20
+ import { validateProject } from '../validate/index.js';
21
+ import { loadLicense, isAuthorized, isPaidSeat } from '../license/index.js';
22
+ export async function runShip(opts) {
23
+ const steps = [];
24
+ const exec = opts.runProcess ?? defaultRunProcess;
25
+ // 1. validate
26
+ const t1 = Date.now();
27
+ const v = await validateProject({ projectRoot: opts.projectRoot, strict: true });
28
+ steps.push({
29
+ name: 'validate',
30
+ ok: v.ok,
31
+ skipped: false,
32
+ detail: summariseValidate(v),
33
+ ms: Date.now() - t1,
34
+ });
35
+ if (!v.ok)
36
+ return { steps, ok: false };
37
+ // 2. license
38
+ const t2 = Date.now();
39
+ const lic = await loadLicense();
40
+ const licOk = isAuthorized(lic);
41
+ steps.push({
42
+ name: 'license',
43
+ ok: licOk,
44
+ skipped: false,
45
+ detail: summariseLicense(lic),
46
+ ms: Date.now() - t2,
47
+ });
48
+ if (!licOk)
49
+ return { steps, ok: false };
50
+ // 3. test
51
+ if (opts.skipTests) {
52
+ steps.push({
53
+ name: 'test', ok: true, skipped: true,
54
+ detail: 'skipped (--skip-tests)',
55
+ ms: 0,
56
+ });
57
+ }
58
+ else {
59
+ const t3 = Date.now();
60
+ const r = await exec('npm', ['test', '--silent'], opts.projectRoot);
61
+ steps.push({
62
+ name: 'test',
63
+ ok: r.code === 0,
64
+ skipped: false,
65
+ detail: r.code === 0 ? 'passed' : 'failed: ' + tailLine(r.stderrTail || r.stdoutTail),
66
+ ms: Date.now() - t3,
67
+ });
68
+ if (r.code !== 0)
69
+ return { steps, ok: false };
70
+ }
71
+ // 4. build
72
+ const t4 = Date.now();
73
+ const b = await exec('npm', ['run', 'build', '--silent'], opts.projectRoot);
74
+ steps.push({
75
+ name: 'build',
76
+ ok: b.code === 0,
77
+ skipped: false,
78
+ detail: b.code === 0 ? 'passed' : 'failed: ' + tailLine(b.stderrTail || b.stdoutTail),
79
+ ms: Date.now() - t4,
80
+ });
81
+ if (b.code !== 0)
82
+ return { steps, ok: false };
83
+ return { steps, ok: true };
84
+ }
85
+ function summariseValidate(v) {
86
+ if (v.ok && v.findings.length === 0)
87
+ return 'clean';
88
+ const errs = v.findings.filter((f) => f.severity === 'error').length;
89
+ const warns = v.findings.filter((f) => f.severity === 'warn').length;
90
+ return errs + ' error(s), ' + warns + ' warning(s)';
91
+ }
92
+ function summariseLicense(lic) {
93
+ if (isPaidSeat(lic))
94
+ return 'paid seat (' + (lic.seat?.email ?? 'machine-bound') + ')';
95
+ if (lic.status === 'trial' && lic.trial) {
96
+ return 'trial -- ' + lic.trial.daysLeft + ' day(s) left';
97
+ }
98
+ return 'no active license or trial';
99
+ }
100
+ function tailLine(s) {
101
+ const lines = s.trim().split(/\r?\n/).filter((l) => l.length > 0);
102
+ return lines[lines.length - 1] ?? '';
103
+ }
104
+ async function defaultRunProcess(cmd, args, cwd) {
105
+ return new Promise((resolve) => {
106
+ let stdoutBuf = '';
107
+ let stderrBuf = '';
108
+ // shell:true on Windows so 'npm' resolves to npm.cmd. Safe
109
+ // because cmd + args are not user-supplied here.
110
+ const child = spawn(cmd, args, { cwd, shell: process.platform === 'win32' });
111
+ child.stdout?.on('data', (chunk) => { stdoutBuf += String(chunk); if (stdoutBuf.length > 8192)
112
+ stdoutBuf = stdoutBuf.slice(-8192); });
113
+ child.stderr?.on('data', (chunk) => { stderrBuf += String(chunk); if (stderrBuf.length > 8192)
114
+ stderrBuf = stderrBuf.slice(-8192); });
115
+ child.on('close', (code) => resolve({
116
+ code: code ?? 1,
117
+ stdoutTail: stdoutBuf,
118
+ stderrTail: stderrBuf,
119
+ }));
120
+ child.on('error', () => resolve({ code: 1, stdoutTail: '', stderrTail: 'failed to spawn ' + cmd }));
121
+ });
122
+ }
123
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/ship/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export interface TemplateContext {
2
+ projectSlug: string;
3
+ projectName: string;
4
+ licenseRef: string;
5
+ }
6
+ export interface ScaffoldOptions {
7
+ /** Template id under templates/ (e.g. 'react-app'). */
8
+ templateName: string;
9
+ /** Absolute path of the target directory. */
10
+ targetDir: string;
11
+ /** Substitution values. */
12
+ ctx: TemplateContext;
13
+ /**
14
+ * If true, refuse to write into a non-empty target dir.
15
+ * If false, overwrite existing files (no merge, no rename).
16
+ */
17
+ refuseIfNonEmpty: boolean;
18
+ }
19
+ export interface ScaffoldResult {
20
+ files: string[];
21
+ }
22
+ /**
23
+ * Resolve the absolute path of the bundled templates directory.
24
+ *
25
+ * Works in three runtimes:
26
+ * - tsx dev: src/commands/new.ts -> ../../templates/
27
+ * - tsc out: dist/commands/new.js -> ../../templates/
28
+ * - npm pkg: node_modules/.../dist/commands/new.js -> same
29
+ *
30
+ * Exported so tests can override via templatesDirForTest() when
31
+ * exercising the scaffolder against a controlled fixture.
32
+ */
33
+ export declare function defaultTemplatesDir(): string;
34
+ export declare function scaffold(opts: ScaffoldOptions, templatesDir?: string): Promise<ScaffoldResult>;
35
+ export declare function applyTokens(input: string, ctx: TemplateContext): string;
36
+ /**
37
+ * Title-case a slug for the human-readable project name.
38
+ * "my-todos" -> "My Todos"
39
+ * "yujin-koe" -> "Yujin Koe"
40
+ */
41
+ export declare function titleCaseFromSlug(slug: string): string;
42
+ /**
43
+ * Validate a project slug. NAC + npm conventions:
44
+ * - lowercase
45
+ * - alphanumeric + dash
46
+ * - 3..40 chars
47
+ * - must start with a letter
48
+ */
49
+ export declare function isValidSlug(slug: string): boolean;
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,GAAG,EAAE,eAAe,CAAC;IACrB;;;OAGG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAYpG;AAoED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAKvE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Yujin Forge -- template engine.
3
+ *
4
+ * Reads a starter template from the package's templates/<name>/
5
+ * directory, applies token substitution, and writes the materialised
6
+ * project to a target directory.
7
+ *
8
+ * Tokens (case-sensitive, matched literally):
9
+ *
10
+ * %%PROJECT_SLUG%% slug passed to `yf new <slug>`
11
+ * %%PROJECT_NAME%% human-friendly name (default = title-cased slug)
12
+ * %%LICENSE_REF%% license reference (paid seat token or 'trial')
13
+ *
14
+ * Binary files (images, archives, fonts) are passed through
15
+ * unchanged. The text-vs-binary detection is extension-based --
16
+ * cheap, deterministic, and avoids partial reads that would break
17
+ * UTF-8 substitution.
18
+ */
19
+ import { promises as fs } from 'node:fs';
20
+ import path from 'node:path';
21
+ import { fileURLToPath } from 'node:url';
22
+ /** Files we touch as UTF-8 text + substitute tokens in. */
23
+ const TEXT_EXTENSIONS = new Set([
24
+ '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
25
+ '.json', '.md', '.css', '.html', '.txt',
26
+ '.yml', '.yaml', '.toml', '.lock',
27
+ '.gitignore', '.npmrc', '.env', '.env.example',
28
+ ]);
29
+ /**
30
+ * Resolve the absolute path of the bundled templates directory.
31
+ *
32
+ * Works in three runtimes:
33
+ * - tsx dev: src/commands/new.ts -> ../../templates/
34
+ * - tsc out: dist/commands/new.js -> ../../templates/
35
+ * - npm pkg: node_modules/.../dist/commands/new.js -> same
36
+ *
37
+ * Exported so tests can override via templatesDirForTest() when
38
+ * exercising the scaffolder against a controlled fixture.
39
+ */
40
+ export function defaultTemplatesDir() {
41
+ const here = path.dirname(fileURLToPath(import.meta.url));
42
+ return path.resolve(here, '..', '..', 'templates');
43
+ }
44
+ export async function scaffold(opts, templatesDir) {
45
+ const root = templatesDir ?? defaultTemplatesDir();
46
+ const src = path.join(root, opts.templateName);
47
+ await assertTemplateExists(src, opts.templateName);
48
+ await assertTargetWritable(opts.targetDir, opts.refuseIfNonEmpty);
49
+ await fs.mkdir(opts.targetDir, { recursive: true });
50
+ const written = [];
51
+ await walkAndCopy(src, opts.targetDir, opts.ctx, written);
52
+ written.sort();
53
+ return { files: written };
54
+ }
55
+ async function assertTemplateExists(dir, name) {
56
+ try {
57
+ const stat = await fs.stat(dir);
58
+ if (!stat.isDirectory()) {
59
+ throw new Error(`template '${name}' is not a directory at ${dir}`);
60
+ }
61
+ }
62
+ catch (err) {
63
+ if (err.code === 'ENOENT') {
64
+ throw new Error(`template '${name}' not found (looked in ${dir})`);
65
+ }
66
+ throw err;
67
+ }
68
+ }
69
+ async function assertTargetWritable(dir, refuseIfNonEmpty) {
70
+ let entries;
71
+ try {
72
+ entries = await fs.readdir(dir);
73
+ }
74
+ catch (err) {
75
+ if (err.code === 'ENOENT')
76
+ return;
77
+ throw err;
78
+ }
79
+ if (refuseIfNonEmpty && entries.length > 0) {
80
+ throw new Error(`target directory ${dir} is not empty (use --force to overwrite, or pick a different --dir)`);
81
+ }
82
+ }
83
+ async function walkAndCopy(srcDir, destDir, ctx, written) {
84
+ const entries = await fs.readdir(srcDir, { withFileTypes: true });
85
+ for (const entry of entries) {
86
+ const srcPath = path.join(srcDir, entry.name);
87
+ const destPath = path.join(destDir, entry.name);
88
+ if (entry.isDirectory()) {
89
+ await fs.mkdir(destPath, { recursive: true });
90
+ await walkAndCopy(srcPath, destPath, ctx, written);
91
+ continue;
92
+ }
93
+ if (entry.isFile()) {
94
+ const ext = path.extname(entry.name);
95
+ const isText = TEXT_EXTENSIONS.has(ext) || isDotConfig(entry.name);
96
+ if (isText) {
97
+ const raw = await fs.readFile(srcPath, 'utf-8');
98
+ await fs.writeFile(destPath, applyTokens(raw, ctx), 'utf-8');
99
+ }
100
+ else {
101
+ await fs.copyFile(srcPath, destPath);
102
+ }
103
+ written.push(destPath);
104
+ }
105
+ }
106
+ }
107
+ function isDotConfig(name) {
108
+ // Cover dotfiles without a recognised extension (.gitignore,
109
+ // .npmrc, .env, .env.example etc).
110
+ return name.startsWith('.') && !name.includes('.', 1);
111
+ }
112
+ export function applyTokens(input, ctx) {
113
+ return input
114
+ .replace(/%%PROJECT_SLUG%%/g, ctx.projectSlug)
115
+ .replace(/%%PROJECT_NAME%%/g, ctx.projectName)
116
+ .replace(/%%LICENSE_REF%%/g, ctx.licenseRef);
117
+ }
118
+ /**
119
+ * Title-case a slug for the human-readable project name.
120
+ * "my-todos" -> "My Todos"
121
+ * "yujin-koe" -> "Yujin Koe"
122
+ */
123
+ export function titleCaseFromSlug(slug) {
124
+ return slug
125
+ .split(/[-_]+/)
126
+ .filter((part) => part.length > 0)
127
+ .map((part) => part[0].toUpperCase() + part.slice(1).toLowerCase())
128
+ .join(' ');
129
+ }
130
+ /**
131
+ * Validate a project slug. NAC + npm conventions:
132
+ * - lowercase
133
+ * - alphanumeric + dash
134
+ * - 3..40 chars
135
+ * - must start with a letter
136
+ */
137
+ export function isValidSlug(slug) {
138
+ return /^[a-z][a-z0-9-]{2,39}$/.test(slug);
139
+ }
140
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const c: {
2
+ success: (s: string) => string;
3
+ warn: (s: string) => string;
4
+ error: (s: string) => string;
5
+ info: (s: string) => string;
6
+ brand: (s: string) => string;
7
+ kanji: (s: string) => string;
8
+ dim: (s: string) => string;
9
+ code: (s: string) => string;
10
+ };
11
+ /** Print a header with the Forge kanji brand mark. */
12
+ export declare function header(line: string): void;
13
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,CAAC;iBACC,MAAM;cACN,MAAM;eACN,MAAM;cACN,MAAM;eACN,MAAM;eACN,MAAM;aACN,MAAM;cACN,MAAM;CACpB,CAAC;AAEF,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGzC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Yujin Forge -- color helpers for CLI output.
3
+ *
4
+ * Centralised so the entire CLI uses the same palette + the same
5
+ * "supports color?" detection. Wraps kleur but adds two niceties:
6
+ *
7
+ * - dim() preserves italics on terminals that support them
8
+ * - kanji() uses the warm-gold accent for the brand mark
9
+ */
10
+ import kleur from 'kleur';
11
+ export const c = {
12
+ success: (s) => kleur.green(s),
13
+ warn: (s) => kleur.yellow(s),
14
+ error: (s) => kleur.red(s),
15
+ info: (s) => kleur.cyan(s),
16
+ brand: (s) => kleur.blue().bold(s),
17
+ kanji: (s) => kleur.yellow().bold(s),
18
+ dim: (s) => kleur.gray(s),
19
+ code: (s) => kleur.gray('`') + kleur.white(s) + kleur.gray('`'),
20
+ };
21
+ /** Print a header with the Forge kanji brand mark. */
22
+ export function header(line) {
23
+ // U+58F0 -- "voice" kanji used as the brand mark across Yujin.
24
+ console.log(c.kanji('声') + ' ' + c.brand(line));
25
+ }
26
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,IAAI,EAAK,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,KAAK,EAAI,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,EAAK,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,KAAK,EAAI,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,KAAK,EAAI,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,GAAG,EAAM,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,IAAI,EAAK,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;CAC3E,CAAC;AAEF,sDAAsD;AACtD,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,+DAA+D;IAC/D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,19 @@
1
+ export type Severity = 'error' | 'warn';
2
+ export interface Finding {
3
+ severity: Severity;
4
+ code: string;
5
+ message: string;
6
+ }
7
+ export interface ValidateReport {
8
+ project_root: string;
9
+ findings: Finding[];
10
+ ok: boolean;
11
+ }
12
+ export interface ValidateOptions {
13
+ /** Project root to validate. */
14
+ projectRoot: string;
15
+ /** If true, treat warnings as errors. */
16
+ strict?: boolean;
17
+ }
18
+ export declare function validateProject(opts: ValidateOptions): Promise<ValidateReport>;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AASD,wBAAsB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAgBpF"}