@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,31 @@
1
+ export type ForgeTarget = 'responsive' | 'mobile-only' | 'desktop-only';
2
+ export declare const FORGE_TARGETS: readonly ForgeTarget[];
3
+ /** Feature split when target is `responsive`. desktop_only +
4
+ * mobile_only + shared partitions are mutually exclusive on
5
+ * the source side; the scaffolder enforces it. */
6
+ export interface FeatureSplit {
7
+ desktop_only: readonly string[];
8
+ mobile_only: readonly string[];
9
+ shared: readonly string[];
10
+ }
11
+ export interface ResolvedTarget {
12
+ target: ForgeTarget | null;
13
+ feature_split: FeatureSplit | null;
14
+ }
15
+ /** Read target + feature_split from yujin.forge.json. Returns
16
+ * `{ target: null }` when the file is missing or the field
17
+ * is absent -- the caller (Pilot) should prompt the user. */
18
+ export declare function resolveTarget(projectRoot: string): Promise<ResolvedTarget>;
19
+ /** Persist target + (optional) feature_split into the project
20
+ * config. Preserves other fields. */
21
+ export declare function persistTarget(projectRoot: string, target: ForgeTarget, featureSplit?: Partial<FeatureSplit>): Promise<void>;
22
+ /** Validate that the target value is one of the canonical
23
+ * three. Returns null on invalid input. */
24
+ export declare function normaliseTarget(v: unknown): ForgeTarget | null;
25
+ /**
26
+ * Human-readable description of a target, surfaced by Pilot
27
+ * + the manuals. Respects the dual mode (SQ 0.8): didactico
28
+ * + tecnico variants. The default is didactico-friendly.
29
+ */
30
+ export declare function describeTarget(target: ForgeTarget, mode?: 'didactico' | 'tecnico'): string;
31
+ //# sourceMappingURL=target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../src/core/target.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,CAAC;AACxE,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EACD,CAAC;AAEhD;;mDAEmD;AACnD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,WAAW,EAAG,SAAS,MAAM,EAAE,CAAC;IAChC,MAAM,EAAQ,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,YAAY,GAAG,IAAI,CAAC;CACpC;AAID;;8DAE8D;AAC9D,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAehF;AAED;sCACsC;AACtC,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;4CAC4C;AAC5C,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAe9D;AAYD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,WAAW,GAAG,SAAuB,GAAG,MAAM,CAmBvG"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Forge build target resolver (SQ 0.10).
3
+ *
4
+ * Target enumerates how a project is meant to be consumed:
5
+ *
6
+ * responsive -- web that adapts from desktop to mobile breakpoints.
7
+ * mobile-only -- React Native (Expo) single-target.
8
+ * desktop-only -- Electron / web-only (no mobile breakpoints).
9
+ *
10
+ * Resolved per-project from `yujin.forge.json::target` -- there
11
+ * is no env or CLI override for this one because target is a
12
+ * structural property of the codebase, not a runtime knob.
13
+ *
14
+ * The Pilot install flow (sec 0.10) is required to ask the
15
+ * user for this value at first run; this module exposes the
16
+ * resolver + persistor + feature_split shape that callers
17
+ * (scaffolder, sec 0.10 test, manuals) consume.
18
+ *
19
+ * ASCII-only.
20
+ */
21
+ import { promises as fs } from 'node:fs';
22
+ import path from 'node:path';
23
+ export const FORGE_TARGETS = ['responsive', 'mobile-only', 'desktop-only'];
24
+ const PROJECT_CONFIG = 'yujin.forge.json';
25
+ /** Read target + feature_split from yujin.forge.json. Returns
26
+ * `{ target: null }` when the file is missing or the field
27
+ * is absent -- the caller (Pilot) should prompt the user. */
28
+ export async function resolveTarget(projectRoot) {
29
+ const cfgPath = path.join(projectRoot, PROJECT_CONFIG);
30
+ let parsed;
31
+ try {
32
+ const raw = await fs.readFile(cfgPath, 'utf-8');
33
+ parsed = JSON.parse(raw);
34
+ }
35
+ catch {
36
+ return { target: null, feature_split: null };
37
+ }
38
+ if (!parsed || typeof parsed !== 'object') {
39
+ return { target: null, feature_split: null };
40
+ }
41
+ const target = normaliseTarget(parsed.target);
42
+ const fs2 = normaliseFeatureSplit(parsed.feature_split);
43
+ return { target, feature_split: fs2 };
44
+ }
45
+ /** Persist target + (optional) feature_split into the project
46
+ * config. Preserves other fields. */
47
+ export async function persistTarget(projectRoot, target, featureSplit) {
48
+ const cfgPath = path.join(projectRoot, PROJECT_CONFIG);
49
+ let cfg = {};
50
+ try {
51
+ const raw = await fs.readFile(cfgPath, 'utf-8');
52
+ cfg = JSON.parse(raw);
53
+ if (!cfg || typeof cfg !== 'object')
54
+ cfg = {};
55
+ }
56
+ catch { /* fresh */ }
57
+ cfg.target = target;
58
+ if (featureSplit !== undefined) {
59
+ cfg.feature_split = {
60
+ desktop_only: Array.isArray(featureSplit.desktop_only) ? featureSplit.desktop_only : [],
61
+ mobile_only: Array.isArray(featureSplit.mobile_only) ? featureSplit.mobile_only : [],
62
+ shared: Array.isArray(featureSplit.shared) ? featureSplit.shared : [],
63
+ };
64
+ }
65
+ await fs.writeFile(cfgPath, JSON.stringify(cfg, null, 2), 'utf-8');
66
+ }
67
+ /** Validate that the target value is one of the canonical
68
+ * three. Returns null on invalid input. */
69
+ export function normaliseTarget(v) {
70
+ if (typeof v !== 'string')
71
+ return null;
72
+ const lower = v.trim().toLowerCase();
73
+ /* Accept short aliases too. */
74
+ const map = {
75
+ 'responsive': 'responsive',
76
+ 'mobile-only': 'mobile-only',
77
+ 'desktop-only': 'desktop-only',
78
+ 'mobile': 'mobile-only',
79
+ 'desktop': 'desktop-only',
80
+ 'both': 'responsive',
81
+ 'web': 'responsive',
82
+ 'rn': 'mobile-only',
83
+ };
84
+ return map[lower] ?? null;
85
+ }
86
+ function normaliseFeatureSplit(v) {
87
+ if (!v || typeof v !== 'object')
88
+ return null;
89
+ const fs2 = v;
90
+ return {
91
+ desktop_only: Array.isArray(fs2.desktop_only) ? fs2.desktop_only.filter((x) => typeof x === 'string') : [],
92
+ mobile_only: Array.isArray(fs2.mobile_only) ? fs2.mobile_only.filter((x) => typeof x === 'string') : [],
93
+ shared: Array.isArray(fs2.shared) ? fs2.shared.filter((x) => typeof x === 'string') : [],
94
+ };
95
+ }
96
+ /**
97
+ * Human-readable description of a target, surfaced by Pilot
98
+ * + the manuals. Respects the dual mode (SQ 0.8): didactico
99
+ * + tecnico variants. The default is didactico-friendly.
100
+ */
101
+ export function describeTarget(target, mode = 'didactico') {
102
+ if (mode === 'tecnico') {
103
+ switch (target) {
104
+ case 'responsive':
105
+ return 'responsive (web desktop + mobile breakpoints, Vite/Next + React Native sharing)';
106
+ case 'mobile-only':
107
+ return 'mobile-only (Expo RN single-target, no web build)';
108
+ case 'desktop-only':
109
+ return 'desktop-only (Electron or web-only, no mobile breakpoints)';
110
+ }
111
+ }
112
+ switch (target) {
113
+ case 'responsive':
114
+ return 'La app la va a usar la gente en su computadora Y en su celular.';
115
+ case 'mobile-only':
116
+ return 'La app la va a usar la gente solo en su celular.';
117
+ case 'desktop-only':
118
+ return 'La app la va a usar la gente solo en su computadora.';
119
+ }
120
+ }
121
+ //# sourceMappingURL=target.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.js","sourceRoot":"","sources":["../../src/core/target.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export interface AwsDeployConfig {
2
+ region: string;
3
+ cluster: string;
4
+ service: string;
5
+ /** Image URI -- e.g. `123.dkr.ecr.us-east-1.amazonaws.com/myapp:tag`. */
6
+ image: string;
7
+ /** Optional task definition family override; defaults to
8
+ * `<service>-task`. */
9
+ task_family?: string;
10
+ }
11
+ export interface DeployPlan {
12
+ cloud: 'aws';
13
+ config: AwsDeployConfig;
14
+ steps: string[];
15
+ /** Friendly summary surfaced in didactico mode. */
16
+ summary: string;
17
+ }
18
+ export interface DeployResult {
19
+ ok: boolean;
20
+ cloud: 'aws';
21
+ message: string;
22
+ /** Underlying SDK error if ok=false. */
23
+ detail?: string;
24
+ /** Newly published task definition ARN (when ok). */
25
+ task_definition_arn?: string;
26
+ }
27
+ /** Read aws_access_key_id + aws_secret_access_key from the
28
+ * vault. Returns null when either is missing. */
29
+ export declare function resolveAwsCredentials(): Promise<{
30
+ accessKeyId: string;
31
+ secretAccessKey: string;
32
+ } | null>;
33
+ /** Read deploys.aws from yujin.forge.json. */
34
+ export declare function readDeployConfig(projectRoot: string): Promise<AwsDeployConfig | null>;
35
+ /** Compute the plan WITHOUT making any AWS API call. */
36
+ export declare function planDeploy(config: AwsDeployConfig): DeployPlan;
37
+ /** Execute the plan. Lazily imports @aws-sdk/* so the build
38
+ * doesn't pay the cost for users that never deploy. */
39
+ export declare function applyDeploy(plan: DeployPlan, creds: {
40
+ accessKeyId: string;
41
+ secretAccessKey: string;
42
+ }): Promise<DeployResult>;
43
+ //# sourceMappingURL=aws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../src/deploy/aws.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAQ,MAAM,CAAC;IACrB,OAAO,EAAO,MAAM,CAAC;IACrB,OAAO,EAAO,MAAM,CAAC;IACrB,yEAAyE;IACzE,KAAK,EAAS,MAAM,CAAC;IACrB;4BACwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;kDACkD;AAClD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,IAAI,CAAC,CAaR;AAED,8CAA8C;AAC9C,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAgB3F;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,UAAU,CAgB9D;AAED;wDACwD;AACxD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,YAAY,CAAC,CAwFvB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * AWS deploy reference (PLAN #2 -- shipping module).
3
+ *
4
+ * Built-in. Other clouds (GCP/Azure/Fly/Render/Vercel) are
5
+ * NOT built-in: when the user asks `yf deploy <other>`, Forge
6
+ * constructs the plugin live with them in a chat session
7
+ * + saves it to `plugins/deploy/<cloud>.ts` of their repo.
8
+ *
9
+ * This module is the canonical example. Pattern:
10
+ *
11
+ * - resolveCredentials(): pull aws_access_key_id +
12
+ * aws_secret_access_key from the vault.
13
+ * - readDeployConfig(): read `yujin.forge.json::deploys.aws`.
14
+ * - planDeploy(): assemble a Plan describing what will
15
+ * happen (does NOT make any API call).
16
+ * - applyDeploy(plan): execute the plan via AWS SDK.
17
+ *
18
+ * The plan/apply split is what Forge uses to surface diffs
19
+ * to the user in tecnico mode + auto-confirm in didactico.
20
+ *
21
+ * Coverage in v1: ECS Fargate `update-service` (rolling
22
+ * deploy to an existing service). Provisioning (create
23
+ * cluster, register task definition for the first time) is
24
+ * left to the user's GCP/Azure plugins or future iteration.
25
+ *
26
+ * ASCII-only.
27
+ */
28
+ import { promises as fs } from 'node:fs';
29
+ import path from 'node:path';
30
+ import { Vault } from '../vault/store.js';
31
+ import { configDir } from '../license/index.js';
32
+ /** Read aws_access_key_id + aws_secret_access_key from the
33
+ * vault. Returns null when either is missing. */
34
+ export async function resolveAwsCredentials() {
35
+ try {
36
+ const vault = await Vault.open({ configDir: configDir() });
37
+ if (!vault.has('aws_access_key_id') || !vault.has('aws_secret_access_key')) {
38
+ return null;
39
+ }
40
+ return {
41
+ accessKeyId: vault.get('aws_access_key_id'),
42
+ secretAccessKey: vault.get('aws_secret_access_key'),
43
+ };
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ /** Read deploys.aws from yujin.forge.json. */
50
+ export async function readDeployConfig(projectRoot) {
51
+ const cfgPath = path.join(projectRoot, 'yujin.forge.json');
52
+ try {
53
+ const raw = await fs.readFile(cfgPath, 'utf-8');
54
+ const parsed = JSON.parse(raw);
55
+ const aws = parsed.deploys?.aws;
56
+ if (!aws)
57
+ return null;
58
+ if (typeof aws.region !== 'string' || typeof aws.cluster !== 'string'
59
+ || typeof aws.service !== 'string' || typeof aws.image !== 'string') {
60
+ throw new Error('yujin.forge.json::deploys.aws missing region/cluster/service/image');
61
+ }
62
+ return aws;
63
+ }
64
+ catch (err) {
65
+ if (err.code === 'ENOENT')
66
+ return null;
67
+ throw err;
68
+ }
69
+ }
70
+ /** Compute the plan WITHOUT making any AWS API call. */
71
+ export function planDeploy(config) {
72
+ const taskFamily = config.task_family ?? config.service + '-task';
73
+ return {
74
+ cloud: 'aws',
75
+ config,
76
+ steps: [
77
+ 'Describe current task definition for family ' + taskFamily,
78
+ 'Register a new revision with image ' + config.image,
79
+ 'Update service ' + config.service + ' on cluster ' + config.cluster + ' to the new task def',
80
+ 'Wait until the service stabilises (or timeout 5 min)',
81
+ ],
82
+ summary: 'Voy a desplegar la imagen ' + config.image + ' en ECS Fargate '
83
+ + '(cluster ' + config.cluster + ', servicio ' + config.service + ', region ' + config.region + '). '
84
+ + 'Es un rolling update: ECS levanta nuevos tasks con la imagen nueva y va dando de baja los viejos.',
85
+ };
86
+ }
87
+ /** Execute the plan. Lazily imports @aws-sdk/* so the build
88
+ * doesn't pay the cost for users that never deploy. */
89
+ export async function applyDeploy(plan, creds) {
90
+ const { ECSClient, DescribeTaskDefinitionCommand, RegisterTaskDefinitionCommand, UpdateServiceCommand, DescribeServicesCommand } = await import('@aws-sdk/client-ecs');
91
+ const client = new ECSClient({
92
+ region: plan.config.region,
93
+ credentials: {
94
+ accessKeyId: creds.accessKeyId,
95
+ secretAccessKey: creds.secretAccessKey,
96
+ },
97
+ });
98
+ const taskFamily = plan.config.task_family ?? plan.config.service + '-task';
99
+ try {
100
+ /* Step 1: pull the current task def. */
101
+ const current = await client.send(new DescribeTaskDefinitionCommand({
102
+ taskDefinition: taskFamily,
103
+ }));
104
+ const def = current.taskDefinition;
105
+ if (!def) {
106
+ return { ok: false, cloud: 'aws',
107
+ message: 'no task definition found for family ' + taskFamily };
108
+ }
109
+ /* Step 2: register a new revision with the new image.
110
+ Mutate `containerDefinitions[*].image` -- assume the
111
+ FIRST container is the app (Forge convention). The
112
+ user can override via deploys.aws.container_name in
113
+ a future iteration. */
114
+ const containers = (def.containerDefinitions ?? []).map((c, i) => ({
115
+ ...c,
116
+ image: i === 0 ? plan.config.image : c.image,
117
+ }));
118
+ const register = await client.send(new RegisterTaskDefinitionCommand({
119
+ family: taskFamily,
120
+ containerDefinitions: containers,
121
+ cpu: def.cpu,
122
+ memory: def.memory,
123
+ networkMode: def.networkMode,
124
+ requiresCompatibilities: def.requiresCompatibilities,
125
+ executionRoleArn: def.executionRoleArn,
126
+ taskRoleArn: def.taskRoleArn,
127
+ runtimePlatform: def.runtimePlatform,
128
+ volumes: def.volumes,
129
+ }));
130
+ const newArn = register.taskDefinition?.taskDefinitionArn;
131
+ if (!newArn) {
132
+ return { ok: false, cloud: 'aws',
133
+ message: 'register-task-definition returned no ARN' };
134
+ }
135
+ /* Step 3: update service to point to the new revision. */
136
+ await client.send(new UpdateServiceCommand({
137
+ cluster: plan.config.cluster,
138
+ service: plan.config.service,
139
+ taskDefinition: newArn,
140
+ forceNewDeployment: true,
141
+ }));
142
+ /* Step 4: poll service status until stable (or 5 min). */
143
+ const deadline = Date.now() + 5 * 60 * 1000;
144
+ let lastEvent = '';
145
+ while (Date.now() < deadline) {
146
+ await new Promise((r) => setTimeout(r, 5000));
147
+ const sv = await client.send(new DescribeServicesCommand({
148
+ cluster: plan.config.cluster,
149
+ services: [plan.config.service],
150
+ }));
151
+ const s = sv.services?.[0];
152
+ if (!s)
153
+ break;
154
+ if ((s.deployments ?? []).length === 1
155
+ && (s.runningCount ?? 0) === (s.desiredCount ?? 0)) {
156
+ return { ok: true, cloud: 'aws',
157
+ message: 'service stable: ' + s.runningCount + '/' + s.desiredCount + ' tasks',
158
+ task_definition_arn: newArn };
159
+ }
160
+ lastEvent = (s.events?.[0]?.message ?? '') + '';
161
+ }
162
+ return { ok: false, cloud: 'aws',
163
+ message: 'service did not stabilise within 5 min',
164
+ detail: lastEvent,
165
+ task_definition_arn: newArn };
166
+ }
167
+ catch (err) {
168
+ return { ok: false, cloud: 'aws',
169
+ message: 'AWS SDK error',
170
+ detail: err instanceof Error ? err.message : String(err) };
171
+ }
172
+ }
173
+ //# sourceMappingURL=aws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../src/deploy/aws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Figma REST API client (read-only file fetch).
3
+ *
4
+ * The full API surface is large; we only need the single endpoint
5
+ * `GET /v1/files/{file_key}` which returns the document tree +
6
+ * published styles table.
7
+ *
8
+ * Dependency injection: the fetcher is taken as an opt so tests can
9
+ * swap in a stub that returns a fixture JSON without going over the
10
+ * network. Production paths use the global `fetch`.
11
+ *
12
+ * Reference: https://www.figma.com/developers/api#get-files-endpoint
13
+ *
14
+ * ASCII-only.
15
+ */
16
+ import type { FigmaFile } from './types.js';
17
+ export interface FetchFileOptions {
18
+ fileKey: string;
19
+ /** Personal access token. Env var fallback: FIGMA_PERSONAL_ACCESS_TOKEN. */
20
+ token?: string;
21
+ /** Subtree depth limit; `1` returns just the top-level pages. */
22
+ depth?: number;
23
+ /** Optional injected fetcher (defaults to globalThis.fetch). */
24
+ fetcher?: (url: string, init: {
25
+ headers: Record<string, string>;
26
+ }) => Promise<{
27
+ ok: boolean;
28
+ status: number;
29
+ statusText: string;
30
+ json(): Promise<unknown>;
31
+ text(): Promise<string>;
32
+ }>;
33
+ }
34
+ export declare function fetchFigmaFile(opts: FetchFileOptions): Promise<FigmaFile>;
35
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/figma/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC;QAC5E,EAAE,EAAE,OAAO,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;CACJ;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CA0B/E"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Figma REST API client (read-only file fetch).
3
+ *
4
+ * The full API surface is large; we only need the single endpoint
5
+ * `GET /v1/files/{file_key}` which returns the document tree +
6
+ * published styles table.
7
+ *
8
+ * Dependency injection: the fetcher is taken as an opt so tests can
9
+ * swap in a stub that returns a fixture JSON without going over the
10
+ * network. Production paths use the global `fetch`.
11
+ *
12
+ * Reference: https://www.figma.com/developers/api#get-files-endpoint
13
+ *
14
+ * ASCII-only.
15
+ */
16
+ export async function fetchFigmaFile(opts) {
17
+ const token = opts.token || process.env.FIGMA_PERSONAL_ACCESS_TOKEN;
18
+ if (!token) {
19
+ throw new Error('Figma personal access token missing. Set FIGMA_PERSONAL_ACCESS_TOKEN or pass --token.');
20
+ }
21
+ if (!opts.fileKey) {
22
+ throw new Error('Figma file_key is required.');
23
+ }
24
+ const base = 'https://api.figma.com/v1/files/' + encodeURIComponent(opts.fileKey);
25
+ const url = opts.depth ? base + '?depth=' + opts.depth : base;
26
+ const fetcher = opts.fetcher
27
+ || ((u, init) => globalThis.fetch(u, init));
28
+ const resp = await fetcher(url, { headers: { 'X-Figma-Token': token } });
29
+ if (!resp.ok) {
30
+ const body = await resp.text().catch(() => '');
31
+ throw new Error('Figma file fetch failed: ' + resp.status + ' ' + resp.statusText
32
+ + (body ? ' -- ' + body.slice(0, 240) : ''));
33
+ }
34
+ const parsed = (await resp.json());
35
+ if (!parsed || typeof parsed !== 'object' || !parsed.document) {
36
+ throw new Error('Figma file response missing `document` root.');
37
+ }
38
+ return parsed;
39
+ }
40
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/figma/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAoBH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAsB;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IACpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,IAAI,GAAG,iCAAiC,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;WACvB,CAAC,CAAC,CAAS,EAAE,IAAyC,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAQ,CAAC,CAAC;IAClG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU;cAC/D,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5C,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAc,CAAC;IAChD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Figma -> NAC-3 decorator. Bridge between the normalised Figma
3
+ * tree (src/figma/normalize.ts) and emitted, NAC-3-decorated source
4
+ * code (React JSX or vanilla HTML).
5
+ *
6
+ * Pipeline:
7
+ * 1. Build a prompt describing the page + plugin slug + the list
8
+ * of NormalisedElement entries with their roles + verbs.
9
+ * 2. Ask Claude to emit a single JSON object containing:
10
+ * - decorated source per screen (the JSX or HTML the dev
11
+ * downloads),
12
+ * - the NAC manifest fragment,
13
+ * - the CSS file with the resolved design tokens.
14
+ * 3. Hand the result back to the CLI wrapper which writes the
15
+ * files + invokes the same nac-bridge + register wiring the
16
+ * AI HTML decorator uses.
17
+ *
18
+ * The Claude call is a single DI seam (decorator? on the opts) so
19
+ * tests can stub the network. Mirrors the seam already used by
20
+ * aiDecorateFile (G4).
21
+ *
22
+ * ASCII-only.
23
+ */
24
+ import type { NormalisedFile } from './types.js';
25
+ export type Framework = 'react' | 'html' | 'vue';
26
+ export interface DecorateInput {
27
+ /** Normalised model produced by normaliseFigmaFile. */
28
+ file: NormalisedFile;
29
+ /** Output framework. Default 'react'. */
30
+ framework?: Framework;
31
+ /** Plugin slug. If unset, derived from file.source.name (slugified). */
32
+ pluginSlug?: string;
33
+ /** Override the Anthropic model id. Default 'claude-sonnet-4-6'. */
34
+ model?: string;
35
+ }
36
+ export interface DecoratedScreen {
37
+ slug: string;
38
+ /** Decorated source code (one file per screen). */
39
+ source: string;
40
+ /** Suggested basename for this screen's output file. */
41
+ basename: string;
42
+ }
43
+ export interface DecorateResult {
44
+ framework: Framework;
45
+ plugin_slug: string;
46
+ screens: DecoratedScreen[];
47
+ /** NAC manifest aggregated across all screens. JSON string. */
48
+ manifest_json: string;
49
+ /** CSS file body with --color-* and --font-* design tokens. */
50
+ css: string;
51
+ meta: {
52
+ model: string;
53
+ input_tokens: number;
54
+ output_tokens: number;
55
+ cost_usd: number;
56
+ latency_ms: number;
57
+ };
58
+ }
59
+ export type DecorateCaller = (args: {
60
+ model: string;
61
+ systemPrompt: string;
62
+ userPrompt: string;
63
+ }) => Promise<{
64
+ text: string;
65
+ input_tokens: number;
66
+ output_tokens: number;
67
+ latency_ms: number;
68
+ }>;
69
+ export declare function decorateFigma(input: DecorateInput, caller?: DecorateCaller): Promise<DecorateResult>;
70
+ declare function buildUserPrompt(file: NormalisedFile, framework: Framework, pluginSlug: string): string;
71
+ declare function derivePluginSlug(projectName: string): string;
72
+ export { derivePluginSlug, buildUserPrompt };
73
+ export declare function summariseDecoration(result: DecorateResult, file: NormalisedFile): string;
74
+ //# sourceMappingURL=decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/figma/decorator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAoB,MAAM,YAAY,CAAC;AAEnE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,IAAI,EAAE,cAAc,CAAC;IACrB,yCAAyC;IACzC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,KAAK,OAAO,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAyDH,wBAAsB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAyC1G;AAED,iBAAS,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAyB/F;AAED,iBAAS,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGrD;AA6CD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAI7C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAiBxF"}