@stackbone/cli 0.5.1 → 0.5.3

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 CHANGED
@@ -7,6 +7,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.3] - 2026-09-25
11
+
12
+ ### Fixed
13
+
14
+ - **`stackbone dev` failed at `Starting docker services` with `401 UNAUTHORIZED`
15
+ from quay.io.** MinIO closed anonymous pulls of `minio/minio` there too, after
16
+ Docker Hub. The compose files `stackbone dev` and `stackbone package` write now
17
+ pull the community fork `pgsty/minio:RELEASE.2026-08-04T00-00-00Z`, which needs
18
+ no account (PLA-1794).
19
+
20
+ ## [0.5.2] - 2026-09-23
21
+
22
+ ### Fixed
23
+
24
+ - **A fresh `stackbone init` failed `npm install` with `ERESOLVE`.** The scaffold
25
+ pinned `zod@4.4.3`, while its own `@workflow/world@5.0.0-beta.11` peer-requires
26
+ exactly `zod@4.3.6`. pnpm only warns about a peer conflict, so it went
27
+ unnoticed. The shell template, its `workflows` member and the deep-agent
28
+ dependency map now all pin `4.3.6` (PLA-1653).
29
+
30
+ - **`init [dir]` help said omitting the positional scaffolds in place.** It
31
+ creates a subdirectory; pass `.` to scaffold in the current directory.
32
+
33
+ - **`stackbone dev` re-parsed a url connector spec on every action and every
34
+ trigger tick.** The parsed spec is now kept in process while its text is
35
+ unchanged. For Microsoft Graph's 42 MB spec, an introspection drops from about
36
+ 6 s to under 50 ms after the first one (PLA-1714).
37
+
10
38
  ## [0.5.1] - 2026-09-17
11
39
 
12
40
  ### Fixed
package/main.js CHANGED
@@ -15739,7 +15739,7 @@ var emulatorCors = (allowlist) => cors({
15739
15739
  var STACKBONE_CLI_BUILD_VERSION, EMULATOR_CAPABILITY_ROUTES, EMULATOR_CAPABILITIES, buildContractResponse;
15740
15740
  var init_contract = __esmMin((() => {
15741
15741
  init_src$19();
15742
- STACKBONE_CLI_BUILD_VERSION = "0.5.1";
15742
+ STACKBONE_CLI_BUILD_VERSION = "0.5.3";
15743
15743
  EMULATOR_CAPABILITY_ROUTES = {
15744
15744
  "database.postgres_direct": "/api/db",
15745
15745
  "rag.basic": "/api/rag",
@@ -30698,6 +30698,70 @@ var init_spec_cache_key = __esmMin((() => {
30698
30698
  SPEC_CACHE_KEY_NAMESPACE = "connect:spec";
30699
30699
  }));
30700
30700
  //#endregion
30701
+ //#region ../../libs/runtime/connect-broker/src/lib/cache/spec-digest.ts
30702
+ /**
30703
+ * The digest a spec document is known by: sha256 of its text, hex. One function
30704
+ * for both sides of PLA-1714 — the cache that vouches for a document by its
30705
+ * digest and the introspection memo that keys a parse on it — because two
30706
+ * spellings of "the hash of the text" is how a vouched digest stops matching.
30707
+ */
30708
+ function specTextDigest(text) {
30709
+ return createHash("sha256").update(text).digest("hex");
30710
+ }
30711
+ var init_spec_digest = __esmMin((() => {}));
30712
+ //#endregion
30713
+ //#region ../../libs/runtime/connect-broker/src/lib/cache/digest-tracking-spec-cache.ts
30714
+ /**
30715
+ * Wrap `shared` so it remembers the digest of each document it writes or reads.
30716
+ * `now`, `maxAgeMs` and `maxEntries` are injected so the bounds are provable in
30717
+ * tests without a real clock or thirty-two documents.
30718
+ */
30719
+ function trackSpecDigests(shared, options = {}) {
30720
+ const now = options.now ?? (() => Date.now());
30721
+ const maxAgeMs = options.maxAgeMs ?? 6e5;
30722
+ const maxEntries = options.maxEntries ?? 32;
30723
+ const digests = /* @__PURE__ */ new Map();
30724
+ const remember = (key, text, ttlMs) => {
30725
+ digests.delete(key);
30726
+ digests.set(key, {
30727
+ digest: specTextDigest(text),
30728
+ expiresAt: now() + Math.min(ttlMs, maxAgeMs)
30729
+ });
30730
+ while (digests.size > maxEntries) {
30731
+ const oldest = digests.keys().next();
30732
+ if (oldest.done === true) break;
30733
+ digests.delete(oldest.value);
30734
+ }
30735
+ };
30736
+ return {
30737
+ async digestOf(key) {
30738
+ const held = digests.get(key);
30739
+ if (held === void 0) return null;
30740
+ if (held.expiresAt <= now()) {
30741
+ digests.delete(key);
30742
+ return null;
30743
+ }
30744
+ return held.digest;
30745
+ },
30746
+ async get(key) {
30747
+ const text = await shared.get(key);
30748
+ if (text !== null) remember(key, text, maxAgeMs);
30749
+ return text;
30750
+ },
30751
+ async set(key, value, ttlMs) {
30752
+ await shared.set(key, value, ttlMs);
30753
+ if (ttlMs > 0) remember(key, value, ttlMs);
30754
+ },
30755
+ async evict(key) {
30756
+ digests.delete(key);
30757
+ await shared.evict(key);
30758
+ }
30759
+ };
30760
+ }
30761
+ var init_digest_tracking_spec_cache = __esmMin((() => {
30762
+ init_spec_digest();
30763
+ }));
30764
+ //#endregion
30701
30765
  //#region ../../libs/runtime/connect-broker/src/lib/executor/credential-placement.ts
30702
30766
  /**
30703
30767
  * Apply the broker-minted token to EVERY placement the connector declares, all
@@ -36659,10 +36723,17 @@ function redactUrl(raw) {
36659
36723
  async function resolveSpecDocument(specSource, deps = {}) {
36660
36724
  if (specSource === void 0) throw new Error("connector definition has no specSource to introspect");
36661
36725
  if (specSource.kind === "inline") return specSource.document;
36726
+ return parseSpecText(await (await fetchSpec(specSource, deps)).text(), specSource.url);
36727
+ }
36728
+ /** Fetch a `url` specSource through the injected `fetch`, refusing a non-2xx. */
36729
+ async function fetchSpec(specSource, deps) {
36662
36730
  if (deps.fetch === void 0) throw new Error(`connector specSource is a url ("${redactUrl(specSource.url)}") but no fetch was injected to resolve it`);
36663
36731
  const response = deps.policy !== void 0 ? await deps.fetch(specSource.url, deps.headers, deps.policy) : deps.headers !== void 0 ? await deps.fetch(specSource.url, deps.headers) : await deps.fetch(specSource.url);
36664
36732
  if (!response.ok) throw new Error(`fetching connector spec from "${redactUrl(specSource.url)}" failed with status ${response.status}`);
36665
- const body = await response.text();
36733
+ return response;
36734
+ }
36735
+ /** Parse fetched spec text as JSON, falling back to YAML. `url` only feeds the error. */
36736
+ function parseSpecText(body, url) {
36666
36737
  let doc;
36667
36738
  try {
36668
36739
  doc = JSON.parse(body);
@@ -36673,9 +36744,46 @@ async function resolveSpecDocument(specSource, deps = {}) {
36673
36744
  doc = void 0;
36674
36745
  }
36675
36746
  }
36676
- if (doc === null || typeof doc !== "object") throw new Error(`connector spec fetched from "${redactUrl(specSource.url)}" is not valid JSON or YAML`);
36747
+ if (doc === null || typeof doc !== "object") throw new Error(`connector spec fetched from "${redactUrl(url)}" is not valid JSON or YAML`);
36677
36748
  return doc;
36678
36749
  }
36750
+ /** The protocol introspector's own output for a parsed document, with no extras. */
36751
+ function introspectDocument(protocol, document) {
36752
+ if (protocol === "openapi") return Promise.resolve(introspectOpenApi(document));
36753
+ return introspectMcpTools({ listToolsResult: document });
36754
+ }
36755
+ /** A held parse by memo key, refreshed as most recently used. */
36756
+ function heldIntrospection(key) {
36757
+ const held = baseIntrospections.get(key);
36758
+ if (held !== void 0) {
36759
+ baseIntrospections.delete(key);
36760
+ baseIntrospections.set(key, held);
36761
+ }
36762
+ return held;
36763
+ }
36764
+ async function introspectBase(def, deps) {
36765
+ const source = def.specSource;
36766
+ if (source?.kind !== "url") return introspectDocument(def.protocol, await resolveSpecDocument(source, deps));
36767
+ const response = await fetchSpec(source, deps);
36768
+ if (response.digest !== void 0) {
36769
+ const held = heldIntrospection(`${def.protocol}:${response.digest}`);
36770
+ if (held !== void 0) return held;
36771
+ }
36772
+ const text = await response.text();
36773
+ const key = `${def.protocol}:${specTextDigest(text)}`;
36774
+ const held = heldIntrospection(key);
36775
+ if (held !== void 0) return held;
36776
+ const parsing = Promise.resolve().then(() => introspectDocument(def.protocol, parseSpecText(text, source.url))).catch((err) => {
36777
+ if (baseIntrospections.get(key) === parsing) baseIntrospections.delete(key);
36778
+ throw err;
36779
+ });
36780
+ baseIntrospections.set(key, parsing);
36781
+ if (baseIntrospections.size > 16) {
36782
+ const oldest = baseIntrospections.keys().next().value;
36783
+ if (oldest !== void 0) baseIntrospections.delete(oldest);
36784
+ }
36785
+ return parsing;
36786
+ }
36679
36787
  /**
36680
36788
  * Resolve a connector's spec document and dispatch it to the right introspector
36681
36789
  * for its `protocol`. Returns the normalized `IntrospectionResult` —
@@ -36693,17 +36801,19 @@ async function resolveSpecDocument(specSource, deps = {}) {
36693
36801
  * not dropping information silently.
36694
36802
  */
36695
36803
  async function introspectConnector(def, deps = {}) {
36696
- const document = await resolveSpecDocument(def.specSource, deps);
36697
- if (def.protocol === "openapi") return appendExtraQueryParams(appendExtraOperations(introspectOpenApi(document), def.extraOperations), def.extraQueryParams);
36698
- const result = await introspectMcpTools({ listToolsResult: document });
36804
+ const result = await introspectBase(def, deps);
36805
+ if (def.protocol === "openapi") return appendExtraQueryParams(appendExtraOperations(result, def.extraOperations), def.extraQueryParams);
36699
36806
  if (def.extraOperations === void 0 || def.extraOperations.length === 0) return result;
36700
36807
  return {
36701
36808
  ...result,
36702
36809
  warnings: [...result.warnings, `extraOperations: ignored — connector '${def.id}' speaks mcp, whose surface is tools, not operations`]
36703
36810
  };
36704
36811
  }
36812
+ var baseIntrospections;
36705
36813
  var init_spec_introspection = __esmMin((() => {
36706
36814
  init_src$4();
36815
+ init_spec_digest();
36816
+ baseIntrospections = /* @__PURE__ */ new Map();
36707
36817
  }));
36708
36818
  //#endregion
36709
36819
  //#region ../../libs/runtime/connect-broker/src/lib/executor/spec-request.ts
@@ -36828,6 +36938,26 @@ function createCachingSpecFetch(options) {
36828
36938
  fetch: async (url, headers, policy) => {
36829
36939
  fromCache = false;
36830
36940
  pending = null;
36941
+ const fromNetwork = () => policy !== void 0 ? fetch(url, headers, policy) : headers !== void 0 ? fetch(url, headers) : fetch(url);
36942
+ const digest = cache.digestOf ? await cache.digestOf(key).catch(() => null) : null;
36943
+ if (digest !== null) {
36944
+ fromCache = true;
36945
+ return {
36946
+ ok: true,
36947
+ status: 200,
36948
+ digest,
36949
+ text: async () => {
36950
+ const held = await cache.get(key).catch(() => null);
36951
+ if (held !== null) return held;
36952
+ const response = await fromNetwork();
36953
+ if (!response.ok) throw new Error(`the cached connector spec is gone and re-fetching it failed with status ${response.status}`);
36954
+ const body = await response.text();
36955
+ fromCache = false;
36956
+ pending = body;
36957
+ return body;
36958
+ }
36959
+ };
36960
+ }
36831
36961
  const hit = await cache.get(key).catch(() => null);
36832
36962
  if (hit !== null) {
36833
36963
  fromCache = true;
@@ -36837,7 +36967,7 @@ function createCachingSpecFetch(options) {
36837
36967
  text: async () => hit
36838
36968
  };
36839
36969
  }
36840
- const response = policy !== void 0 ? await fetch(url, headers, policy) : headers !== void 0 ? await fetch(url, headers) : await fetch(url);
36970
+ const response = await fromNetwork();
36841
36971
  if (!response.ok) return response;
36842
36972
  const body = await response.text();
36843
36973
  pending = body;
@@ -38636,6 +38766,8 @@ var init_src$3 = __esmMin((() => {
38636
38766
  init_redis_spec_cache();
38637
38767
  init_in_memory_spec_cache();
38638
38768
  init_spec_cache_key();
38769
+ init_digest_tracking_spec_cache();
38770
+ init_spec_digest();
38639
38771
  init_cached_spec_fetch();
38640
38772
  init_get_token();
38641
38773
  init_src$20();
@@ -53269,6 +53401,10 @@ var DEV_CONNECT_ENCRYPTION_KEY = "dev-only-encryption-key";
53269
53401
  * branch: a compose with no Redis and a single-process self-host box both land on
53270
53402
  * the Map and must keep behaving exactly as they do today.
53271
53403
  *
53404
+ * Both are wrapped in `trackSpecDigests` (PLA-1714): the box remembers the digest
53405
+ * of each spec it holds, so a trigger tick reuses the parsed document without
53406
+ * pulling it out of Redis — 42 MB per tick for Microsoft Graph.
53407
+ *
53272
53408
  * `lazyConnect`, and it matters: a box whose Redis is unreachable must still boot
53273
53409
  * and still serve actions. `createCachingSpecFetch` swallows every cache error, so
53274
53410
  * a dead Redis makes introspection slower — the miss path this cache replaced —
@@ -53276,12 +53412,12 @@ var DEV_CONNECT_ENCRYPTION_KEY = "dev-only-encryption-key";
53276
53412
  */
53277
53413
  var createBoxSpecCache = (redisUrl, deps = {}) => {
53278
53414
  if (redisUrl === void 0 || redisUrl === "") return {
53279
- cache: createInMemorySpecCache(),
53415
+ cache: trackSpecDigests(createInMemorySpecCache()),
53280
53416
  close: async () => void 0
53281
53417
  };
53282
53418
  const redis = (deps.connect ?? defaultSpecCacheRedis)(redisUrl);
53283
53419
  return {
53284
- cache: new RedisSpecCache(redis),
53420
+ cache: trackSpecDigests(new RedisSpecCache(redis)),
53285
53421
  close: async () => {
53286
53422
  await redis.quit().catch(() => void 0);
53287
53423
  }
@@ -54992,7 +55128,8 @@ var createConnectHandlers = (opts) => {
54992
55128
  const specCache = {
54993
55129
  get: async (key) => (await shared()).specCache.get(key),
54994
55130
  set: async (key, value, ttlMs) => (await shared()).specCache.set(key, value, ttlMs),
54995
- evict: async (key) => (await shared()).specCache.evict(key)
55131
+ evict: async (key) => (await shared()).specCache.evict(key),
55132
+ digestOf: async (key) => await (await shared()).specCache.digestOf?.(key) ?? null
54996
55133
  };
54997
55134
  const registry = opts.registry ?? createRegistryStore();
54998
55135
  const agentWire = {
@@ -72671,7 +72808,7 @@ var gitignore_raw_default = "# >>> stackbone >>>\n.stackbone/\nnode_modules/\ndi
72671
72808
  var npmrc_raw_default = "# A hoisted (npm-like) node_modules layout so the emulator resolves ONE copy of\n# each externalized runtime dep (@stackbone/sdk, deepagents, @langchain/*) — a\n# second inlined copy would split the SDK's AsyncLocalStorage and empty per-run logs.\nnode-linker=hoisted\n";
72672
72809
  //#endregion
72673
72810
  //#region src/services/scaffold/templates/shell/package.json.tmpl?raw
72674
- var package_json_default$1 = "{\n \"name\": \"{{name}}\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"description\": \"A Stackbone multi-agent workspace: N in-process deep agents + N Workflow SDK workflows.\",\n \"scripts\": {\n \"dev\": \"stackbone dev\",\n \"build\": \"stackbone build\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"1.2.8\",\n \"@langchain/langgraph\": \"1.4.7\",\n \"@langchain/langgraph-checkpoint-postgres\": \"1.0.4\",\n \"@langchain/openai\": \"1.5.3\",\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"@workflow/world\": \"5.0.0-beta.11\",\n \"deepagents\": \"1.10.5\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"24.x\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260523.1\"\n },\n \"packageManager\": \"pnpm@9.0.0\",\n \"workspaces\": [\"workflows\"],\n \"engines\": {\n \"node\": \"24.x\"\n }\n}\n";
72811
+ var package_json_default$1 = "{\n \"name\": \"{{name}}\",\n \"version\": \"0.0.0\",\n \"private\": true,\n \"type\": \"module\",\n \"description\": \"A Stackbone multi-agent workspace: N in-process deep agents + N Workflow SDK workflows.\",\n \"scripts\": {\n \"dev\": \"stackbone dev\",\n \"build\": \"stackbone build\"\n },\n \"dependencies\": {\n \"@langchain/core\": \"1.2.8\",\n \"@langchain/langgraph\": \"1.4.7\",\n \"@langchain/langgraph-checkpoint-postgres\": \"1.0.4\",\n \"@langchain/openai\": \"1.5.3\",\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"@workflow/world\": \"5.0.0-beta.11\",\n \"deepagents\": \"1.10.5\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"24.x\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260523.1\"\n },\n \"packageManager\": \"pnpm@9.0.0\",\n \"workspaces\": [\"workflows\"],\n \"engines\": {\n \"node\": \"24.x\"\n }\n}\n";
72675
72812
  //#endregion
72676
72813
  //#region src/services/scaffold/templates/shell/pnpm-workspace.yaml?raw
72677
72814
  var pnpm_workspace_default = "packages:\n - 'workflows'\n";
@@ -72680,7 +72817,7 @@ var pnpm_workspace_default = "packages:\n - 'workflows'\n";
72680
72817
  var tsconfig_default$1 = "{\n \"compilerOptions\": {\n \"module\": \"nodenext\",\n \"moduleResolution\": \"nodenext\",\n \"target\": \"esnext\",\n \"strict\": true,\n \"skipLibCheck\": true,\n \"noEmit\": true,\n \"types\": [\"node\"]\n }\n}\n";
72681
72818
  //#endregion
72682
72819
  //#region src/services/scaffold/templates/shell/workflows/package.json.tmpl?raw
72683
- var package_json_default = "{\n \"name\": \"workflows\",\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"typecheck\": \"tsgo\"\n },\n \"dependencies\": {\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"24.x\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260523.1\"\n },\n \"engines\": {\n \"node\": \"24.x\"\n }\n}\n";
72820
+ var package_json_default = "{\n \"name\": \"workflows\",\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"private\": true,\n \"scripts\": {\n \"typecheck\": \"tsgo\"\n },\n \"dependencies\": {\n \"@stackbone/sdk\": \"{{sdkVersion}}\",\n \"workflow\": \"5.0.0-beta.19\",\n \"zod\": \"4.3.6\"\n },\n \"devDependencies\": {\n \"@types/node\": \"24.x\",\n \"@typescript/native-preview\": \"7.0.0-dev.20260523.1\"\n },\n \"engines\": {\n \"node\": \"24.x\"\n }\n}\n";
72684
72821
  //#endregion
72685
72822
  //#region src/services/scaffold/templates/shell/workflows/tsconfig.json?raw
72686
72823
  var tsconfig_default = "{\n \"compilerOptions\": {\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"target\": \"esnext\",\n \"strict\": true,\n \"skipLibCheck\": true,\n \"noEmit\": true,\n \"types\": [\"node\"]\n },\n \"include\": [\"**/*.ts\", \"../.stackbone/**/*.d.ts\"]\n}\n";
@@ -72748,7 +72885,10 @@ var DEEP_AGENT_GROUP = "deep-agents";
72748
72885
  * resolvable from the workspace root so the host resolves ONE copy alongside the
72749
72886
  * agent's `@langchain/*`. `zod` is usually already pinned by the workspace shell —
72750
72887
  * {@link mergeMissingWorkspaceDeps} never overwrites an existing version, so it is
72751
- * included only as a safety net for a hand-built workspace.
72888
+ * included only as a safety net for a hand-built workspace. Its value is not free:
72889
+ * the shell's `@workflow/world` peer-requires ONE exact `zod`, and npm refuses to
72890
+ * install a workspace that pins another (PLA-1653), so this entry must stay equal to
72891
+ * the two `package.json.tmpl` pins. `scaffold.spec.ts` fails if the three drift.
72752
72892
  */
72753
72893
  var DEEP_AGENT_WORKSPACE_DEPS = Object.freeze({
72754
72894
  "@langchain/core": "1.2.8",
@@ -72756,7 +72896,7 @@ var DEEP_AGENT_WORKSPACE_DEPS = Object.freeze({
72756
72896
  "@langchain/langgraph-checkpoint-postgres": "1.0.4",
72757
72897
  "@langchain/openai": "1.5.3",
72758
72898
  deepagents: "1.10.5",
72759
- zod: "4.4.3"
72899
+ zod: "4.3.6"
72760
72900
  });
72761
72901
  /**
72762
72902
  * Generate the FilePlan for a deep agent named `name`: just `deep-agents/<name>/
@@ -76663,8 +76803,15 @@ var REDIS_IMAGE$1 = "redis:7-alpine";
76663
76803
  *
76664
76804
  * Same image and pin as `stackbone dev`'s compose, so the emulator and the
76665
76805
  * deliverable run the identical backend.
76806
+ *
76807
+ * The community fork, not `minio/minio`. MinIO closed anonymous pulls of its own
76808
+ * image on Docker Hub (2026-09-12, PLA-1423) and then on quay.io (401 on every
76809
+ * tag by 2026-09-25, PLA-1794). A first-run `stackbone dev`, and the operator
76810
+ * running a packaged folder, pull with no credentials. `pgsty/minio` publishes
76811
+ * amd64 + arm64, keeps the upstream entrypoint and ships `mc` and `sh`, which the
76812
+ * healthcheck and the bucket-init container call.
76666
76813
  */
76667
- var MINIO_IMAGE$1 = "quay.io/minio/minio:RELEASE.2025-03-12T18-04-18Z";
76814
+ var MINIO_IMAGE = "pgsty/minio:RELEASE.2026-08-04T00-00-00Z";
76668
76815
  /** Access key the bundled MinIO is created with. The secret is generated per package. */
76669
76816
  var MINIO_ACCESS_KEY = "stackbone";
76670
76817
  /** Bucket the init container creates, and the agent's `STACKBONE_S3_BUCKET`. */
@@ -76762,7 +76909,7 @@ var renderInfraServices = () => ` postgres:
76762
76909
  minio:
76763
76910
  # S3-compatible object storage: the agent's own files (\`client.storage\`), the
76764
76911
  # originals managed RAG ingests, and what Studio's file browser lists.
76765
- image: ${MINIO_IMAGE$1}
76912
+ image: ${MINIO_IMAGE}
76766
76913
  command: ['server', '/data']
76767
76914
  environment:
76768
76915
  MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
@@ -76805,7 +76952,7 @@ var renderInfraServices = () => ` postgres:
76805
76952
  # alphabet contains \`-\`, so about one packaged folder in 64 minted one. One
76806
76953
  # of them took \`next\` red on 2026-08-31 (run 33430510314) on a
76807
76954
  # comments-only commit.
76808
- image: ${MINIO_IMAGE$1}
76955
+ image: ${MINIO_IMAGE}
76809
76956
  restart: 'no'
76810
76957
  depends_on:
76811
76958
  minio:
@@ -80033,7 +80180,6 @@ var readStackboneConfig = async (cwd) => readJsonFile(stackboneConfigPath(cwd),
80033
80180
  //#region src/dev/compose-template.ts
80034
80181
  var POSTGRES_IMAGE = "pgvector/pgvector:pg17";
80035
80182
  var REDIS_IMAGE = "redis:7-alpine";
80036
- var MINIO_IMAGE = "quay.io/minio/minio:RELEASE.2025-03-12T18-04-18Z";
80037
80183
  var PGVECTOR_INIT_SQL = `-- Generated by stackbone dev. Runs once on Postgres first boot via
80038
80184
  -- /docker-entrypoint-initdb.d. The queue extension is gone (BullMQ over Redis
80039
80185
  -- is the only job engine); only pgvector is enabled here.
@@ -85456,7 +85602,7 @@ var createInitCommand = (ctx) => defineCommand({
85456
85602
  args: {
85457
85603
  dir: {
85458
85604
  type: "positional",
85459
- description: "Target subdirectory. Omit to derive it from --name (or the current directory).",
85605
+ description: "Target subdirectory. Pass `.` to scaffold into the current directory; omitted, a new subdirectory is created, named after --name (or after the current directory).",
85460
85606
  required: false
85461
85607
  },
85462
85608
  with: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackbone/cli",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "bin": {
Binary file
Binary file