@niujiajie/freespec 0.0.0-stage → 1.15.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 (308) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +58 -2
  3. package/bin/freespec.js +5 -0
  4. package/dist/cli/index.d.ts +25 -0
  5. package/dist/cli/index.js +359 -0
  6. package/dist/commands/shared-output.d.ts +18 -0
  7. package/dist/commands/shared-output.js +61 -0
  8. package/dist/commands/workflow/default-schema.d.ts +2 -0
  9. package/dist/commands/workflow/default-schema.js +4 -0
  10. package/dist/commands/workflow/index.d.ts +13 -0
  11. package/dist/commands/workflow/index.js +10 -0
  12. package/dist/commands/workflow/instructions.d.ts +39 -0
  13. package/dist/commands/workflow/instructions.js +565 -0
  14. package/dist/commands/workflow/new-change.d.ts +19 -0
  15. package/dist/commands/workflow/new-change.js +135 -0
  16. package/dist/commands/workflow/shared.d.ts +94 -0
  17. package/dist/commands/workflow/shared.js +169 -0
  18. package/dist/commands/workflow/status.d.ts +18 -0
  19. package/dist/commands/workflow/status.js +201 -0
  20. package/dist/core/artifact-graph/graph.d.ts +72 -0
  21. package/dist/core/artifact-graph/graph.js +165 -0
  22. package/dist/core/artifact-graph/index.d.ts +9 -0
  23. package/dist/core/artifact-graph/index.js +14 -0
  24. package/dist/core/artifact-graph/instruction-loader.d.ts +208 -0
  25. package/dist/core/artifact-graph/instruction-loader.js +268 -0
  26. package/dist/core/artifact-graph/outputs.d.ts +19 -0
  27. package/dist/core/artifact-graph/outputs.js +351 -0
  28. package/dist/core/artifact-graph/resolver.d.ts +89 -0
  29. package/dist/core/artifact-graph/resolver.js +342 -0
  30. package/dist/core/artifact-graph/schema.d.ts +27 -0
  31. package/dist/core/artifact-graph/schema.js +160 -0
  32. package/dist/core/artifact-graph/state.d.ts +12 -0
  33. package/dist/core/artifact-graph/state.js +31 -0
  34. package/dist/core/artifact-graph/types.d.ts +40 -0
  35. package/dist/core/artifact-graph/types.js +59 -0
  36. package/dist/core/available-tools.d.ts +18 -0
  37. package/dist/core/available-tools.js +49 -0
  38. package/dist/core/change-layout.d.ts +17 -0
  39. package/dist/core/change-layout.js +30 -0
  40. package/dist/core/change-metadata/index.d.ts +2 -0
  41. package/dist/core/change-metadata/index.js +2 -0
  42. package/dist/core/change-metadata/schema.d.ts +23 -0
  43. package/dist/core/change-metadata/schema.js +46 -0
  44. package/dist/core/change-status-policy.d.ts +49 -0
  45. package/dist/core/change-status-policy.js +50 -0
  46. package/dist/core/command-generation/adapters/amazon-q.d.ts +17 -0
  47. package/dist/core/command-generation/adapters/amazon-q.js +32 -0
  48. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  49. package/dist/core/command-generation/adapters/antigravity.js +27 -0
  50. package/dist/core/command-generation/adapters/atomcode.d.ts +24 -0
  51. package/dist/core/command-generation/adapters/atomcode.js +46 -0
  52. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  53. package/dist/core/command-generation/adapters/auggie.js +28 -0
  54. package/dist/core/command-generation/adapters/bob.d.ts +18 -0
  55. package/dist/core/command-generation/adapters/bob.js +33 -0
  56. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  57. package/dist/core/command-generation/adapters/claude.js +32 -0
  58. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  59. package/dist/core/command-generation/adapters/cline.js +27 -0
  60. package/dist/core/command-generation/adapters/codeassistant.d.ts +15 -0
  61. package/dist/core/command-generation/adapters/codeassistant.js +29 -0
  62. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  63. package/dist/core/command-generation/adapters/codebuddy.js +29 -0
  64. package/dist/core/command-generation/adapters/codestudio.d.ts +13 -0
  65. package/dist/core/command-generation/adapters/codestudio.js +27 -0
  66. package/dist/core/command-generation/adapters/command-code.d.ts +19 -0
  67. package/dist/core/command-generation/adapters/command-code.js +34 -0
  68. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  69. package/dist/core/command-generation/adapters/continue.js +33 -0
  70. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  71. package/dist/core/command-generation/adapters/costrict.js +28 -0
  72. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  73. package/dist/core/command-generation/adapters/crush.js +30 -0
  74. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  75. package/dist/core/command-generation/adapters/cursor.js +31 -0
  76. package/dist/core/command-generation/adapters/devin.d.ts +19 -0
  77. package/dist/core/command-generation/adapters/devin.js +36 -0
  78. package/dist/core/command-generation/adapters/easycode.d.ts +17 -0
  79. package/dist/core/command-generation/adapters/easycode.js +28 -0
  80. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/factory.js +28 -0
  82. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/gemini.js +27 -0
  84. package/dist/core/command-generation/adapters/gigacode.d.ts +17 -0
  85. package/dist/core/command-generation/adapters/gigacode.js +31 -0
  86. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/github-copilot.js +27 -0
  88. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  89. package/dist/core/command-generation/adapters/iflow.js +30 -0
  90. package/dist/core/command-generation/adapters/index.d.ts +40 -0
  91. package/dist/core/command-generation/adapters/index.js +40 -0
  92. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/junie.js +27 -0
  94. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  95. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  96. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  97. package/dist/core/command-generation/adapters/kiro.js +27 -0
  98. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  99. package/dist/core/command-generation/adapters/lingma.js +30 -0
  100. package/dist/core/command-generation/adapters/oh-my-pi.d.ts +21 -0
  101. package/dist/core/command-generation/adapters/oh-my-pi.js +42 -0
  102. package/dist/core/command-generation/adapters/opencode.d.ts +14 -0
  103. package/dist/core/command-generation/adapters/opencode.js +38 -0
  104. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  105. package/dist/core/command-generation/adapters/pi.js +39 -0
  106. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/qoder.js +30 -0
  108. package/dist/core/command-generation/adapters/qwen.d.ts +17 -0
  109. package/dist/core/command-generation/adapters/qwen.js +31 -0
  110. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  111. package/dist/core/command-generation/adapters/roocode.js +27 -0
  112. package/dist/core/command-generation/adapters/trae.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/trae.js +28 -0
  114. package/dist/core/command-generation/adapters/zcode.d.ts +16 -0
  115. package/dist/core/command-generation/adapters/zcode.js +33 -0
  116. package/dist/core/command-generation/generator.d.ts +29 -0
  117. package/dist/core/command-generation/generator.js +43 -0
  118. package/dist/core/command-generation/index.d.ts +22 -0
  119. package/dist/core/command-generation/index.js +24 -0
  120. package/dist/core/command-generation/invocation.d.ts +73 -0
  121. package/dist/core/command-generation/invocation.js +77 -0
  122. package/dist/core/command-generation/registry.d.ts +36 -0
  123. package/dist/core/command-generation/registry.js +114 -0
  124. package/dist/core/command-generation/toml.d.ts +19 -0
  125. package/dist/core/command-generation/toml.js +39 -0
  126. package/dist/core/command-generation/types.d.ts +63 -0
  127. package/dist/core/command-generation/types.js +8 -0
  128. package/dist/core/command-generation/yaml.d.ts +36 -0
  129. package/dist/core/command-generation/yaml.js +48 -0
  130. package/dist/core/command-surface.d.ts +15 -0
  131. package/dist/core/command-surface.js +33 -0
  132. package/dist/core/config-prompts.d.ts +9 -0
  133. package/dist/core/config-prompts.js +56 -0
  134. package/dist/core/config-schema.d.ts +98 -0
  135. package/dist/core/config-schema.js +308 -0
  136. package/dist/core/config.d.ts +50 -0
  137. package/dist/core/config.js +122 -0
  138. package/dist/core/file-state.d.ts +36 -0
  139. package/dist/core/file-state.js +144 -0
  140. package/dist/core/file-view.d.ts +13 -0
  141. package/dist/core/file-view.js +14 -0
  142. package/dist/core/global-config.d.ts +101 -0
  143. package/dist/core/global-config.js +182 -0
  144. package/dist/core/id.d.ts +17 -0
  145. package/dist/core/id.js +30 -0
  146. package/dist/core/index.d.ts +6 -0
  147. package/dist/core/index.js +7 -0
  148. package/dist/core/init.d.ts +57 -0
  149. package/dist/core/init.js +836 -0
  150. package/dist/core/list.d.ts +11 -0
  151. package/dist/core/list.js +197 -0
  152. package/dist/core/migration.d.ts +121 -0
  153. package/dist/core/migration.js +540 -0
  154. package/dist/core/onboarding-commands.d.ts +30 -0
  155. package/dist/core/onboarding-commands.js +38 -0
  156. package/dist/core/openspec-root.d.ts +47 -0
  157. package/dist/core/openspec-root.js +196 -0
  158. package/dist/core/planning-home.d.ts +16 -0
  159. package/dist/core/planning-home.js +67 -0
  160. package/dist/core/profile-sync-drift.d.ts +31 -0
  161. package/dist/core/profile-sync-drift.js +201 -0
  162. package/dist/core/profiles.d.ts +19 -0
  163. package/dist/core/profiles.js +33 -0
  164. package/dist/core/project-config.d.ts +132 -0
  165. package/dist/core/project-config.js +519 -0
  166. package/dist/core/references.d.ts +10 -0
  167. package/dist/core/references.js +46 -0
  168. package/dist/core/root-selection.d.ts +59 -0
  169. package/dist/core/root-selection.js +132 -0
  170. package/dist/core/shared/allowed-tools.d.ts +12 -0
  171. package/dist/core/shared/allowed-tools.js +12 -0
  172. package/dist/core/shared/ide-restart.d.ts +26 -0
  173. package/dist/core/shared/ide-restart.js +42 -0
  174. package/dist/core/shared/index.d.ts +11 -0
  175. package/dist/core/shared/index.js +11 -0
  176. package/dist/core/shared/skill-content-equivalence.d.ts +7 -0
  177. package/dist/core/shared/skill-content-equivalence.js +45 -0
  178. package/dist/core/shared/skill-files.d.ts +7 -0
  179. package/dist/core/shared/skill-files.js +43 -0
  180. package/dist/core/shared/skill-generation.d.ts +49 -0
  181. package/dist/core/shared/skill-generation.js +125 -0
  182. package/dist/core/shared/skill-paths.d.ts +13 -0
  183. package/dist/core/shared/skill-paths.js +23 -0
  184. package/dist/core/shared/tool-detection.d.ts +99 -0
  185. package/dist/core/shared/tool-detection.js +318 -0
  186. package/dist/core/shared-skill-target.d.ts +51 -0
  187. package/dist/core/shared-skill-target.js +239 -0
  188. package/dist/core/store/errors.d.ts +20 -0
  189. package/dist/core/store/errors.js +22 -0
  190. package/dist/core/store/index.d.ts +2 -0
  191. package/dist/core/store/index.js +2 -0
  192. package/dist/core/styles/palette.d.ts +7 -0
  193. package/dist/core/styles/palette.js +8 -0
  194. package/dist/core/templates/optional-workflow.d.ts +69 -0
  195. package/dist/core/templates/optional-workflow.js +140 -0
  196. package/dist/core/templates/types.d.ts +19 -0
  197. package/dist/core/templates/types.js +5 -0
  198. package/dist/core/templates/workflows/personal.d.ts +22 -0
  199. package/dist/core/templates/workflows/personal.js +225 -0
  200. package/dist/core/update-plan.d.ts +127 -0
  201. package/dist/core/update-plan.js +390 -0
  202. package/dist/core/update.d.ts +154 -0
  203. package/dist/core/update.js +723 -0
  204. package/dist/core/version-check.d.ts +188 -0
  205. package/dist/core/version-check.js +906 -0
  206. package/dist/core/zod-issues.d.ts +4 -0
  207. package/dist/core/zod-issues.js +10 -0
  208. package/dist/index.d.ts +3 -0
  209. package/dist/index.js +3 -0
  210. package/dist/prompts/searchable-multi-select.d.ts +35 -0
  211. package/dist/prompts/searchable-multi-select.js +188 -0
  212. package/dist/telemetry/config.d.ts +37 -0
  213. package/dist/telemetry/config.js +148 -0
  214. package/dist/telemetry/index.d.ts +39 -0
  215. package/dist/telemetry/index.js +217 -0
  216. package/dist/telemetry/opt-out.d.ts +17 -0
  217. package/dist/telemetry/opt-out.js +27 -0
  218. package/dist/ui/ascii-patterns.d.ts +16 -0
  219. package/dist/ui/ascii-patterns.js +133 -0
  220. package/dist/ui/welcome-screen.d.ts +18 -0
  221. package/dist/ui/welcome-screen.js +199 -0
  222. package/dist/utils/change-metadata.d.ts +116 -0
  223. package/dist/utils/change-metadata.js +324 -0
  224. package/dist/utils/change-utils.d.ts +79 -0
  225. package/dist/utils/change-utils.js +121 -0
  226. package/dist/utils/ci.d.ts +12 -0
  227. package/dist/utils/ci.js +16 -0
  228. package/dist/utils/command-references.d.ts +104 -0
  229. package/dist/utils/command-references.js +190 -0
  230. package/dist/utils/date.d.ts +8 -0
  231. package/dist/utils/date.js +13 -0
  232. package/dist/utils/executable-path.d.ts +5 -0
  233. package/dist/utils/executable-path.js +44 -0
  234. package/dist/utils/file-system.d.ts +58 -0
  235. package/dist/utils/file-system.js +432 -0
  236. package/dist/utils/index.d.ts +6 -0
  237. package/dist/utils/index.js +9 -0
  238. package/dist/utils/interactive.d.ts +85 -0
  239. package/dist/utils/interactive.js +174 -0
  240. package/dist/utils/item-discovery.d.ts +15 -0
  241. package/dist/utils/item-discovery.js +33 -0
  242. package/dist/utils/line-endings.d.ts +34 -0
  243. package/dist/utils/line-endings.js +46 -0
  244. package/dist/utils/match.d.ts +3 -0
  245. package/dist/utils/match.js +22 -0
  246. package/dist/utils/nested-change.d.ts +35 -0
  247. package/dist/utils/nested-change.js +185 -0
  248. package/dist/utils/shell-detection.d.ts +20 -0
  249. package/dist/utils/shell-detection.js +94 -0
  250. package/dist/utils/task-progress.d.ts +67 -0
  251. package/dist/utils/task-progress.js +184 -0
  252. package/package.json +74 -4
  253. package/schemas//351/273/230/350/256/244/schema.yaml +68 -0
  254. package/schemas//351/273/230/350/256/244/templates//344/273/273/345/212/241/346/270/205/345/215/225.md +25 -0
  255. package/schemas//351/273/230/350/256/244/templates//346/265/213/350/257/225/347/224/250/344/276/213.md +34 -0
  256. package/schemas//351/273/230/350/256/244/templates//350/256/276/350/256/241/346/226/207/346/241/243.md +172 -0
  257. package/schemas//351/273/230/350/256/244/templates//351/234/200/346/261/202/346/226/207/346/241/243.md +19 -0
  258. package/skill-files//344/273/273/345/212/241/references//346/212/244/346/240/217.md +43 -0
  259. package/skill-files//344/273/273/345/212/241/references//347/262/222/345/272/246.md +23 -0
  260. package/skill-files//344/273/273/345/212/241/references//347/272/246/346/235/237.md +8 -0
  261. package/skill-files//344/273/273/345/212/241/scripts/check-tasks.mjs +83 -0
  262. package/skill-files//345/206/231Java/references/Java/350/247/204/350/214/203.md +25 -0
  263. package/skill-files//345/206/231Java/references//345/215/261/351/231/251/345/206/231/346/263/225.md +27 -0
  264. package/skill-files//345/206/231Java/references//345/256/214/346/210/220/345/257/271/347/205/247.md +15 -0
  265. package/skill-files//345/206/231Java/references//346/212/244/346/240/217.md +35 -0
  266. package/skill-files//345/206/231Java/references//347/272/246/346/235/237.md +8 -0
  267. package/skill-files//345/206/231Java/references//350/270/251/345/235/221.md +17 -0
  268. package/skill-files//345/256/241Java/references//346/212/244/346/240/217.md +19 -0
  269. package/skill-files//345/256/241Java/references//347/244/272/344/276/213.md +23 -0
  270. package/skill-files//345/256/241Java/references//347/272/246/346/235/237.md +7 -0
  271. package/skill-files//345/256/241Java/references//350/247/204/345/210/231.md +23 -0
  272. package/skill-files//345/256/241Java/references//351/242/206/345/237/237/346/243/200/351/241/271.md +58 -0
  273. package/skill-files//345/256/241/346/226/207/346/241/243/references//346/212/244/346/240/217.md +18 -0
  274. package/skill-files//345/256/241/346/226/207/346/241/243/references//347/272/246/346/235/237.md +8 -0
  275. package/skill-files//345/256/241/346/226/207/346/241/243/references//347/273/264/345/272/246.md +17 -0
  276. package/skill-files//345/256/241/346/226/207/346/241/243/references//350/270/251/345/235/221.md +11 -0
  277. package/skill-files//346/226/260/345/273/272/references//344/272/244/346/216/245.md +11 -0
  278. package/skill-files//346/226/260/345/273/272/references//346/212/244/346/240/217.md +14 -0
  279. package/skill-files//346/226/260/345/273/272/references//347/272/246/346/235/237.md +7 -0
  280. package/skill-files//346/267/261/346/200/235/config/prompts.yaml +114 -0
  281. package/skill-files//346/267/261/346/200/235/references//344/270/211/346/226/271/346/240/270/345/257/271.md +72 -0
  282. package/skill-files//346/267/261/346/200/235/references//344/276/213/345/255/220.md +39 -0
  283. package/skill-files//346/267/261/346/200/235/references//346/200/216/344/271/210/346/203/263.md +61 -0
  284. package/skill-files//346/267/261/346/200/235/references//346/212/244/346/240/217.md +26 -0
  285. package/skill-files//346/267/261/346/200/235/references//347/202/271/351/200/211/346/217/220/351/227/256.md +66 -0
  286. package/skill-files//346/267/261/346/200/235/references//347/231/273/350/256/260.md +45 -0
  287. package/skill-files//346/267/261/346/200/235/references//347/272/246/346/235/237.md +9 -0
  288. package/skill-files//347/224/250/344/276/213/references//346/200/216/344/271/210/345/206/231.md +13 -0
  289. package/skill-files//347/224/250/344/276/213/references//346/212/244/346/240/217.md +42 -0
  290. package/skill-files//347/224/250/344/276/213/references//347/272/246/346/235/237.md +5 -0
  291. package/skill-files//347/224/250/344/276/213/scripts/check-cases.mjs +70 -0
  292. package/skill-files//350/256/276/350/256/241/references//345/207/206/345/244/207.md +25 -0
  293. package/skill-files//350/256/276/350/256/241/references//346/212/244/346/240/217.md +134 -0
  294. package/skill-files//350/256/276/350/256/241/references//346/226/207/351/243/216.md +17 -0
  295. package/skill-files//350/256/276/350/256/241/references//347/225/214/351/235/242.md +18 -0
  296. package/skill-files//350/256/276/350/256/241/references//347/261/273/345/236/213.md +19 -0
  297. package/skill-files//350/256/276/350/256/241/references//347/272/246/346/235/237.md +25 -0
  298. package/skill-files//350/256/276/350/256/241/scripts/_smoke.mjs +72 -0
  299. package/skill-files//350/256/276/350/256/241/scripts/check-design.mjs +331 -0
  300. package/skill-files//351/234/200/346/261/202/references//346/212/244/346/240/217.md +26 -0
  301. package/skill-files//351/234/200/346/261/202/references//346/226/207/351/243/216.md +23 -0
  302. package/skill-files//351/234/200/346/261/202/references//346/267/261/346/200/235/346/221/204/345/205/245.md +21 -0
  303. package/skill-files//351/234/200/346/261/202/references//347/272/246/346/235/237.md +8 -0
  304. package/skill-files//351/234/200/346/261/202/references//351/234/200/346/261/202/345/276/205/345/256/232.md +13 -0
  305. package/skill-files//351/234/200/346/261/202/scripts/check-requirements.mjs +60 -0
  306. package/skill-files//351/252/214/346/224/266/references//346/212/244/346/240/217.md +27 -0
  307. package/skill-files//351/252/214/346/224/266/references//346/240/270/345/257/271.md +17 -0
  308. package/skill-files//351/252/214/346/224/266/references//347/272/246/346/235/237.md +7 -0
@@ -0,0 +1,565 @@
1
+ /**
2
+ * Instructions Command
3
+ *
4
+ * Generates enriched instructions for creating artifacts or applying tasks.
5
+ * Includes both artifact instructions and apply instructions.
6
+ */
7
+ import path from 'path';
8
+ import * as fs from 'fs';
9
+ import { loadChangeContext, generateInstructions, resolveSchema, resolveArtifactOutputs, } from '../../core/artifact-graph/index.js';
10
+ import { getChangeDir, resolveCurrentPlanningHomeSync, } from '../../core/planning-home.js';
11
+ import { resolveRootForCommand, toPlanningHome, toRootOutput, } from '../../core/root-selection.js';
12
+ import { escapeEnvelopeAttribute, escapeEnvelopeTags, sanitizeInline, } from '../../core/references.js';
13
+ import { loadOperationInputs, readProjectConfig, } from '../../core/project-config.js';
14
+ import { validateChangeExists, validateSchemaExists, } from './shared.js';
15
+ import { parseTaskLines } from '../../utils/task-progress.js';
16
+ // -----------------------------------------------------------------------------
17
+ // Artifact Instructions Command
18
+ // -----------------------------------------------------------------------------
19
+ /** Reads the resolved root's config. Missing or unparseable configs are null. */
20
+ function loadRootConfigContext(root) {
21
+ return { projectConfig: readProjectConfig(root.path) };
22
+ }
23
+ export async function instructionsCommand(artifactId, options) {
24
+ // Resolve (and banner) before the spinner starts so stderr stays readable.
25
+ const root = await resolveRootForCommand(options, { json: options.json });
26
+ if (!root) {
27
+ return;
28
+ }
29
+ let spinner;
30
+ if (!options.json) {
31
+ const { default: ora } = await import('ora');
32
+ spinner = ora('Generating instructions...').start();
33
+ }
34
+ try {
35
+ const planningHome = toPlanningHome(root);
36
+ const projectRoot = root.path;
37
+ const changeName = await validateChangeExists(options.change, projectRoot, root.changesDir, { newChangeHint: 'freespec new change <name>' });
38
+ // Validate schema if explicitly provided
39
+ if (options.schema) {
40
+ validateSchemaExists(options.schema, projectRoot);
41
+ }
42
+ const { projectConfig } = loadRootConfigContext(root);
43
+ // loadChangeContext will auto-detect schema from metadata if not provided
44
+ const context = loadChangeContext(projectRoot, changeName, options.schema, {
45
+ changeDir: getChangeDir(planningHome, changeName),
46
+ planningHome,
47
+ projectConfig,
48
+ });
49
+ if (!artifactId) {
50
+ spinner?.stop();
51
+ const validIds = context.graph.getAllArtifacts().map((a) => a.id);
52
+ throw new Error(`Missing required argument <artifact>. Valid artifacts:\n ${validIds.join('\n ')}`);
53
+ }
54
+ const artifact = context.graph.getArtifact(artifactId);
55
+ if (!artifact) {
56
+ spinner?.stop();
57
+ const validIds = context.graph.getAllArtifacts().map((a) => a.id);
58
+ throw new Error(`Artifact '${artifactId}' not found in schema '${context.schemaName}'. Valid artifacts:\n ${validIds.join('\n ')}`);
59
+ }
60
+ const instructions = generateInstructions(context, artifactId, projectRoot, {
61
+ projectConfig,
62
+ });
63
+ const isBlocked = instructions.dependencies.some((d) => !d.done);
64
+ spinner?.stop();
65
+ if (options.json) {
66
+ console.log(JSON.stringify({ ...instructions, root: toRootOutput(root) }, null, 2));
67
+ return;
68
+ }
69
+ printInstructionsText(instructions, isBlocked);
70
+ }
71
+ catch (error) {
72
+ spinner?.stop();
73
+ throw error;
74
+ }
75
+ }
76
+ export function printInstructionsText(instructions, isBlocked) {
77
+ const { artifactId, changeName, schemaName, changeDir, resolvedOutputPath, description, instruction, context, rules, template, dependencies, unlocks, } = instructions;
78
+ // Opening tag. The change name is a directory name read from disk, and the
79
+ // read path rejects only separators and NUL - a quote in it would otherwise
80
+ // close the attribute and forge siblings on this tag.
81
+ console.log(`<artifact id="${escapeEnvelopeAttribute(artifactId)}"` +
82
+ ` change="${escapeEnvelopeAttribute(changeName)}"` +
83
+ ` schema="${escapeEnvelopeAttribute(schemaName)}">`);
84
+ console.log();
85
+ if (instructions.warnings) {
86
+ for (const warning of instructions.warnings) {
87
+ console.log('<warning>');
88
+ console.log(escapeEnvelopeTags(warning));
89
+ console.log('</warning>');
90
+ console.log();
91
+ }
92
+ }
93
+ // Artifacts skipped via skip_specs get no creation directive: emitting the
94
+ // task/template anyway would prompt an agent to write spec files that
95
+ // validate then rejects as conflicting with the marker.
96
+ if (instructions.skipped) {
97
+ console.log('<warning>');
98
+ console.log(instructions.warning ?? 'This artifact is skipped (skip_specs is set in .freespec.yaml).');
99
+ console.log('</warning>');
100
+ console.log();
101
+ console.log('</artifact>');
102
+ return;
103
+ }
104
+ // Warning for blocked artifacts
105
+ if (isBlocked) {
106
+ const missing = dependencies.filter((d) => !d.done).map((d) => d.id);
107
+ console.log('<warning>');
108
+ console.log('This artifact has unmet dependencies. Complete them first or proceed with caution.');
109
+ console.log(`Missing: ${missing.join(', ')}`);
110
+ console.log('</warning>');
111
+ console.log();
112
+ }
113
+ // Task directive
114
+ console.log('<task>');
115
+ console.log(`Create the ${escapeEnvelopeTags(artifactId)} artifact for change "${escapeEnvelopeTags(changeName)}".`);
116
+ console.log(escapeEnvelopeTags(description));
117
+ console.log('</task>');
118
+ console.log();
119
+ // Project context (AI constraint - do not include in output)
120
+ if (context) {
121
+ console.log('<project_context>');
122
+ console.log('<!-- This is background information for you. Do NOT include this in your output. -->');
123
+ console.log(escapeEnvelopeTags(context));
124
+ console.log('</project_context>');
125
+ console.log();
126
+ }
127
+ // Rules (AI constraint - do not include in output)
128
+ if (rules && rules.length > 0) {
129
+ console.log('<rules>');
130
+ console.log('<!-- These are constraints for you to follow. Do NOT include this in your output. -->');
131
+ for (const rule of rules) {
132
+ // Flattened so a newline cannot forge a sibling bullet, but never
133
+ // truncated: these are instructions an agent has to follow in full.
134
+ console.log(`- ${escapeEnvelopeTags(sanitizeInline(rule, Infinity))}`);
135
+ }
136
+ console.log('</rules>');
137
+ console.log();
138
+ }
139
+ // Dependencies (files to read for context)
140
+ if (dependencies.length > 0) {
141
+ console.log('<dependencies>');
142
+ console.log('Read the current contents of these files before creating this artifact (re-read them from disk even if you saw them earlier - they may have been edited):');
143
+ console.log();
144
+ for (const dep of dependencies) {
145
+ // A dependency satisfied via skip_specs has no files by design: telling
146
+ // the agent to read them (or calling them "done") would send it hunting
147
+ // for spec files that must not exist.
148
+ if (dep.skipped) {
149
+ console.log(`<dependency id="${dep.id}" status="skipped">`);
150
+ console.log(` <description>Skipped: the change declares skip_specs, so this artifact has no files to read.</description>`);
151
+ console.log('</dependency>');
152
+ continue;
153
+ }
154
+ const status = dep.done ? 'done' : 'missing';
155
+ const fullPath = path.join(changeDir, dep.path);
156
+ console.log(`<dependency id="${dep.id}" status="${status}">`);
157
+ console.log(` <path>${fullPath}</path>`);
158
+ console.log(` <description>${escapeEnvelopeTags(dep.description)}</description>`);
159
+ console.log('</dependency>');
160
+ }
161
+ console.log('</dependencies>');
162
+ console.log();
163
+ }
164
+ // Output location
165
+ console.log('<output>');
166
+ console.log(`Write to: ${resolvedOutputPath}`);
167
+ console.log('</output>');
168
+ console.log();
169
+ // Instruction (guidance)
170
+ if (instruction) {
171
+ console.log('<instruction>');
172
+ console.log(escapeEnvelopeTags(instruction.trim()));
173
+ console.log('</instruction>');
174
+ console.log();
175
+ }
176
+ // Template
177
+ console.log('<template>');
178
+ console.log('<!-- Use this as the structure for your output file. Fill in the sections. -->');
179
+ // Copied verbatim into the artifact file, so its `<!-- ... -->` comments and
180
+ // `<placeholder>` markers must survive - only the envelope's own closing
181
+ // tags are neutralized.
182
+ console.log(escapeEnvelopeTags(template.trim()));
183
+ console.log('</template>');
184
+ console.log();
185
+ // Success criteria placeholder
186
+ console.log('<success_criteria>');
187
+ console.log('<!-- To be defined in schema validation rules -->');
188
+ console.log('</success_criteria>');
189
+ console.log();
190
+ // Unlocks
191
+ if (unlocks.length > 0) {
192
+ console.log('<unlocks>');
193
+ console.log(`Completing this artifact enables: ${unlocks.join(', ')}`);
194
+ console.log('</unlocks>');
195
+ console.log();
196
+ }
197
+ // Closing tag
198
+ console.log('</artifact>');
199
+ }
200
+ /** Adds one-based source locations to parsed tasks without changing task parsing. */
201
+ function parseLocatedTasks(content, sourcePath) {
202
+ const tasks = [];
203
+ for (const [index, line] of content.split('\n').entries()) {
204
+ const [task] = parseTaskLines(line);
205
+ if (task)
206
+ tasks.push({ ...task, sourcePath, line: index + 1 });
207
+ }
208
+ return tasks;
209
+ }
210
+ /**
211
+ * Turns parsed task lines into the listed task items.
212
+ *
213
+ * A checkbox with no text after it is left out of the list: this is work for an
214
+ * agent to act on and tick off, and a bare `- [ ]` gives it nothing to match.
215
+ * It still counts toward progress, which is taken from every parsed line, so
216
+ * this list can be shorter than the totals beside it but never disagrees with
217
+ * `freespec list` or archive about how much work is left. An empty list is also
218
+ * what puts apply in its "nothing to work on" state, so a file of nothing but
219
+ * text-less checkboxes asks to be rewritten instead of being called done.
220
+ */
221
+ function toTaskItems(parsed) {
222
+ const tasks = [];
223
+ for (const task of parsed) {
224
+ if (task.description.length === 0)
225
+ continue;
226
+ tasks.push({
227
+ id: `${tasks.length + 1}`,
228
+ description: task.description,
229
+ done: task.done,
230
+ sourcePath: task.sourcePath,
231
+ line: task.line,
232
+ });
233
+ }
234
+ return tasks;
235
+ }
236
+ /**
237
+ * The command that builds one artifact.
238
+ *
239
+ * Every earlier remedy here named the `freespec-continue-change` skill, which
240
+ * the `core` profile never installs - the advice was a dead end for the default
241
+ * install. The CLI verb exists on every profile and is what the skill runs.
242
+ */
243
+ function describeArtifactRemedy(changeName, artifactId, options = {}) {
244
+ const target = artifactId ?? '<artifact>';
245
+ const verb = options.many ? 'Create each with' : 'Create it with';
246
+ return (`${verb} \`freespec instructions ${target} --change ${changeName}\`` +
247
+ ` (\`freespec status --change ${changeName}\` shows what is left).`);
248
+ }
249
+ /**
250
+ * Finds the artifact a schema path is generated by, so a remedy can name it.
251
+ */
252
+ function findArtifactIdFor(schema, generates) {
253
+ return schema.artifacts.find((artifact) => artifact.generates === generates)?.id;
254
+ }
255
+ /**
256
+ * Everything still to build before apply can run, in build order.
257
+ *
258
+ * Apply blocks on the schema's `apply.requires` alone, so its own list stops at
259
+ * the first hop: a change with only a proposal is told "Missing artifacts:
260
+ * tasks" while the specs `tasks` depends on are missing too. An agent that
261
+ * takes that literally writes the tracking file straight from the proposal and
262
+ * skips the artifacts in between - the failure reported in #834 and #869.
263
+ * Walking `requires` names the whole chain, the same set and order
264
+ * `freespec status` already prints, without changing what apply blocks on.
265
+ */
266
+ function collectMissingPrerequisites(input) {
267
+ const { requiredArtifactIds, schema, buildOrder, completed } = input;
268
+ const byId = new Map(schema.artifacts.map((artifact) => [artifact.id, artifact]));
269
+ const missing = new Set();
270
+ const queue = [...requiredArtifactIds];
271
+ const seen = new Set(queue);
272
+ while (queue.length > 0) {
273
+ const id = queue.shift();
274
+ const artifact = byId.get(id);
275
+ if (!artifact)
276
+ continue;
277
+ if (!completed.has(id))
278
+ missing.add(id);
279
+ for (const dependency of artifact.requires) {
280
+ if (seen.has(dependency))
281
+ continue;
282
+ seen.add(dependency);
283
+ queue.push(dependency);
284
+ }
285
+ }
286
+ const order = new Map(buildOrder.map((id, index) => [id, index]));
287
+ return [...missing].sort((a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0));
288
+ }
289
+ /**
290
+ * Generates apply instructions for implementing tasks from a change.
291
+ * Schema-aware: reads apply phase configuration from schema to determine
292
+ * required artifacts, tracking file, and instruction.
293
+ */
294
+ export async function generateApplyInstructions(projectRoot, changeName, schemaName, options = {}) {
295
+ const planningHome = options.planningHome ?? resolveCurrentPlanningHomeSync({ startPath: projectRoot });
296
+ // loadChangeContext will auto-detect schema from metadata if not provided
297
+ const context = loadChangeContext(projectRoot, changeName, schemaName, {
298
+ changeDir: getChangeDir(planningHome, changeName),
299
+ planningHome,
300
+ projectConfig: options.projectConfig,
301
+ });
302
+ const changeDir = context.changeDir;
303
+ // Get the full schema to access the apply phase configuration
304
+ const schema = resolveSchema(context.schemaName, projectRoot);
305
+ const applyConfig = schema.apply;
306
+ // Determine required artifacts and tracking file from schema
307
+ // Fallback: if no apply block, require all artifacts
308
+ const requiredArtifactIds = applyConfig?.requires ?? schema.artifacts.map((a) => a.id);
309
+ const tracksFile = applyConfig?.tracks ?? null;
310
+ const schemaInstruction = applyConfig?.instruction ?? null;
311
+ const operationInputs = loadOperationInputs(options.projectConfig ?? null, 'apply');
312
+ // Check which required artifacts are missing. Artifacts the change skips
313
+ // via skip_specs count as present - their files must not exist, and
314
+ // status already reports them complete, so apply cannot block on them.
315
+ const missingArtifacts = [];
316
+ for (const artifactId of requiredArtifactIds) {
317
+ if (context.skippedArtifacts?.has(artifactId)) {
318
+ continue;
319
+ }
320
+ const artifact = schema.artifacts.find((a) => a.id === artifactId);
321
+ if (artifact && resolveArtifactOutputs(changeDir, artifact.generates).length === 0) {
322
+ missingArtifacts.push(artifactId);
323
+ }
324
+ }
325
+ // Everything still to build, not just the first hop apply blocks on.
326
+ const missingPrerequisites = collectMissingPrerequisites({
327
+ requiredArtifactIds: [...requiredArtifactIds],
328
+ schema,
329
+ buildOrder: context.graph.getBuildOrder(),
330
+ completed: context.completed,
331
+ });
332
+ // Build context files from all existing artifacts in schema
333
+ const contextFiles = {};
334
+ for (const artifact of schema.artifacts) {
335
+ const outputs = resolveArtifactOutputs(changeDir, artifact.generates);
336
+ if (outputs.length > 0) {
337
+ contextFiles[artifact.id] = outputs;
338
+ }
339
+ }
340
+ // Parse every concrete file matched by apply.tracks. A tracking path may be
341
+ // a glob owned by an artifact with any ID, so treating it as one literal
342
+ // path loses task evidence for valid custom schemas.
343
+ let parsedTasks = [];
344
+ const unavailableTrackingFiles = [];
345
+ let tracksFileExists = false;
346
+ if (tracksFile) {
347
+ const tracksPaths = resolveArtifactOutputs(changeDir, tracksFile);
348
+ tracksFileExists = tracksPaths.length > 0;
349
+ for (const tracksPath of tracksPaths) {
350
+ try {
351
+ const tasksContent = await fs.promises.readFile(tracksPath, 'utf-8');
352
+ parsedTasks.push(...parseLocatedTasks(tasksContent, tracksPath));
353
+ }
354
+ catch (error) {
355
+ const code = error?.code;
356
+ const message = error instanceof Error ? error.message : String(error);
357
+ unavailableTrackingFiles.push({
358
+ path: tracksPath,
359
+ reason: code && !message.includes(code) ? `${code}: ${message}` : message,
360
+ });
361
+ }
362
+ }
363
+ }
364
+ const tasks = toTaskItems(parsedTasks);
365
+ // Calculate progress over every checkbox in the file, listed or not, so these
366
+ // numbers match `freespec list` and archive's incomplete-task check.
367
+ const total = parsedTasks.length;
368
+ const complete = parsedTasks.filter((task) => task.done).length;
369
+ const remaining = total - complete;
370
+ // Determine state and instruction
371
+ let state;
372
+ let instruction;
373
+ if (missingArtifacts.length > 0) {
374
+ state = 'blocked';
375
+ const chain = missingPrerequisites.length > missingArtifacts.length
376
+ ? `\nNot created yet, in build order: ${missingPrerequisites.join(', ')}.` +
377
+ ` Build the ones this change needs before applying - the schema says which are conditional.`
378
+ : '';
379
+ instruction =
380
+ `Cannot apply this change yet. Missing artifacts: ${missingArtifacts.join(', ')}.${chain}` +
381
+ `\n${describeArtifactRemedy(changeName,
382
+ // Only name one when one is left: the first of several would be the
383
+ // schema's conditional artifact as often as not.
384
+ missingPrerequisites.length === 1 ? missingPrerequisites[0] : undefined, { many: missingPrerequisites.length > 1 })}`;
385
+ }
386
+ else if (tracksFile && !tracksFileExists) {
387
+ // Tracking file configured but doesn't exist yet
388
+ const tracksFilename = path.basename(tracksFile);
389
+ state = 'blocked';
390
+ instruction =
391
+ `The ${tracksFilename} file is missing and must be created.` +
392
+ `\n${describeArtifactRemedy(changeName, findArtifactIdFor(schema, tracksFile))}`;
393
+ }
394
+ else if (tracksFile && unavailableTrackingFiles.length > 0 && tasks.length === 0) {
395
+ state = 'blocked';
396
+ instruction = 'No readable task descriptions are available.';
397
+ }
398
+ else if (tracksFile && tracksFileExists && tasks.length === 0) {
399
+ // Tracking file exists but lists nothing an agent can work on: either no
400
+ // checkboxes at all, or only checkboxes with no text after them.
401
+ const tracksFilename = path.basename(tracksFile);
402
+ state = 'blocked';
403
+ instruction =
404
+ `The ${tracksFilename} file exists but contains no tasks to work on.` +
405
+ `\nAdd tasks to ${tracksFilename}, or rebuild it: ${describeArtifactRemedy(changeName, findArtifactIdFor(schema, tracksFile))}`;
406
+ }
407
+ else if (tracksFile &&
408
+ unavailableTrackingFiles.length === 0 &&
409
+ remaining === 0 &&
410
+ total > 0) {
411
+ state = 'all_done';
412
+ instruction = 'All tracked tasks are complete.\nReview or verify the change as appropriate before archiving.';
413
+ }
414
+ else if (!tracksFile) {
415
+ // No tracking file configured in schema - ready to apply
416
+ state = 'ready';
417
+ instruction = schemaInstruction?.trim() ?? 'All required artifacts complete. Proceed with implementation.';
418
+ }
419
+ else {
420
+ state = 'ready';
421
+ instruction = schemaInstruction?.trim() ?? 'Read context files, work through pending tasks, mark complete as you go.\nPause if you hit blockers or need clarification.';
422
+ }
423
+ if (unavailableTrackingFiles.length > 0) {
424
+ const unavailableDetails = unavailableTrackingFiles
425
+ .map((file) => `- ${file.path}: ${file.reason}`)
426
+ .join('\n');
427
+ instruction += `\nTask completion is not verified because tracking evidence was unavailable:\n${unavailableDetails}`;
428
+ }
429
+ const warnings = [...(context.warnings ?? [])];
430
+ return {
431
+ changeName,
432
+ changeDir,
433
+ schemaName: context.schemaName,
434
+ contextFiles,
435
+ progress: { total, complete, remaining },
436
+ tasks,
437
+ taskTrackingConfigured: tracksFile !== null,
438
+ ...(unavailableTrackingFiles.length > 0 ? { unavailableTrackingFiles } : {}),
439
+ state,
440
+ missingArtifacts: missingArtifacts.length > 0 ? missingArtifacts : undefined,
441
+ ...(missingPrerequisites.length > 0 ? { missingPrerequisites } : {}),
442
+ ...(warnings.length > 0 ? { warnings } : {}),
443
+ instruction,
444
+ ...operationInputs,
445
+ };
446
+ }
447
+ export async function applyInstructionsCommand(options) {
448
+ // Resolve (and banner) before the spinner starts so stderr stays readable.
449
+ const root = await resolveRootForCommand(options, { json: options.json });
450
+ if (!root) {
451
+ return;
452
+ }
453
+ let spinner;
454
+ if (!options.json) {
455
+ const { default: ora } = await import('ora');
456
+ spinner = ora('Generating apply instructions...').start();
457
+ }
458
+ try {
459
+ const planningHome = toPlanningHome(root);
460
+ const projectRoot = root.path;
461
+ const changeName = await validateChangeExists(options.change, projectRoot, root.changesDir, { newChangeHint: 'freespec new change <name>' });
462
+ // Validate schema if explicitly provided
463
+ if (options.schema) {
464
+ validateSchemaExists(options.schema, projectRoot);
465
+ }
466
+ // One parsed config snapshot supplies schema fallback, references, context,
467
+ // and operation guidance for this command.
468
+ const { projectConfig } = loadRootConfigContext(root);
469
+ const instructions = await generateApplyInstructions(projectRoot, changeName, options.schema, {
470
+ planningHome,
471
+ projectConfig,
472
+ });
473
+ spinner?.stop();
474
+ if (options.json) {
475
+ console.log(JSON.stringify({ ...instructions, root: toRootOutput(root) }, null, 2));
476
+ return;
477
+ }
478
+ printApplyInstructionsText(instructions);
479
+ }
480
+ catch (error) {
481
+ spinner?.stop();
482
+ throw error;
483
+ }
484
+ }
485
+ export function printApplyInstructionsText(instructions) {
486
+ const { changeName, schemaName, contextFiles, progress, tasks, state, missingArtifacts, warnings, instruction } = instructions;
487
+ console.log(`## Apply: ${changeName}`);
488
+ console.log(`Schema: ${schemaName}`);
489
+ console.log();
490
+ // Warning for blocked state
491
+ if (state === 'blocked' && missingArtifacts) {
492
+ console.log('### ⚠️ Blocked');
493
+ console.log();
494
+ console.log(`Missing artifacts: ${missingArtifacts.join(', ')}`);
495
+ if (instructions.missingPrerequisites &&
496
+ instructions.missingPrerequisites.length > missingArtifacts.length) {
497
+ console.log(`Not created yet, in build order: ${instructions.missingPrerequisites.join(', ')}`);
498
+ }
499
+ console.log();
500
+ }
501
+ if (warnings && warnings.length > 0) {
502
+ console.log('### ⚠️ Warnings');
503
+ console.log();
504
+ for (const warning of warnings) {
505
+ console.log(`- ${warning}`);
506
+ }
507
+ console.log();
508
+ }
509
+ // Context files (dynamically from schema)
510
+ const contextFileEntries = Object.entries(contextFiles);
511
+ if (contextFileEntries.length > 0) {
512
+ console.log('### Context Files');
513
+ for (const [artifactId, filePaths] of contextFileEntries) {
514
+ for (const filePath of filePaths) {
515
+ console.log(`- ${artifactId}: ${filePath}`);
516
+ }
517
+ }
518
+ console.log();
519
+ }
520
+ // Progress (only show if we have tracking)
521
+ if (progress.total > 0 || tasks.length > 0) {
522
+ console.log('### Progress');
523
+ if (state === 'all_done') {
524
+ console.log(`${progress.complete}/${progress.total} complete ✓`);
525
+ }
526
+ else {
527
+ console.log(`${progress.complete}/${progress.total} complete`);
528
+ }
529
+ console.log();
530
+ }
531
+ // Tasks
532
+ if (tasks.length > 0) {
533
+ console.log('### Tasks');
534
+ for (const task of tasks) {
535
+ const checkbox = task.done ? '[x]' : '[ ]';
536
+ console.log(`- ${checkbox} ${task.description}`);
537
+ }
538
+ console.log();
539
+ }
540
+ // Instruction
541
+ console.log('### Instruction');
542
+ console.log(instruction);
543
+ console.log();
544
+ printOperationInputsText(instructions);
545
+ }
546
+ function printOperationInputsText(inputs) {
547
+ if (inputs.context) {
548
+ console.log('### Project Context (required instruction input)');
549
+ // Printed verbatim on purpose. Escaping a leading `#` would also fire inside
550
+ // fenced code (`# install deps`), so heading forgery is not guarded here.
551
+ console.log(inputs.context);
552
+ console.log();
553
+ }
554
+ if (inputs.operationGuidance && inputs.operationGuidance.length > 0) {
555
+ console.log('### Operation Guidance (advisory)');
556
+ for (const guidance of inputs.operationGuidance) {
557
+ console.log(`- ${sanitizeInline(guidance, Infinity)}`);
558
+ }
559
+ console.log();
560
+ }
561
+ if (!inputs.context && !inputs.operationGuidance) {
562
+ console.log('No project context or operation guidance configured.');
563
+ }
564
+ }
565
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * New Change Command
3
+ *
4
+ * Creates a new change directory with optional description and schema in the
5
+ * resolved FreeSpec root. Initiative linking and workspace affected areas
6
+ * are no longer part of this command.
7
+ */
8
+ export interface NewChangeOptions {
9
+ description?: string;
10
+ goal?: string;
11
+ schema?: string;
12
+ store?: string;
13
+ storePath?: string;
14
+ initiative?: string;
15
+ areas?: string;
16
+ json?: boolean;
17
+ }
18
+ export declare function newChangeCommand(name: string | undefined, options: NewChangeOptions): Promise<void>;
19
+ //# sourceMappingURL=new-change.d.ts.map