substrate-ai 0.20.102 → 0.20.104

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/dist/cli/index.js CHANGED
@@ -2089,6 +2089,10 @@ async function runInitAction(options) {
2089
2089
  ".substrate/current-run-id",
2090
2090
  ".substrate/scenarios/",
2091
2091
  ".substrate/state/",
2092
+ ".substrate/runs/",
2093
+ ".substrate/notifications/",
2094
+ ".substrate/kv-metrics.json",
2095
+ ".substrate/latest-heartbeat-per-story-state.json",
2092
2096
  ".substrate/substrate.db",
2093
2097
  ".substrate/substrate.db-journal",
2094
2098
  ".codex/prompts/",
@@ -11951,8 +11955,9 @@ function registerIngestEpicCommand(program) {
11951
11955
  await initWorkGraphSchema(adapter);
11952
11956
  const ingester = new EpicIngester(adapter);
11953
11957
  const result = await ingester.ingest(stories, dependencies);
11954
- const epicNum = stories[0].epic_num;
11955
- process.stdout.write(`Ingested ${result.storiesUpserted} stories and ${result.dependenciesReplaced} dependencies from epic ${epicNum}\n`);
11958
+ const epicNums = [...new Set(stories.map((s) => s.epic_num))].sort((a, b) => a - b);
11959
+ const epicLabel = epicNums.length === 1 ? `epic ${epicNums[0]}` : `epics ${epicNums.join(", ")}`;
11960
+ process.stdout.write(`Ingested ${result.storiesUpserted} stories and ${result.dependenciesReplaced} dependencies from ${epicLabel}\n`);
11956
11961
  } catch (err) {
11957
11962
  const msg = err instanceof Error ? err.message : String(err);
11958
11963
  process.stderr.write(`Error: ${msg}\n`);
@@ -93,4 +93,14 @@ Each dispatched story runs in `.substrate-worktrees/story-<key>` on its own bran
93
93
  - `.substrate/runs/<run-id>.json` — per-run manifest (one file per run; not an aggregate)
94
94
  - `.substrate/current-run-id` — plain text file with the latest run ID
95
95
  - `.substrate/notifications/<run-id>-<timestamp>.json` — operator halt notifications (deleted by `substrate report` after read)
96
+
97
+ ### Recommended `.gitignore` entries
98
+
99
+ Substrate writes ephemeral per-process and per-run state under `.substrate/`. Only `.substrate/config.yaml` is intended to be tracked — everything else (Dolt repo, kv-metrics, run manifests, heartbeats, halt notifications, current-run-id, .pid files) regenerates each run. Ignore everything under `.substrate/` and re-include only the config:
100
+
101
+ ```gitignore
102
+ # Substrate ephemeral state — track only the operator config
103
+ .substrate/*
104
+ !.substrate/config.yaml
105
+ ```
96
106
  <!-- substrate:end -->
@@ -109,6 +109,30 @@ Each dispatched story runs in `.substrate-worktrees/story-<key>` on its own bran
109
109
  - `.substrate/current-run-id` — plain text file with the latest run ID; consulted by canonical run-discovery
110
110
  - `.substrate/notifications/<run-id>-<timestamp>.json` — operator halt notifications written by the Recovery Engine; deleted by `substrate report` after read
111
111
 
112
+ ### Recommended `.gitignore` entries
113
+
114
+ Substrate writes ephemeral per-process and per-run state under `.substrate/`. Only `.substrate/config.yaml` is intended to be tracked — everything else (the Dolt repo, kv-metrics, run manifests, heartbeats, halt notifications, current-run-id, .pid files) is regenerated each run and should be ignored. The simplest pattern is to ignore everything under `.substrate/` and re-include only the config:
115
+
116
+ ```gitignore
117
+ # Substrate ephemeral state — track only the operator config
118
+ .substrate/*
119
+ !.substrate/config.yaml
120
+ ```
121
+
122
+ This is future-proof against new ephemeral files substrate may introduce. If you'd rather enumerate the specific patterns, the equivalent explicit form is:
123
+
124
+ ```gitignore
125
+ .substrate/state/
126
+ .substrate/runs/
127
+ .substrate/notifications/
128
+ .substrate/kv-metrics.json
129
+ .substrate/current-run-id
130
+ .substrate/latest-heartbeat-per-story-state.json
131
+ .substrate/*.db
132
+ .substrate/*.pid
133
+ .substrate/routing-policy.yaml
134
+ ```
135
+
112
136
  ### State Backend
113
137
 
114
138
  Substrate uses Dolt for versioned pipeline state by default. Run `substrate init` to set it up automatically if Dolt is on PATH. Features that require Dolt: `substrate history`, OTEL observability persistence, and context engineering repo-map storage.
@@ -93,4 +93,14 @@ Each dispatched story runs in `.substrate-worktrees/story-<key>` on its own bran
93
93
  - `.substrate/runs/<run-id>.json` — per-run manifest (one file per run; not an aggregate)
94
94
  - `.substrate/current-run-id` — plain text file with the latest run ID
95
95
  - `.substrate/notifications/<run-id>-<timestamp>.json` — operator halt notifications (deleted by `substrate report` after read)
96
+
97
+ ### Recommended `.gitignore` entries
98
+
99
+ Substrate writes ephemeral per-process and per-run state under `.substrate/`. Only `.substrate/config.yaml` is intended to be tracked — everything else (Dolt repo, kv-metrics, run manifests, heartbeats, halt notifications, current-run-id, .pid files) regenerates each run. Ignore everything under `.substrate/` and re-include only the config:
100
+
101
+ ```gitignore
102
+ # Substrate ephemeral state — track only the operator config
103
+ .substrate/*
104
+ !.substrate/config.yaml
105
+ ```
96
106
  <!-- substrate:end -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "substrate-ai",
3
- "version": "0.20.102",
3
+ "version": "0.20.104",
4
4
  "description": "Substrate — multi-agent orchestration daemon for AI coding agents",
5
5
  "type": "module",
6
6
  "license": "MIT",