@stigmer/cli 3.35.0 → 3.37.0
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/auth/auth0.d.ts.map +1 -1
- package/auth/auth0.js.map +1 -1
- package/auth/callback-server.d.ts.map +1 -1
- package/auth/callback-server.js.map +1 -1
- package/auth/index.d.ts.map +1 -1
- package/auth/index.js.map +1 -1
- package/auth/login.d.ts.map +1 -1
- package/auth/login.js.map +1 -1
- package/auth/pages.d.ts.map +1 -1
- package/auth/pages.js.map +1 -1
- package/auth/pkce.d.ts.map +1 -1
- package/auth/pkce.js.map +1 -1
- package/auth/token.d.ts.map +1 -1
- package/auth/token.js.map +1 -1
- package/backend.d.ts.map +1 -1
- package/backend.js.map +1 -1
- package/cli/stigmer.d.ts.map +1 -1
- package/cli/stigmer.js.map +1 -1
- package/client/client.d.ts.map +1 -1
- package/client/client.js.map +1 -1
- package/client/index.d.ts.map +1 -1
- package/client/index.js.map +1 -1
- package/commands/agent-exec-flags.d.ts.map +1 -1
- package/commands/agent-exec-flags.js.map +1 -1
- package/commands/apikey/duration.d.ts.map +1 -1
- package/commands/apikey/duration.js.map +1 -1
- package/commands/apikey/index.d.ts.map +1 -1
- package/commands/apikey/index.js.map +1 -1
- package/commands/apply.d.ts.map +1 -1
- package/commands/apply.js.map +1 -1
- package/commands/auth/index.d.ts.map +1 -1
- package/commands/auth/index.js.map +1 -1
- package/commands/auth/login.d.ts.map +1 -1
- package/commands/auth/login.js.map +1 -1
- package/commands/auth/whoami.d.ts.map +1 -1
- package/commands/auth/whoami.js.map +1 -1
- package/commands/bootstrap.d.ts.map +1 -1
- package/commands/bootstrap.js.map +1 -1
- package/commands/completion.d.ts.map +1 -1
- package/commands/completion.js.map +1 -1
- package/commands/config/backend.d.ts.map +1 -1
- package/commands/config/backend.js.map +1 -1
- package/commands/config/context.d.ts.map +1 -1
- package/commands/config/context.js.map +1 -1
- package/commands/config/index.d.ts.map +1 -1
- package/commands/config/index.js.map +1 -1
- package/commands/config/kv.d.ts.map +1 -1
- package/commands/config/kv.js.map +1 -1
- package/commands/connect.d.ts.map +1 -1
- package/commands/connect.js.map +1 -1
- package/commands/delete.d.ts.map +1 -1
- package/commands/delete.js.map +1 -1
- package/commands/diff.d.ts.map +1 -1
- package/commands/diff.js.map +1 -1
- package/commands/down.d.ts.map +1 -1
- package/commands/down.js.map +1 -1
- package/commands/download.d.ts.map +1 -1
- package/commands/download.js.map +1 -1
- package/commands/execution/approve.d.ts.map +1 -1
- package/commands/execution/approve.js.map +1 -1
- package/commands/execution/control.d.ts.map +1 -1
- package/commands/execution/control.js.map +1 -1
- package/commands/execution/index.d.ts.map +1 -1
- package/commands/execution/index.js.map +1 -1
- package/commands/execution/logs.d.ts.map +1 -1
- package/commands/execution/logs.js.map +1 -1
- package/commands/execution/trace.d.ts.map +1 -1
- package/commands/execution/trace.js.map +1 -1
- package/commands/get.d.ts.map +1 -1
- package/commands/get.js.map +1 -1
- package/commands/install.d.ts.map +1 -1
- package/commands/install.js.map +1 -1
- package/commands/internal-daemon.d.ts.map +1 -1
- package/commands/internal-daemon.js.map +1 -1
- package/commands/list.d.ts.map +1 -1
- package/commands/list.js.map +1 -1
- package/commands/logs.d.ts.map +1 -1
- package/commands/logs.js.map +1 -1
- package/commands/marketplace.d.ts.map +1 -1
- package/commands/marketplace.js.map +1 -1
- package/commands/mcp-server.d.ts.map +1 -1
- package/commands/mcp-server.js.map +1 -1
- package/commands/push.d.ts.map +1 -1
- package/commands/push.js.map +1 -1
- package/commands/reset.d.ts.map +1 -1
- package/commands/reset.js.map +1 -1
- package/commands/resume.d.ts.map +1 -1
- package/commands/resume.js.map +1 -1
- package/commands/run.d.ts.map +1 -1
- package/commands/run.js.map +1 -1
- package/commands/schedule.d.ts.map +1 -1
- package/commands/schedule.js.map +1 -1
- package/commands/search.d.ts.map +1 -1
- package/commands/search.js.map +1 -1
- package/commands/setup.d.ts.map +1 -1
- package/commands/setup.js.map +1 -1
- package/commands/share.d.ts.map +1 -1
- package/commands/share.js.map +1 -1
- package/commands/shared.d.ts.map +1 -1
- package/commands/shared.js.map +1 -1
- package/commands/status.d.ts.map +1 -1
- package/commands/status.js.map +1 -1
- package/commands/tag.d.ts.map +1 -1
- package/commands/tag.js.map +1 -1
- package/commands/up.d.ts.map +1 -1
- package/commands/up.js.map +1 -1
- package/commands/usage.d.ts.map +1 -1
- package/commands/usage.js.map +1 -1
- package/commands/validate.d.ts.map +1 -1
- package/commands/validate.js.map +1 -1
- package/commands/version.d.ts.map +1 -1
- package/commands/version.js.map +1 -1
- package/config/config.d.ts.map +1 -1
- package/config/config.js.map +1 -1
- package/config/index.d.ts.map +1 -1
- package/config/index.js.map +1 -1
- package/config/keys.d.ts.map +1 -1
- package/config/keys.js.map +1 -1
- package/config/paths.d.ts.map +1 -1
- package/config/paths.js.map +1 -1
- package/config/resolve.d.ts.map +1 -1
- package/config/resolve.js.map +1 -1
- package/errors/classify.d.ts.map +1 -1
- package/errors/classify.js.map +1 -1
- package/errors/cli-exit-error.d.ts.map +1 -1
- package/errors/cli-exit-error.js.map +1 -1
- package/errors/exit-codes.d.ts.map +1 -1
- package/errors/exit-codes.js.map +1 -1
- package/errors/handle.d.ts.map +1 -1
- package/errors/handle.js.map +1 -1
- package/errors/index.d.ts.map +1 -1
- package/errors/index.js.map +1 -1
- package/errors/usage-error.d.ts.map +1 -1
- package/errors/usage-error.js.map +1 -1
- package/index.d.ts.map +1 -1
- package/index.js.map +1 -1
- package/local/artifact.d.ts.map +1 -1
- package/local/artifact.js.map +1 -1
- package/local/bootstrap.d.ts.map +1 -1
- package/local/bootstrap.js.map +1 -1
- package/local/constants.d.ts.map +1 -1
- package/local/constants.js.map +1 -1
- package/local/daemon/components.d.ts.map +1 -1
- package/local/daemon/components.js.map +1 -1
- package/local/daemon/env.d.ts.map +1 -1
- package/local/daemon/env.js.map +1 -1
- package/local/daemon/host.d.ts.map +1 -1
- package/local/daemon/host.js.map +1 -1
- package/local/daemon/index.d.ts.map +1 -1
- package/local/daemon/index.js.map +1 -1
- package/local/daemon/launch.d.ts.map +1 -1
- package/local/daemon/launch.js.map +1 -1
- package/local/daemon/process.d.ts.map +1 -1
- package/local/daemon/process.js.map +1 -1
- package/local/daemon/supervisor.d.ts.map +1 -1
- package/local/daemon/supervisor.js.map +1 -1
- package/local/daemon/types.d.ts.map +1 -1
- package/local/daemon/types.js.map +1 -1
- package/local/llm-config.d.ts.map +1 -1
- package/local/llm-config.js.map +1 -1
- package/local/logs/tail.d.ts.map +1 -1
- package/local/logs/tail.js.map +1 -1
- package/local/logs/view.d.ts.map +1 -1
- package/local/logs/view.js.map +1 -1
- package/local/net/tcp.d.ts.map +1 -1
- package/local/net/tcp.js.map +1 -1
- package/local/operator-config.d.ts.map +1 -1
- package/local/operator-config.js.map +1 -1
- package/local/paths.d.ts.map +1 -1
- package/local/paths.js.map +1 -1
- package/local/reset.d.ts.map +1 -1
- package/local/reset.js.map +1 -1
- package/local/runtime/index.d.ts.map +1 -1
- package/local/runtime/index.js.map +1 -1
- package/local/runtime/node.d.ts.map +1 -1
- package/local/runtime/node.js.map +1 -1
- package/local/runtime/runner.d.ts.map +1 -1
- package/local/runtime/runner.js.map +1 -1
- package/local/runtime/runtimes-install.d.ts.map +1 -1
- package/local/runtime/runtimes-install.js.map +1 -1
- package/local/runtime/server.d.ts.map +1 -1
- package/local/runtime/server.js.map +1 -1
- package/local/runtime/which.d.ts.map +1 -1
- package/local/runtime/which.js.map +1 -1
- package/local/setup/prompt.d.ts.map +1 -1
- package/local/setup/prompt.js.map +1 -1
- package/local/setup/wizard.d.ts.map +1 -1
- package/local/setup/wizard.js.map +1 -1
- package/local/state/health-state.d.ts.map +1 -1
- package/local/state/health-state.js.map +1 -1
- package/local/state/index.d.ts.map +1 -1
- package/local/state/index.js.map +1 -1
- package/local/state/lock.d.ts.map +1 -1
- package/local/state/lock.js.map +1 -1
- package/local/state/log-rotation.d.ts.map +1 -1
- package/local/state/log-rotation.js.map +1 -1
- package/local/state/pidfile.d.ts.map +1 -1
- package/local/state/pidfile.js.map +1 -1
- package/local/state/proc.d.ts.map +1 -1
- package/local/state/proc.js.map +1 -1
- package/local/state/startup-config.d.ts.map +1 -1
- package/local/state/startup-config.js.map +1 -1
- package/local/status.d.ts.map +1 -1
- package/local/status.js.map +1 -1
- package/local/temporal/download.d.ts.map +1 -1
- package/local/temporal/download.js.map +1 -1
- package/local/temporal/index.d.ts.map +1 -1
- package/local/temporal/index.js.map +1 -1
- package/local/temporal/inspect.d.ts.map +1 -1
- package/local/temporal/inspect.js.map +1 -1
- package/local/temporal/manager.d.ts.map +1 -1
- package/local/temporal/manager.js.map +1 -1
- package/local/temporal/supervisor.d.ts.map +1 -1
- package/local/temporal/supervisor.js.map +1 -1
- package/local/webconsole/index.d.ts.map +1 -1
- package/local/webconsole/index.js.map +1 -1
- package/logger.d.ts.map +1 -1
- package/logger.js.map +1 -1
- package/marketplace/config.d.ts.map +1 -1
- package/marketplace/config.js.map +1 -1
- package/marketplace/github.d.ts.map +1 -1
- package/marketplace/github.js.map +1 -1
- package/marketplace/index.d.ts.map +1 -1
- package/marketplace/index.js.map +1 -1
- package/marketplace/install.d.ts.map +1 -1
- package/marketplace/install.js.map +1 -1
- package/marketplace/materialize.d.ts.map +1 -1
- package/marketplace/materialize.js.map +1 -1
- package/marketplace/official.d.ts.map +1 -1
- package/marketplace/official.js.map +1 -1
- package/marketplace/read.d.ts.map +1 -1
- package/marketplace/read.js.map +1 -1
- package/marketplace/ref.d.ts.map +1 -1
- package/marketplace/ref.js.map +1 -1
- package/marketplace/render.d.ts.map +1 -1
- package/marketplace/render.js.map +1 -1
- package/output/command-result.d.ts.map +1 -1
- package/output/command-result.js.map +1 -1
- package/output/confirm.d.ts.map +1 -1
- package/output/confirm.js.map +1 -1
- package/output/format.d.ts.map +1 -1
- package/output/format.js.map +1 -1
- package/output/index.d.ts.map +1 -1
- package/output/index.js.map +1 -1
- package/output/ndjson.d.ts.map +1 -1
- package/output/ndjson.js.map +1 -1
- package/output/proto.d.ts.map +1 -1
- package/output/proto.js.map +1 -1
- package/output/style.d.ts.map +1 -1
- package/output/style.js.map +1 -1
- package/output/table.d.ts.map +1 -1
- package/output/table.js.map +1 -1
- package/package.json +7 -7
- package/program.d.ts.map +1 -1
- package/program.js.map +1 -1
- package/registry/aliases.d.ts.map +1 -1
- package/registry/aliases.js.map +1 -1
- package/registry/index.d.ts.map +1 -1
- package/registry/index.js.map +1 -1
- package/registry/metadata.d.ts.map +1 -1
- package/registry/metadata.js.map +1 -1
- package/registry/registry.d.ts.map +1 -1
- package/registry/registry.js.map +1 -1
- package/registry/verb-support.d.ts.map +1 -1
- package/registry/verb-support.js.map +1 -1
- package/registry/verbs.d.ts.map +1 -1
- package/registry/verbs.js.map +1 -1
- package/resources/apply/apply.d.ts.map +1 -1
- package/resources/apply/apply.js.map +1 -1
- package/resources/apply/discovery.d.ts.map +1 -1
- package/resources/apply/discovery.js.map +1 -1
- package/resources/apply/handlers.d.ts.map +1 -1
- package/resources/apply/handlers.js.map +1 -1
- package/resources/connect/connect.d.ts.map +1 -1
- package/resources/connect/connect.js.map +1 -1
- package/resources/connect/discover.d.ts.map +1 -1
- package/resources/connect/discover.js.map +1 -1
- package/resources/connect/display.d.ts.map +1 -1
- package/resources/connect/display.js.map +1 -1
- package/resources/connect/oauth.d.ts.map +1 -1
- package/resources/connect/oauth.js.map +1 -1
- package/resources/cursor-pages.d.ts.map +1 -1
- package/resources/cursor-pages.js.map +1 -1
- package/resources/delete.d.ts.map +1 -1
- package/resources/delete.js.map +1 -1
- package/resources/diff.d.ts.map +1 -1
- package/resources/diff.js.map +1 -1
- package/resources/documents.d.ts.map +1 -1
- package/resources/documents.js.map +1 -1
- package/resources/download.d.ts.map +1 -1
- package/resources/download.js.map +1 -1
- package/resources/execution-approve.d.ts.map +1 -1
- package/resources/execution-approve.js.map +1 -1
- package/resources/execution-control.d.ts.map +1 -1
- package/resources/execution-control.js.map +1 -1
- package/resources/execution-format.d.ts.map +1 -1
- package/resources/execution-format.js.map +1 -1
- package/resources/execution-logs.d.ts.map +1 -1
- package/resources/execution-logs.js.map +1 -1
- package/resources/execution-trace.d.ts.map +1 -1
- package/resources/execution-trace.js.map +1 -1
- package/resources/execution.d.ts.map +1 -1
- package/resources/execution.js.map +1 -1
- package/resources/get-bindings.d.ts.map +1 -1
- package/resources/get-bindings.js.map +1 -1
- package/resources/get.d.ts.map +1 -1
- package/resources/get.js.map +1 -1
- package/resources/git.d.ts.map +1 -1
- package/resources/git.js.map +1 -1
- package/resources/ignore/index.d.ts.map +1 -1
- package/resources/ignore/index.js.map +1 -1
- package/resources/ignore/matcher.d.ts.map +1 -1
- package/resources/ignore/matcher.js.map +1 -1
- package/resources/list.d.ts.map +1 -1
- package/resources/list.js.map +1 -1
- package/resources/mcp/placeholder-resolver.d.ts.map +1 -1
- package/resources/mcp/placeholder-resolver.js.map +1 -1
- package/resources/mcp/runtime-env.d.ts.map +1 -1
- package/resources/mcp/runtime-env.js.map +1 -1
- package/resources/picker/ink.d.ts.map +1 -1
- package/resources/picker/ink.js.map +1 -1
- package/resources/picker/tty.d.ts.map +1 -1
- package/resources/picker/tty.js.map +1 -1
- package/resources/plugin.d.ts.map +1 -1
- package/resources/plugin.js.map +1 -1
- package/resources/reference.d.ts.map +1 -1
- package/resources/reference.js.map +1 -1
- package/resources/render.d.ts.map +1 -1
- package/resources/render.js.map +1 -1
- package/resources/run/agent-exec.d.ts.map +1 -1
- package/resources/run/agent-exec.js.map +1 -1
- package/resources/run/attachments.d.ts.map +1 -1
- package/resources/run/attachments.js.map +1 -1
- package/resources/run/create.d.ts.map +1 -1
- package/resources/run/create.js.map +1 -1
- package/resources/run/env.d.ts.map +1 -1
- package/resources/run/env.js.map +1 -1
- package/resources/run/epilogue.d.ts.map +1 -1
- package/resources/run/epilogue.js.map +1 -1
- package/resources/run/header.d.ts.map +1 -1
- package/resources/run/header.js.map +1 -1
- package/resources/run/prepare.d.ts.map +1 -1
- package/resources/run/prepare.js.map +1 -1
- package/resources/run/resolve.d.ts.map +1 -1
- package/resources/run/resolve.js.map +1 -1
- package/resources/run/resume.d.ts.map +1 -1
- package/resources/run/resume.js.map +1 -1
- package/resources/run/stream.d.ts.map +1 -1
- package/resources/run/stream.js.map +1 -1
- package/resources/run/workflow-stream.d.ts.map +1 -1
- package/resources/run/workflow-stream.js.map +1 -1
- package/resources/run/workspace.d.ts.map +1 -1
- package/resources/run/workspace.js.map +1 -1
- package/resources/schedule.d.ts.map +1 -1
- package/resources/schedule.js.map +1 -1
- package/resources/search.d.ts.map +1 -1
- package/resources/search.js.map +1 -1
- package/resources/session.d.ts.map +1 -1
- package/resources/session.js.map +1 -1
- package/resources/share.d.ts.map +1 -1
- package/resources/share.js.map +1 -1
- package/resources/skill.d.ts.map +1 -1
- package/resources/skill.js.map +1 -1
- package/resources/stream/approval-detect.d.ts.map +1 -1
- package/resources/stream/approval-detect.js.map +1 -1
- package/resources/stream/convert.d.ts.map +1 -1
- package/resources/stream/convert.js.map +1 -1
- package/resources/stream/diff.d.ts.map +1 -1
- package/resources/stream/diff.js.map +1 -1
- package/resources/stream/events.d.ts.map +1 -1
- package/resources/stream/events.js.map +1 -1
- package/resources/stream/headless.d.ts.map +1 -1
- package/resources/stream/headless.js.map +1 -1
- package/resources/stream/ink.d.ts.map +1 -1
- package/resources/stream/ink.js.map +1 -1
- package/resources/stream/render-ndjson.d.ts.map +1 -1
- package/resources/stream/render-ndjson.js.map +1 -1
- package/resources/stream/render-plaintext.d.ts.map +1 -1
- package/resources/stream/render-plaintext.js.map +1 -1
- package/resources/stream/snapshot.d.ts.map +1 -1
- package/resources/stream/snapshot.js.map +1 -1
- package/resources/stream/subagent.d.ts.map +1 -1
- package/resources/stream/subagent.js.map +1 -1
- package/resources/stream/submit.d.ts.map +1 -1
- package/resources/stream/submit.js.map +1 -1
- package/resources/stream/todo.d.ts.map +1 -1
- package/resources/stream/todo.js.map +1 -1
- package/resources/stream/tool-state.d.ts.map +1 -1
- package/resources/stream/tool-state.js.map +1 -1
- package/resources/stream/tty.d.ts.map +1 -1
- package/resources/stream/tty.js.map +1 -1
- package/resources/stream/workflow-event-view.d.ts.map +1 -1
- package/resources/stream/workflow-event-view.js.map +1 -1
- package/resources/stream/workflow-render-ndjson.d.ts.map +1 -1
- package/resources/stream/workflow-render-ndjson.js.map +1 -1
- package/resources/stream/workflow-render-plaintext.d.ts.map +1 -1
- package/resources/stream/workflow-render-plaintext.js.map +1 -1
- package/resources/tag.d.ts.map +1 -1
- package/resources/tag.js.map +1 -1
- package/resources/task-configs.d.ts.map +1 -1
- package/resources/task-configs.js.map +1 -1
- package/resources/usage.d.ts.map +1 -1
- package/resources/usage.js.map +1 -1
- package/resources/validate.d.ts.map +1 -1
- package/resources/validate.js.map +1 -1
- package/resources/version.d.ts.map +1 -1
- package/resources/version.js.map +1 -1
- package/runtime.d.ts.map +1 -1
- package/runtime.js.map +1 -1
- package/version.d.ts.map +1 -1
- package/version.js.map +1 -1
- package/src/auth/pkce.test.ts +0 -37
- package/src/auth/token.test.ts +0 -151
- package/src/client/client.test.ts +0 -142
- package/src/commands/apikey/duration.test.ts +0 -23
- package/src/commands/auth/login.test.ts +0 -52
- package/src/commands/auth/whoami.test.ts +0 -96
- package/src/commands/bootstrap.test.ts +0 -178
- package/src/commands/config/backend.test.ts +0 -122
- package/src/commands/config/context.test.ts +0 -171
- package/src/commands/connect.test.ts +0 -113
- package/src/commands/install.test.ts +0 -307
- package/src/commands/marketplace.test.ts +0 -205
- package/src/commands/mcp-server.test.ts +0 -65
- package/src/commands/validate.test.ts +0 -168
- package/src/config/config.test.ts +0 -132
- package/src/config/keys.test.ts +0 -61
- package/src/config/resolve.test.ts +0 -242
- package/src/errors/clierr.test.ts +0 -172
- package/src/local/artifact.test.ts +0 -54
- package/src/local/bootstrap.test.ts +0 -166
- package/src/local/daemon/components.test.ts +0 -148
- package/src/local/daemon/daemon.integration.test.ts +0 -216
- package/src/local/daemon/env.test.ts +0 -108
- package/src/local/daemon/launch.test.ts +0 -136
- package/src/local/daemon/supervisor.test.ts +0 -260
- package/src/local/llm-config.test.ts +0 -66
- package/src/local/logs/tail.test.ts +0 -70
- package/src/local/logs/view.test.ts +0 -46
- package/src/local/operator-config.test.ts +0 -72
- package/src/local/reset.test.ts +0 -53
- package/src/local/runtime/runtime.test.ts +0 -240
- package/src/local/runtime/runtimes-install.test.ts +0 -58
- package/src/local/runtime/server.test.ts +0 -253
- package/src/local/setup/wizard.test.ts +0 -94
- package/src/local/state/state.test.ts +0 -210
- package/src/local/status.test.ts +0 -108
- package/src/local/temporal/download.test.ts +0 -248
- package/src/local/temporal/inspect.test.ts +0 -83
- package/src/local/temporal/manager.test.ts +0 -64
- package/src/local/temporal/supervisor.test.ts +0 -77
- package/src/marketplace/__fixtures__/cursor-marketplace.ts +0 -69
- package/src/marketplace/config.test.ts +0 -254
- package/src/marketplace/github.test.ts +0 -394
- package/src/marketplace/install.test.ts +0 -261
- package/src/marketplace/official.test.ts +0 -107
- package/src/marketplace/read.test.ts +0 -93
- package/src/marketplace/ref.test.ts +0 -179
- package/src/output/command-result.test.ts +0 -73
- package/src/output/confirm.test.ts +0 -43
- package/src/output/format.test.ts +0 -65
- package/src/output/proto.test.ts +0 -72
- package/src/output/table.test.ts +0 -37
- package/src/program.test.ts +0 -62
- package/src/registry/aliases.test.ts +0 -142
- package/src/registry/registry.test.ts +0 -355
- package/src/resources/apply/apply.integration.test.ts +0 -353
- package/src/resources/apply/apply.test.ts +0 -134
- package/src/resources/apply/discovery.integration.test.ts +0 -99
- package/src/resources/connect/__fixtures__/stdio-crash.mjs +0 -6
- package/src/resources/connect/__fixtures__/stdio-server.mjs +0 -48
- package/src/resources/connect/connect.integration.test.ts +0 -383
- package/src/resources/connect/discover.test.ts +0 -84
- package/src/resources/connect/oauth.test.ts +0 -158
- package/src/resources/cursor-pages.test.ts +0 -55
- package/src/resources/diff.integration.test.ts +0 -103
- package/src/resources/diff.test.ts +0 -34
- package/src/resources/documents.test.ts +0 -67
- package/src/resources/execution-approve.test.ts +0 -50
- package/src/resources/execution-format.test.ts +0 -48
- package/src/resources/execution.integration.test.ts +0 -285
- package/src/resources/execution.test.ts +0 -138
- package/src/resources/ignore/ignore.test.ts +0 -62
- package/src/resources/mcp/placeholder-resolver.test.ts +0 -71
- package/src/resources/mcp/runtime-env.test.ts +0 -102
- package/src/resources/mutate-verbs.integration.test.ts +0 -455
- package/src/resources/picker/tty.test.ts +0 -37
- package/src/resources/plugin.test.ts +0 -379
- package/src/resources/push-download.integration.test.ts +0 -175
- package/src/resources/read-completion.integration.test.ts +0 -164
- package/src/resources/read-verbs.integration.test.ts +0 -603
- package/src/resources/reference.test.ts +0 -107
- package/src/resources/run/agent-exec.test.ts +0 -179
- package/src/resources/run/attachments.test.ts +0 -135
- package/src/resources/run/create.test.ts +0 -336
- package/src/resources/run/env.test.ts +0 -131
- package/src/resources/run/header.test.ts +0 -79
- package/src/resources/run/prepare.test.ts +0 -428
- package/src/resources/run/workflow-stream.integration.test.ts +0 -157
- package/src/resources/run/workspace.test.ts +0 -93
- package/src/resources/share.test.ts +0 -523
- package/src/resources/skill.test.ts +0 -364
- package/src/resources/stream/diff.test.ts +0 -338
- package/src/resources/stream/headless.test.ts +0 -119
- package/src/resources/stream/lazy-import.test.ts +0 -63
- package/src/resources/stream/render-ndjson.test.ts +0 -126
- package/src/resources/stream/render-plaintext.test.ts +0 -127
- package/src/resources/stream/snapshot.test.ts +0 -111
- package/src/resources/stream/submit.test.ts +0 -77
- package/src/resources/stream/workflow-event-view.test.ts +0 -116
- package/src/resources/stream/workflow-render.test.ts +0 -81
- package/src/resources/task-configs.test.ts +0 -98
- package/src/resources/usage.test.ts +0 -94
- package/src/resources/validate.test.ts +0 -79
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
// Command-level contract for `validate`. Drives the real commander program
|
|
2
|
-
// against temp files and asserts the classified exit code and, for the plugin
|
|
3
|
-
// route, the rendered output. The contract: 0 = valid (a plugin with warnings
|
|
4
|
-
// is still 0), 2 = invalid input (bad path, bad YAML, unknown kind, schema
|
|
5
|
-
// failure, a plugin the reader refuses), 1 = unexpected. This is a
|
|
6
|
-
// deliberate, documented refinement over the Go CLI, which returned a
|
|
7
|
-
// generic exit 1 for all validate failures. The YAML cases are unchanged by
|
|
8
|
-
// the plugin route and pin that it stays out of their way.
|
|
9
|
-
|
|
10
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
11
|
-
import { tmpdir } from "node:os";
|
|
12
|
-
import { join } from "node:path";
|
|
13
|
-
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|
14
|
-
import { classify, ExitCode } from "../errors/index.js";
|
|
15
|
-
import { buildProgram } from "../program.js";
|
|
16
|
-
|
|
17
|
-
let dir: string;
|
|
18
|
-
let plugin: string;
|
|
19
|
-
let brokenPlugin: string;
|
|
20
|
-
|
|
21
|
-
function write(root: string, rel: string, content: string): void {
|
|
22
|
-
const full = join(root, rel);
|
|
23
|
-
mkdirSync(join(full, ".."), { recursive: true });
|
|
24
|
-
writeFileSync(full, content);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
beforeAll(() => {
|
|
28
|
-
dir = mkdtempSync(join(tmpdir(), "stigmer-validate-"));
|
|
29
|
-
writeFileSync(
|
|
30
|
-
join(dir, "valid.yaml"),
|
|
31
|
-
[
|
|
32
|
-
"apiVersion: agentic.stigmer.ai/v1",
|
|
33
|
-
"kind: Agent",
|
|
34
|
-
"metadata:",
|
|
35
|
-
" name: Reviewer",
|
|
36
|
-
" slug: reviewer",
|
|
37
|
-
" org: acme",
|
|
38
|
-
"spec:",
|
|
39
|
-
" description: reviews code",
|
|
40
|
-
"",
|
|
41
|
-
].join("\n"),
|
|
42
|
-
);
|
|
43
|
-
writeFileSync(join(dir, "bad-schema.yaml"), ["kind: Agent", "metadata: not-an-object", ""].join("\n"));
|
|
44
|
-
writeFileSync(join(dir, "unknown.yaml"), ["kind: Banana", "metadata:", " name: x", ""].join("\n"));
|
|
45
|
-
|
|
46
|
-
// A Cursor plugin with a header token the manifest does not declare: valid,
|
|
47
|
-
// with one warning, and an ai.stigmer/ document that must not be validated
|
|
48
|
-
// as a loose resource.
|
|
49
|
-
plugin = mkdtempSync(join(tmpdir(), "stigmer-validate-plugin-"));
|
|
50
|
-
write(plugin, ".cursor-plugin/plugin.json", JSON.stringify({ name: "github", version: "1.0.0", mcpServers: "./mcp.json", logo: "assets/logo.svg" }));
|
|
51
|
-
write(plugin, "mcp.json", JSON.stringify({ mcpServers: { github: { type: "http", url: "https://api.example.com/mcp/", headers: { Authorization: "Bearer ${GITHUB_TOKEN}" } } } }));
|
|
52
|
-
write(plugin, "ai.stigmer/agent.yaml", "not: a valid resource document\n");
|
|
53
|
-
write(plugin, "assets/logo.svg", "<svg/>");
|
|
54
|
-
|
|
55
|
-
// The same plugin with the URL made a variable: the one refusal.
|
|
56
|
-
brokenPlugin = mkdtempSync(join(tmpdir(), "stigmer-validate-broken-"));
|
|
57
|
-
write(brokenPlugin, ".cursor-plugin/plugin.json", JSON.stringify({ name: "Broken Name", mcpServers: "./mcp.json" }));
|
|
58
|
-
write(brokenPlugin, "mcp.json", JSON.stringify({ mcpServers: { crm: { type: "http", url: "${CRM_URL}", auth: { scopes: ["a"] } } } }));
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
afterAll(() => {
|
|
62
|
-
for (const path of [dir, plugin, brokenPlugin]) rmSync(path, { recursive: true, force: true });
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
interface Run {
|
|
66
|
-
readonly exitCode: number;
|
|
67
|
-
readonly stdout: string;
|
|
68
|
-
readonly stderr: string;
|
|
69
|
-
readonly error: unknown;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Runs `validate <args>` with output captured, returning the classified exit
|
|
73
|
-
// code (0 on success) and what reached each stream.
|
|
74
|
-
async function runValidate(...args: string[]): Promise<Run> {
|
|
75
|
-
const program = buildProgram();
|
|
76
|
-
program.exitOverride();
|
|
77
|
-
let stdout = "";
|
|
78
|
-
let stderr = "";
|
|
79
|
-
const outSpy = vi.spyOn(process.stdout, "write").mockImplementation((chunk) => {
|
|
80
|
-
stdout += String(chunk);
|
|
81
|
-
return true;
|
|
82
|
-
});
|
|
83
|
-
const errSpy = vi.spyOn(process.stderr, "write").mockImplementation((chunk) => {
|
|
84
|
-
stderr += String(chunk);
|
|
85
|
-
return true;
|
|
86
|
-
});
|
|
87
|
-
try {
|
|
88
|
-
await program.parseAsync(["node", "stigmer", "validate", ...args]);
|
|
89
|
-
return { exitCode: ExitCode.Success, stdout, stderr, error: undefined };
|
|
90
|
-
} catch (err) {
|
|
91
|
-
return { exitCode: classify(err)?.exitCode ?? -1, stdout, stderr, error: err };
|
|
92
|
-
} finally {
|
|
93
|
-
outSpy.mockRestore();
|
|
94
|
-
errSpy.mockRestore();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
describe("validate exit codes (YAML)", () => {
|
|
99
|
-
it("exits 0 for a valid resource", async () => {
|
|
100
|
-
expect((await runValidate("-f", join(dir, "valid.yaml"))).exitCode).toBe(ExitCode.Success);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it("fails the batch when a directory holds an invalid file", async () => {
|
|
104
|
-
expect((await runValidate("-f", dir)).exitCode).not.toBe(ExitCode.Success);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it("exits 2 for a schema-invalid resource", async () => {
|
|
108
|
-
expect((await runValidate("-f", join(dir, "bad-schema.yaml"))).exitCode).toBe(ExitCode.Usage);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it("exits 2 for an unknown resource kind", async () => {
|
|
112
|
-
expect((await runValidate("-f", join(dir, "unknown.yaml"))).exitCode).toBe(ExitCode.Usage);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it("exits 2 for a path that does not exist", async () => {
|
|
116
|
-
expect((await runValidate("-f", join(dir, "missing.yaml"))).exitCode).toBe(ExitCode.Usage);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
describe("validate on a plugin directory", () => {
|
|
121
|
-
it("accepts the plugin with a warning status, exit 0, everything on stderr", async () => {
|
|
122
|
-
const run = await runValidate("-f", plugin);
|
|
123
|
-
expect(run.exitCode).toBe(ExitCode.Success);
|
|
124
|
-
expect(run.stdout).toBe("");
|
|
125
|
-
expect(run.stderr).toContain("Plugin 'github' is valid with 1 warning");
|
|
126
|
-
expect(run.stderr).toContain("Cursor plugin");
|
|
127
|
-
// Section keys are padded to the widest key, so match key and value loosely.
|
|
128
|
-
expect(run.stderr).toMatch(/MCP servers\s+1: github \(http\)/);
|
|
129
|
-
expect(run.stderr).toMatch(/Variables\s+1: GITHUB_TOKEN \(inferred\)/);
|
|
130
|
-
expect(run.stderr).toMatch(/Files\s+4 read, 0 excluded by ignore rules/);
|
|
131
|
-
expect(run.stderr).toMatch(/Stigmer overlay\s+agent/);
|
|
132
|
-
expect(run.stderr).toContain("variable 'GITHUB_TOKEN' is referenced by MCP server 'github' but not declared");
|
|
133
|
-
expect(run.stderr).toContain("- logo (.cursor-plugin/plugin.json#logo)");
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it("emits the normalised package as JSON data on stdout with --json", async () => {
|
|
137
|
-
const run = await runValidate("-f", plugin, "--json");
|
|
138
|
-
expect(run.exitCode).toBe(ExitCode.Success);
|
|
139
|
-
expect(run.stderr).toBe("");
|
|
140
|
-
const parsed = JSON.parse(run.stdout);
|
|
141
|
-
expect(parsed.status).toBe("warning");
|
|
142
|
-
expect(parsed.data.plugin).toMatchObject({
|
|
143
|
-
name: "github",
|
|
144
|
-
dialect: "cursor",
|
|
145
|
-
mcpServers: [{ name: "github", transport: "http", env: ["GITHUB_TOKEN"] }],
|
|
146
|
-
variables: [{ name: "GITHUB_TOKEN", isSecret: true, optional: false, declaredBy: "inferred" }],
|
|
147
|
-
overlay: { agent: "ai.stigmer/agent.yaml", workflows: [], mcpServers: [] },
|
|
148
|
-
});
|
|
149
|
-
expect(parsed.data.warnings.map((w: { kind: string }) => w.kind)).toEqual(["variable-inferred"]);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it("prints only the status line with --quiet", async () => {
|
|
153
|
-
const run = await runValidate("-f", plugin, "--quiet");
|
|
154
|
-
expect(run.stderr.trim()).toBe("⚠ Plugin 'github' is valid with 1 warning");
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it("refuses with exit 2 and every problem's sentence", async () => {
|
|
158
|
-
const run = await runValidate("-f", brokenPlugin);
|
|
159
|
-
expect(run.exitCode).toBe(ExitCode.Usage);
|
|
160
|
-
const message = (run.error as Error).message;
|
|
161
|
-
expect(message).toContain("plugin cannot be installed, 2 problems found:");
|
|
162
|
-
expect(message).toContain("plugin name 'Broken Name' in '.cursor-plugin/plugin.json' is invalid");
|
|
163
|
-
expect(message).toContain("MCP server 'crm' in 'mcp.json' has a variable in its 'url'");
|
|
164
|
-
// Warnings ride along under the refusal so one run says everything.
|
|
165
|
-
expect(message).toContain("and 1 warning:");
|
|
166
|
-
expect(message).toContain("MCP server 'crm' in 'mcp.json' has an 'auth' block Stigmer does not read");
|
|
167
|
-
});
|
|
168
|
-
});
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
-
import { setStandalone } from "../runtime.js";
|
|
6
|
-
import { getDefault, isCloudMode, load, save } from "./config.js";
|
|
7
|
-
|
|
8
|
-
function tempConfigPath(): string {
|
|
9
|
-
const dir = mkdtempSync(join(tmpdir(), "stigmer-cli-config-"));
|
|
10
|
-
return join(dir, "config.yaml");
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
afterEach(() => {
|
|
14
|
-
setStandalone(false);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
describe("load", () => {
|
|
18
|
-
it("returns the local default when the file is missing", () => {
|
|
19
|
-
const config = load(join(tempConfigPath(), "does-not-exist.yaml"));
|
|
20
|
-
expect(config).toEqual(getDefault());
|
|
21
|
-
expect(isCloudMode(config)).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it("returns the default in standalone mode without reading the file", () => {
|
|
25
|
-
const path = tempConfigPath();
|
|
26
|
-
writeFileSync(path, "backend:\n type: cloud\n");
|
|
27
|
-
setStandalone(true);
|
|
28
|
-
expect(load(path)).toEqual(getDefault());
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it("migrates a legacy cloud config into the named model on load", () => {
|
|
32
|
-
const path = tempConfigPath();
|
|
33
|
-
writeFileSync(
|
|
34
|
-
path,
|
|
35
|
-
"backend:\n type: cloud\n cloud:\n endpoint: api.stigmer.ai:443\n org_id: acme\ncontext:\n organization: acme\n",
|
|
36
|
-
);
|
|
37
|
-
const config = load(path);
|
|
38
|
-
// The legacy slot becomes the reserved "cloud" entry; the legacy type
|
|
39
|
-
// selects it as current. The slot itself is not carried forward.
|
|
40
|
-
expect(config.current_backend).toBe("cloud");
|
|
41
|
-
expect(config.backends?.["cloud"]).toEqual({
|
|
42
|
-
type: "cloud",
|
|
43
|
-
endpoint: "api.stigmer.ai:443",
|
|
44
|
-
org_id: "acme",
|
|
45
|
-
});
|
|
46
|
-
expect(config.backend.cloud).toBeUndefined();
|
|
47
|
-
expect(config.context?.organization).toBe("acme");
|
|
48
|
-
expect(isCloudMode(config)).toBe(true);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it("parses a named-model config with selfhost entries", () => {
|
|
52
|
-
const path = tempConfigPath();
|
|
53
|
-
writeFileSync(
|
|
54
|
-
path,
|
|
55
|
-
"backend:\n type: cloud\nbackends:\n staging:\n type: selfhost\n endpoint: stigmer.example.com:7234\n api_key: stk_x\ncurrent_backend: staging\n",
|
|
56
|
-
);
|
|
57
|
-
const config = load(path);
|
|
58
|
-
expect(config.current_backend).toBe("staging");
|
|
59
|
-
expect(config.backends?.["staging"]?.type).toBe("selfhost");
|
|
60
|
-
expect(config.backends?.["staging"]?.api_key).toBe("stk_x");
|
|
61
|
-
expect(isCloudMode(config)).toBe(false);
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
describe("save", () => {
|
|
66
|
-
it("round-trips a config and writes a 0600 file with the doc header", () => {
|
|
67
|
-
const path = tempConfigPath();
|
|
68
|
-
const config = getDefault();
|
|
69
|
-
(config.backends ??= {})["cloud"] = {
|
|
70
|
-
type: "cloud",
|
|
71
|
-
endpoint: "api.stigmer.ai:443",
|
|
72
|
-
token: "t",
|
|
73
|
-
org_id: "acme",
|
|
74
|
-
};
|
|
75
|
-
config.current_backend = "cloud";
|
|
76
|
-
save(config, path);
|
|
77
|
-
|
|
78
|
-
const text = readFileSync(path, "utf8");
|
|
79
|
-
expect(text).toContain("# Stigmer CLI Configuration");
|
|
80
|
-
const reloaded = load(path);
|
|
81
|
-
expect(reloaded.backends).toEqual(config.backends);
|
|
82
|
-
expect(reloaded.current_backend).toBe("cloud");
|
|
83
|
-
// The legacy mirror is written for older readers.
|
|
84
|
-
expect(reloaded.backend.type).toBe("cloud");
|
|
85
|
-
|
|
86
|
-
rmSync(path);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it("writes a legacy-loaded cloud config in the named shape (the one-time migration)", () => {
|
|
90
|
-
const path = tempConfigPath();
|
|
91
|
-
writeFileSync(
|
|
92
|
-
path,
|
|
93
|
-
"backend:\n type: cloud\n cloud:\n endpoint: api.stigmer.ai:443\n token: t\n",
|
|
94
|
-
);
|
|
95
|
-
save(load(path), path);
|
|
96
|
-
|
|
97
|
-
const text = readFileSync(path, "utf8");
|
|
98
|
-
expect(text).toContain("backends:");
|
|
99
|
-
expect(text).toContain("current_backend: cloud");
|
|
100
|
-
// The legacy slot is gone; its content lives in backends.cloud.
|
|
101
|
-
expect(text).not.toContain(" cloud:\n endpoint");
|
|
102
|
-
const reloaded = load(path);
|
|
103
|
-
expect(reloaded.backends?.["cloud"]?.token).toBe("t");
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it("keeps a pristine local config byte-stable (no named-model keys appear)", () => {
|
|
107
|
-
const path = tempConfigPath();
|
|
108
|
-
save(getDefault(), path);
|
|
109
|
-
const text = readFileSync(path, "utf8");
|
|
110
|
-
expect(text).not.toContain("backends:");
|
|
111
|
-
expect(text).not.toContain("current_backend:");
|
|
112
|
-
expect(text).toContain("type: local");
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it("preserves the opaque local backend section across a load/save round-trip", () => {
|
|
116
|
-
const path = tempConfigPath();
|
|
117
|
-
writeFileSync(
|
|
118
|
-
path,
|
|
119
|
-
"backend:\n type: local\n local:\n temporal:\n managed: true\n execution:\n mode: local\n",
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
const config = load(path);
|
|
123
|
-
// Mutate an unrelated field, then save.
|
|
124
|
-
(config.context ??= {}).organization = "acme";
|
|
125
|
-
save(config, path);
|
|
126
|
-
|
|
127
|
-
const reloaded = readFileSync(path, "utf8");
|
|
128
|
-
expect(reloaded).toContain("managed: true");
|
|
129
|
-
expect(reloaded).toContain("mode: local");
|
|
130
|
-
expect(reloaded).toContain("organization: acme");
|
|
131
|
-
});
|
|
132
|
-
});
|
package/src/config/keys.test.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { UsageError } from "../errors/usage-error.js";
|
|
3
|
-
import { getDefault } from "./config.js";
|
|
4
|
-
import { configKeyNames, getConfigValue, setConfigValue } from "./keys.js";
|
|
5
|
-
|
|
6
|
-
describe("config keys", () => {
|
|
7
|
-
it("lists the known keys sorted", () => {
|
|
8
|
-
expect(configKeyNames()).toEqual([
|
|
9
|
-
"backend.cloud.endpoint",
|
|
10
|
-
"backend.cloud.org_id",
|
|
11
|
-
"backend.type",
|
|
12
|
-
"context.organization",
|
|
13
|
-
"current_backend",
|
|
14
|
-
]);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it("gets the backend type", () => {
|
|
18
|
-
expect(getConfigValue(getDefault(), "backend.type")).toBe("local");
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it("returns empty string for unset nested keys", () => {
|
|
22
|
-
expect(getConfigValue(getDefault(), "backend.cloud.org_id")).toBe("");
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it("sets a nested key, creating the reserved cloud entry", () => {
|
|
26
|
-
const config = getDefault();
|
|
27
|
-
setConfigValue(config, "backend.cloud.org_id", "acme");
|
|
28
|
-
expect(config.backends?.["cloud"]?.org_id).toBe("acme");
|
|
29
|
-
expect(getConfigValue(config, "backend.cloud.org_id")).toBe("acme");
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("backend.type set to cloud selects the reserved cloud entry", () => {
|
|
33
|
-
const config = getDefault();
|
|
34
|
-
setConfigValue(config, "backend.type", "cloud");
|
|
35
|
-
expect(config.current_backend).toBe("cloud");
|
|
36
|
-
expect(config.backends?.["cloud"]?.type).toBe("cloud");
|
|
37
|
-
expect(getConfigValue(config, "backend.type")).toBe("cloud");
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("current_backend switches only to known names", () => {
|
|
41
|
-
const config = getDefault();
|
|
42
|
-
expect(() => setConfigValue(config, "current_backend", "nope")).toThrow(
|
|
43
|
-
UsageError,
|
|
44
|
-
);
|
|
45
|
-
setConfigValue(config, "current_backend", "local");
|
|
46
|
-
expect(getConfigValue(config, "current_backend")).toBe("local");
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("validates backend.type values", () => {
|
|
50
|
-
expect(() => setConfigValue(getDefault(), "backend.type", "bogus")).toThrow(
|
|
51
|
-
UsageError,
|
|
52
|
-
);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("rejects unknown keys", () => {
|
|
56
|
-
expect(() => getConfigValue(getDefault(), "nope.nope")).toThrow(UsageError);
|
|
57
|
-
expect(() => setConfigValue(getDefault(), "nope.nope", "x")).toThrow(
|
|
58
|
-
UsageError,
|
|
59
|
-
);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
// Pins the effective-value resolvers over the named-backend model (O3):
|
|
2
|
-
// env > active entry > defaults for endpoint/token/org/console-URL, the
|
|
3
|
-
// selfhost credential lane (api_key), and the auth gate's three postures
|
|
4
|
-
// (local never, selfhost never client-side, cloud requires a credential).
|
|
5
|
-
|
|
6
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
7
|
-
import { CliExitError } from "../errors/index.js";
|
|
8
|
-
import type { Config, NamedBackendConfig } from "./config.js";
|
|
9
|
-
import {
|
|
10
|
-
DEFAULT_CLOUD_CONSOLE_URL,
|
|
11
|
-
ensureAuthenticated,
|
|
12
|
-
resolveConsoleURL,
|
|
13
|
-
resolveContextOrganization,
|
|
14
|
-
resolveEndpoint,
|
|
15
|
-
resolveOrganization,
|
|
16
|
-
resolveToken,
|
|
17
|
-
} from "./resolve.js";
|
|
18
|
-
|
|
19
|
-
const ENV_KEYS = [
|
|
20
|
-
"STIGMER_SERVER_ADDRESS",
|
|
21
|
-
"STIGMER_API_KEY",
|
|
22
|
-
"STIGMER_ORG_ID",
|
|
23
|
-
] as const;
|
|
24
|
-
|
|
25
|
-
afterEach(() => {
|
|
26
|
-
for (const key of ENV_KEYS) delete process.env[key];
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
function localConfig(context?: Config["context"]): Config {
|
|
30
|
-
return {
|
|
31
|
-
backend: { type: "local" },
|
|
32
|
-
backends: {},
|
|
33
|
-
current_backend: "local",
|
|
34
|
-
context,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function cloudConfig(
|
|
39
|
-
overrides: Partial<NamedBackendConfig> = {},
|
|
40
|
-
context?: Config["context"],
|
|
41
|
-
): Config {
|
|
42
|
-
return {
|
|
43
|
-
backend: { type: "cloud" },
|
|
44
|
-
backends: {
|
|
45
|
-
cloud: { type: "cloud", endpoint: "cloud.example:443", ...overrides },
|
|
46
|
-
},
|
|
47
|
-
current_backend: "cloud",
|
|
48
|
-
context,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function selfhostConfig(overrides: Partial<NamedBackendConfig> = {}): Config {
|
|
53
|
-
return {
|
|
54
|
-
backend: { type: "cloud" },
|
|
55
|
-
backends: {
|
|
56
|
-
staging: {
|
|
57
|
-
type: "selfhost",
|
|
58
|
-
endpoint: "stigmer.example.com:7234",
|
|
59
|
-
...overrides,
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
current_backend: "staging",
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
describe("resolveEndpoint", () => {
|
|
67
|
-
it("defaults to the local daemon address in local mode", () => {
|
|
68
|
-
expect(resolveEndpoint(localConfig())).toBe("localhost:7234");
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("uses the cloud default when no endpoint is configured", () => {
|
|
72
|
-
expect(resolveEndpoint(cloudConfig({ endpoint: undefined }))).toBe(
|
|
73
|
-
"api.stigmer.ai:443",
|
|
74
|
-
);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it("prefers the configured cloud endpoint", () => {
|
|
78
|
-
expect(resolveEndpoint(cloudConfig())).toBe("cloud.example:443");
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it("uses the selfhost entry's endpoint", () => {
|
|
82
|
-
expect(resolveEndpoint(selfhostConfig())).toBe("stigmer.example.com:7234");
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it("refuses a selfhost entry without an endpoint (hand-edited config)", () => {
|
|
86
|
-
expect(() =>
|
|
87
|
-
resolveEndpoint(selfhostConfig({ endpoint: undefined })),
|
|
88
|
-
).toThrow(CliExitError);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it("lets STIGMER_SERVER_ADDRESS override everything", () => {
|
|
92
|
-
process.env.STIGMER_SERVER_ADDRESS = "override:7234";
|
|
93
|
-
expect(resolveEndpoint(cloudConfig())).toBe("override:7234");
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
describe("resolveToken", () => {
|
|
98
|
-
it("prefers STIGMER_API_KEY over the config token", () => {
|
|
99
|
-
process.env.STIGMER_API_KEY = "env-key";
|
|
100
|
-
expect(resolveToken(cloudConfig({ token: "config-token" }))).toBe(
|
|
101
|
-
"env-key",
|
|
102
|
-
);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("falls back to the cloud entry's login token", () => {
|
|
106
|
-
expect(resolveToken(cloudConfig({ token: "config-token" }))).toBe(
|
|
107
|
-
"config-token",
|
|
108
|
-
);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it("uses the selfhost entry's api_key", () => {
|
|
112
|
-
expect(resolveToken(selfhostConfig({ api_key: "stk_stored" }))).toBe(
|
|
113
|
-
"stk_stored",
|
|
114
|
-
);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it("returns empty string when unauthenticated", () => {
|
|
118
|
-
expect(resolveToken(cloudConfig({ endpoint: undefined }))).toBe("");
|
|
119
|
-
expect(resolveToken(selfhostConfig())).toBe("");
|
|
120
|
-
expect(resolveToken(localConfig())).toBe("");
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
describe("resolveOrganization", () => {
|
|
125
|
-
it("prefers the --org flag override", () => {
|
|
126
|
-
process.env.STIGMER_ORG_ID = "env-org";
|
|
127
|
-
const config = cloudConfig({ org_id: "config-org" });
|
|
128
|
-
expect(resolveOrganization(config, "flag-org")).toBe("flag-org");
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it("falls back to STIGMER_ORG_ID, then context, then the entry's org_id", () => {
|
|
132
|
-
process.env.STIGMER_ORG_ID = "env-org";
|
|
133
|
-
expect(resolveOrganization(cloudConfig({ org_id: "config-org" }))).toBe(
|
|
134
|
-
"env-org",
|
|
135
|
-
);
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
it("uses context organization when no flag/env is set", () => {
|
|
139
|
-
const config = cloudConfig(
|
|
140
|
-
{ org_id: "legacy" },
|
|
141
|
-
{ organization: "ctx-org" },
|
|
142
|
-
);
|
|
143
|
-
expect(resolveOrganization(config)).toBe("ctx-org");
|
|
144
|
-
expect(resolveContextOrganization(config)).toBe("ctx-org");
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
it("falls back to the entry's org_id", () => {
|
|
148
|
-
expect(resolveContextOrganization(cloudConfig({ org_id: "legacy" }))).toBe(
|
|
149
|
-
"legacy",
|
|
150
|
-
);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
it("defaults to the stigmer org in local mode when nothing is configured", () => {
|
|
154
|
-
expect(resolveOrganization(localConfig())).toBe("stigmer");
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it("defaults to the stigmer org on a selfhost backend (it IS the OSS server)", () => {
|
|
158
|
-
expect(resolveOrganization(selfhostConfig())).toBe("stigmer");
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it("prefers an explicit context org over the local default", () => {
|
|
162
|
-
expect(
|
|
163
|
-
resolveOrganization(localConfig({ organization: "my-local-org" })),
|
|
164
|
-
).toBe("my-local-org");
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it("does not apply the local default in cloud mode (org stays empty)", () => {
|
|
168
|
-
expect(resolveOrganization(cloudConfig({ endpoint: undefined }))).toBe("");
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it("reports an unset local org as empty via resolveContextOrganization (no implicit default)", () => {
|
|
172
|
-
// The implicit local default lives only in resolveOrganization (effective
|
|
173
|
-
// org for operations); the context query must stay faithful so config/context
|
|
174
|
-
// display can show "(not set)".
|
|
175
|
-
expect(resolveContextOrganization(localConfig())).toBe("");
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
describe("resolveConsoleURL", () => {
|
|
180
|
-
it("prefers the STIGMER_CONSOLE_URL override", () => {
|
|
181
|
-
expect(
|
|
182
|
-
resolveConsoleURL(cloudConfig(), {
|
|
183
|
-
STIGMER_CONSOLE_URL: "https://console.example",
|
|
184
|
-
} as NodeJS.ProcessEnv),
|
|
185
|
-
).toBe("https://console.example");
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it("uses the local web-console port for the local backend", () => {
|
|
189
|
-
expect(resolveConsoleURL(localConfig(), {} as NodeJS.ProcessEnv)).toBe(
|
|
190
|
-
"http://localhost:7234",
|
|
191
|
-
);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it("uses the cloud console URL for the cloud backend", () => {
|
|
195
|
-
expect(resolveConsoleURL(cloudConfig(), {} as NodeJS.ProcessEnv)).toBe(
|
|
196
|
-
DEFAULT_CLOUD_CONSOLE_URL,
|
|
197
|
-
);
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it("derives the selfhost console from the entry's endpoint (one-origin rule)", () => {
|
|
201
|
-
expect(resolveConsoleURL(selfhostConfig(), {} as NodeJS.ProcessEnv)).toBe(
|
|
202
|
-
"http://stigmer.example.com:7234",
|
|
203
|
-
);
|
|
204
|
-
expect(
|
|
205
|
-
resolveConsoleURL(
|
|
206
|
-
selfhostConfig({ endpoint: "stigmer.example.com:443" }),
|
|
207
|
-
{} as NodeJS.ProcessEnv,
|
|
208
|
-
),
|
|
209
|
-
).toBe("https://stigmer.example.com");
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
describe("ensureAuthenticated", () => {
|
|
214
|
-
it("never requires auth in local mode", () => {
|
|
215
|
-
expect(() => ensureAuthenticated(localConfig())).not.toThrow();
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it("never gates selfhost client-side (the server owns that decision)", () => {
|
|
219
|
-
expect(() => ensureAuthenticated(selfhostConfig())).not.toThrow();
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
it("throws in cloud mode with no credentials", () => {
|
|
223
|
-
expect(() => ensureAuthenticated(cloudConfig())).toThrow(CliExitError);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it("passes with a stored access token", () => {
|
|
227
|
-
expect(() =>
|
|
228
|
-
ensureAuthenticated(cloudConfig({ token: "t" })),
|
|
229
|
-
).not.toThrow();
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it("passes with only a refresh token (silent refresh will mint one)", () => {
|
|
233
|
-
expect(() =>
|
|
234
|
-
ensureAuthenticated(cloudConfig({ refresh_token: "r" })),
|
|
235
|
-
).not.toThrow();
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it("passes with STIGMER_API_KEY in the environment", () => {
|
|
239
|
-
process.env.STIGMER_API_KEY = "stk_env";
|
|
240
|
-
expect(() => ensureAuthenticated(cloudConfig())).not.toThrow();
|
|
241
|
-
});
|
|
242
|
-
});
|