@askexenow/exe-os 0.9.64 → 0.9.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/deploy/stack-manifests/v0.9.json +4 -4
  2. package/dist/bin/backfill-conversations.js +22 -0
  3. package/dist/bin/backfill-responses.js +22 -0
  4. package/dist/bin/backfill-vectors.js +22 -0
  5. package/dist/bin/cleanup-stale-review-tasks.js +22 -0
  6. package/dist/bin/cli.js +2280 -1199
  7. package/dist/bin/exe-agent-config.js +4 -0
  8. package/dist/bin/exe-agent.js +16 -0
  9. package/dist/bin/exe-assign.js +22 -0
  10. package/dist/bin/exe-boot.js +116 -7
  11. package/dist/bin/exe-call.js +16 -0
  12. package/dist/bin/exe-cloud.js +6671 -464
  13. package/dist/bin/exe-dispatch.js +24 -0
  14. package/dist/bin/exe-doctor.js +2845 -1223
  15. package/dist/bin/exe-export-behaviors.js +24 -0
  16. package/dist/bin/exe-forget.js +22 -0
  17. package/dist/bin/exe-gateway.js +24 -0
  18. package/dist/bin/exe-heartbeat.js +23 -0
  19. package/dist/bin/exe-kill.js +22 -0
  20. package/dist/bin/exe-launch-agent.js +24 -0
  21. package/dist/bin/exe-link.js +310 -178
  22. package/dist/bin/exe-new-employee.js +127 -1
  23. package/dist/bin/exe-pending-messages.js +22 -0
  24. package/dist/bin/exe-pending-notifications.js +22 -0
  25. package/dist/bin/exe-pending-reviews.js +22 -0
  26. package/dist/bin/exe-rename.js +22 -0
  27. package/dist/bin/exe-review.js +22 -0
  28. package/dist/bin/exe-search.js +24 -0
  29. package/dist/bin/exe-session-cleanup.js +24 -0
  30. package/dist/bin/exe-settings.js +10 -0
  31. package/dist/bin/exe-start-codex.js +135 -1
  32. package/dist/bin/exe-start-opencode.js +149 -1
  33. package/dist/bin/exe-status.js +22 -0
  34. package/dist/bin/exe-team.js +22 -0
  35. package/dist/bin/git-sweep.js +24 -0
  36. package/dist/bin/graph-backfill.js +22 -0
  37. package/dist/bin/graph-export.js +22 -0
  38. package/dist/bin/install.js +115 -1
  39. package/dist/bin/intercom-check.js +24 -0
  40. package/dist/bin/scan-tasks.js +24 -0
  41. package/dist/bin/setup.js +412 -157
  42. package/dist/bin/shard-migrate.js +22 -0
  43. package/dist/bin/update.js +4 -0
  44. package/dist/gateway/index.js +24 -0
  45. package/dist/hooks/bug-report-worker.js +135 -42
  46. package/dist/hooks/codex-stop-task-finalizer.js +24 -0
  47. package/dist/hooks/commit-complete.js +24 -0
  48. package/dist/hooks/error-recall.js +24 -0
  49. package/dist/hooks/exe-heartbeat-hook.js +4 -0
  50. package/dist/hooks/ingest-worker.js +4 -0
  51. package/dist/hooks/ingest.js +23 -0
  52. package/dist/hooks/instructions-loaded.js +22 -0
  53. package/dist/hooks/notification.js +22 -0
  54. package/dist/hooks/post-compact.js +22 -0
  55. package/dist/hooks/post-tool-combined.js +24 -0
  56. package/dist/hooks/pre-compact.js +260 -109
  57. package/dist/hooks/pre-tool-use.js +22 -0
  58. package/dist/hooks/prompt-submit.js +24 -0
  59. package/dist/hooks/session-end.js +161 -122
  60. package/dist/hooks/session-start.js +142 -0
  61. package/dist/hooks/stop.js +23 -0
  62. package/dist/hooks/subagent-stop.js +22 -0
  63. package/dist/hooks/summary-worker.js +195 -79
  64. package/dist/index.js +24 -0
  65. package/dist/lib/agent-config.js +4 -0
  66. package/dist/lib/cloud-sync.js +50 -6
  67. package/dist/lib/config.js +12 -0
  68. package/dist/lib/consolidation.js +4 -0
  69. package/dist/lib/database.js +4 -0
  70. package/dist/lib/db-daemon-client.js +4 -0
  71. package/dist/lib/db.js +4 -0
  72. package/dist/lib/device-registry.js +4 -0
  73. package/dist/lib/embedder.js +12 -0
  74. package/dist/lib/employee-templates.js +16 -0
  75. package/dist/lib/employees.js +4 -0
  76. package/dist/lib/exe-daemon-client.js +4 -0
  77. package/dist/lib/exe-daemon.js +1144 -480
  78. package/dist/lib/hybrid-search.js +24 -0
  79. package/dist/lib/identity.js +4 -0
  80. package/dist/lib/license.js +4 -0
  81. package/dist/lib/messaging.js +4 -0
  82. package/dist/lib/reminders.js +4 -0
  83. package/dist/lib/schedules.js +22 -0
  84. package/dist/lib/skill-learning.js +12 -0
  85. package/dist/lib/status-brief.js +39 -0
  86. package/dist/lib/store.js +22 -0
  87. package/dist/lib/task-router.js +4 -0
  88. package/dist/lib/tasks.js +12 -0
  89. package/dist/lib/tmux-routing.js +12 -0
  90. package/dist/lib/token-spend.js +4 -0
  91. package/dist/mcp/server.js +1045 -427
  92. package/dist/mcp/tools/complete-reminder.js +4 -0
  93. package/dist/mcp/tools/create-reminder.js +4 -0
  94. package/dist/mcp/tools/create-task.js +12 -0
  95. package/dist/mcp/tools/deactivate-behavior.js +4 -0
  96. package/dist/mcp/tools/list-reminders.js +4 -0
  97. package/dist/mcp/tools/list-tasks.js +4 -0
  98. package/dist/mcp/tools/send-message.js +4 -0
  99. package/dist/mcp/tools/update-task.js +12 -0
  100. package/dist/runtime/index.js +24 -0
  101. package/dist/tui/App.js +24 -0
  102. package/package.json +3 -2
  103. package/src/commands/exe/cloud.md +15 -8
  104. package/src/commands/exe/link.md +7 -6
  105. package/stack.release.json +2 -2
@@ -202,6 +202,11 @@ function normalizeAutoUpdate(raw) {
202
202
  const userAU = raw.autoUpdate ?? {};
203
203
  raw.autoUpdate = { ...defaultAU, ...userAU };
204
204
  }
205
+ function normalizeOrchestration(raw) {
206
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
207
+ const userOrg = raw.orchestration ?? {};
208
+ raw.orchestration = { ...defaultOrg, ...userOrg };
209
+ }
205
210
  async function loadConfig() {
206
211
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
207
212
  await ensurePrivateDir(dir);
@@ -226,6 +231,7 @@ async function loadConfig() {
226
231
  normalizeScalingRoadmap(migratedCfg);
227
232
  normalizeSessionLifecycle(migratedCfg);
228
233
  normalizeAutoUpdate(migratedCfg);
234
+ normalizeOrchestration(migratedCfg);
229
235
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
230
236
  if (config.dbPath.startsWith("~")) {
231
237
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -249,6 +255,7 @@ function loadConfigSync() {
249
255
  normalizeScalingRoadmap(migratedCfg);
250
256
  normalizeSessionLifecycle(migratedCfg);
251
257
  normalizeAutoUpdate(migratedCfg);
258
+ normalizeOrchestration(migratedCfg);
252
259
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
253
260
  } catch {
254
261
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -270,6 +277,7 @@ async function loadConfigFrom(configPath) {
270
277
  normalizeScalingRoadmap(migratedCfg);
271
278
  normalizeSessionLifecycle(migratedCfg);
272
279
  normalizeAutoUpdate(migratedCfg);
280
+ normalizeOrchestration(migratedCfg);
273
281
  return { ...DEFAULT_CONFIG, ...migratedCfg };
274
282
  } catch {
275
283
  return { ...DEFAULT_CONFIG };
@@ -341,6 +349,10 @@ var init_config = __esm({
341
349
  checkOnBoot: true,
342
350
  autoInstall: false,
343
351
  checkIntervalMs: 24 * 60 * 60 * 1e3
352
+ },
353
+ orchestration: {
354
+ phase: "phase_1_coo",
355
+ phaseSetBy: "default"
344
356
  }
345
357
  };
346
358
  CONFIG_MIGRATIONS = [
@@ -3826,6 +3838,12 @@ var init_platform_procedures = __esm({
3826
3838
  priority: "p0",
3827
3839
  content: "Founder -> coordinator (the executive agent, internally routed as 'COO') -> CTO/CMO. CTO -> engineers. CMO -> content production. Never skip levels: the coordinator does not bypass managers for specialist work. Specialists report to their manager. If you need cross-team info, use ask_team_memory \u2014 don't read other agents' task folders. Each level owns dispatch downward and review upward."
3828
3840
  },
3841
+ {
3842
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3843
+ domain: "workflow",
3844
+ priority: "p1",
3845
+ content: "New customers start best in Phase 1: founder \u2194 coordinator/Chief of Staff, building company context. Suggest Phase 2 executives when domain work repeats; suggest Phase 3 parallel execution only when review/permission gates are ready. This is guidance, not a blocker: users may jump phases anytime. Never overwrite their phase, role titles, identities, or custom org design."
3846
+ },
3829
3847
  {
3830
3848
  title: "Single dispatch path \u2014 create_task only",
3831
3849
  domain: "workflow",
@@ -3884,6 +3902,12 @@ var init_platform_procedures = __esm({
3884
3902
  priority: "p0",
3885
3903
  content: "exe-build-adv is MANDATORY for ALL work touching 3+ files. Run /exe-build-adv --auto BEFORE implementation. Pipeline: Spec \u2192 AC \u2192 Tests \u2192 Evaluate \u2192 Fix. No multi-file feature ships without pipeline artifacts. No exceptions \u2014 managers reject work without them."
3886
3904
  },
3905
+ {
3906
+ title: "Commit discipline \u2014 never leave verified work floating",
3907
+ domain: "workflow",
3908
+ priority: "p1",
3909
+ content: "After any code-change batch passes typecheck/tests/build, run git status, summarize changed files, and commit with a clear message before ending the session. If work must remain uncommitted for review/dogfood, explicitly say so, list the files, and state the blocker. Never imply work is complete while verified changes are still floating locally."
3910
+ },
3887
3911
  {
3888
3912
  title: "Desktop and TUI are the same product",
3889
3913
  domain: "architecture",
@@ -99,6 +99,10 @@ var init_config = __esm({
99
99
  checkOnBoot: true,
100
100
  autoInstall: false,
101
101
  checkIntervalMs: 24 * 60 * 60 * 1e3
102
+ },
103
+ orchestration: {
104
+ phase: "phase_1_coo",
105
+ phaseSetBy: "default"
102
106
  }
103
107
  };
104
108
  }
@@ -102,6 +102,10 @@ var DEFAULT_CONFIG = {
102
102
  checkOnBoot: true,
103
103
  autoInstall: false,
104
104
  checkIntervalMs: 24 * 60 * 60 * 1e3
105
+ },
106
+ orchestration: {
107
+ phase: "phase_1_coo",
108
+ phaseSetBy: "default"
105
109
  }
106
110
  };
107
111
 
@@ -122,6 +122,10 @@ var init_config = __esm({
122
122
  checkOnBoot: true,
123
123
  autoInstall: false,
124
124
  checkIntervalMs: 24 * 60 * 60 * 1e3
125
+ },
126
+ orchestration: {
127
+ phase: "phase_1_coo",
128
+ phaseSetBy: "default"
125
129
  }
126
130
  };
127
131
  }
@@ -99,6 +99,10 @@ var init_config = __esm({
99
99
  checkOnBoot: true,
100
100
  autoInstall: false,
101
101
  checkIntervalMs: 24 * 60 * 60 * 1e3
102
+ },
103
+ orchestration: {
104
+ phase: "phase_1_coo",
105
+ phaseSetBy: "default"
102
106
  }
103
107
  };
104
108
  }
@@ -178,6 +178,11 @@ function normalizeAutoUpdate(raw) {
178
178
  const userAU = raw.autoUpdate ?? {};
179
179
  raw.autoUpdate = { ...defaultAU, ...userAU };
180
180
  }
181
+ function normalizeOrchestration(raw) {
182
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
183
+ const userOrg = raw.orchestration ?? {};
184
+ raw.orchestration = { ...defaultOrg, ...userOrg };
185
+ }
181
186
  async function loadConfig() {
182
187
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
183
188
  await ensurePrivateDir(dir);
@@ -202,6 +207,7 @@ async function loadConfig() {
202
207
  normalizeScalingRoadmap(migratedCfg);
203
208
  normalizeSessionLifecycle(migratedCfg);
204
209
  normalizeAutoUpdate(migratedCfg);
210
+ normalizeOrchestration(migratedCfg);
205
211
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
206
212
  if (config.dbPath.startsWith("~")) {
207
213
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -277,6 +283,10 @@ var init_config = __esm({
277
283
  checkOnBoot: true,
278
284
  autoInstall: false,
279
285
  checkIntervalMs: 24 * 60 * 60 * 1e3
286
+ },
287
+ orchestration: {
288
+ phase: "phase_1_coo",
289
+ phaseSetBy: "default"
280
290
  }
281
291
  };
282
292
  CONFIG_MIGRATIONS = [
@@ -3150,6 +3160,12 @@ var init_platform_procedures = __esm({
3150
3160
  priority: "p0",
3151
3161
  content: "Founder -> coordinator (the executive agent, internally routed as 'COO') -> CTO/CMO. CTO -> engineers. CMO -> content production. Never skip levels: the coordinator does not bypass managers for specialist work. Specialists report to their manager. If you need cross-team info, use ask_team_memory \u2014 don't read other agents' task folders. Each level owns dispatch downward and review upward."
3152
3162
  },
3163
+ {
3164
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3165
+ domain: "workflow",
3166
+ priority: "p1",
3167
+ content: "New customers start best in Phase 1: founder \u2194 coordinator/Chief of Staff, building company context. Suggest Phase 2 executives when domain work repeats; suggest Phase 3 parallel execution only when review/permission gates are ready. This is guidance, not a blocker: users may jump phases anytime. Never overwrite their phase, role titles, identities, or custom org design."
3168
+ },
3153
3169
  {
3154
3170
  title: "Single dispatch path \u2014 create_task only",
3155
3171
  domain: "workflow",
@@ -3208,6 +3224,12 @@ var init_platform_procedures = __esm({
3208
3224
  priority: "p0",
3209
3225
  content: "exe-build-adv is MANDATORY for ALL work touching 3+ files. Run /exe-build-adv --auto BEFORE implementation. Pipeline: Spec \u2192 AC \u2192 Tests \u2192 Evaluate \u2192 Fix. No multi-file feature ships without pipeline artifacts. No exceptions \u2014 managers reject work without them."
3210
3226
  },
3227
+ {
3228
+ title: "Commit discipline \u2014 never leave verified work floating",
3229
+ domain: "workflow",
3230
+ priority: "p1",
3231
+ content: "After any code-change batch passes typecheck/tests/build, run git status, summarize changed files, and commit with a clear message before ending the session. If work must remain uncommitted for review/dogfood, explicitly say so, list the files, and state the blocker. Never imply work is complete while verified changes are still floating locally."
3232
+ },
3211
3233
  {
3212
3234
  title: "Desktop and TUI are the same product",
3213
3235
  domain: "architecture",
@@ -138,6 +138,11 @@ function normalizeAutoUpdate(raw) {
138
138
  const userAU = raw.autoUpdate ?? {};
139
139
  raw.autoUpdate = { ...defaultAU, ...userAU };
140
140
  }
141
+ function normalizeOrchestration(raw) {
142
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
143
+ const userOrg = raw.orchestration ?? {};
144
+ raw.orchestration = { ...defaultOrg, ...userOrg };
145
+ }
141
146
  async function loadConfig() {
142
147
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
143
148
  await ensurePrivateDir(dir);
@@ -162,6 +167,7 @@ async function loadConfig() {
162
167
  normalizeScalingRoadmap(migratedCfg);
163
168
  normalizeSessionLifecycle(migratedCfg);
164
169
  normalizeAutoUpdate(migratedCfg);
170
+ normalizeOrchestration(migratedCfg);
165
171
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
166
172
  if (config.dbPath.startsWith("~")) {
167
173
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -185,6 +191,7 @@ function loadConfigSync() {
185
191
  normalizeScalingRoadmap(migratedCfg);
186
192
  normalizeSessionLifecycle(migratedCfg);
187
193
  normalizeAutoUpdate(migratedCfg);
194
+ normalizeOrchestration(migratedCfg);
188
195
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
189
196
  } catch {
190
197
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -206,6 +213,7 @@ async function loadConfigFrom(configPath) {
206
213
  normalizeScalingRoadmap(migratedCfg);
207
214
  normalizeSessionLifecycle(migratedCfg);
208
215
  normalizeAutoUpdate(migratedCfg);
216
+ normalizeOrchestration(migratedCfg);
209
217
  return { ...DEFAULT_CONFIG, ...migratedCfg };
210
218
  } catch {
211
219
  return { ...DEFAULT_CONFIG };
@@ -277,6 +285,10 @@ var init_config = __esm({
277
285
  checkOnBoot: true,
278
286
  autoInstall: false,
279
287
  checkIntervalMs: 24 * 60 * 60 * 1e3
288
+ },
289
+ orchestration: {
290
+ phase: "phase_1_coo",
291
+ phaseSetBy: "default"
280
292
  }
281
293
  };
282
294
  CONFIG_MIGRATIONS = [
@@ -60,6 +60,8 @@ async function generateStatusBrief(employees, data, _activeAgentIds) {
60
60
  }
61
61
  const sections = [];
62
62
  sections.push([` EXE STATUS BRIEF \u2014 ${dateStr}${sessionTag}`]);
63
+ const orchestrationLines = buildOrchestrationPhase(data, employees);
64
+ if (orchestrationLines.length > 0) sections.push(orchestrationLines);
63
65
  const reminderLines = buildReminders(data);
64
66
  if (reminderLines.length > 0) sections.push(reminderLines);
65
67
  const actionLines = buildActionRequired(data);
@@ -102,6 +104,11 @@ function buildFirstBootBrief(employees, dateStr, sessionTag) {
102
104
  bodyLines.push(` ${emoji} ${emp.name}${role}`);
103
105
  }
104
106
  bodyLines.push("");
107
+ bodyLines.push(" \u{1F9ED} Orchestration:");
108
+ bodyLines.push(" \u2022 Phase 1 \u2014 COO / Chief of Staff mode");
109
+ bodyLines.push(" \u2022 Recommended start: build company context first");
110
+ bodyLines.push(" \u2022 You can unlock executives or parallel mode anytime");
111
+ bodyLines.push("");
105
112
  bodyLines.push(" \u{1F4A1} Quick start:");
106
113
  bodyLines.push(" \u2022 Run `exe-os backfill-conversations` to import Claude Code history");
107
114
  bodyLines.push(" \u2022 Say `/exe` to launch your COO with a full status brief");
@@ -132,6 +139,38 @@ function buildReminders(data) {
132
139
  }
133
140
  return lines;
134
141
  }
142
+ function buildOrchestrationPhase(data, employees) {
143
+ if (!data.orchestrationPhase) return [];
144
+ const phase = data.orchestrationPhase;
145
+ const hasExecutiveBench = employees.some((e) => ["cto", "cmo"].includes(e.role.toLowerCase()));
146
+ const openWorkCount = data.globalTasks.filter((t) => t.status === "open" || t.status === "in_progress").length;
147
+ const domainKeywordHits = data.globalTasks.filter(
148
+ (t) => /\b(api|bug|code|repo|build|deploy|design|brand|copy|content|marketing|legal|finance|sales|crm)\b/i.test(t.title)
149
+ ).length;
150
+ const phase1Signal = !hasExecutiveBench && (openWorkCount >= 3 || domainKeywordHits >= 2);
151
+ if (phase === "phase_2_executives") {
152
+ return [
153
+ "\u{1F9ED} ORCHESTRATION",
154
+ " Phase 2 \u2014 Executive bench",
155
+ " Focus: COO works with CTO/CMO/domain executives before specialist fan-out",
156
+ " You can switch phases anytime: exe-os org phase"
157
+ ];
158
+ }
159
+ if (phase === "phase_3_parallel_org") {
160
+ return [
161
+ "\u{1F9ED} ORCHESTRATION",
162
+ " Phase 3 \u2014 Parallel execution org",
163
+ " Focus: executives can delegate to specialists in parallel with review gates",
164
+ " You can switch phases anytime: exe-os org phase"
165
+ ];
166
+ }
167
+ return [
168
+ "\u{1F9ED} ORCHESTRATION",
169
+ " Phase 1 \u2014 COO / Chief of Staff mode",
170
+ " Focus: building company context before delegation",
171
+ phase1Signal ? " Signal: repeated domain work detected. Consider: exe-os org unlock executives" : " Ready later? exe-os org unlock executives"
172
+ ];
173
+ }
135
174
  function buildActionRequired(data) {
136
175
  const lines = [];
137
176
  let hasIssues = false;
package/dist/lib/store.js CHANGED
@@ -187,6 +187,11 @@ function normalizeAutoUpdate(raw) {
187
187
  const userAU = raw.autoUpdate ?? {};
188
188
  raw.autoUpdate = { ...defaultAU, ...userAU };
189
189
  }
190
+ function normalizeOrchestration(raw) {
191
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
192
+ const userOrg = raw.orchestration ?? {};
193
+ raw.orchestration = { ...defaultOrg, ...userOrg };
194
+ }
190
195
  async function loadConfig() {
191
196
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
192
197
  await ensurePrivateDir(dir);
@@ -211,6 +216,7 @@ async function loadConfig() {
211
216
  normalizeScalingRoadmap(migratedCfg);
212
217
  normalizeSessionLifecycle(migratedCfg);
213
218
  normalizeAutoUpdate(migratedCfg);
219
+ normalizeOrchestration(migratedCfg);
214
220
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
215
221
  if (config.dbPath.startsWith("~")) {
216
222
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -286,6 +292,10 @@ var init_config = __esm({
286
292
  checkOnBoot: true,
287
293
  autoInstall: false,
288
294
  checkIntervalMs: 24 * 60 * 60 * 1e3
295
+ },
296
+ orchestration: {
297
+ phase: "phase_1_coo",
298
+ phaseSetBy: "default"
289
299
  }
290
300
  };
291
301
  CONFIG_MIGRATIONS = [
@@ -3150,6 +3160,12 @@ var init_platform_procedures = __esm({
3150
3160
  priority: "p0",
3151
3161
  content: "Founder -> coordinator (the executive agent, internally routed as 'COO') -> CTO/CMO. CTO -> engineers. CMO -> content production. Never skip levels: the coordinator does not bypass managers for specialist work. Specialists report to their manager. If you need cross-team info, use ask_team_memory \u2014 don't read other agents' task folders. Each level owns dispatch downward and review upward."
3152
3162
  },
3163
+ {
3164
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3165
+ domain: "workflow",
3166
+ priority: "p1",
3167
+ content: "New customers start best in Phase 1: founder \u2194 coordinator/Chief of Staff, building company context. Suggest Phase 2 executives when domain work repeats; suggest Phase 3 parallel execution only when review/permission gates are ready. This is guidance, not a blocker: users may jump phases anytime. Never overwrite their phase, role titles, identities, or custom org design."
3168
+ },
3153
3169
  {
3154
3170
  title: "Single dispatch path \u2014 create_task only",
3155
3171
  domain: "workflow",
@@ -3208,6 +3224,12 @@ var init_platform_procedures = __esm({
3208
3224
  priority: "p0",
3209
3225
  content: "exe-build-adv is MANDATORY for ALL work touching 3+ files. Run /exe-build-adv --auto BEFORE implementation. Pipeline: Spec \u2192 AC \u2192 Tests \u2192 Evaluate \u2192 Fix. No multi-file feature ships without pipeline artifacts. No exceptions \u2014 managers reject work without them."
3210
3226
  },
3227
+ {
3228
+ title: "Commit discipline \u2014 never leave verified work floating",
3229
+ domain: "workflow",
3230
+ priority: "p1",
3231
+ content: "After any code-change batch passes typecheck/tests/build, run git status, summarize changed files, and commit with a clear message before ending the session. If work must remain uncommitted for review/dogfood, explicitly say so, list the files, and state the blocker. Never imply work is complete while verified changes are still floating locally."
3232
+ },
3211
3233
  {
3212
3234
  title: "Desktop and TUI are the same product",
3213
3235
  domain: "architecture",
@@ -99,6 +99,10 @@ var init_config = __esm({
99
99
  checkOnBoot: true,
100
100
  autoInstall: false,
101
101
  checkIntervalMs: 24 * 60 * 60 * 1e3
102
+ },
103
+ orchestration: {
104
+ phase: "phase_1_coo",
105
+ phaseSetBy: "default"
102
106
  }
103
107
  };
104
108
  }
package/dist/lib/tasks.js CHANGED
@@ -156,6 +156,11 @@ function normalizeAutoUpdate(raw) {
156
156
  const userAU = raw.autoUpdate ?? {};
157
157
  raw.autoUpdate = { ...defaultAU, ...userAU };
158
158
  }
159
+ function normalizeOrchestration(raw) {
160
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
161
+ const userOrg = raw.orchestration ?? {};
162
+ raw.orchestration = { ...defaultOrg, ...userOrg };
163
+ }
159
164
  async function loadConfig() {
160
165
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
161
166
  await ensurePrivateDir(dir);
@@ -180,6 +185,7 @@ async function loadConfig() {
180
185
  normalizeScalingRoadmap(migratedCfg);
181
186
  normalizeSessionLifecycle(migratedCfg);
182
187
  normalizeAutoUpdate(migratedCfg);
188
+ normalizeOrchestration(migratedCfg);
183
189
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
184
190
  if (config.dbPath.startsWith("~")) {
185
191
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -203,6 +209,7 @@ function loadConfigSync() {
203
209
  normalizeScalingRoadmap(migratedCfg);
204
210
  normalizeSessionLifecycle(migratedCfg);
205
211
  normalizeAutoUpdate(migratedCfg);
212
+ normalizeOrchestration(migratedCfg);
206
213
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
207
214
  } catch {
208
215
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -224,6 +231,7 @@ async function loadConfigFrom(configPath) {
224
231
  normalizeScalingRoadmap(migratedCfg);
225
232
  normalizeSessionLifecycle(migratedCfg);
226
233
  normalizeAutoUpdate(migratedCfg);
234
+ normalizeOrchestration(migratedCfg);
227
235
  return { ...DEFAULT_CONFIG, ...migratedCfg };
228
236
  } catch {
229
237
  return { ...DEFAULT_CONFIG };
@@ -295,6 +303,10 @@ var init_config = __esm({
295
303
  checkOnBoot: true,
296
304
  autoInstall: false,
297
305
  checkIntervalMs: 24 * 60 * 60 * 1e3
306
+ },
307
+ orchestration: {
308
+ phase: "phase_1_coo",
309
+ phaseSetBy: "default"
298
310
  }
299
311
  };
300
312
  CONFIG_MIGRATIONS = [
@@ -441,6 +441,11 @@ function normalizeAutoUpdate(raw) {
441
441
  const userAU = raw.autoUpdate ?? {};
442
442
  raw.autoUpdate = { ...defaultAU, ...userAU };
443
443
  }
444
+ function normalizeOrchestration(raw) {
445
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
446
+ const userOrg = raw.orchestration ?? {};
447
+ raw.orchestration = { ...defaultOrg, ...userOrg };
448
+ }
444
449
  async function loadConfig() {
445
450
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
446
451
  await ensurePrivateDir(dir);
@@ -465,6 +470,7 @@ async function loadConfig() {
465
470
  normalizeScalingRoadmap(migratedCfg);
466
471
  normalizeSessionLifecycle(migratedCfg);
467
472
  normalizeAutoUpdate(migratedCfg);
473
+ normalizeOrchestration(migratedCfg);
468
474
  const config = { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
469
475
  if (config.dbPath.startsWith("~")) {
470
476
  config.dbPath = config.dbPath.replace(/^~/, os2.homedir());
@@ -488,6 +494,7 @@ function loadConfigSync() {
488
494
  normalizeScalingRoadmap(migratedCfg);
489
495
  normalizeSessionLifecycle(migratedCfg);
490
496
  normalizeAutoUpdate(migratedCfg);
497
+ normalizeOrchestration(migratedCfg);
491
498
  return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
492
499
  } catch {
493
500
  return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
@@ -509,6 +516,7 @@ async function loadConfigFrom(configPath) {
509
516
  normalizeScalingRoadmap(migratedCfg);
510
517
  normalizeSessionLifecycle(migratedCfg);
511
518
  normalizeAutoUpdate(migratedCfg);
519
+ normalizeOrchestration(migratedCfg);
512
520
  return { ...DEFAULT_CONFIG, ...migratedCfg };
513
521
  } catch {
514
522
  return { ...DEFAULT_CONFIG };
@@ -580,6 +588,10 @@ var init_config = __esm({
580
588
  checkOnBoot: true,
581
589
  autoInstall: false,
582
590
  checkIntervalMs: 24 * 60 * 60 * 1e3
591
+ },
592
+ orchestration: {
593
+ phase: "phase_1_coo",
594
+ phaseSetBy: "default"
583
595
  }
584
596
  };
585
597
  CONFIG_MIGRATIONS = [
@@ -99,6 +99,10 @@ var init_config = __esm({
99
99
  checkOnBoot: true,
100
100
  autoInstall: false,
101
101
  checkIntervalMs: 24 * 60 * 60 * 1e3
102
+ },
103
+ orchestration: {
104
+ phase: "phase_1_coo",
105
+ phaseSetBy: "default"
102
106
  }
103
107
  };
104
108
  }