@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
@@ -214,6 +214,11 @@ function normalizeAutoUpdate(raw) {
214
214
  const userAU = raw.autoUpdate ?? {};
215
215
  raw.autoUpdate = { ...defaultAU, ...userAU };
216
216
  }
217
+ function normalizeOrchestration(raw) {
218
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
219
+ const userOrg = raw.orchestration ?? {};
220
+ raw.orchestration = { ...defaultOrg, ...userOrg };
221
+ }
217
222
  async function loadConfig() {
218
223
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
219
224
  await ensurePrivateDir(dir);
@@ -238,6 +243,7 @@ async function loadConfig() {
238
243
  normalizeScalingRoadmap(migratedCfg);
239
244
  normalizeSessionLifecycle(migratedCfg);
240
245
  normalizeAutoUpdate(migratedCfg);
246
+ normalizeOrchestration(migratedCfg);
241
247
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
242
248
  if (config.dbPath.startsWith("~")) {
243
249
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -261,6 +267,7 @@ function loadConfigSync() {
261
267
  normalizeScalingRoadmap(migratedCfg);
262
268
  normalizeSessionLifecycle(migratedCfg);
263
269
  normalizeAutoUpdate(migratedCfg);
270
+ normalizeOrchestration(migratedCfg);
264
271
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
265
272
  } catch {
266
273
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -282,6 +289,7 @@ async function loadConfigFrom(configPath) {
282
289
  normalizeScalingRoadmap(migratedCfg);
283
290
  normalizeSessionLifecycle(migratedCfg);
284
291
  normalizeAutoUpdate(migratedCfg);
292
+ normalizeOrchestration(migratedCfg);
285
293
  return { ...DEFAULT_CONFIG, ...migratedCfg };
286
294
  } catch {
287
295
  return { ...DEFAULT_CONFIG };
@@ -353,6 +361,10 @@ var init_config = __esm({
353
361
  checkOnBoot: true,
354
362
  autoInstall: false,
355
363
  checkIntervalMs: 24 * 60 * 60 * 1e3
364
+ },
365
+ orchestration: {
366
+ phase: "phase_1_coo",
367
+ phaseSetBy: "default"
356
368
  }
357
369
  };
358
370
  CONFIG_MIGRATIONS = [
@@ -3228,6 +3240,12 @@ var init_platform_procedures = __esm({
3228
3240
  priority: "p0",
3229
3241
  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."
3230
3242
  },
3243
+ {
3244
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3245
+ domain: "workflow",
3246
+ priority: "p1",
3247
+ 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."
3248
+ },
3231
3249
  {
3232
3250
  title: "Single dispatch path \u2014 create_task only",
3233
3251
  domain: "workflow",
@@ -3286,6 +3304,12 @@ var init_platform_procedures = __esm({
3286
3304
  priority: "p0",
3287
3305
  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."
3288
3306
  },
3307
+ {
3308
+ title: "Commit discipline \u2014 never leave verified work floating",
3309
+ domain: "workflow",
3310
+ priority: "p1",
3311
+ 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."
3312
+ },
3289
3313
  {
3290
3314
  title: "Desktop and TUI are the same product",
3291
3315
  domain: "architecture",
@@ -3948,7 +3972,7 @@ function commandHasAnyMarker(command, markers) {
3948
3972
  function isLegacySplitPostToolCommand(command) {
3949
3973
  return commandHasAnyMarker(command, LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS);
3950
3974
  }
3951
- var EXE_HOOKS, LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS;
3975
+ var EXE_HOOKS, EXE_HOOK_MANIFEST, LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS;
3952
3976
  var init_runtime_hook_manifest = __esm({
3953
3977
  "src/adapters/runtime-hook-manifest.ts"() {
3954
3978
  "use strict";
@@ -3966,6 +3990,116 @@ var init_runtime_hook_manifest = __esm({
3966
3990
  notification: "dist/hooks/notification.js",
3967
3991
  instructionsLoaded: "dist/hooks/instructions-loaded.js"
3968
3992
  };
3993
+ EXE_HOOK_MANIFEST = [
3994
+ {
3995
+ key: "postToolCombined",
3996
+ event: "PostToolUse",
3997
+ commandMarker: EXE_HOOKS.postToolCombined,
3998
+ owner: "exe-os",
3999
+ purpose: "Single PostToolUse entrypoint for ingestion, error recall, summaries, and bug detection.",
4000
+ runtimes: ["claude", "codex", "opencode"],
4001
+ checkpointRole: "none"
4002
+ },
4003
+ {
4004
+ key: "sessionStart",
4005
+ event: "SessionStart",
4006
+ commandMarker: EXE_HOOKS.sessionStart,
4007
+ owner: "exe-os",
4008
+ purpose: "Loads agent identity, procedures, and boot context.",
4009
+ runtimes: ["claude", "codex", "opencode"],
4010
+ checkpointRole: "none"
4011
+ },
4012
+ {
4013
+ key: "promptSubmit",
4014
+ event: "UserPromptSubmit",
4015
+ commandMarker: EXE_HOOKS.promptSubmit,
4016
+ owner: "exe-os",
4017
+ purpose: "Injects current tasks, pending reviews, and local context before each prompt.",
4018
+ runtimes: ["claude", "codex", "opencode"],
4019
+ checkpointRole: "none"
4020
+ },
4021
+ {
4022
+ key: "heartbeat",
4023
+ event: "UserPromptSubmit",
4024
+ commandMarker: EXE_HOOKS.heartbeat,
4025
+ owner: "exe-os",
4026
+ purpose: "Lightweight heartbeat/status sidecar for Claude Code sessions.",
4027
+ runtimes: ["claude"],
4028
+ checkpointRole: "none"
4029
+ },
4030
+ {
4031
+ key: "stop",
4032
+ event: "Stop",
4033
+ commandMarker: EXE_HOOKS.stop,
4034
+ owner: "exe-os",
4035
+ purpose: "Finalizes task state, capacity signals, and emergency checkpointing.",
4036
+ runtimes: ["claude", "codex", "opencode"],
4037
+ checkpointRole: "capacity_checkpoint"
4038
+ },
4039
+ {
4040
+ key: "preToolUse",
4041
+ event: "PreToolUse",
4042
+ commandMarker: EXE_HOOKS.preToolUse,
4043
+ owner: "exe-os",
4044
+ purpose: "Preflight guardrails before shell/tool execution.",
4045
+ runtimes: ["claude", "codex", "opencode"],
4046
+ checkpointRole: "none"
4047
+ },
4048
+ {
4049
+ key: "subagentStop",
4050
+ event: "SubagentStop",
4051
+ commandMarker: EXE_HOOKS.subagentStop,
4052
+ owner: "exe-os",
4053
+ purpose: "Captures subagent completion context.",
4054
+ runtimes: ["claude"],
4055
+ checkpointRole: "none"
4056
+ },
4057
+ {
4058
+ key: "preCompact",
4059
+ event: "PreCompact",
4060
+ commandMarker: EXE_HOOKS.preCompact,
4061
+ owner: "exe-os",
4062
+ purpose: "Writes active-task snapshot and compaction recovery context.",
4063
+ runtimes: ["claude"],
4064
+ checkpointRole: "recovery_context"
4065
+ },
4066
+ {
4067
+ key: "postCompact",
4068
+ event: "PostCompact",
4069
+ commandMarker: EXE_HOOKS.postCompact,
4070
+ owner: "exe-os",
4071
+ purpose: "Rehydrates recovery context after compaction.",
4072
+ runtimes: ["claude"],
4073
+ checkpointRole: "recovery_context"
4074
+ },
4075
+ {
4076
+ key: "sessionEnd",
4077
+ event: "SessionEnd",
4078
+ commandMarker: EXE_HOOKS.sessionEnd,
4079
+ owner: "exe-os",
4080
+ purpose: "Stores session-end checkpoint and triages orphaned in-progress tasks.",
4081
+ runtimes: ["claude"],
4082
+ checkpointRole: "session_summary"
4083
+ },
4084
+ {
4085
+ key: "notification",
4086
+ event: "Notification",
4087
+ commandMarker: EXE_HOOKS.notification,
4088
+ owner: "exe-os",
4089
+ purpose: "Captures runtime notifications and nudges.",
4090
+ runtimes: ["claude"],
4091
+ checkpointRole: "none"
4092
+ },
4093
+ {
4094
+ key: "instructionsLoaded",
4095
+ event: "InstructionsLoaded",
4096
+ commandMarker: EXE_HOOKS.instructionsLoaded,
4097
+ owner: "exe-os",
4098
+ purpose: "Applies runtime instruction post-processing.",
4099
+ runtimes: ["claude"],
4100
+ checkpointRole: "none"
4101
+ }
4102
+ ];
3969
4103
  LEGACY_SPLIT_POST_TOOL_HOOK_MARKERS = [
3970
4104
  "dist/hooks/ingest.js",
3971
4105
  "dist/hooks/error-recall.js",
@@ -214,6 +214,11 @@ function normalizeAutoUpdate(raw) {
214
214
  const userAU = raw.autoUpdate ?? {};
215
215
  raw.autoUpdate = { ...defaultAU, ...userAU };
216
216
  }
217
+ function normalizeOrchestration(raw) {
218
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
219
+ const userOrg = raw.orchestration ?? {};
220
+ raw.orchestration = { ...defaultOrg, ...userOrg };
221
+ }
217
222
  async function loadConfig() {
218
223
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
219
224
  await ensurePrivateDir(dir);
@@ -238,6 +243,7 @@ async function loadConfig() {
238
243
  normalizeScalingRoadmap(migratedCfg);
239
244
  normalizeSessionLifecycle(migratedCfg);
240
245
  normalizeAutoUpdate(migratedCfg);
246
+ normalizeOrchestration(migratedCfg);
241
247
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
242
248
  if (config.dbPath.startsWith("~")) {
243
249
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -261,6 +267,7 @@ function loadConfigSync() {
261
267
  normalizeScalingRoadmap(migratedCfg);
262
268
  normalizeSessionLifecycle(migratedCfg);
263
269
  normalizeAutoUpdate(migratedCfg);
270
+ normalizeOrchestration(migratedCfg);
264
271
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
265
272
  } catch {
266
273
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -282,6 +289,7 @@ async function loadConfigFrom(configPath) {
282
289
  normalizeScalingRoadmap(migratedCfg);
283
290
  normalizeSessionLifecycle(migratedCfg);
284
291
  normalizeAutoUpdate(migratedCfg);
292
+ normalizeOrchestration(migratedCfg);
285
293
  return { ...DEFAULT_CONFIG, ...migratedCfg };
286
294
  } catch {
287
295
  return { ...DEFAULT_CONFIG };
@@ -353,6 +361,10 @@ var init_config = __esm({
353
361
  checkOnBoot: true,
354
362
  autoInstall: false,
355
363
  checkIntervalMs: 24 * 60 * 60 * 1e3
364
+ },
365
+ orchestration: {
366
+ phase: "phase_1_coo",
367
+ phaseSetBy: "default"
356
368
  }
357
369
  };
358
370
  CONFIG_MIGRATIONS = [
@@ -3228,6 +3240,12 @@ var init_platform_procedures = __esm({
3228
3240
  priority: "p0",
3229
3241
  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."
3230
3242
  },
3243
+ {
3244
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3245
+ domain: "workflow",
3246
+ priority: "p1",
3247
+ 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."
3248
+ },
3231
3249
  {
3232
3250
  title: "Single dispatch path \u2014 create_task only",
3233
3251
  domain: "workflow",
@@ -3286,6 +3304,12 @@ var init_platform_procedures = __esm({
3286
3304
  priority: "p0",
3287
3305
  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."
3288
3306
  },
3307
+ {
3308
+ title: "Commit discipline \u2014 never leave verified work floating",
3309
+ domain: "workflow",
3310
+ priority: "p1",
3311
+ 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."
3312
+ },
3289
3313
  {
3290
3314
  title: "Desktop and TUI are the same product",
3291
3315
  domain: "architecture",
@@ -3934,7 +3958,7 @@ var init_preferences = __esm({
3934
3958
  function textHasLegacySplitPostToolHook(text) {
3935
3959
  return [EXE_HOOK_FILES.ingest, EXE_HOOK_FILES.errorRecall, EXE_HOOK_FILES.ingestWorker].some((file) => text.includes(file));
3936
3960
  }
3937
- var EXE_HOOK_FILES;
3961
+ var EXE_HOOK_FILES, EXE_HOOKS, EXE_HOOK_MANIFEST;
3938
3962
  var init_runtime_hook_manifest = __esm({
3939
3963
  "src/adapters/runtime-hook-manifest.ts"() {
3940
3964
  "use strict";
@@ -3944,6 +3968,130 @@ var init_runtime_hook_manifest = __esm({
3944
3968
  errorRecall: "error-recall.js",
3945
3969
  ingestWorker: "ingest-worker.js"
3946
3970
  };
3971
+ EXE_HOOKS = {
3972
+ postToolCombined: "dist/hooks/post-tool-combined.js",
3973
+ sessionStart: "dist/hooks/session-start.js",
3974
+ promptSubmit: "dist/hooks/prompt-submit.js",
3975
+ heartbeat: "dist/hooks/exe-heartbeat-hook.js",
3976
+ stop: "dist/hooks/stop.js",
3977
+ preToolUse: "dist/hooks/pre-tool-use.js",
3978
+ subagentStop: "dist/hooks/subagent-stop.js",
3979
+ preCompact: "dist/hooks/pre-compact.js",
3980
+ postCompact: "dist/hooks/post-compact.js",
3981
+ sessionEnd: "dist/hooks/session-end.js",
3982
+ notification: "dist/hooks/notification.js",
3983
+ instructionsLoaded: "dist/hooks/instructions-loaded.js"
3984
+ };
3985
+ EXE_HOOK_MANIFEST = [
3986
+ {
3987
+ key: "postToolCombined",
3988
+ event: "PostToolUse",
3989
+ commandMarker: EXE_HOOKS.postToolCombined,
3990
+ owner: "exe-os",
3991
+ purpose: "Single PostToolUse entrypoint for ingestion, error recall, summaries, and bug detection.",
3992
+ runtimes: ["claude", "codex", "opencode"],
3993
+ checkpointRole: "none"
3994
+ },
3995
+ {
3996
+ key: "sessionStart",
3997
+ event: "SessionStart",
3998
+ commandMarker: EXE_HOOKS.sessionStart,
3999
+ owner: "exe-os",
4000
+ purpose: "Loads agent identity, procedures, and boot context.",
4001
+ runtimes: ["claude", "codex", "opencode"],
4002
+ checkpointRole: "none"
4003
+ },
4004
+ {
4005
+ key: "promptSubmit",
4006
+ event: "UserPromptSubmit",
4007
+ commandMarker: EXE_HOOKS.promptSubmit,
4008
+ owner: "exe-os",
4009
+ purpose: "Injects current tasks, pending reviews, and local context before each prompt.",
4010
+ runtimes: ["claude", "codex", "opencode"],
4011
+ checkpointRole: "none"
4012
+ },
4013
+ {
4014
+ key: "heartbeat",
4015
+ event: "UserPromptSubmit",
4016
+ commandMarker: EXE_HOOKS.heartbeat,
4017
+ owner: "exe-os",
4018
+ purpose: "Lightweight heartbeat/status sidecar for Claude Code sessions.",
4019
+ runtimes: ["claude"],
4020
+ checkpointRole: "none"
4021
+ },
4022
+ {
4023
+ key: "stop",
4024
+ event: "Stop",
4025
+ commandMarker: EXE_HOOKS.stop,
4026
+ owner: "exe-os",
4027
+ purpose: "Finalizes task state, capacity signals, and emergency checkpointing.",
4028
+ runtimes: ["claude", "codex", "opencode"],
4029
+ checkpointRole: "capacity_checkpoint"
4030
+ },
4031
+ {
4032
+ key: "preToolUse",
4033
+ event: "PreToolUse",
4034
+ commandMarker: EXE_HOOKS.preToolUse,
4035
+ owner: "exe-os",
4036
+ purpose: "Preflight guardrails before shell/tool execution.",
4037
+ runtimes: ["claude", "codex", "opencode"],
4038
+ checkpointRole: "none"
4039
+ },
4040
+ {
4041
+ key: "subagentStop",
4042
+ event: "SubagentStop",
4043
+ commandMarker: EXE_HOOKS.subagentStop,
4044
+ owner: "exe-os",
4045
+ purpose: "Captures subagent completion context.",
4046
+ runtimes: ["claude"],
4047
+ checkpointRole: "none"
4048
+ },
4049
+ {
4050
+ key: "preCompact",
4051
+ event: "PreCompact",
4052
+ commandMarker: EXE_HOOKS.preCompact,
4053
+ owner: "exe-os",
4054
+ purpose: "Writes active-task snapshot and compaction recovery context.",
4055
+ runtimes: ["claude"],
4056
+ checkpointRole: "recovery_context"
4057
+ },
4058
+ {
4059
+ key: "postCompact",
4060
+ event: "PostCompact",
4061
+ commandMarker: EXE_HOOKS.postCompact,
4062
+ owner: "exe-os",
4063
+ purpose: "Rehydrates recovery context after compaction.",
4064
+ runtimes: ["claude"],
4065
+ checkpointRole: "recovery_context"
4066
+ },
4067
+ {
4068
+ key: "sessionEnd",
4069
+ event: "SessionEnd",
4070
+ commandMarker: EXE_HOOKS.sessionEnd,
4071
+ owner: "exe-os",
4072
+ purpose: "Stores session-end checkpoint and triages orphaned in-progress tasks.",
4073
+ runtimes: ["claude"],
4074
+ checkpointRole: "session_summary"
4075
+ },
4076
+ {
4077
+ key: "notification",
4078
+ event: "Notification",
4079
+ commandMarker: EXE_HOOKS.notification,
4080
+ owner: "exe-os",
4081
+ purpose: "Captures runtime notifications and nudges.",
4082
+ runtimes: ["claude"],
4083
+ checkpointRole: "none"
4084
+ },
4085
+ {
4086
+ key: "instructionsLoaded",
4087
+ event: "InstructionsLoaded",
4088
+ commandMarker: EXE_HOOKS.instructionsLoaded,
4089
+ owner: "exe-os",
4090
+ purpose: "Applies runtime instruction post-processing.",
4091
+ runtimes: ["claude"],
4092
+ checkpointRole: "none"
4093
+ }
4094
+ ];
3947
4095
  }
3948
4096
  });
3949
4097
 
@@ -135,6 +135,11 @@ function normalizeAutoUpdate(raw) {
135
135
  const userAU = raw.autoUpdate ?? {};
136
136
  raw.autoUpdate = { ...defaultAU, ...userAU };
137
137
  }
138
+ function normalizeOrchestration(raw) {
139
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
140
+ const userOrg = raw.orchestration ?? {};
141
+ raw.orchestration = { ...defaultOrg, ...userOrg };
142
+ }
138
143
  async function loadConfig() {
139
144
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
140
145
  await ensurePrivateDir(dir);
@@ -159,6 +164,7 @@ async function loadConfig() {
159
164
  normalizeScalingRoadmap(migratedCfg);
160
165
  normalizeSessionLifecycle(migratedCfg);
161
166
  normalizeAutoUpdate(migratedCfg);
167
+ normalizeOrchestration(migratedCfg);
162
168
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
163
169
  if (config.dbPath.startsWith("~")) {
164
170
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -234,6 +240,10 @@ var init_config = __esm({
234
240
  checkOnBoot: true,
235
241
  autoInstall: false,
236
242
  checkIntervalMs: 24 * 60 * 60 * 1e3
243
+ },
244
+ orchestration: {
245
+ phase: "phase_1_coo",
246
+ phaseSetBy: "default"
237
247
  }
238
248
  };
239
249
  CONFIG_MIGRATIONS = [
@@ -3860,6 +3870,12 @@ var init_platform_procedures = __esm({
3860
3870
  priority: "p0",
3861
3871
  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."
3862
3872
  },
3873
+ {
3874
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3875
+ domain: "workflow",
3876
+ priority: "p1",
3877
+ 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."
3878
+ },
3863
3879
  {
3864
3880
  title: "Single dispatch path \u2014 create_task only",
3865
3881
  domain: "workflow",
@@ -3918,6 +3934,12 @@ var init_platform_procedures = __esm({
3918
3934
  priority: "p0",
3919
3935
  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."
3920
3936
  },
3937
+ {
3938
+ title: "Commit discipline \u2014 never leave verified work floating",
3939
+ domain: "workflow",
3940
+ priority: "p1",
3941
+ 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."
3942
+ },
3921
3943
  {
3922
3944
  title: "Desktop and TUI are the same product",
3923
3945
  domain: "architecture",
@@ -124,6 +124,11 @@ function normalizeAutoUpdate(raw) {
124
124
  const userAU = raw.autoUpdate ?? {};
125
125
  raw.autoUpdate = { ...defaultAU, ...userAU };
126
126
  }
127
+ function normalizeOrchestration(raw) {
128
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
129
+ const userOrg = raw.orchestration ?? {};
130
+ raw.orchestration = { ...defaultOrg, ...userOrg };
131
+ }
127
132
  async function loadConfig() {
128
133
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
129
134
  await ensurePrivateDir(dir);
@@ -148,6 +153,7 @@ async function loadConfig() {
148
153
  normalizeScalingRoadmap(migratedCfg);
149
154
  normalizeSessionLifecycle(migratedCfg);
150
155
  normalizeAutoUpdate(migratedCfg);
156
+ normalizeOrchestration(migratedCfg);
151
157
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
152
158
  if (config.dbPath.startsWith("~")) {
153
159
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -223,6 +229,10 @@ var init_config = __esm({
223
229
  checkOnBoot: true,
224
230
  autoInstall: false,
225
231
  checkIntervalMs: 24 * 60 * 60 * 1e3
232
+ },
233
+ orchestration: {
234
+ phase: "phase_1_coo",
235
+ phaseSetBy: "default"
226
236
  }
227
237
  };
228
238
  CONFIG_MIGRATIONS = [
@@ -3849,6 +3859,12 @@ var init_platform_procedures = __esm({
3849
3859
  priority: "p0",
3850
3860
  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."
3851
3861
  },
3862
+ {
3863
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3864
+ domain: "workflow",
3865
+ priority: "p1",
3866
+ 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."
3867
+ },
3852
3868
  {
3853
3869
  title: "Single dispatch path \u2014 create_task only",
3854
3870
  domain: "workflow",
@@ -3907,6 +3923,12 @@ var init_platform_procedures = __esm({
3907
3923
  priority: "p0",
3908
3924
  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."
3909
3925
  },
3926
+ {
3927
+ title: "Commit discipline \u2014 never leave verified work floating",
3928
+ domain: "workflow",
3929
+ priority: "p1",
3930
+ 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."
3931
+ },
3910
3932
  {
3911
3933
  title: "Desktop and TUI are the same product",
3912
3934
  domain: "architecture",
@@ -442,6 +442,11 @@ function normalizeAutoUpdate(raw) {
442
442
  const userAU = raw.autoUpdate ?? {};
443
443
  raw.autoUpdate = { ...defaultAU, ...userAU };
444
444
  }
445
+ function normalizeOrchestration(raw) {
446
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
447
+ const userOrg = raw.orchestration ?? {};
448
+ raw.orchestration = { ...defaultOrg, ...userOrg };
449
+ }
445
450
  async function loadConfig() {
446
451
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
447
452
  await ensurePrivateDir(dir);
@@ -466,6 +471,7 @@ async function loadConfig() {
466
471
  normalizeScalingRoadmap(migratedCfg);
467
472
  normalizeSessionLifecycle(migratedCfg);
468
473
  normalizeAutoUpdate(migratedCfg);
474
+ normalizeOrchestration(migratedCfg);
469
475
  const config = { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
470
476
  if (config.dbPath.startsWith("~")) {
471
477
  config.dbPath = config.dbPath.replace(/^~/, os2.homedir());
@@ -489,6 +495,7 @@ function loadConfigSync() {
489
495
  normalizeScalingRoadmap(migratedCfg);
490
496
  normalizeSessionLifecycle(migratedCfg);
491
497
  normalizeAutoUpdate(migratedCfg);
498
+ normalizeOrchestration(migratedCfg);
492
499
  return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
493
500
  } catch {
494
501
  return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
@@ -510,6 +517,7 @@ async function loadConfigFrom(configPath) {
510
517
  normalizeScalingRoadmap(migratedCfg);
511
518
  normalizeSessionLifecycle(migratedCfg);
512
519
  normalizeAutoUpdate(migratedCfg);
520
+ normalizeOrchestration(migratedCfg);
513
521
  return { ...DEFAULT_CONFIG, ...migratedCfg };
514
522
  } catch {
515
523
  return { ...DEFAULT_CONFIG };
@@ -581,6 +589,10 @@ var init_config = __esm({
581
589
  checkOnBoot: true,
582
590
  autoInstall: false,
583
591
  checkIntervalMs: 24 * 60 * 60 * 1e3
592
+ },
593
+ orchestration: {
594
+ phase: "phase_1_coo",
595
+ phaseSetBy: "default"
584
596
  }
585
597
  };
586
598
  CONFIG_MIGRATIONS = [
@@ -7544,6 +7556,12 @@ var init_platform_procedures = __esm({
7544
7556
  priority: "p0",
7545
7557
  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."
7546
7558
  },
7559
+ {
7560
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
7561
+ domain: "workflow",
7562
+ priority: "p1",
7563
+ 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."
7564
+ },
7547
7565
  {
7548
7566
  title: "Single dispatch path \u2014 create_task only",
7549
7567
  domain: "workflow",
@@ -7602,6 +7620,12 @@ var init_platform_procedures = __esm({
7602
7620
  priority: "p0",
7603
7621
  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."
7604
7622
  },
7623
+ {
7624
+ title: "Commit discipline \u2014 never leave verified work floating",
7625
+ domain: "workflow",
7626
+ priority: "p1",
7627
+ 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."
7628
+ },
7605
7629
  {
7606
7630
  title: "Desktop and TUI are the same product",
7607
7631
  domain: "architecture",
@@ -188,6 +188,11 @@ function normalizeAutoUpdate(raw) {
188
188
  const userAU = raw.autoUpdate ?? {};
189
189
  raw.autoUpdate = { ...defaultAU, ...userAU };
190
190
  }
191
+ function normalizeOrchestration(raw) {
192
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
193
+ const userOrg = raw.orchestration ?? {};
194
+ raw.orchestration = { ...defaultOrg, ...userOrg };
195
+ }
191
196
  async function loadConfig() {
192
197
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
193
198
  await ensurePrivateDir(dir);
@@ -212,6 +217,7 @@ async function loadConfig() {
212
217
  normalizeScalingRoadmap(migratedCfg);
213
218
  normalizeSessionLifecycle(migratedCfg);
214
219
  normalizeAutoUpdate(migratedCfg);
220
+ normalizeOrchestration(migratedCfg);
215
221
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
216
222
  if (config.dbPath.startsWith("~")) {
217
223
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -287,6 +293,10 @@ var init_config = __esm({
287
293
  checkOnBoot: true,
288
294
  autoInstall: false,
289
295
  checkIntervalMs: 24 * 60 * 60 * 1e3
296
+ },
297
+ orchestration: {
298
+ phase: "phase_1_coo",
299
+ phaseSetBy: "default"
290
300
  }
291
301
  };
292
302
  CONFIG_MIGRATIONS = [
@@ -3151,6 +3161,12 @@ var init_platform_procedures = __esm({
3151
3161
  priority: "p0",
3152
3162
  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."
3153
3163
  },
3164
+ {
3165
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
3166
+ domain: "workflow",
3167
+ priority: "p1",
3168
+ 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."
3169
+ },
3154
3170
  {
3155
3171
  title: "Single dispatch path \u2014 create_task only",
3156
3172
  domain: "workflow",
@@ -3209,6 +3225,12 @@ var init_platform_procedures = __esm({
3209
3225
  priority: "p0",
3210
3226
  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."
3211
3227
  },
3228
+ {
3229
+ title: "Commit discipline \u2014 never leave verified work floating",
3230
+ domain: "workflow",
3231
+ priority: "p1",
3232
+ 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."
3233
+ },
3212
3234
  {
3213
3235
  title: "Desktop and TUI are the same product",
3214
3236
  domain: "architecture",