@astrale-os/cli 1.0.0-beta.32 → 1.0.0-beta.43
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.
- package/CHANGELOG.md +928 -0
- package/README.md +53 -43
- package/THIRD-PARTY-NOTICES.md +37 -1
- package/dist/astrale.js +349631 -83669
- package/dist/public/connect-core.js +16 -47
- package/dist/public/keys/index.js +1 -1
- package/dist/types/admin/contract.d.ts +11 -0
- package/dist/types/admin/graph/index.d.ts +1 -0
- package/dist/types/admin/graph/nodes.d.ts +12 -0
- package/dist/types/admin/instance/client.d.ts +2 -0
- package/dist/types/connection/lifetime.d.ts +1 -1
- package/dist/types/errors.d.ts +3 -0
- package/dist/types/lib/proc.d.ts +1 -0
- package/dist/types/lib/update.d.ts +15 -7
- package/package.json +8 -6
- package/studio/client/dist/assets/index-5C1uT6ML.css +2 -0
- package/studio/client/dist/assets/index-C4kNlvwF.js +80 -0
- package/studio/client/dist/assets/schema-studio-BR9d0faB.js +8 -0
- package/studio/client/dist/index.html +13 -2
- package/studio/package.json +2 -1
- package/studio/server/agent/ask.test.ts +7 -1
- package/studio/server/agent/bridge/grant.ts +15 -3
- package/studio/server/agent/prompts/system.test.ts +5 -0
- package/studio/server/agent/prompts/system.ts +19 -4
- package/studio/server/agent/routes.test.ts +39 -1
- package/studio/server/agent/routes.ts +3 -0
- package/studio/server/agent/run/coordinator.test.ts +7 -1
- package/studio/server/agent/run/preparation.ts +1 -0
- package/studio/server/agent/run/transcript.test.ts +47 -2
- package/studio/server/agent/run/transcript.ts +32 -3
- package/studio/server/api/documents.test.ts +31 -0
- package/studio/server/api/documents.ts +35 -1
- package/studio/server/api-agent-loadout.test.ts +7 -1
- package/studio/server/api.test.ts +7 -1
- package/studio/server/cache.ts +4 -4
- package/studio/server/detect.ts +9 -12
- package/studio/server/domain.test.ts +83 -3
- package/studio/server/domain.ts +205 -27
- package/studio/server/handoff/service.ts +1 -1
- package/studio/server/index.ts +5 -8
- package/studio/server/introspect/extractor.ts +111 -17
- package/studio/server/introspect/overlay-tsmorph.test.ts +9 -9
- package/studio/server/introspect/overlay.ts +1 -1
- package/studio/server/introspect/runtime.ts +9 -1
- package/studio/server/introspect/source-overlay/spans.ts +2 -5
- package/studio/server/lifecycle.ts +1 -1
- package/studio/server/state/baseline.test.ts +14 -0
- package/studio/server/state/baseline.ts +16 -2
- package/studio/server/watch.test.ts +2 -1
- package/studio/server/watch.ts +5 -2
- package/studio/server/workspace/create.ts +9 -8
- package/studio/server/workspace-state.ts +4 -6
- package/studio/server/workspace-watch.ts +33 -22
- package/studio/shared/contracts/agent.ts +3 -0
- package/viewer/dist/main.js +12 -12
- package/src/__tests__/fixtures/publication.ts +0 -20
- package/src/admin/.spec/api.d.ts +0 -3
- package/src/admin/.spec/architecture.md +0 -22
- package/src/admin/.spec/icon.svg +0 -3
- package/src/admin/.spec/layout.ts +0 -6
- package/src/admin/__tests__/fixture.ts +0 -25
- package/src/admin/catalog/.spec/api.d.ts +0 -63
- package/src/admin/catalog/.spec/architecture.md +0 -7
- package/src/admin/catalog/.spec/icon.svg +0 -3
- package/src/admin/catalog/.spec/layout.ts +0 -6
- package/src/admin/catalog/__tests__/client.test.ts +0 -245
- package/src/admin/catalog/client.ts +0 -195
- package/src/admin/catalog/index.ts +0 -13
- package/src/admin/catalog/model.ts +0 -41
- package/src/admin/catalog/tsconfig.json +0 -8
- package/src/admin/contract.ts +0 -47
- package/src/admin/graph/.spec/api.d.ts +0 -22
- package/src/admin/graph/.spec/architecture.md +0 -5
- package/src/admin/graph/.spec/icon.svg +0 -3
- package/src/admin/graph/.spec/layout.ts +0 -3
- package/src/admin/graph/index.ts +0 -6
- package/src/admin/graph/nodes.ts +0 -56
- package/src/admin/index.ts +0 -2
- package/src/admin/instance/.spec/api.d.ts +0 -62
- package/src/admin/instance/.spec/architecture.md +0 -10
- package/src/admin/instance/.spec/icon.svg +0 -3
- package/src/admin/instance/.spec/layout.ts +0 -6
- package/src/admin/instance/__tests__/client.test.ts +0 -273
- package/src/admin/instance/client.ts +0 -191
- package/src/admin/instance/index.ts +0 -15
- package/src/admin/instance/model.ts +0 -59
- package/src/admin/instance/tsconfig.json +0 -8
- package/src/commands/__tests__/admin-instance.test.ts +0 -91
- package/src/commands/__tests__/auth-login.test.ts +0 -231
- package/src/commands/__tests__/auth-token.test.ts +0 -223
- package/src/commands/__tests__/call-describe.test.ts +0 -80
- package/src/commands/__tests__/call.test.ts +0 -63
- package/src/commands/__tests__/domain-install-operation.test.ts +0 -145
- package/src/commands/__tests__/domain-install-owned.test.ts +0 -191
- package/src/commands/__tests__/domain-list.test.ts +0 -133
- package/src/commands/__tests__/domain-uninstall.test.ts +0 -53
- package/src/commands/__tests__/install-direct.test.ts +0 -128
- package/src/commands/__tests__/install-identity-override.test.ts +0 -76
- package/src/commands/__tests__/instance-bookmark.test.ts +0 -166
- package/src/commands/__tests__/instance-list-admin.test.ts +0 -26
- package/src/commands/__tests__/instance-list-rows.test.ts +0 -64
- package/src/commands/__tests__/instance-status.test.ts +0 -139
- package/src/commands/__tests__/instance-use.test.ts +0 -67
- package/src/commands/__tests__/introspect-parse.test.ts +0 -100
- package/src/commands/__tests__/logs.test.ts +0 -345
- package/src/commands/__tests__/read-commands.test.ts +0 -377
- package/src/commands/__tests__/setup-plan.test.ts +0 -61
- package/src/commands/__tests__/studio-descriptor.test.ts +0 -22
- package/src/commands/__tests__/token-ttl.test.ts +0 -66
- package/src/commands/__tests__/update.test.ts +0 -95
- package/src/commands/__tests__/view-build.test.ts +0 -58
- package/src/commands/__tests__/view.test.ts +0 -197
- package/src/commands/admin/status.ts +0 -61
- package/src/commands/admin/use.ts +0 -100
- package/src/commands/auth/login.ts +0 -82
- package/src/commands/auth/logout.ts +0 -53
- package/src/commands/auth/status.ts +0 -86
- package/src/commands/auth/token.ts +0 -174
- package/src/commands/browser.ts +0 -236
- package/src/commands/call-describe.ts +0 -123
- package/src/commands/call.ts +0 -230
- package/src/commands/domain/install.ts +0 -575
- package/src/commands/domain/list.ts +0 -155
- package/src/commands/domain/publish.ts +0 -136
- package/src/commands/domain/uninstall.ts +0 -128
- package/src/commands/get.ts +0 -69
- package/src/commands/identity/__tests__/register.test.ts +0 -93
- package/src/commands/identity/create.ts +0 -35
- package/src/commands/identity/delete.ts +0 -24
- package/src/commands/identity/export.ts +0 -46
- package/src/commands/identity/import.ts +0 -61
- package/src/commands/identity/list.ts +0 -56
- package/src/commands/identity/register.ts +0 -195
- package/src/commands/identity/sync.ts +0 -38
- package/src/commands/identity/unsync.ts +0 -34
- package/src/commands/identity/use.ts +0 -24
- package/src/commands/identity/whoami.ts +0 -34
- package/src/commands/idp/add.ts +0 -150
- package/src/commands/idp/list.ts +0 -57
- package/src/commands/idp/refresh.ts +0 -38
- package/src/commands/idp/remove.ts +0 -36
- package/src/commands/idp/show.ts +0 -29
- package/src/commands/instance/active.ts +0 -73
- package/src/commands/instance/bookmark.ts +0 -101
- package/src/commands/instance/create.ts +0 -61
- package/src/commands/instance/delete.ts +0 -69
- package/src/commands/instance/forget.ts +0 -26
- package/src/commands/instance/list.ts +0 -197
- package/src/commands/instance/status.ts +0 -92
- package/src/commands/instance/use.ts +0 -263
- package/src/commands/introspect.ts +0 -129
- package/src/commands/logs.ts +0 -371
- package/src/commands/mutate.ts +0 -122
- package/src/commands/query.ts +0 -142
- package/src/commands/session/analyze.ts +0 -72
- package/src/commands/session/list.ts +0 -36
- package/src/commands/setup.ts +0 -54
- package/src/commands/status.ts +0 -60
- package/src/commands/studio.ts +0 -434
- package/src/commands/token.ts +0 -121
- package/src/commands/ui/__tests__/commands.test.ts +0 -152
- package/src/commands/ui/add.ts +0 -51
- package/src/commands/ui/doctor.ts +0 -21
- package/src/commands/ui/init.ts +0 -38
- package/src/commands/ui/list.ts +0 -26
- package/src/commands/ui/preset-apply.ts +0 -19
- package/src/commands/ui/preset-list.ts +0 -12
- package/src/commands/ui/shared.ts +0 -25
- package/src/commands/update.ts +0 -356
- package/src/commands/use.ts +0 -86
- package/src/commands/view-serve.ts +0 -26
- package/src/commands/view.ts +0 -658
- package/src/connect-core.test.ts +0 -38
- package/src/connect-core.ts +0 -42
- package/src/connection/.spec/api.d.ts +0 -110
- package/src/connection/.spec/architecture.md +0 -58
- package/src/connection/.spec/capabilities/connection.ts +0 -13
- package/src/connection/.spec/examples/call.ts +0 -7
- package/src/connection/.spec/flows/command.ts +0 -20
- package/src/connection/.spec/flows/session.ts +0 -62
- package/src/connection/.spec/laws/connection.ts +0 -213
- package/src/connection/.spec/layout.ts +0 -22
- package/src/connection/__tests__/auth.test.ts +0 -129
- package/src/connection/__tests__/ca-fetch.test.ts +0 -60
- package/src/connection/__tests__/call.test.ts +0 -17
- package/src/connection/__tests__/credential.test.ts +0 -254
- package/src/connection/__tests__/errors.test.ts +0 -577
- package/src/connection/__tests__/exchange.test.ts +0 -404
- package/src/connection/__tests__/failure-fixtures.ts +0 -39
- package/src/connection/__tests__/failure-safety.test.ts +0 -75
- package/src/connection/__tests__/fixtures/localhost-cert.pem +0 -19
- package/src/connection/__tests__/fixtures/localhost-key.base64 +0 -1
- package/src/connection/__tests__/managed.test.ts +0 -39
- package/src/connection/__tests__/reasons.test.ts +0 -78
- package/src/connection/__tests__/self.test.ts +0 -71
- package/src/connection/__tests__/session.test.ts +0 -144
- package/src/connection/__tests__/target.test.ts +0 -95
- package/src/connection/auth.ts +0 -265
- package/src/connection/call.ts +0 -7
- package/src/connection/command.ts +0 -67
- package/src/connection/credential.ts +0 -138
- package/src/connection/errors.ts +0 -1
- package/src/connection/exchange.ts +0 -394
- package/src/connection/failure/classify.ts +0 -110
- package/src/connection/failure/index.ts +0 -18
- package/src/connection/failure/model.ts +0 -28
- package/src/connection/failure/render.ts +0 -116
- package/src/connection/index.ts +0 -8
- package/src/connection/lifetime.ts +0 -25
- package/src/connection/reasons.ts +0 -209
- package/src/connection/self.ts +0 -138
- package/src/connection/session.ts +0 -203
- package/src/connection/target.ts +0 -112
- package/src/connection/tsconfig.json +0 -6
- package/src/errors.ts +0 -66
- package/src/graph/.spec/api.d.ts +0 -41
- package/src/graph/.spec/laws/documents.ts +0 -24
- package/src/graph/.spec/laws/projection.ts +0 -13
- package/src/graph/.spec/layout.ts +0 -14
- package/src/graph/__tests__/mutation.test.ts +0 -51
- package/src/graph/__tests__/projection.test.ts +0 -22
- package/src/graph/__tests__/query.test.ts +0 -180
- package/src/graph/class.ts +0 -30
- package/src/graph/index.ts +0 -4
- package/src/graph/mutation.ts +0 -46
- package/src/graph/projection.ts +0 -21
- package/src/graph/query.ts +0 -95
- package/src/graph/tsconfig.json +0 -6
- package/src/identity/.history/ard/bootstrap-root-transfer.md +0 -57
- package/src/identity/.history/ard/domain-mediated-registration.md +0 -36
- package/src/identity/.spec/api.d.ts +0 -124
- package/src/identity/.spec/architecture.md +0 -33
- package/src/identity/.spec/capabilities/identity.ts +0 -7
- package/src/identity/.spec/flows/bootstrap-root.ts +0 -79
- package/src/identity/.spec/flows/domain-mediated-registration.ts +0 -51
- package/src/identity/.spec/flows/import.ts +0 -29
- package/src/identity/.spec/laws/identity.ts +0 -56
- package/src/identity/.spec/layout.ts +0 -13
- package/src/identity/__tests__/fixtures/registry-journey.ts +0 -65
- package/src/identity/__tests__/registration.test.ts +0 -64
- package/src/identity/__tests__/registry.test.ts +0 -74
- package/src/identity/__tests__/transfer.test.ts +0 -198
- package/src/identity/index.ts +0 -23
- package/src/identity/registration.ts +0 -72
- package/src/identity/registry.ts +0 -181
- package/src/identity/transfer.ts +0 -187
- package/src/identity/tsconfig.json +0 -6
- package/src/index.ts +0 -1
- package/src/keys/.spec/api.d.ts +0 -74
- package/src/keys/.spec/architecture.md +0 -13
- package/src/keys/.spec/laws/keys.ts +0 -43
- package/src/keys/.spec/layout.ts +0 -6
- package/src/keys/__tests__/algorithm.test.ts +0 -39
- package/src/keys/__tests__/keys.test.ts +0 -172
- package/src/keys/algorithm.ts +0 -33
- package/src/keys/credential.ts +0 -113
- package/src/keys/index.ts +0 -14
- package/src/keys/pair.ts +0 -219
- package/src/keys/tsconfig.json +0 -6
- package/src/lib/__tests__/admin-target.test.ts +0 -184
- package/src/lib/__tests__/binary.test.ts +0 -70
- package/src/lib/__tests__/browser-retention.test.ts +0 -212
- package/src/lib/__tests__/command-dx.test.ts +0 -102
- package/src/lib/__tests__/concurrency.test.ts +0 -62
- package/src/lib/__tests__/config.test.ts +0 -81
- package/src/lib/__tests__/design.test.ts +0 -99
- package/src/lib/__tests__/domain-publication.test.ts +0 -138
- package/src/lib/__tests__/format.test.ts +0 -22
- package/src/lib/__tests__/idp-session.driver.ts +0 -60
- package/src/lib/__tests__/idp-session.test.ts +0 -404
- package/src/lib/__tests__/idp.test.ts +0 -415
- package/src/lib/__tests__/instance-candidates.test.ts +0 -146
- package/src/lib/__tests__/instance-target.test.ts +0 -213
- package/src/lib/__tests__/instance.test.ts +0 -192
- package/src/lib/__tests__/local-status.test.ts +0 -202
- package/src/lib/__tests__/log-errors.test.ts +0 -64
- package/src/lib/__tests__/log.test.ts +0 -31
- package/src/lib/__tests__/meta.test.ts +0 -55
- package/src/lib/__tests__/output.test.ts +0 -162
- package/src/lib/__tests__/panel.test.ts +0 -40
- package/src/lib/__tests__/port.test.ts +0 -44
- package/src/lib/__tests__/prompt.test.ts +0 -25
- package/src/lib/__tests__/sdk-deps.test.ts +0 -68
- package/src/lib/__tests__/self.test.ts +0 -50
- package/src/lib/__tests__/skills.test.ts +0 -834
- package/src/lib/__tests__/studio-server-deps.test.ts +0 -111
- package/src/lib/__tests__/table.test.ts +0 -53
- package/src/lib/__tests__/update.test.ts +0 -511
- package/src/lib/__tests__/use-target.test.ts +0 -56
- package/src/lib/__tests__/validation.test.ts +0 -34
- package/src/lib/__tests__/view-assets.test.ts +0 -171
- package/src/lib/__tests__/view-external-open-intent.test.ts +0 -150
- package/src/lib/__tests__/view-external-open-origins.test.ts +0 -27
- package/src/lib/__tests__/view-open-intent.test.ts +0 -280
- package/src/lib/__tests__/view-port-allocation.test.ts +0 -82
- package/src/lib/__tests__/view-server.test.ts +0 -91
- package/src/lib/__tests__/view-session.test.ts +0 -100
- package/src/lib/__tests__/view-snapshot.test.ts +0 -77
- package/src/lib/admin-domain.ts +0 -43
- package/src/lib/admin-instance.ts +0 -56
- package/src/lib/admin-target.ts +0 -290
- package/src/lib/binary.ts +0 -127
- package/src/lib/browser-retention.ts +0 -210
- package/src/lib/browser.ts +0 -150
- package/src/lib/ca-fetch.ts +0 -133
- package/src/lib/command-dx.ts +0 -191
- package/src/lib/concurrency.ts +0 -31
- package/src/lib/config.ts +0 -57
- package/src/lib/credential-lifetime.ts +0 -24
- package/src/lib/domain-publication.ts +0 -104
- package/src/lib/failure-debug.ts +0 -26
- package/src/lib/format.ts +0 -4
- package/src/lib/idp-session.ts +0 -156
- package/src/lib/idp.ts +0 -926
- package/src/lib/instance-candidates.ts +0 -49
- package/src/lib/instance-target.ts +0 -197
- package/src/lib/instance.ts +0 -468
- package/src/lib/invocation.ts +0 -11
- package/src/lib/local-status.ts +0 -152
- package/src/lib/log.ts +0 -143
- package/src/lib/login-flow.ts +0 -201
- package/src/lib/meta.ts +0 -90
- package/src/lib/output.ts +0 -238
- package/src/lib/panel.ts +0 -61
- package/src/lib/port.ts +0 -41
- package/src/lib/proc.ts +0 -87
- package/src/lib/prompt.ts +0 -136
- package/src/lib/provision-instance.ts +0 -139
- package/src/lib/sdk-deps.ts +0 -104
- package/src/lib/self.ts +0 -22
- package/src/lib/skills/lock.ts +0 -117
- package/src/lib/skills/sync.ts +0 -878
- package/src/lib/skills.ts +0 -120
- package/src/lib/table.ts +0 -62
- package/src/lib/update.ts +0 -568
- package/src/lib/use-target.ts +0 -24
- package/src/lib/validation.ts +0 -59
- package/src/lib/view/assets.ts +0 -87
- package/src/lib/view/external-open-intent.ts +0 -41
- package/src/lib/view/external-open-origins.ts +0 -37
- package/src/lib/view/host-capabilities.ts +0 -17
- package/src/lib/view/open-intent.ts +0 -67
- package/src/lib/view/port-allocation.ts +0 -19
- package/src/lib/view/resolve.ts +0 -111
- package/src/lib/view/server.ts +0 -259
- package/src/lib/view/session.ts +0 -154
- package/src/lib/view/snapshot.ts +0 -101
- package/src/paths/.spec/api.d.ts +0 -13
- package/src/paths/.spec/architecture.md +0 -5
- package/src/paths/.spec/layout.ts +0 -3
- package/src/paths/index.ts +0 -13
- package/src/program/.spec/api.d.ts +0 -43
- package/src/program/.spec/architecture.md +0 -18
- package/src/program/.spec/laws/program.ts +0 -29
- package/src/program/.spec/layout.ts +0 -14
- package/src/program/__tests__/program.test.ts +0 -556
- package/src/program/argv.ts +0 -14
- package/src/program/build.ts +0 -205
- package/src/program/command.ts +0 -43
- package/src/program/index.ts +0 -3
- package/src/program/options.ts +0 -41
- package/src/program/registry.ts +0 -64
- package/src/program/tsconfig.json +0 -6
- package/src/setup/__tests__/instance-step.test.ts +0 -256
- package/src/setup/__tests__/util.test.ts +0 -29
- package/src/setup/engine.ts +0 -83
- package/src/setup/render.ts +0 -107
- package/src/setup/steps/admin.ts +0 -93
- package/src/setup/steps/agent-browser.ts +0 -81
- package/src/setup/steps/auth.ts +0 -54
- package/src/setup/steps/domain.ts +0 -68
- package/src/setup/steps/index.ts +0 -18
- package/src/setup/steps/instance.ts +0 -206
- package/src/setup/steps/skills-bridge.ts +0 -70
- package/src/setup/steps/skills.ts +0 -61
- package/src/setup/types.ts +0 -61
- package/src/setup/util.ts +0 -34
- package/src/state/.spec/api.d.ts +0 -152
- package/src/state/.spec/architecture.md +0 -45
- package/src/state/.spec/capabilities/state.ts +0 -7
- package/src/state/.spec/flows/identity-update.ts +0 -22
- package/src/state/.spec/laws/state.ts +0 -73
- package/src/state/.spec/layout.ts +0 -15
- package/src/state/__tests__/exchange-credentials.test.ts +0 -341
- package/src/state/__tests__/files.test.ts +0 -136
- package/src/state/__tests__/fixtures/identity-transition.ts +0 -37
- package/src/state/__tests__/fixtures/session-route-process.ts +0 -93
- package/src/state/__tests__/identities.test.ts +0 -142
- package/src/state/__tests__/paths.test.ts +0 -28
- package/src/state/__tests__/session-routes.test.ts +0 -138
- package/src/state/exchange-credentials.ts +0 -250
- package/src/state/files.ts +0 -170
- package/src/state/identities.ts +0 -229
- package/src/state/index.ts +0 -31
- package/src/state/paths.ts +0 -64
- package/src/state/session-routes.ts +0 -34
- package/src/state/tsconfig.json +0 -6
- package/src/telemetry/__tests__/analyze-log.test.ts +0 -38
- package/src/telemetry/__tests__/gate.test.ts +0 -63
- package/src/telemetry/__tests__/recorder.test.ts +0 -111
- package/src/telemetry/__tests__/redact.test.ts +0 -79
- package/src/telemetry/__tests__/retention.test.ts +0 -267
- package/src/telemetry/__tests__/session.test.ts +0 -166
- package/src/telemetry/__tests__/settings.test.ts +0 -102
- package/src/telemetry/__tests__/store-scan.test.ts +0 -128
- package/src/telemetry/__tests__/trigger.test.ts +0 -78
- package/src/telemetry/adapters/__tests__/claude-code.test.ts +0 -89
- package/src/telemetry/adapters/__tests__/codex.test.ts +0 -138
- package/src/telemetry/adapters/__tests__/index.test.ts +0 -88
- package/src/telemetry/adapters/claude-code.ts +0 -90
- package/src/telemetry/adapters/codex.ts +0 -160
- package/src/telemetry/adapters/index.ts +0 -45
- package/src/telemetry/adapters/types.ts +0 -21
- package/src/telemetry/analyze.ts +0 -249
- package/src/telemetry/gate.ts +0 -79
- package/src/telemetry/recorder.ts +0 -68
- package/src/telemetry/redact.ts +0 -53
- package/src/telemetry/retention.ts +0 -176
- package/src/telemetry/session.ts +0 -94
- package/src/telemetry/settings.ts +0 -79
- package/src/telemetry/store.ts +0 -174
- package/src/telemetry/trigger.ts +0 -107
- package/src/telemetry/types.ts +0 -64
- package/src/test-utils.ts +0 -18
- package/src/ui/.spec/api.d.ts +0 -14
- package/src/ui/.spec/architecture.md +0 -14
- package/src/ui/.spec/laws.ts +0 -50
- package/src/ui/.spec/layout.ts +0 -16
- package/src/ui/__tests__/ui.test.ts +0 -1742
- package/src/ui/index.ts +0 -13
- package/src/ui/lock.ts +0 -89
- package/src/ui/model.ts +0 -83
- package/src/ui/operations.ts +0 -1044
- package/src/ui/project.ts +0 -333
- package/src/ui/release.ts +0 -398
- package/src/ui/runner.ts +0 -18
- package/studio/client/dist/assets/index-BFVFs_8x.js +0 -81
- package/studio/client/dist/assets/index-DuB9iUdu.css +0 -2
- package/studio/client/dist/assets/schema-studio-DH6oEWME.js +0 -8
- package/studio/tsconfig.json +0 -24
- package/viewer/tsconfig.json +0 -13
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
import type { Command } from 'commander'
|
|
2
|
-
|
|
3
|
-
import { describe, expect, test } from 'bun:test'
|
|
4
|
-
import { createHash } from 'node:crypto'
|
|
5
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
6
|
-
import { join } from 'node:path'
|
|
7
|
-
|
|
8
|
-
import { buildProgram, normalizeRootVersionArgv } from '../index'
|
|
9
|
-
|
|
10
|
-
// Help output is the public CLI contract: version, spec anchors, and skill mirror stay in sync.
|
|
11
|
-
|
|
12
|
-
const cliRoot = join(import.meta.dir, '../../..')
|
|
13
|
-
|
|
14
|
-
/** Every command in the tree (root + groups + nested subgroups), depth-first. */
|
|
15
|
-
function allCommands(cmd: Command): Command[] {
|
|
16
|
-
return [cmd, ...cmd.commands.flatMap(allCommands)]
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
describe('help contract — version is single-sourced', () => {
|
|
20
|
-
/** @evidence TEST-CLI-PROGRAM-VERSION-SINGLE-SOURCE */
|
|
21
|
-
test('program version === package.json === release-please manifest', async () => {
|
|
22
|
-
const program = await buildProgram()
|
|
23
|
-
const pkg = JSON.parse(readFileSync(join(cliRoot, 'package.json'), 'utf8')) as {
|
|
24
|
-
version: string
|
|
25
|
-
}
|
|
26
|
-
const manifest = JSON.parse(
|
|
27
|
-
readFileSync(join(cliRoot, '.release-please-manifest.json'), 'utf8'),
|
|
28
|
-
) as Record<string, string>
|
|
29
|
-
|
|
30
|
-
// Program version must follow both package.json and release-please metadata.
|
|
31
|
-
expect(program.version()).toBe(pkg.version)
|
|
32
|
-
expect(manifest['.']).toBe(pkg.version)
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
type InspectedCommand = Command & {
|
|
37
|
-
readonly _allowExcessArguments?: boolean
|
|
38
|
-
readonly _allowUnknownOption?: boolean
|
|
39
|
-
readonly _combineFlagAndOptionalValue?: boolean
|
|
40
|
-
readonly _enablePositionalOptions?: boolean
|
|
41
|
-
readonly _hidden?: boolean
|
|
42
|
-
readonly _passThroughOptions?: boolean
|
|
43
|
-
readonly _showHelpAfterError?: boolean
|
|
44
|
-
readonly _showSuggestionAfterError?: boolean
|
|
45
|
-
readonly _storeOptionsAsProperties?: boolean
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
type InspectedArgument = Command['registeredArguments'][number] & {
|
|
49
|
-
readonly parseArg?: unknown
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
type InspectedOption = Command['options'][number] & {
|
|
53
|
-
readonly conflictsWith?: readonly string[]
|
|
54
|
-
readonly implied?: Readonly<Record<string, unknown>>
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function ledgeredSurface(root: Command): readonly object[] {
|
|
58
|
-
const rows: object[] = []
|
|
59
|
-
const visit = (command: Command, parents: readonly string[]): void => {
|
|
60
|
-
const inspected = command as InspectedCommand
|
|
61
|
-
rows.push({
|
|
62
|
-
command: parents.join(' '),
|
|
63
|
-
aliases: command.aliases(),
|
|
64
|
-
description: command.description(),
|
|
65
|
-
summary: command.summary(),
|
|
66
|
-
arguments: command.registeredArguments.map((argument) => {
|
|
67
|
-
const inspectedArgument = argument as InspectedArgument
|
|
68
|
-
return {
|
|
69
|
-
name: argument.name(),
|
|
70
|
-
description: argument.description,
|
|
71
|
-
required: Boolean(argument.required),
|
|
72
|
-
variadic: Boolean(argument.variadic),
|
|
73
|
-
defaultValue: argument.defaultValue ?? null,
|
|
74
|
-
choices: argument.argChoices ?? null,
|
|
75
|
-
hasParser: typeof inspectedArgument.parseArg === 'function',
|
|
76
|
-
}
|
|
77
|
-
}),
|
|
78
|
-
options: command.options.map((option) => {
|
|
79
|
-
const inspectedOption = option as InspectedOption
|
|
80
|
-
return {
|
|
81
|
-
flags: option.flags,
|
|
82
|
-
attribute: option.attributeName(),
|
|
83
|
-
description: option.description,
|
|
84
|
-
required: Boolean(option.required),
|
|
85
|
-
optional: Boolean(option.optional),
|
|
86
|
-
variadic: Boolean(option.variadic),
|
|
87
|
-
mandatory: Boolean(option.mandatory),
|
|
88
|
-
negate: Boolean(option.negate),
|
|
89
|
-
hidden: Boolean(option.hidden),
|
|
90
|
-
defaultValue: option.defaultValue ?? null,
|
|
91
|
-
presetArg: option.presetArg ?? null,
|
|
92
|
-
envVar: option.envVar ?? null,
|
|
93
|
-
choices: option.argChoices ?? null,
|
|
94
|
-
conflictsWith: inspectedOption.conflictsWith ?? [],
|
|
95
|
-
implied: inspectedOption.implied ?? null,
|
|
96
|
-
hasParser: typeof option.parseArg === 'function',
|
|
97
|
-
}
|
|
98
|
-
}),
|
|
99
|
-
behavior: {
|
|
100
|
-
allowExcessArguments: Boolean(inspected._allowExcessArguments),
|
|
101
|
-
allowUnknownOption: Boolean(inspected._allowUnknownOption),
|
|
102
|
-
combineFlagAndOptionalValue: Boolean(inspected._combineFlagAndOptionalValue),
|
|
103
|
-
enablePositionalOptions: Boolean(inspected._enablePositionalOptions),
|
|
104
|
-
passThroughOptions: Boolean(inspected._passThroughOptions),
|
|
105
|
-
showHelpAfterError: Boolean(inspected._showHelpAfterError),
|
|
106
|
-
showSuggestionAfterError: Boolean(inspected._showSuggestionAfterError),
|
|
107
|
-
storeOptionsAsProperties: Boolean(inspected._storeOptionsAsProperties),
|
|
108
|
-
},
|
|
109
|
-
hidden: Boolean(inspected._hidden),
|
|
110
|
-
help: command.helpInformation(),
|
|
111
|
-
})
|
|
112
|
-
for (const child of command.commands) visit(child, [...parents, child.name()])
|
|
113
|
-
}
|
|
114
|
-
visit(root, [])
|
|
115
|
-
return rows.sort((left, right) => {
|
|
116
|
-
const leftName = (left as { command: string }).command
|
|
117
|
-
const rightName = (right as { command: string }).command
|
|
118
|
-
return leftName.localeCompare(rightName)
|
|
119
|
-
})
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
describe('program composition', () => {
|
|
123
|
-
/** @evidence TEST-CLI-PROGRAM-MATCHES-LEDGERED-SURFACE */
|
|
124
|
-
test('matches the complete ledgered command and help surface', async () => {
|
|
125
|
-
const surface = ledgeredSurface(await buildProgram())
|
|
126
|
-
const paths = surface.map((entry) => (entry as { command: string }).command)
|
|
127
|
-
|
|
128
|
-
expect(paths).toEqual([
|
|
129
|
-
'',
|
|
130
|
-
'__view-serve',
|
|
131
|
-
'admin',
|
|
132
|
-
'admin status',
|
|
133
|
-
'admin use',
|
|
134
|
-
'auth',
|
|
135
|
-
'auth login',
|
|
136
|
-
'auth logout',
|
|
137
|
-
'auth status',
|
|
138
|
-
'auth token',
|
|
139
|
-
'browser',
|
|
140
|
-
'call',
|
|
141
|
-
'domain',
|
|
142
|
-
'domain install',
|
|
143
|
-
'domain list',
|
|
144
|
-
'domain publish',
|
|
145
|
-
'domain uninstall',
|
|
146
|
-
'get',
|
|
147
|
-
'identity',
|
|
148
|
-
'identity create',
|
|
149
|
-
'identity delete',
|
|
150
|
-
'identity export',
|
|
151
|
-
'identity import',
|
|
152
|
-
'identity list',
|
|
153
|
-
'identity register',
|
|
154
|
-
'identity sync',
|
|
155
|
-
'identity unsync',
|
|
156
|
-
'identity use',
|
|
157
|
-
'identity whoami',
|
|
158
|
-
'idp',
|
|
159
|
-
'idp add',
|
|
160
|
-
'idp list',
|
|
161
|
-
'idp refresh',
|
|
162
|
-
'idp remove',
|
|
163
|
-
'idp show',
|
|
164
|
-
'instance',
|
|
165
|
-
'instance active',
|
|
166
|
-
'instance bookmark',
|
|
167
|
-
'instance create',
|
|
168
|
-
'instance delete',
|
|
169
|
-
'instance forget',
|
|
170
|
-
'instance list',
|
|
171
|
-
'instance status',
|
|
172
|
-
'instance use',
|
|
173
|
-
'introspect',
|
|
174
|
-
'logs',
|
|
175
|
-
'mutate',
|
|
176
|
-
'query',
|
|
177
|
-
'session',
|
|
178
|
-
'session analyze',
|
|
179
|
-
'session list',
|
|
180
|
-
'setup',
|
|
181
|
-
'status',
|
|
182
|
-
'studio',
|
|
183
|
-
'token',
|
|
184
|
-
'ui',
|
|
185
|
-
'ui add',
|
|
186
|
-
'ui doctor',
|
|
187
|
-
'ui init',
|
|
188
|
-
'ui list',
|
|
189
|
-
'ui preset',
|
|
190
|
-
'ui preset apply',
|
|
191
|
-
'ui preset list',
|
|
192
|
-
'update',
|
|
193
|
-
'use',
|
|
194
|
-
'view',
|
|
195
|
-
'whoami',
|
|
196
|
-
])
|
|
197
|
-
expect(createHash('sha256').update(JSON.stringify(surface)).digest('hex')).toBe(
|
|
198
|
-
'91c35b18985ad8606b5f2429fd8860b020a93edccb30dfbaa74d501929a8513b',
|
|
199
|
-
)
|
|
200
|
-
})
|
|
201
|
-
|
|
202
|
-
/** @evidence TEST-CLI-PROGRAM-BUILDS-ISOLATED-ROOTS */
|
|
203
|
-
test('builds a fresh Commander root for each consumer', async () => {
|
|
204
|
-
const first = await buildProgram()
|
|
205
|
-
first.command('__temporary-test-command')
|
|
206
|
-
|
|
207
|
-
const second = await buildProgram()
|
|
208
|
-
expect(second).not.toBe(first)
|
|
209
|
-
expect(second.commands.some((command) => command.name() === '__temporary-test-command')).toBe(
|
|
210
|
-
false,
|
|
211
|
-
)
|
|
212
|
-
})
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
describe('help contract — no internal SPEC anchors leak to users', () => {
|
|
216
|
-
test('no rendered --help text contains a § section anchor', async () => {
|
|
217
|
-
const program = await buildProgram()
|
|
218
|
-
const offenders = allCommands(program)
|
|
219
|
-
.filter((c) => c.helpInformation().includes('§'))
|
|
220
|
-
.map((c) => c.name() || '<root>')
|
|
221
|
-
|
|
222
|
-
expect(offenders).toEqual([])
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
test('Kernel and Instance vocabulary does not expose retired Host or Interface concepts', async () => {
|
|
226
|
-
const program = await buildProgram()
|
|
227
|
-
const help = allCommands(program)
|
|
228
|
-
.map((command) => command.helpInformation())
|
|
229
|
-
.join('\n')
|
|
230
|
-
|
|
231
|
-
expect(help).not.toContain('host.astrale.ai')
|
|
232
|
-
expect(help).not.toContain(':interface.')
|
|
233
|
-
expect(help).not.toContain('Class or Interface')
|
|
234
|
-
expect(help).not.toContain('emulated host')
|
|
235
|
-
expect(help).not.toContain('Host shell')
|
|
236
|
-
})
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
describe('help contract — IdP/auth surface is registered', () => {
|
|
240
|
-
test('idp group and auth commands are visible in --help tree', async () => {
|
|
241
|
-
const program = await buildProgram()
|
|
242
|
-
const names = allCommands(program).map((command) => command.name())
|
|
243
|
-
|
|
244
|
-
expect(names).toContain('idp')
|
|
245
|
-
expect(names).toContain('add')
|
|
246
|
-
expect(names).toContain('login')
|
|
247
|
-
expect(names).toContain('token')
|
|
248
|
-
expect(names).toContain('update')
|
|
249
|
-
expect(program.helpInformation()).toContain('idp')
|
|
250
|
-
expect(program.helpInformation()).toContain('update')
|
|
251
|
-
})
|
|
252
|
-
})
|
|
253
|
-
|
|
254
|
-
describe('help contract — admin target surface is registered', () => {
|
|
255
|
-
test('admin group and admin-target flags are visible', async () => {
|
|
256
|
-
const program = await buildProgram()
|
|
257
|
-
const names = allCommands(program).map((command) => command.name())
|
|
258
|
-
const instanceCreate = allCommands(program).find((command) => command.name() === 'create')
|
|
259
|
-
|
|
260
|
-
expect(names).toContain('admin')
|
|
261
|
-
expect(names).toContain('status')
|
|
262
|
-
expect(names).toContain('use')
|
|
263
|
-
expect(program.helpInformation()).toContain('admin')
|
|
264
|
-
expect(instanceCreate?.helpInformation()).toContain('--admin <name>')
|
|
265
|
-
expect(instanceCreate?.helpInformation()).toContain('--admin-url <url>')
|
|
266
|
-
|
|
267
|
-
const adminUse = program.commands
|
|
268
|
-
.find((command) => command.name() === 'admin')
|
|
269
|
-
?.commands.find((command) => command.name() === 'use')
|
|
270
|
-
expect(adminUse?.helpInformation()).toContain('--kernel-issuer <url>')
|
|
271
|
-
expect(adminUse?.helpInformation()).toContain('--domain-issuer <url>')
|
|
272
|
-
expect(adminUse?.helpInformation()).not.toContain('--issuer <url>')
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
test('instance create delegates infrastructure placement to Admin', async () => {
|
|
276
|
-
const program = await buildProgram()
|
|
277
|
-
const instanceCreate = allCommands(program).find((command) => command.name() === 'create')
|
|
278
|
-
const help = instanceCreate?.helpInformation() ?? ''
|
|
279
|
-
|
|
280
|
-
expect(help).toContain('Provision an instance through the Admin control plane')
|
|
281
|
-
expect(help).not.toContain('Host')
|
|
282
|
-
expect(help).not.toContain('Fleet')
|
|
283
|
-
expect(help).not.toContain('--host-id')
|
|
284
|
-
expect(help).not.toContain('--no-use')
|
|
285
|
-
expect(help).not.toContain('Instance.init')
|
|
286
|
-
})
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
describe('help contract — connect-only command surface', () => {
|
|
290
|
-
test('runtime management commands are not registered', async () => {
|
|
291
|
-
const program = await buildProgram()
|
|
292
|
-
const names = program.commands.map((command) => command.name())
|
|
293
|
-
|
|
294
|
-
// `logs` and `domain` have managed/admin meanings, so only retired verbs are absent.
|
|
295
|
-
for (const removed of [
|
|
296
|
-
'init',
|
|
297
|
-
'start',
|
|
298
|
-
'stop',
|
|
299
|
-
'restart',
|
|
300
|
-
'reset',
|
|
301
|
-
'bootstrap',
|
|
302
|
-
'tunnel',
|
|
303
|
-
'graph',
|
|
304
|
-
'server',
|
|
305
|
-
'env',
|
|
306
|
-
'ls',
|
|
307
|
-
'describe',
|
|
308
|
-
]) {
|
|
309
|
-
expect(names).not.toContain(removed)
|
|
310
|
-
}
|
|
311
|
-
})
|
|
312
|
-
})
|
|
313
|
-
|
|
314
|
-
describe('help contract — UI is project tooling', () => {
|
|
315
|
-
test('add recovery guidance uses only registered UI commands', async () => {
|
|
316
|
-
const program = await buildProgram()
|
|
317
|
-
const uiAdd = program.commands
|
|
318
|
-
.find((command) => command.name() === 'ui')
|
|
319
|
-
?.commands.find((command) => command.name() === 'add')
|
|
320
|
-
let help = ''
|
|
321
|
-
uiAdd?.configureOutput({
|
|
322
|
-
writeOut: (chunk) => {
|
|
323
|
-
help += chunk ?? ''
|
|
324
|
-
},
|
|
325
|
-
})
|
|
326
|
-
uiAdd?.outputHelp()
|
|
327
|
-
|
|
328
|
-
expect(help).toContain('astrale ui doctor')
|
|
329
|
-
expect(help).toContain('--overwrite --yes')
|
|
330
|
-
expect(help).not.toMatch(/\b(?:astrale ui )?diff\b/u)
|
|
331
|
-
})
|
|
332
|
-
|
|
333
|
-
test('keeps the documented root version alias operational', async () => {
|
|
334
|
-
const program = await buildProgram()
|
|
335
|
-
let stdout = ''
|
|
336
|
-
program.exitOverride().configureOutput({
|
|
337
|
-
writeOut: (chunk) => {
|
|
338
|
-
stdout += chunk ?? ''
|
|
339
|
-
},
|
|
340
|
-
})
|
|
341
|
-
|
|
342
|
-
await expect(
|
|
343
|
-
program.parseAsync(normalizeRootVersionArgv(['node', 'astrale', '--version'])),
|
|
344
|
-
).rejects.toMatchObject({ code: 'commander.version' })
|
|
345
|
-
expect(stdout.trim()).toBe(program.version() ?? '')
|
|
346
|
-
expect(program.helpInformation()).toMatch(/root alias:\s+--version/u)
|
|
347
|
-
})
|
|
348
|
-
|
|
349
|
-
test('routes root and subcommand version flags to their exact owners', async () => {
|
|
350
|
-
const program = await buildProgram()
|
|
351
|
-
const uiList = program.commands
|
|
352
|
-
.find((command) => command.name() === 'ui')
|
|
353
|
-
?.commands.find((command) => command.name() === 'list')
|
|
354
|
-
let observedVersion: unknown
|
|
355
|
-
uiList?.action((_query, options) => {
|
|
356
|
-
observedVersion = options.version
|
|
357
|
-
})
|
|
358
|
-
|
|
359
|
-
const uiArgv = ['node', 'astrale', 'ui', 'list', 'chart', '--version', '0.3.0-beta.1']
|
|
360
|
-
expect(normalizeRootVersionArgv(uiArgv)).toEqual(uiArgv)
|
|
361
|
-
expect(normalizeRootVersionArgv(['node', 'astrale', '--version'])).toEqual([
|
|
362
|
-
'node',
|
|
363
|
-
'astrale',
|
|
364
|
-
'--cli-version',
|
|
365
|
-
])
|
|
366
|
-
expect(normalizeRootVersionArgv(['node', 'astrale', '--ci', '--version'])).toEqual([
|
|
367
|
-
'node',
|
|
368
|
-
'astrale',
|
|
369
|
-
'--ci',
|
|
370
|
-
'--cli-version',
|
|
371
|
-
])
|
|
372
|
-
|
|
373
|
-
await program.parseAsync(uiArgv)
|
|
374
|
-
|
|
375
|
-
expect(observedVersion).toBe('0.3.0-beta.1')
|
|
376
|
-
})
|
|
377
|
-
|
|
378
|
-
test('routes explicit versions with positional inputs for UI init and update', async () => {
|
|
379
|
-
const program = await buildProgram()
|
|
380
|
-
const uiInit = program.commands
|
|
381
|
-
.find((command) => command.name() === 'ui')
|
|
382
|
-
?.commands.find((command) => command.name() === 'init')
|
|
383
|
-
const update = program.commands.find((command) => command.name() === 'update')
|
|
384
|
-
let initializedPath: unknown
|
|
385
|
-
let initializedVersion: unknown
|
|
386
|
-
let updateVersion: unknown
|
|
387
|
-
uiInit?.action((projectPath, options) => {
|
|
388
|
-
initializedPath = projectPath
|
|
389
|
-
initializedVersion = options.version
|
|
390
|
-
})
|
|
391
|
-
update?.action((options) => {
|
|
392
|
-
updateVersion = options.version
|
|
393
|
-
})
|
|
394
|
-
|
|
395
|
-
await program.parseAsync([
|
|
396
|
-
'node',
|
|
397
|
-
'astrale',
|
|
398
|
-
'ui',
|
|
399
|
-
'init',
|
|
400
|
-
'./app',
|
|
401
|
-
'--version',
|
|
402
|
-
'0.3.0-beta.1',
|
|
403
|
-
])
|
|
404
|
-
expect(initializedPath).toBe('./app')
|
|
405
|
-
expect(initializedVersion).toBe('0.3.0-beta.1')
|
|
406
|
-
|
|
407
|
-
await program.parseAsync(['node', 'astrale', 'update', '--version', '1.0.0-beta.13'])
|
|
408
|
-
expect(updateVersion).toBe('1.0.0-beta.13')
|
|
409
|
-
})
|
|
410
|
-
|
|
411
|
-
test('continues to admit global machine flags after a subcommand', async () => {
|
|
412
|
-
const program = await buildProgram()
|
|
413
|
-
const uiList = program.commands
|
|
414
|
-
.find((command) => command.name() === 'ui')
|
|
415
|
-
?.commands.find((command) => command.name() === 'list')
|
|
416
|
-
let invoked = false
|
|
417
|
-
uiList?.action(() => {
|
|
418
|
-
invoked = true
|
|
419
|
-
})
|
|
420
|
-
|
|
421
|
-
await program.parseAsync(['node', 'astrale', 'ui', 'list', '--ci', '--no-prompt'])
|
|
422
|
-
|
|
423
|
-
expect(invoked).toBe(true)
|
|
424
|
-
})
|
|
425
|
-
|
|
426
|
-
test('UI commands are local-only and add accepts zero or more canonical addresses', async () => {
|
|
427
|
-
const program = await buildProgram()
|
|
428
|
-
const ui = program.commands.find((command) => command.name() === 'ui')
|
|
429
|
-
const add = ui?.commands.find((command) => command.name() === 'add')
|
|
430
|
-
|
|
431
|
-
expect(ui?.commands.map((command) => command.name())).toEqual([
|
|
432
|
-
'init',
|
|
433
|
-
'list',
|
|
434
|
-
'add',
|
|
435
|
-
'doctor',
|
|
436
|
-
'preset',
|
|
437
|
-
])
|
|
438
|
-
expect(add?.helpInformation()).toContain('[items...]')
|
|
439
|
-
for (const command of ui?.commands ?? []) {
|
|
440
|
-
const help = command.helpInformation()
|
|
441
|
-
expect(help).not.toContain('--url <url>')
|
|
442
|
-
expect(help).not.toContain('--anonymous')
|
|
443
|
-
}
|
|
444
|
-
})
|
|
445
|
-
})
|
|
446
|
-
|
|
447
|
-
describe('help contract — read command split', () => {
|
|
448
|
-
test('get is point-read only and query owns structured read flags', async () => {
|
|
449
|
-
const program = await buildProgram()
|
|
450
|
-
const get = allCommands(program).find((command) => command.name() === 'get')
|
|
451
|
-
const query = allCommands(program).find((command) => command.name() === 'query')
|
|
452
|
-
const getHelp = get?.helpInformation() ?? ''
|
|
453
|
-
const queryHelp = query?.helpInformation() ?? ''
|
|
454
|
-
|
|
455
|
-
expect(getHelp).toContain('Usage: astrale get [options] <target>')
|
|
456
|
-
expect(getHelp).not.toContain('-l, --long')
|
|
457
|
-
expect(getHelp).not.toContain('--depth')
|
|
458
|
-
expect(getHelp).not.toContain('--children')
|
|
459
|
-
expect(getHelp).not.toContain('--edges')
|
|
460
|
-
expect(getHelp).not.toContain('--graph')
|
|
461
|
-
|
|
462
|
-
expect(queryHelp).toContain('Usage: astrale query [options] [sources...]')
|
|
463
|
-
expect(queryHelp).not.toContain('--depth <n>')
|
|
464
|
-
expect(queryHelp).not.toContain('--children <json>')
|
|
465
|
-
expect(queryHelp).not.toContain('--edges <json>')
|
|
466
|
-
expect(queryHelp).toContain('--ast <json>')
|
|
467
|
-
expect(queryHelp).toContain('--class <path>')
|
|
468
|
-
expect(queryHelp).not.toContain('--definition')
|
|
469
|
-
expect(queryHelp).toContain('--edge <class>')
|
|
470
|
-
expect(queryHelp).toContain('--direction <direction>')
|
|
471
|
-
expect(queryHelp).toContain('--limit <n>')
|
|
472
|
-
expect(queryHelp).toContain('--cursor <token>')
|
|
473
|
-
expect(queryHelp).not.toContain('--cypher <query>')
|
|
474
|
-
})
|
|
475
|
-
|
|
476
|
-
test('keeps the removed query --definition flag outside the parsed command surface', async () => {
|
|
477
|
-
const program = await buildProgram()
|
|
478
|
-
const query = allCommands(program).find((command) => command.name() === 'query')
|
|
479
|
-
const parsed = query?.parseOptions(['--definition', '/:notes.example.dev:class.Note'])
|
|
480
|
-
|
|
481
|
-
expect(parsed?.unknown).toContain('--definition')
|
|
482
|
-
expect(query?.options.some((option) => option.attributeName() === 'definition')).toBe(false)
|
|
483
|
-
})
|
|
484
|
-
|
|
485
|
-
test('routes query --class through Commander as the exact Class option', async () => {
|
|
486
|
-
const program = await buildProgram()
|
|
487
|
-
const query = allCommands(program).find((command) => command.name() === 'query')
|
|
488
|
-
let observed: unknown
|
|
489
|
-
query?.action((sources, options) => {
|
|
490
|
-
observed = { sources, class: options.class, limit: options.limit, json: options.json }
|
|
491
|
-
})
|
|
492
|
-
|
|
493
|
-
await program.parseAsync([
|
|
494
|
-
'node',
|
|
495
|
-
'astrale',
|
|
496
|
-
'query',
|
|
497
|
-
'--class',
|
|
498
|
-
'/:notes.example.dev:class.Note',
|
|
499
|
-
'--limit',
|
|
500
|
-
'1',
|
|
501
|
-
'--json',
|
|
502
|
-
])
|
|
503
|
-
|
|
504
|
-
expect(observed).toEqual({
|
|
505
|
-
sources: [],
|
|
506
|
-
class: '/:notes.example.dev:class.Note',
|
|
507
|
-
limit: '1',
|
|
508
|
-
json: true,
|
|
509
|
-
})
|
|
510
|
-
})
|
|
511
|
-
})
|
|
512
|
-
|
|
513
|
-
describe('help contract — explicit anonymous authentication', () => {
|
|
514
|
-
test('kernel commands expose the credential-less session flag', async () => {
|
|
515
|
-
const program = await buildProgram()
|
|
516
|
-
const call = allCommands(program).find((command) => command.name() === 'call')
|
|
517
|
-
|
|
518
|
-
expect(call?.helpInformation()).toContain('--anonymous')
|
|
519
|
-
expect(call?.helpInformation()).toContain('Send no credential')
|
|
520
|
-
})
|
|
521
|
-
})
|
|
522
|
-
|
|
523
|
-
describe('help contract — payload sources', () => {
|
|
524
|
-
test('call excludes --file while mutate supports it', async () => {
|
|
525
|
-
const program = await buildProgram()
|
|
526
|
-
const call = allCommands(program).find((command) => command.name() === 'call')
|
|
527
|
-
const mutate = allCommands(program).find((command) => command.name() === 'mutate')
|
|
528
|
-
const callHelp = call?.helpInformation() ?? ''
|
|
529
|
-
const mutateHelp = mutate?.helpInformation() ?? ''
|
|
530
|
-
|
|
531
|
-
expect(callHelp).toContain('--data <json>')
|
|
532
|
-
expect(callHelp).not.toContain('--file <path>')
|
|
533
|
-
expect(callHelp).not.toContain('--describe')
|
|
534
|
-
expect(mutateHelp).toContain('--data <json>')
|
|
535
|
-
expect(mutateHelp).toContain('--file <path>')
|
|
536
|
-
})
|
|
537
|
-
})
|
|
538
|
-
|
|
539
|
-
describe('help contract — skill is single-source, not duplicated', () => {
|
|
540
|
-
const canonical = join(cliRoot, 'skills/astrale-cli/SKILL.md')
|
|
541
|
-
// Workspace mirror lives in the superrepo, outside this submodule. Absent
|
|
542
|
-
// when the CLI repo is tested standalone — only assert parity when present.
|
|
543
|
-
const mirror = join(cliRoot, '../.agents/skills/astrale-cli/SKILL.md')
|
|
544
|
-
|
|
545
|
-
test('canonical skill file exists and is non-empty', () => {
|
|
546
|
-
expect(existsSync(canonical)).toBe(true)
|
|
547
|
-
expect(readFileSync(canonical, 'utf8').length).toBeGreaterThan(0)
|
|
548
|
-
})
|
|
549
|
-
|
|
550
|
-
test.skipIf(!existsSync(mirror))(
|
|
551
|
-
'workspace mirror is byte-identical to the canonical skill',
|
|
552
|
-
() => {
|
|
553
|
-
expect(readFileSync(mirror, 'utf8')).toBe(readFileSync(canonical, 'utf8'))
|
|
554
|
-
},
|
|
555
|
-
)
|
|
556
|
-
})
|
package/src/program/argv.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Keep `astrale --version` as the familiar root spelling without claiming the
|
|
3
|
-
* same flag after a subcommand. Commands such as `ui list` and `update` own
|
|
4
|
-
* their release `--version` value.
|
|
5
|
-
*/
|
|
6
|
-
export function normalizeRootVersionArgv(argv: readonly string[]): string[] {
|
|
7
|
-
const normalized = [...argv]
|
|
8
|
-
const commandIndex = normalized.findIndex((token, index) => index >= 2 && !token.startsWith('-'))
|
|
9
|
-
const versionIndex = normalized.indexOf('--version', 2)
|
|
10
|
-
if (versionIndex !== -1 && (commandIndex === -1 || versionIndex < commandIndex)) {
|
|
11
|
-
normalized[versionIndex] = '--cli-version'
|
|
12
|
-
}
|
|
13
|
-
return normalized
|
|
14
|
-
}
|