@astryxdesign/cli 0.7.2 → 0.7.3-canary.06872b4

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 (212) hide show
  1. package/README.md +99 -66
  2. package/api/build/_adapter.d.mts +58 -0
  3. package/api/build/_adapter.mjs +115 -3
  4. package/api/build/blocks/blocks.d.mts +42 -0
  5. package/api/build/blocks/blocks.mjs +169 -0
  6. package/api/build/blocks/blocks.test.mjs +108 -0
  7. package/api/build/blocks/blocks.weights.json +1 -0
  8. package/api/build/build.mjs +25 -6
  9. package/api/build/kit/answer.d.mts +14 -0
  10. package/api/build/kit/answer.mjs +85 -0
  11. package/api/build/kit/answer.test.mjs +38 -0
  12. package/api/build/kit/kind.d.mts +25 -0
  13. package/api/build/kit/kind.mjs +170 -0
  14. package/api/build/kit/kit.d.mts +2 -4
  15. package/api/build/kit/kit.mjs +8 -398
  16. package/api/build/kit/rank.d.mts +3 -32
  17. package/api/build/kit/rank.mjs +25 -342
  18. package/api/build/kit/rank.test.mjs +2 -1
  19. package/api/build/kit/signals.d.mts +60 -0
  20. package/api/build/kit/signals.mjs +284 -0
  21. package/api/build/kit/start.d.mts +32 -0
  22. package/api/build/kit/start.mjs +163 -0
  23. package/api/build/kit/words.d.mts +72 -0
  24. package/api/build/kit/words.mjs +202 -0
  25. package/api/build/tree.d.mts +20 -0
  26. package/api/build/tree.mjs +52 -0
  27. package/api/build/tree.test.mjs +177 -0
  28. package/api/build/tree.weights.json +1 -0
  29. package/api/component/component.mjs +16 -2
  30. package/api/component/component.test.mjs +15 -0
  31. package/api/discover/_adapter.mjs +36 -9
  32. package/api/discover/_adapter.test.mjs +42 -0
  33. package/api/docs/_adapter.mjs +17 -5
  34. package/api/docs/docs.test.mjs +7 -1
  35. package/api/doctor/doctor.mjs +86 -12
  36. package/api/doctor/doctor.test.mjs +28 -3
  37. package/api/init/init.doc.mjs +20 -6
  38. package/api/init/init.test.mjs +18 -2
  39. package/api/init/init.type.d.mts +3 -3
  40. package/api/init/init.type.mjs +3 -3
  41. package/api/init/remove/remove.mjs +17 -4
  42. package/api/init/remove/remove.test.mjs +114 -2
  43. package/api/init/run/run.mjs +69 -6
  44. package/api/integration/authoring-checks.mjs +83 -9
  45. package/api/integration/pack-check.mjs +123 -4
  46. package/api/integration/pack-check.test.mjs +87 -0
  47. package/api/integration/validate-integration-case-disk.test.mjs +111 -0
  48. package/api/integration/validate-integration-gaps.test.mjs +1964 -0
  49. package/api/integration/validate-integration.d.mts +11 -2
  50. package/api/integration/validate-integration.mjs +226 -32
  51. package/api/integration/validate-integration.type.d.mts +58 -1
  52. package/api/integration/validate-integration.type.mjs +45 -2
  53. package/api/integration/validateIntegration.doc.mjs +1 -1
  54. package/api/search/ORDERING.md +28 -0
  55. package/api/search/_adapter.d.mts +66 -2
  56. package/api/search/_adapter.mjs +118 -10
  57. package/api/search/_candidate-score.d.mts +40 -0
  58. package/api/search/_candidate-score.mjs +238 -0
  59. package/api/search/_cards.json +6098 -0
  60. package/api/search/_compound.d.mts +50 -0
  61. package/api/search/_compound.mjs +170 -0
  62. package/api/search/_doc-searcher.d.mts +4 -0
  63. package/api/search/_doc-searcher.mjs +23 -0
  64. package/api/search/_doc-searcher.test.mjs +36 -0
  65. package/api/search/_doc-searcher.weights.json +1 -0
  66. package/api/search/_doc-text.d.mts +30 -0
  67. package/api/search/_doc-text.mjs +87 -0
  68. package/api/search/_entries.d.mts +52 -0
  69. package/api/search/_entries.mjs +158 -0
  70. package/api/search/_features.d.mts +35 -0
  71. package/api/search/_features.mjs +155 -0
  72. package/api/search/_gather-components.d.mts +26 -0
  73. package/api/search/_gather-components.mjs +284 -0
  74. package/api/search/_gather-docs.d.mts +20 -0
  75. package/api/search/_gather-docs.mjs +254 -0
  76. package/api/search/_gather-hooks.d.mts +12 -0
  77. package/api/search/_gather-hooks.mjs +52 -0
  78. package/api/search/_gather-templates.d.mts +25 -0
  79. package/api/search/_gather-templates.mjs +107 -0
  80. package/api/search/_lexical.d.mts +135 -0
  81. package/api/search/_lexical.mjs +351 -0
  82. package/api/search/_main-searcher.d.mts +19 -0
  83. package/api/search/_main-searcher.mjs +115 -0
  84. package/api/search/_main-searcher.test.mjs +106 -0
  85. package/api/search/_main-searcher.weights.json +1 -0
  86. package/api/search/_module-doc.d.mts +32 -0
  87. package/api/search/_module-doc.mjs +78 -0
  88. package/api/search/_order.d.mts +32 -0
  89. package/api/search/_order.mjs +162 -0
  90. package/api/search/_order.test.mjs +72 -0
  91. package/api/search/_priority.d.mts +50 -0
  92. package/api/search/_priority.mjs +139 -0
  93. package/api/search/_query-words.d.mts +25 -0
  94. package/api/search/_query-words.mjs +92 -0
  95. package/api/search/_query.d.mts +65 -0
  96. package/api/search/_query.mjs +176 -0
  97. package/api/search/_result.d.mts +97 -0
  98. package/api/search/_result.mjs +150 -0
  99. package/api/search/_score.d.mts +60 -0
  100. package/api/search/_score.mjs +283 -0
  101. package/api/search/_synonyms.d.mts +21 -0
  102. package/api/search/_synonyms.mjs +67 -0
  103. package/api/search/_template-searcher.d.mts +4 -0
  104. package/api/search/_template-searcher.mjs +23 -0
  105. package/api/search/_template-searcher.test.mjs +40 -0
  106. package/api/search/_template-searcher.weights.json +1 -0
  107. package/api/search/_titles.d.mts +33 -0
  108. package/api/search/_titles.mjs +65 -0
  109. package/api/search/_words.d.mts +64 -0
  110. package/api/search/_words.mjs +157 -0
  111. package/api/search/search.d.mts +22 -305
  112. package/api/search/search.doc.mjs +7 -5
  113. package/api/search/search.mjs +53 -2483
  114. package/api/search/search.type.d.mts +6 -1
  115. package/api/search/search.type.mjs +6 -1
  116. package/api/search/tree.d.mts +15 -0
  117. package/api/search/tree.mjs +40 -0
  118. package/api/search/tree.test.mjs +66 -0
  119. package/api/search/tree.weights.json +1 -0
  120. package/api/theme/build/build.packed-old-core.test.mjs +1 -0
  121. package/api/upgrade/_adapter.d.mts +57 -9
  122. package/api/upgrade/_adapter.mjs +198 -28
  123. package/api/upgrade/registry/registry.d.mts +10 -4
  124. package/api/upgrade/registry/registry.mjs +33 -16
  125. package/api/upgrade/registry/registry.test.mjs +85 -0
  126. package/api/upgrade/run/run.d.mts +4 -2
  127. package/api/upgrade/run/run.mjs +13 -2
  128. package/api/upgrade/run/run.test.mjs +417 -3
  129. package/api/upgrade/upgrade.doc.mjs +10 -5
  130. package/api/upgrade/upgrade.mjs +13 -2
  131. package/api/upgrade/upgrade.test.mjs +194 -0
  132. package/api/upgrade/upgrade.type.d.mts +5 -3
  133. package/api/upgrade/upgrade.type.mjs +8 -6
  134. package/assets/codemods/transforms/v0.7.0/__tests__/validate-data-token-ownership.test.mjs +11 -0
  135. package/assets/codemods/transforms/v0.7.0/validate-data-token-ownership.mjs +3 -3
  136. package/assets/docs/is-my-code-good.doc.mjs +287 -0
  137. package/assets/docs/tree/api.doc.mjs +6 -0
  138. package/assets/docs/tree/host-entry.doc.mjs +128 -0
  139. package/assets/docs/tree/template-grading-rubric.doc.mjs +16 -37
  140. package/assets/docs/tree/tokens-data.doc.mjs +2 -2
  141. package/assets/docs/working-with-ai.doc.mjs +6 -2
  142. package/assets/templates/themes/butter/butterTheme.ts +4 -2
  143. package/assets/templates/themes/stone/stoneTheme.ts +4 -2
  144. package/assets/templates/themes/y2k/y2kTheme.ts +4 -2
  145. package/authoring/debug/parse.d.mts +1 -1
  146. package/clients/cli/bin/astryx.mjs +7 -78
  147. package/clients/cli/commands/doctor.mjs +30 -0
  148. package/clients/cli/commands/doctor.test.mjs +65 -0
  149. package/clients/cli/commands/init.behavior.test.mjs +230 -1
  150. package/clients/cli/commands/init.doc.mjs +28 -9
  151. package/clients/cli/commands/init.flag-help.test.mjs +1 -0
  152. package/clients/cli/commands/init.mjs +2 -2
  153. package/clients/cli/commands/outside-project.test.mjs +2 -1
  154. package/clients/cli/commands/setup-nudge.test.mjs +61 -0
  155. package/clients/cli/commands/upgrade.doc.mjs +4 -2
  156. package/clients/cli/commands/upgrade.mjs +9 -2
  157. package/clients/cli/commands/upgrade.subfolder-path.test.mjs +97 -0
  158. package/clients/cli/index.mjs +19 -1
  159. package/clients/cli/run.mjs +108 -0
  160. package/foundation/agent-docs/agent-doc-state.d.mts +20 -7
  161. package/foundation/agent-docs/agent-doc-state.mjs +35 -8
  162. package/foundation/agent-docs/agent-docs.d.mts +100 -12
  163. package/foundation/agent-docs/agent-docs.mjs +1010 -99
  164. package/foundation/agent-docs/agent-docs.path-safety.test.mjs +1239 -17
  165. package/foundation/agent-docs/agent-docs.test.mjs +678 -35
  166. package/foundation/config/project.mjs +20 -22
  167. package/foundation/config/project.test.mjs +56 -0
  168. package/foundation/discovery/component-discovery.d.mts +37 -0
  169. package/foundation/discovery/component-discovery.mjs +80 -5
  170. package/foundation/discovery/component-loader.d.mts +1 -1
  171. package/foundation/discovery/docs-discovery.mjs +14 -1
  172. package/foundation/discovery/module-exports.d.mts +41 -0
  173. package/foundation/discovery/module-exports.mjs +253 -0
  174. package/foundation/discovery/template-adapter.mjs +18 -1
  175. package/foundation/discovery/template-needs.mjs +1 -44
  176. package/foundation/discovery/theme-discovery.mjs +147 -3
  177. package/foundation/doc-compiler/doc-loads.test.mjs +8 -0
  178. package/foundation/doc-compiler/read.mjs +59 -1
  179. package/foundation/doc-compiler/read.test.mjs +11 -2
  180. package/foundation/fs/paths.d.mts +70 -8
  181. package/foundation/fs/paths.mjs +556 -38
  182. package/foundation/fs/paths.test.mjs +430 -54
  183. package/foundation/integrations/autolink.d.mts +2 -1
  184. package/foundation/integrations/autolink.mjs +4 -13
  185. package/foundation/integrations/computer-integrations.d.mts +6 -3
  186. package/foundation/integrations/computer-integrations.mjs +38 -9
  187. package/foundation/integrations/contribution-inventory.d.mts +15 -20
  188. package/foundation/integrations/contribution-inventory.mjs +41 -5
  189. package/foundation/integrations/integrations.d.mts +27 -1
  190. package/foundation/integrations/integrations.mjs +61 -2
  191. package/foundation/integrations/validate-contributions.d.mts +115 -0
  192. package/foundation/integrations/validate-contributions.mjs +1168 -13
  193. package/foundation/release/handoff.d.mts +23 -4
  194. package/foundation/release/handoff.mjs +175 -8
  195. package/foundation/release/run-context.mjs +14 -0
  196. package/foundation/response/response-types.doc.mjs +1 -1
  197. package/foundation/route/route.d.mts +285 -0
  198. package/foundation/route/route.mjs +324 -0
  199. package/foundation/route/route.test.mjs +153 -0
  200. package/foundation/runtime/hosted-runtime.test.mjs +403 -0
  201. package/foundation/runtime/locked-versions.d.mts +32 -0
  202. package/foundation/runtime/locked-versions.mjs +65 -0
  203. package/foundation/runtime/package-root.d.mts +91 -0
  204. package/foundation/runtime/package-root.mjs +174 -0
  205. package/foundation/runtime/package-set.d.mts +62 -0
  206. package/foundation/runtime/package-set.mjs +130 -0
  207. package/foundation/runtime/package-set.test.mjs +432 -0
  208. package/host/door-conformance.test.mjs +274 -0
  209. package/host/index.d.ts +116 -0
  210. package/host/index.mjs +295 -0
  211. package/host/index.test.mjs +302 -0
  212. package/package.json +14 -9
@@ -0,0 +1,302 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file The host entry, `@astryxdesign/cli/host` (spec AST-081 FR1): every
5
+ * input is checked before anything runs, one run per process, a run matches
6
+ * the bin's, printed commands start with the host's command name, and a
7
+ * project CLI the host declined is never run (FR2, FR9).
8
+ */
9
+
10
+ import {describe, it, expect, afterEach} from 'vitest';
11
+ import {spawnSync} from 'node:child_process';
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import {fileURLToPath} from 'node:url';
15
+ import {
16
+ cleanupFixtures,
17
+ installCore,
18
+ installStandInCli,
19
+ project,
20
+ tempDir,
21
+ } from '../test-utils/release-fixtures.mjs';
22
+ import {runHostedCli} from './index.mjs';
23
+
24
+ const HOST = fileURLToPath(new URL('./index.mjs', import.meta.url));
25
+ const BIN = fileURLToPath(
26
+ new URL('../clients/cli/bin/astryx.mjs', import.meta.url),
27
+ );
28
+ const SELF_VERSION = JSON.parse(
29
+ fs.readFileSync(
30
+ fileURLToPath(new URL('../package.json', import.meta.url)),
31
+ 'utf-8',
32
+ ),
33
+ ).version;
34
+
35
+ afterEach(cleanupFixtures);
36
+
37
+ /**
38
+ * A private home and cache, offline, and none of the test runner's package
39
+ * manager or CI settings.
40
+ * @returns {Record<string, string>}
41
+ */
42
+ function cleanEnv() {
43
+ const home = tempDir('home');
44
+ const cache = tempDir('cache');
45
+ return {
46
+ ...Object.fromEntries(
47
+ Object.entries(process.env).filter(
48
+ ([key]) => !/^(?:npm_|CI$|NO_UPDATE_NOTIFIER$)/iu.test(key),
49
+ ),
50
+ ),
51
+ HOME: home,
52
+ USERPROFILE: home,
53
+ XDG_CACHE_HOME: cache,
54
+ LOCALAPPDATA: cache,
55
+ XDG_CONFIG_HOME: path.join(home, '.config'),
56
+ APPDATA: path.join(home, 'AppData', 'Roaming'),
57
+ NO_COLOR: '1',
58
+ npm_config_registry: 'http://127.0.0.1:9',
59
+ };
60
+ }
61
+
62
+ /**
63
+ * Start a host process that calls `runHostedCli` with `options` (once, or
64
+ * twice with `{twice: true}`) and exits with the returned status.
65
+ * @param {Record<string, unknown>} options
66
+ * @param {{twice?: boolean, env?: Record<string, string>}} [extra]
67
+ */
68
+ function host(options, extra = {}) {
69
+ const script = `
70
+ const {runHostedCli} = await import(${JSON.stringify(HOST)});
71
+ const options = ${JSON.stringify(options)};
72
+ ${
73
+ extra.twice
74
+ ? `const first = runHostedCli(options);
75
+ try { await runHostedCli(options); } catch (err) { process.stderr.write('second: ' + err.message + '\\n'); }
76
+ const {status} = await first;`
77
+ : `const {status} = await runHostedCli(options);`
78
+ }
79
+ process.exitCode = status;
80
+ `;
81
+ const result = spawnSync(
82
+ process.execPath,
83
+ ['--input-type=module', '-e', script],
84
+ {
85
+ cwd: tempDir('host-cwd'),
86
+ encoding: 'utf-8',
87
+ env: extra.env ?? cleanEnv(),
88
+ timeout: 60_000,
89
+ },
90
+ );
91
+ return {status: result.status, stdout: result.stdout, stderr: result.stderr};
92
+ }
93
+
94
+ /**
95
+ * Run the bin itself in `cwd`.
96
+ * @param {string} cwd
97
+ * @param {string[]} args
98
+ * @param {Record<string, string>} env
99
+ */
100
+ function bin(cwd, args, env) {
101
+ const result = spawnSync(process.execPath, [BIN, ...args], {
102
+ cwd,
103
+ encoding: 'utf-8',
104
+ env,
105
+ timeout: 60_000,
106
+ });
107
+ return {status: result.status, stdout: result.stdout, stderr: result.stderr};
108
+ }
109
+
110
+ describe('inputs', () => {
111
+ it('rejects every invalid input before running anything', async () => {
112
+ const before = process.cwd();
113
+ const cases = [
114
+ [null, /options must be an object/u],
115
+ [['--version'], /options must be an object/u],
116
+ [{handlers: {}}, /unknown option "handlers"/u],
117
+ [
118
+ {projectCliAlreadyHandled: true},
119
+ /unknown option "projectCliAlreadyHandled"/u,
120
+ ],
121
+ [{roots: '/tmp'}, /roots must be an array of folder paths/u],
122
+ [{roots: ['']}, /roots must be an array of folder paths/u],
123
+ [
124
+ {roots: [path.join(tempDir(), 'missing')]},
125
+ /roots names a path that is not a folder/u,
126
+ ],
127
+ [
128
+ {integrations: 'acme'},
129
+ /integrations must be an array of package names/u,
130
+ ],
131
+ [
132
+ {integrations: ['Acme Widgets']},
133
+ /integrations must be an array of package names/u,
134
+ ],
135
+ [
136
+ {integrations: ['../acme']},
137
+ /integrations must be an array of package names/u,
138
+ ],
139
+ [
140
+ {discoverSources: [{}]},
141
+ /discoverSources must be an array of functions/u,
142
+ ],
143
+ [{argv: '--version'}, /argv must be an array of strings/u],
144
+ [{argv: [1]}, /argv must be an array of strings/u],
145
+ [{cwd: 7}, /cwd must be a folder path/u],
146
+ [{cwd: path.join(tempDir(), 'missing')}, /cwd is not a folder/u],
147
+ [{cliCommand: ''}, /cliCommand/u],
148
+ [{cliCommand: ' acme astryx'}, /cliCommand/u],
149
+ [{cliCommand: 'acme\nastryx'}, /cliCommand/u],
150
+ [{cliCommand: 'a'.repeat(121)}, /cliCommand/u],
151
+ [{cliCommand: 'acme ASTRYX:START'}, /cliCommand/u],
152
+ [
153
+ {declinedProjectCli: ''},
154
+ /declinedProjectCli must be a non-blank single line/u,
155
+ ],
156
+ [
157
+ {declinedProjectCli: 'a\nb'},
158
+ /declinedProjectCli must be a non-blank single line/u,
159
+ ],
160
+ [
161
+ {declinedProjectCli: ' untrusted'},
162
+ /declinedProjectCli must be a non-blank single line/u,
163
+ ],
164
+ [
165
+ {declinedProjectCli: 'x'.repeat(121)},
166
+ /declinedProjectCli must be a non-blank single line/u,
167
+ ],
168
+ [
169
+ {declinedProjectCli: 3},
170
+ /declinedProjectCli must be a non-blank single line/u,
171
+ ],
172
+ ];
173
+ for (const [options, message] of cases) {
174
+ await expect(runHostedCli(/** @type {any} */ (options))).rejects.toThrow(
175
+ message,
176
+ );
177
+ }
178
+ await expect(
179
+ runHostedCli(/** @type {any} */ ({argv: 'x'})),
180
+ ).rejects.toBeInstanceOf(TypeError);
181
+ expect(process.cwd()).toBe(before);
182
+ });
183
+ });
184
+
185
+ describe('one run per process', () => {
186
+ it('fails a second call before it runs anything, and the first run completes', () => {
187
+ const empty = tempDir('empty');
188
+ const result = host({argv: ['--version'], cwd: empty}, {twice: true});
189
+ expect(result.status).toBe(0);
190
+ expect(result.stdout.trim()).toBe(SELF_VERSION);
191
+ expect(result.stderr).toMatch(
192
+ /second: runHostedCli: a run already started in this process/u,
193
+ );
194
+ });
195
+ });
196
+
197
+ describe('a hosted run matches the bin', () => {
198
+ it('gives the same exit status, output, and standard-error line', () => {
199
+ const empty = tempDir('empty');
200
+ const env = cleanEnv();
201
+ for (const args of [
202
+ ['--version'],
203
+ ['component', 'Buttn'],
204
+ ['docs', '--json'],
205
+ ]) {
206
+ const direct = bin(empty, args, env);
207
+ const hosted = host({argv: args, cwd: empty}, {env});
208
+ expect(hosted.status).toBe(direct.status);
209
+ expect(hosted.stdout).toBe(direct.stdout);
210
+ expect(hosted.stderr).toBe(direct.stderr);
211
+ }
212
+ });
213
+ });
214
+
215
+ describe('the command name', () => {
216
+ it('starts the commands help prints with the host name', () => {
217
+ const empty = tempDir('empty');
218
+ const hosted = host({
219
+ argv: ['--help'],
220
+ cwd: empty,
221
+ cliCommand: 'acme astryx',
222
+ });
223
+ expect(hosted.status).toBe(0);
224
+ expect(hosted.stdout).toContain('See acme astryx docs global.');
225
+ const direct = host({argv: ['--help'], cwd: empty});
226
+ expect(direct.stdout).not.toContain('acme astryx');
227
+ });
228
+ });
229
+
230
+ describe('a project CLI the host declined', () => {
231
+ /** A project whose own CLI is a stand-in that reports when it runs. */
232
+ function projectWithCli(version, core = version) {
233
+ const root = project(tempDir(), {
234
+ '@astryxdesign/core': core,
235
+ '@astryxdesign/cli': version,
236
+ });
237
+ installCore(root, core);
238
+ installStandInCli(root, version);
239
+ return root;
240
+ }
241
+
242
+ it('without a reason, the run is handed to the project CLI', () => {
243
+ const root = projectWithCli('0.6.8');
244
+ const result = host({argv: ['--version'], cwd: root});
245
+ expect(result.status).toBe(0);
246
+ expect(result.stdout.trim()).toBe('0.6.8');
247
+ });
248
+
249
+ it.each(['cannot-start', 'untrusted'])(
250
+ '%s: another release answers itself, with the fallback warning naming the reason',
251
+ reason => {
252
+ const root = projectWithCli('0.6.8');
253
+ const text = host({
254
+ argv: ['--version'],
255
+ cwd: root,
256
+ declinedProjectCli: reason,
257
+ });
258
+ expect(text.status).toBe(0);
259
+ expect(text.stdout.trim()).toBe(SELF_VERSION);
260
+ expect(text.stderr).not.toContain('stand-in');
261
+ expect(text.stderr.trim()).toBe(
262
+ `astryx: could not get Astryx 0.6.8 to match this project's Core (project CLI skipped: ${reason}); answering with CLI ${SELF_VERSION} instead`,
263
+ );
264
+ const json = host({
265
+ argv: ['docs', '--json'],
266
+ cwd: root,
267
+ declinedProjectCli: reason,
268
+ });
269
+ expect(json.status).toBe(0);
270
+ expect(json.stderr).toBe('');
271
+ expect(JSON.parse(json.stdout).meta.answeredBy.copy).toBe('fallback');
272
+ },
273
+ );
274
+
275
+ it("the declined CLI's own release answers in its place, named as that CLI's release", () => {
276
+ // The project's CLI is this release while its Core is another, so the
277
+ // answer is the project CLI's release, not the release matched to Core.
278
+ const root = projectWithCli(SELF_VERSION, '0.6.8');
279
+ const json = host({
280
+ argv: ['docs', '--json'],
281
+ cwd: root,
282
+ declinedProjectCli: 'untrusted',
283
+ });
284
+ expect(json.status).toBe(0);
285
+ expect(json.stderr).toBe('');
286
+ expect(JSON.parse(json.stdout).meta.answeredBy).toMatchObject({
287
+ cli: SELF_VERSION,
288
+ core: '0.6.8',
289
+ copy: 'project',
290
+ });
291
+ const text = host({
292
+ argv: ['--version'],
293
+ cwd: root,
294
+ declinedProjectCli: 'untrusted',
295
+ });
296
+ expect(text.status).toBe(0);
297
+ expect(text.stdout.trim()).toBe(SELF_VERSION);
298
+ expect(text.stderr.trim()).toBe(
299
+ `astryx: answered by CLI ${SELF_VERSION}, the release of this project's CLI, in its place (project CLI skipped: untrusted)`,
300
+ );
301
+ });
302
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astryxdesign/cli",
3
- "version": "0.7.2",
3
+ "version": "0.7.3-canary.06872b4",
4
4
  "displayName": "CLI",
5
5
  "description": "Scaffold projects, browse templates, generate themes, and get agent-ready docs from the command line.",
6
6
  "author": "Meta Open Source",
@@ -42,6 +42,10 @@
42
42
  "types": "./api/index.d.mts",
43
43
  "import": "./api/index.mjs"
44
44
  },
45
+ "./host": {
46
+ "types": "./host/index.d.ts",
47
+ "import": "./host/index.mjs"
48
+ },
45
49
  "./authoring": {
46
50
  "types": "./authoring/index.d.ts",
47
51
  "import": "./authoring/index.mjs"
@@ -81,6 +85,7 @@
81
85
  "assets",
82
86
  "authoring",
83
87
  "foundation",
88
+ "host",
84
89
  "scripts/postinstall.mjs",
85
90
  "CHANGELOG.md"
86
91
  ],
@@ -101,10 +106,10 @@
101
106
  "zod": "^4.4.3"
102
107
  },
103
108
  "peerDependencies": {
104
- "@astryxdesign/charts": "*",
105
- "@astryxdesign/core": "*",
106
- "@astryxdesign/lab": "*",
107
- "@astryxdesign/theme-neutral": "*"
109
+ "@astryxdesign/charts": "0.7.3-canary.06872b4",
110
+ "@astryxdesign/core": "0.7.3-canary.06872b4",
111
+ "@astryxdesign/lab": "0.7.3-canary.06872b4",
112
+ "@astryxdesign/theme-neutral": "0.7.3-canary.06872b4"
108
113
  },
109
114
  "peerDependenciesMeta": {
110
115
  "@astryxdesign/charts": {
@@ -121,10 +126,10 @@
121
126
  }
122
127
  },
123
128
  "devDependencies": {
124
- "@astryxdesign/charts": "*",
125
- "@astryxdesign/core": "*",
126
- "@astryxdesign/lab": "*",
127
- "@astryxdesign/theme-neutral": "*",
129
+ "@astryxdesign/charts": "0.7.3-canary.06872b4",
130
+ "@astryxdesign/core": "0.7.3-canary.06872b4",
131
+ "@astryxdesign/lab": "0.7.3-canary.06872b4",
132
+ "@astryxdesign/theme-neutral": "0.7.3-canary.06872b4",
128
133
  "@heroicons/react": "^2.2.0",
129
134
  "@stylexjs/stylex": "^0.19.0",
130
135
  "@types/babel__core": "^7.20.5",