claude-code-session-manager 0.97.0 → 0.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/README.md +3 -3
  2. package/bin/cli.cjs +16 -4
  3. package/bin/node-floor.cjs +41 -0
  4. package/dist/assets/{DataModel-D93FoaOm.js → DataModel-HdR0AxFq.js} +1 -1
  5. package/dist/assets/{History-CXxxqNP1.js → History-Dr4Jr_5z.js} +2 -2
  6. package/dist/assets/{Hooks-CzeYFQjq.js → Hooks-NhrvH3JP.js} +3 -3
  7. package/dist/assets/{Library-D2zPkwOC.js → Library-Dv_EtIMr.js} +1 -1
  8. package/dist/assets/{MarkdownEditor-DbinP78A.js → MarkdownEditor-DTKDWV_n.js} +1 -1
  9. package/dist/assets/{McpServers-Bu_sVGLr.js → McpServers-M034G9B3.js} +2 -2
  10. package/dist/assets/{Memory-BgiI6LZ_.js → Memory-DzF1B4gx.js} +6 -6
  11. package/dist/assets/{Permissions-C1MMzZRm.js → Permissions-DrgbSGWl.js} +3 -3
  12. package/dist/assets/{Plugins-Dhu6wAZi.js → Plugins-Bd3ef35w.js} +2 -2
  13. package/dist/assets/{ProvenanceBadge-C3AcWKMG.js → ProvenanceBadge-DcBHT1Iy.js} +1 -1
  14. package/dist/assets/{SaveBar-plwYm0iO.js → SaveBar-rimJem-Y.js} +1 -1
  15. package/dist/assets/Scheduler-DjgFJl2w.js +16 -0
  16. package/dist/assets/{ScopeSwitcher-DFy0vv_o.js → ScopeSwitcher-CnAzTBrl.js} +1 -1
  17. package/dist/assets/Settings-Dc1F_sSg.js +3 -0
  18. package/dist/assets/{SkillReferenceGraph-DsI7hRPB.js → SkillReferenceGraph-B9aZDecM.js} +1 -1
  19. package/dist/assets/{Skills-3E748UfB.js → Skills-DRXd18gu.js} +2 -2
  20. package/dist/assets/{SystemPrompt-BqmfUJOd.js → SystemPrompt-ahy5-Fwe.js} +1 -1
  21. package/dist/assets/{TagLibrary-CPz6fO8Q.js → TagLibrary-C_tToDeL.js} +1 -1
  22. package/dist/assets/{TiptapBody-D9EoBQ1P.js → TiptapBody-DvdefS6K.js} +1 -1
  23. package/dist/assets/{Toggle-BHAmZNDn.js → Toggle-6Jl5Njc6.js} +1 -1
  24. package/dist/assets/{index-CKH5Uxik.css → index-Bta-hwud.css} +1 -1
  25. package/dist/assets/{index-tn5JIVPj.js → index-vx8O73l8.js} +497 -502
  26. package/dist/assets/{settingsSchema-Crqy_aNz.js → settingsSchema-D6iRguNV.js} +1 -1
  27. package/dist/index.html +2 -2
  28. package/package.json +26 -29
  29. package/plugins/CLAUDE.md +6 -6
  30. package/plugins/session-manager-dev/skills/builder/4-manual/SKILL.md +23 -19
  31. package/plugins/session-manager-dev/skills/builder/SKILL.md +3 -3
  32. package/plugins/session-manager-dev/skills/develop/SKILL.md +254 -510
  33. package/plugins/session-manager-dev/skills/develop/standards.md +17 -22
  34. package/scripts/README.md +3 -11
  35. package/scripts/audit-ops-hygiene.cjs +3 -3
  36. package/scripts/hooks/lib/guard-prd-writes-policy.cjs +1 -1
  37. package/scripts/hooks/lib/guard-self-schedule-policy.cjs +1 -1
  38. package/scripts/mint-epic.cjs +2 -3
  39. package/scripts/scheduler-mcp-server.cjs +36 -7
  40. package/src/main/agentLibrary.cjs +22 -2
  41. package/src/main/build-info.json +4 -4
  42. package/src/main/config.cjs +41 -38
  43. package/src/main/docEdit.cjs +4 -1
  44. package/src/main/files.cjs +2 -5
  45. package/src/main/health.cjs +1 -1
  46. package/src/main/index.cjs +23 -10
  47. package/src/main/ipcSchemas.cjs +28 -35
  48. package/src/main/lib/agentPersonaSchema.cjs +13 -2
  49. package/src/main/lib/atomicFs.cjs +116 -0
  50. package/src/main/lib/branchSweep.cjs +13 -12
  51. package/src/main/lib/buildTarget.cjs +3 -3
  52. package/src/main/lib/claudeCliCaps.cjs +129 -0
  53. package/src/main/lib/credentials.cjs +2 -4
  54. package/src/main/lib/crossProjectFeedback.cjs +3 -3
  55. package/src/main/lib/cwdClassify.cjs +15 -3
  56. package/src/main/lib/definitionOfDone.cjs +207 -125
  57. package/src/main/lib/dodDrainHook.cjs +11 -5
  58. package/src/main/lib/epicMint.cjs +2 -4
  59. package/src/main/lib/epicStatusMirror.cjs +8 -10
  60. package/src/main/lib/epicWorktreeProjectConfig.cjs +2 -4
  61. package/src/main/lib/gateAuthority.cjs +96 -0
  62. package/src/main/lib/gitExec.cjs +69 -0
  63. package/src/main/lib/gitWorktree.cjs +656 -92
  64. package/src/main/lib/instanceLock.cjs +5 -8
  65. package/src/main/lib/launchFailure.cjs +2 -3
  66. package/src/main/lib/macroLibrary.cjs +386 -0
  67. package/src/main/lib/mcpToolCatalog.cjs +26 -17
  68. package/src/main/lib/needsReviewLedger.cjs +1 -1
  69. package/src/main/lib/opsErrorLog.cjs +11 -1
  70. package/src/main/lib/opsOwnership.cjs +0 -5
  71. package/src/main/lib/pidAlive.cjs +32 -0
  72. package/src/main/lib/prdCreate.cjs +153 -19
  73. package/src/main/lib/prdDisposition.cjs +2 -2
  74. package/src/main/lib/prdGateFiles.cjs +284 -0
  75. package/src/main/lib/prdLocations.cjs +61 -0
  76. package/src/main/lib/prdMigration.cjs +2 -3
  77. package/src/main/lib/prdSizing.cjs +2 -1
  78. package/src/main/lib/promptSessionSchema.cjs +10 -2
  79. package/src/main/lib/rcaReport.cjs +4 -6
  80. package/src/main/lib/reaperHelpers.cjs +8 -1
  81. package/src/main/lib/reservationExpiry.cjs +6 -1
  82. package/src/main/lib/reviewNotice.cjs +263 -0
  83. package/src/main/lib/runClaudeP.cjs +4 -1
  84. package/src/main/lib/schedulerPaths.cjs +22 -2
  85. package/src/main/lib/sessionSlots.cjs +2 -4
  86. package/src/main/lib/shippedPersonaSeeds.cjs +179 -0
  87. package/src/main/lib/timeoutShim.cjs +123 -0
  88. package/src/main/lib/timeoutShimScript.cjs +275 -0
  89. package/src/main/lib/upgradeDrain.cjs +4 -10
  90. package/src/main/lib/watchdogHelpers.cjs +33 -30
  91. package/src/main/lib/workTypeLibrary.cjs +7 -1
  92. package/src/main/promptSessionEvents.cjs +37 -13
  93. package/src/main/queueOps.cjs +17 -6
  94. package/src/main/scheduler.cjs +975 -203
  95. package/src/main/seedAgentPersonas.cjs +278 -23
  96. package/src/main/supervisor.cjs +4 -1
  97. package/src/main/templates/PRD_AUTHORING.md +126 -406
  98. package/src/preload/__tests__/preload-surface.test.cjs +68 -0
  99. package/src/preload/api.d.ts +41 -94
  100. package/src/preload/index.cjs +14 -9
  101. package/src/seed/agents/architect.md +1 -0
  102. package/src/seed/agents/dev-lead.md +17 -18
  103. package/src/seed/agents/project-home-builder.md +1 -0
  104. package/src/seed/agents/validator.md +10 -4
  105. package/dist/assets/HostBilko-nESrTRIg.js +0 -1
  106. package/dist/assets/Scheduler-BVYTeh39.js +0 -16
  107. package/dist/assets/Settings-DIhGgdfs.js +0 -3
  108. package/src/main/__tests__/activeIndexMerge.test.cjs +0 -235
  109. package/src/main/__tests__/agentEffortResolve.test.cjs +0 -117
  110. package/src/main/__tests__/agentLibrary.test.cjs +0 -276
  111. package/src/main/__tests__/agentModelResolve.test.cjs +0 -311
  112. package/src/main/__tests__/agentOverlayWrite.test.cjs +0 -95
  113. package/src/main/__tests__/bilkoHost-deriveSlug.test.cjs +0 -26
  114. package/src/main/__tests__/bilkoHost-integration.test.cjs +0 -118
  115. package/src/main/__tests__/bilkoHostCore.test.cjs +0 -72
  116. package/src/main/__tests__/broadcastCoalescer.test.cjs +0 -122
  117. package/src/main/__tests__/chat-cancel-terminal.test.cjs +0 -120
  118. package/src/main/__tests__/chat-dead-channels.test.cjs +0 -63
  119. package/src/main/__tests__/chat-exit-close-race.test.cjs +0 -146
  120. package/src/main/__tests__/chat-mcp-consent-notice.test.cjs +0 -139
  121. package/src/main/__tests__/chat-preamble-anchors.test.cjs +0 -100
  122. package/src/main/__tests__/chat-queue.test.cjs +0 -97
  123. package/src/main/__tests__/chat-stop-signal.test.cjs +0 -89
  124. package/src/main/__tests__/chatRunner-epic-worktree-execcwd.test.cjs +0 -125
  125. package/src/main/__tests__/chatRunner-session-flag-retry.test.cjs +0 -252
  126. package/src/main/__tests__/classifyPromptTicket.test.cjs +0 -101
  127. package/src/main/__tests__/classifyTranscriptLine.test.cjs +0 -201
  128. package/src/main/__tests__/computeDepHistorySatisfaction.test.cjs +0 -66
  129. package/src/main/__tests__/config-readText-bounded.test.cjs +0 -84
  130. package/src/main/__tests__/configWriteBoundaryOwners.test.cjs +0 -59
  131. package/src/main/__tests__/crossProjectFeedback.test.cjs +0 -334
  132. package/src/main/__tests__/crossProjectFeedbackRoutes.test.cjs +0 -161
  133. package/src/main/__tests__/dep-orphan-archive-health.test.cjs +0 -77
  134. package/src/main/__tests__/develop-skill-failure-modes.test.cjs +0 -70
  135. package/src/main/__tests__/docEdit.test.cjs +0 -244
  136. package/src/main/__tests__/dod-batchkey.test.cjs +0 -183
  137. package/src/main/__tests__/dod-drain-hook.test.cjs +0 -302
  138. package/src/main/__tests__/dod-report.test.cjs +0 -304
  139. package/src/main/__tests__/dod-reverify.test.cjs +0 -285
  140. package/src/main/__tests__/epicContextDigest.test.cjs +0 -174
  141. package/src/main/__tests__/epicMint.test.cjs +0 -332
  142. package/src/main/__tests__/epicMintTelemetryTap.test.cjs +0 -64
  143. package/src/main/__tests__/epicStatusMirror.test.cjs +0 -110
  144. package/src/main/__tests__/epicValidationHook.test.cjs +0 -291
  145. package/src/main/__tests__/exchanges.test.cjs +0 -122
  146. package/src/main/__tests__/exchangesPromptId.test.cjs +0 -61
  147. package/src/main/__tests__/extractJson.test.cjs +0 -51
  148. package/src/main/__tests__/files-reject-credentials.test.cjs +0 -40
  149. package/src/main/__tests__/fixtures/1218-fo-01-move-scripts-lib-into-src-main-lib.log +0 -556
  150. package/src/main/__tests__/flatPrdTickSweep.test.cjs +0 -110
  151. package/src/main/__tests__/health-build-freshness.test.cjs +0 -39
  152. package/src/main/__tests__/health-claude-md-budget.test.cjs +0 -57
  153. package/src/main/__tests__/health-credentials.test.cjs +0 -81
  154. package/src/main/__tests__/health-delegation-chain.test.cjs +0 -124
  155. package/src/main/__tests__/health-per-project-stall.test.cjs +0 -84
  156. package/src/main/__tests__/health-prd-migration.test.cjs +0 -37
  157. package/src/main/__tests__/health-queue-dispatch.test.cjs +0 -135
  158. package/src/main/__tests__/health-starve-escalation.test.cjs +0 -94
  159. package/src/main/__tests__/health-tick-liveness.test.cjs +0 -179
  160. package/src/main/__tests__/health-usage-poller.test.cjs +0 -144
  161. package/src/main/__tests__/health-worktree-cap-blocked.test.cjs +0 -65
  162. package/src/main/__tests__/heapSnapshot.test.cjs +0 -121
  163. package/src/main/__tests__/historyAggregatorIntraday.test.cjs +0 -313
  164. package/src/main/__tests__/historyDashboard.test.cjs +0 -163
  165. package/src/main/__tests__/historyRollup.test.cjs +0 -333
  166. package/src/main/__tests__/intradayRefresh.test.cjs +0 -39
  167. package/src/main/__tests__/ipcSchemas-dependsOn.test.cjs +0 -39
  168. package/src/main/__tests__/kg-augment.test.cjs +0 -195
  169. package/src/main/__tests__/loadGateDetailTick.test.cjs +0 -31
  170. package/src/main/__tests__/machineProfile.test.cjs +0 -152
  171. package/src/main/__tests__/mcpStatus.test.cjs +0 -61
  172. package/src/main/__tests__/memoryAggregate.test.cjs +0 -109
  173. package/src/main/__tests__/memoryStale.test.cjs +0 -88
  174. package/src/main/__tests__/needsReviewLedger.test.cjs +0 -162
  175. package/src/main/__tests__/openExternalApp-spawn-error.test.cjs +0 -25
  176. package/src/main/__tests__/opsErrorLog.test.cjs +0 -109
  177. package/src/main/__tests__/opsErrorLogTelemetryTap.test.cjs +0 -173
  178. package/src/main/__tests__/personaMerge.test.cjs +0 -169
  179. package/src/main/__tests__/planValidator.test.cjs +0 -125
  180. package/src/main/__tests__/pollLoop-dispatch-on-failure.test.cjs +0 -176
  181. package/src/main/__tests__/prd-group-allocator.test.cjs +0 -119
  182. package/src/main/__tests__/prdAdminRouteParity.test.cjs +0 -70
  183. package/src/main/__tests__/prdAdminRoutes.test.cjs +0 -718
  184. package/src/main/__tests__/prdAgentType.test.cjs +0 -103
  185. package/src/main/__tests__/prdAuthoringSeed.test.cjs +0 -39
  186. package/src/main/__tests__/prdCreate.test.cjs +0 -979
  187. package/src/main/__tests__/prdCreateDisposition.test.cjs +0 -201
  188. package/src/main/__tests__/prdCreatePlanId.test.cjs +0 -132
  189. package/src/main/__tests__/prdFrontmatterAgentType.test.cjs +0 -117
  190. package/src/main/__tests__/prdFrontmatterDependsOn.test.cjs +0 -136
  191. package/src/main/__tests__/prdFrontmatterDisposition.test.cjs +0 -125
  192. package/src/main/__tests__/prdFrontmatterQuietMachine.test.cjs +0 -108
  193. package/src/main/__tests__/prdLocations.test.cjs +0 -195
  194. package/src/main/__tests__/prdLocationsArchived.test.cjs +0 -201
  195. package/src/main/__tests__/prdMigration.test.cjs +0 -349
  196. package/src/main/__tests__/prdMigrationLegacyAdopt.test.cjs +0 -91
  197. package/src/main/__tests__/prdParserHighWater.test.cjs +0 -74
  198. package/src/main/__tests__/prdParserSourcePromptId.test.cjs +0 -65
  199. package/src/main/__tests__/prdSetDisposition.test.cjs +0 -222
  200. package/src/main/__tests__/prdSizing.test.cjs +0 -106
  201. package/src/main/__tests__/prdSourcePromptIdBackfill.test.cjs +0 -118
  202. package/src/main/__tests__/prdUpdateDependsOn.test.cjs +0 -160
  203. package/src/main/__tests__/proc-role-env.test.cjs +0 -125
  204. package/src/main/__tests__/procname-claude-spawn-sites.test.cjs +0 -304
  205. package/src/main/__tests__/procname-sm-processes.test.cjs +0 -127
  206. package/src/main/__tests__/projectHomeAdminRoutes.test.cjs +0 -177
  207. package/src/main/__tests__/projectPages.test.cjs +0 -137
  208. package/src/main/__tests__/promptSessionEvents.test.cjs +0 -234
  209. package/src/main/__tests__/promptSessionSchema.test.cjs +0 -101
  210. package/src/main/__tests__/promptSessionTranscript.test.cjs +0 -0
  211. package/src/main/__tests__/promptSessionsCreateEpicHandler.test.cjs +0 -159
  212. package/src/main/__tests__/pty-epic-worktree-spawn-cwd.test.cjs +0 -282
  213. package/src/main/__tests__/pty-session-open-telemetry.test.cjs +0 -96
  214. package/src/main/__tests__/pty-write-result.test.cjs +0 -46
  215. package/src/main/__tests__/queue-health-verdict.test.cjs +0 -170
  216. package/src/main/__tests__/queue-starvation-dispatch-driver.test.cjs +0 -286
  217. package/src/main/__tests__/queue-starvation-per-project.test.cjs +0 -147
  218. package/src/main/__tests__/queueHistory.test.cjs +0 -355
  219. package/src/main/__tests__/queueOps-interactive-ac-lint.test.cjs +0 -65
  220. package/src/main/__tests__/queueOpsArchiveDestination.test.cjs +0 -65
  221. package/src/main/__tests__/queueOpsAutoArchive.test.cjs +0 -154
  222. package/src/main/__tests__/rateLimitPollerStreak.test.cjs +0 -128
  223. package/src/main/__tests__/rcaReport.test.cjs +0 -266
  224. package/src/main/__tests__/reconcileFlatPrdSweep.test.cjs +0 -119
  225. package/src/main/__tests__/reconcileTiming.test.cjs +0 -135
  226. package/src/main/__tests__/runLogRetention.test.cjs +0 -489
  227. package/src/main/__tests__/runVerify-atomic-verdicts.test.cjs +0 -26
  228. package/src/main/__tests__/runVerify-blocked-by-foreign-wip.test.cjs +0 -58
  229. package/src/main/__tests__/runVerify-landed-commit-outranks.test.cjs +0 -191
  230. package/src/main/__tests__/runVerify-policy-denial.test.cjs +0 -89
  231. package/src/main/__tests__/runVerify-transcript-commit-evidence.test.cjs +0 -225
  232. package/src/main/__tests__/runVerify.test.cjs +0 -1784
  233. package/src/main/__tests__/scheduleJobSchema.test.cjs +0 -127
  234. package/src/main/__tests__/scheduleJobStatusDrift.test.cjs +0 -65
  235. package/src/main/__tests__/scheduleJobTransitions.test.cjs +0 -277
  236. package/src/main/__tests__/scheduleJobTransitionsGrep.test.cjs +0 -59
  237. package/src/main/__tests__/scheduleJobTransitionsTelemetryTap.test.cjs +0 -72
  238. package/src/main/__tests__/scheduler-admin-routes.test.cjs +0 -199
  239. package/src/main/__tests__/scheduler-adopted-run-supervision.test.cjs +0 -143
  240. package/src/main/__tests__/scheduler-already-satisfied-on-main.test.cjs +0 -105
  241. package/src/main/__tests__/scheduler-archive-completed-prd.test.cjs +0 -102
  242. package/src/main/__tests__/scheduler-archived-twin-guard.test.cjs +0 -155
  243. package/src/main/__tests__/scheduler-autofix-outcome.test.cjs +0 -188
  244. package/src/main/__tests__/scheduler-autofix-select.test.cjs +0 -439
  245. package/src/main/__tests__/scheduler-autopromote.test.cjs +0 -51
  246. package/src/main/__tests__/scheduler-bash-timeout-env.test.cjs +0 -101
  247. package/src/main/__tests__/scheduler-blocked-by-foreign-wip.test.cjs +0 -107
  248. package/src/main/__tests__/scheduler-boot-orphans.test.cjs +0 -153
  249. package/src/main/__tests__/scheduler-broadcast-reconcile.test.cjs +0 -121
  250. package/src/main/__tests__/scheduler-clear-queue-history.test.cjs +0 -134
  251. package/src/main/__tests__/scheduler-commit-guard-noop.test.cjs +0 -244
  252. package/src/main/__tests__/scheduler-committed-in-window.test.cjs +0 -182
  253. package/src/main/__tests__/scheduler-cross-project-batch.test.cjs +0 -43
  254. package/src/main/__tests__/scheduler-default-eligible-heal.test.cjs +0 -168
  255. package/src/main/__tests__/scheduler-dispatch-loop.test.cjs +0 -58
  256. package/src/main/__tests__/scheduler-effective-concurrency.test.cjs +0 -81
  257. package/src/main/__tests__/scheduler-epic-digest.test.cjs +0 -227
  258. package/src/main/__tests__/scheduler-failed-autoreset.test.cjs +0 -121
  259. package/src/main/__tests__/scheduler-finalize-dispatch-guards.test.cjs +0 -229
  260. package/src/main/__tests__/scheduler-find-prd-dir.test.cjs +0 -75
  261. package/src/main/__tests__/scheduler-fix-plan-path.test.cjs +0 -119
  262. package/src/main/__tests__/scheduler-force-tick-outcome.test.cjs +0 -46
  263. package/src/main/__tests__/scheduler-foreign-wip-manifest.test.cjs +0 -78
  264. package/src/main/__tests__/scheduler-gate-shadow.test.cjs +0 -119
  265. package/src/main/__tests__/scheduler-guard-verdict-autoresolve.test.cjs +0 -390
  266. package/src/main/__tests__/scheduler-heal-refusal.test.cjs +0 -61
  267. package/src/main/__tests__/scheduler-heartbeat-payload.test.cjs +0 -80
  268. package/src/main/__tests__/scheduler-inplace-salvage.test.cjs +0 -323
  269. package/src/main/__tests__/scheduler-integration-failure-stamp.test.cjs +0 -41
  270. package/src/main/__tests__/scheduler-investigation-clean-skip.test.cjs +0 -63
  271. package/src/main/__tests__/scheduler-investigation-prompt.test.cjs +0 -123
  272. package/src/main/__tests__/scheduler-job-budget.test.cjs +0 -172
  273. package/src/main/__tests__/scheduler-job-overrun.test.cjs +0 -175
  274. package/src/main/__tests__/scheduler-launch-failure.test.cjs +0 -199
  275. package/src/main/__tests__/scheduler-leftover-fields.test.cjs +0 -52
  276. package/src/main/__tests__/scheduler-leftover-quarantine.test.cjs +0 -199
  277. package/src/main/__tests__/scheduler-looks-done.test.cjs +0 -537
  278. package/src/main/__tests__/scheduler-manual-pause.test.cjs +0 -118
  279. package/src/main/__tests__/scheduler-mechanical-recovery.test.cjs +0 -245
  280. package/src/main/__tests__/scheduler-meta-code-sha.test.cjs +0 -46
  281. package/src/main/__tests__/scheduler-needs-review-autoresolve.test.cjs +0 -197
  282. package/src/main/__tests__/scheduler-never-stop.test.cjs +0 -157
  283. package/src/main/__tests__/scheduler-no-dead-end-status.test.cjs +0 -152
  284. package/src/main/__tests__/scheduler-no-orphan-run-dir.test.cjs +0 -81
  285. package/src/main/__tests__/scheduler-notify-originating-tab-transcript.test.cjs +0 -87
  286. package/src/main/__tests__/scheduler-notify-originating-tab.test.cjs +0 -343
  287. package/src/main/__tests__/scheduler-periodic-reverify-guard.test.cjs +0 -217
  288. package/src/main/__tests__/scheduler-porcelain-rename.test.cjs +0 -164
  289. package/src/main/__tests__/scheduler-prd-missing-skip.test.cjs +0 -161
  290. package/src/main/__tests__/scheduler-prd-persona-spawn.test.cjs +0 -178
  291. package/src/main/__tests__/scheduler-quarantine-autoresolve.test.cjs +0 -165
  292. package/src/main/__tests__/scheduler-quiet-machine-lease.test.cjs +0 -257
  293. package/src/main/__tests__/scheduler-rate-limit-cooldown-freshness.test.cjs +0 -123
  294. package/src/main/__tests__/scheduler-rate-limit-pause.test.cjs +0 -152
  295. package/src/main/__tests__/scheduler-rate-limit-spin-guard.test.cjs +0 -156
  296. package/src/main/__tests__/scheduler-reap-dead-running-jobs.test.cjs +0 -754
  297. package/src/main/__tests__/scheduler-reaper-helpers-basics.test.cjs +0 -87
  298. package/src/main/__tests__/scheduler-reconcile-cwd-preserve.test.cjs +0 -100
  299. package/src/main/__tests__/scheduler-reconcile-history-backfill.test.cjs +0 -105
  300. package/src/main/__tests__/scheduler-reconcile-invalid-repair.test.cjs +0 -203
  301. package/src/main/__tests__/scheduler-reconcile-quarantine.test.cjs +0 -247
  302. package/src/main/__tests__/scheduler-reset-job-fields-guard.test.cjs +0 -77
  303. package/src/main/__tests__/scheduler-resume-recovery.test.cjs +0 -254
  304. package/src/main/__tests__/scheduler-shard-quarantine.test.cjs +0 -115
  305. package/src/main/__tests__/scheduler-shared-tree-guard.test.cjs +0 -380
  306. package/src/main/__tests__/scheduler-sigterm-commit.test.cjs +0 -43
  307. package/src/main/__tests__/scheduler-stall-per-project.test.cjs +0 -126
  308. package/src/main/__tests__/scheduler-starve-escalation.test.cjs +0 -154
  309. package/src/main/__tests__/scheduler-stranded-autofix-park.test.cjs +0 -252
  310. package/src/main/__tests__/scheduler-stranded-investigation.test.cjs +0 -185
  311. package/src/main/__tests__/scheduler-stuck-failed-escalation.test.cjs +0 -136
  312. package/src/main/__tests__/scheduler-supervisor-record.test.cjs +0 -81
  313. package/src/main/__tests__/scheduler-tick-cancel-token.test.cjs +0 -54
  314. package/src/main/__tests__/scheduler-tick-wedge.test.cjs +0 -172
  315. package/src/main/__tests__/scheduler-transient-failure.test.cjs +0 -141
  316. package/src/main/__tests__/scheduler-unreadable-queue-guard.test.cjs +0 -62
  317. package/src/main/__tests__/scheduler-utilization-hold.test.cjs +0 -89
  318. package/src/main/__tests__/scheduler-verify-prd-path.test.cjs +0 -109
  319. package/src/main/__tests__/scheduler-worktree-cap-defer.test.cjs +0 -234
  320. package/src/main/__tests__/scheduler-worktree-exec-cwd.test.cjs +0 -120
  321. package/src/main/__tests__/scheduler-writeprd-epic-rollback.test.cjs +0 -105
  322. package/src/main/__tests__/schedulerBatchRootBlocker.test.cjs +0 -117
  323. package/src/main/__tests__/schedulerStateSidecarRestore.test.cjs +0 -110
  324. package/src/main/__tests__/seedAgentPersonas.test.cjs +0 -184
  325. package/src/main/__tests__/seedSchedulerMcp.test.cjs +0 -211
  326. package/src/main/__tests__/seedStatus.test.cjs +0 -100
  327. package/src/main/__tests__/seedValidatorPersona.test.cjs +0 -116
  328. package/src/main/__tests__/stop-signal-anchor.test.cjs +0 -75
  329. package/src/main/__tests__/telemetryClient.test.cjs +0 -1055
  330. package/src/main/__tests__/telemetryContract.test.cjs +0 -930
  331. package/src/main/__tests__/telemetrySettings.test.cjs +0 -210
  332. package/src/main/__tests__/transcripts-batch-flush.test.cjs +0 -249
  333. package/src/main/__tests__/transcripts-doFlush-array.test.cjs +0 -124
  334. package/src/main/__tests__/transcripts-paged-reads.test.cjs +0 -241
  335. package/src/main/__tests__/transcripts-worktree-epic-path.test.cjs +0 -154
  336. package/src/main/__tests__/transcriptsUsageFor.test.cjs +0 -206
  337. package/src/main/__tests__/uniquePrdNumbers.test.cjs +0 -153
  338. package/src/main/__tests__/usageSingleFlight.test.cjs +0 -169
  339. package/src/main/__tests__/validationSentinels.test.cjs +0 -84
  340. package/src/main/__tests__/workTypeLibrary.test.cjs +0 -89
  341. package/src/main/bilkoHost.cjs +0 -314
  342. package/src/main/bilkoHostCore.cjs +0 -89
  343. package/src/main/lib/__tests__/active-sessions.test.cjs +0 -251
  344. package/src/main/lib/__tests__/activeIndexRebuild.test.cjs +0 -179
  345. package/src/main/lib/__tests__/agentPersonaSchema.test.cjs +0 -67
  346. package/src/main/lib/__tests__/auditLog.test.cjs +0 -38
  347. package/src/main/lib/__tests__/bootSelfHeal.test.cjs +0 -107
  348. package/src/main/lib/__tests__/branchSweep.test.cjs +0 -164
  349. package/src/main/lib/__tests__/buildIdentity.test.cjs +0 -121
  350. package/src/main/lib/__tests__/buildTarget.test.cjs +0 -52
  351. package/src/main/lib/__tests__/childWithLog.test.cjs +0 -321
  352. package/src/main/lib/__tests__/coldBootPromptSessionsWrite.test.cjs +0 -87
  353. package/src/main/lib/__tests__/crashTelemetry.test.cjs +0 -103
  354. package/src/main/lib/__tests__/credentials-futile-refresh.test.cjs +0 -115
  355. package/src/main/lib/__tests__/cwdClassify.test.cjs +0 -111
  356. package/src/main/lib/__tests__/definitionOfDoneSequence.test.cjs +0 -95
  357. package/src/main/lib/__tests__/delegationReadiness.test.cjs +0 -1175
  358. package/src/main/lib/__tests__/dispatchLoop.test.cjs +0 -63
  359. package/src/main/lib/__tests__/effectiveModelInfo.test.cjs +0 -244
  360. package/src/main/lib/__tests__/ephemeralCwd.test.cjs +0 -91
  361. package/src/main/lib/__tests__/epicDelegationStats.test.cjs +0 -137
  362. package/src/main/lib/__tests__/epicSpawnCwd.test.cjs +0 -283
  363. package/src/main/lib/__tests__/epicSpawnPlan.test.cjs +0 -196
  364. package/src/main/lib/__tests__/epicTranscriptPath.test.cjs +0 -163
  365. package/src/main/lib/__tests__/epicWorktreeBoot.test.cjs +0 -136
  366. package/src/main/lib/__tests__/epicWorktreeMerge.test.cjs +0 -130
  367. package/src/main/lib/__tests__/epicWorktreeMint.test.cjs +0 -117
  368. package/src/main/lib/__tests__/epicWorktreeProjectConfig.test.cjs +0 -137
  369. package/src/main/lib/__tests__/fixChainDepth.test.cjs +0 -40
  370. package/src/main/lib/__tests__/fixtures/204-mercury-steam-horse.log.txt +0 -13
  371. package/src/main/lib/__tests__/fixtures/scheduler-machine.json.corrupt-1789147548 +0 -34
  372. package/src/main/lib/__tests__/gateFixtures.json +0 -20
  373. package/src/main/lib/__tests__/gitCacheBound.test.cjs +0 -69
  374. package/src/main/lib/__tests__/gitWorktree.test.cjs +0 -1478
  375. package/src/main/lib/__tests__/gitWorktreeSalvage.test.cjs +0 -107
  376. package/src/main/lib/__tests__/gitWorktreeSalvageDelta.test.cjs +0 -153
  377. package/src/main/lib/__tests__/guardShims.test.cjs +0 -158
  378. package/src/main/lib/__tests__/importReferences.spec.cjs +0 -56
  379. package/src/main/lib/__tests__/instanceLock.test.cjs +0 -173
  380. package/src/main/lib/__tests__/jobSupervisorRecord.test.cjs +0 -78
  381. package/src/main/lib/__tests__/jobWorktree.test.cjs +0 -199
  382. package/src/main/lib/__tests__/jobWorktreeBootLive.test.cjs +0 -82
  383. package/src/main/lib/__tests__/landedSinceRun.test.cjs +0 -133
  384. package/src/main/lib/__tests__/launchFailure.test.cjs +0 -220
  385. package/src/main/lib/__tests__/loadGate.test.cjs +0 -303
  386. package/src/main/lib/__tests__/localAdminHttp.test.cjs +0 -214
  387. package/src/main/lib/__tests__/loopDelay.test.cjs +0 -68
  388. package/src/main/lib/__tests__/mcpToolCatalog.test.cjs +0 -107
  389. package/src/main/lib/__tests__/modelCatalog.test.cjs +0 -202
  390. package/src/main/lib/__tests__/opsOwnership.test.cjs +0 -113
  391. package/src/main/lib/__tests__/opsRootAbsoluteCwd.test.cjs +0 -328
  392. package/src/main/lib/__tests__/opsRootNestedWrite.test.cjs +0 -51
  393. package/src/main/lib/__tests__/opsRootResolve.test.cjs +0 -149
  394. package/src/main/lib/__tests__/prdDeclaredPaths.test.cjs +0 -82
  395. package/src/main/lib/__tests__/prdDisposition.test.cjs +0 -224
  396. package/src/main/lib/__tests__/procIdentity.test.cjs +0 -119
  397. package/src/main/lib/__tests__/procName.test.cjs +0 -92
  398. package/src/main/lib/__tests__/projectBriefCore.test.cjs +0 -216
  399. package/src/main/lib/__tests__/projectRootResolve.test.cjs +0 -148
  400. package/src/main/lib/__tests__/queueHealth.test.cjs +0 -58
  401. package/src/main/lib/__tests__/queueStoreAtomicWrite.test.cjs +0 -88
  402. package/src/main/lib/__tests__/queueStoreMachineStateRecovery.test.cjs +0 -190
  403. package/src/main/lib/__tests__/quietMachineLease.test.cjs +0 -39
  404. package/src/main/lib/__tests__/rateLimitWindow.test.cjs +0 -88
  405. package/src/main/lib/__tests__/reaperHelpers.test.cjs +0 -577
  406. package/src/main/lib/__tests__/schedulerBatchDepends.test.cjs +0 -312
  407. package/src/main/lib/__tests__/schedulerBatchFairness.test.cjs +0 -213
  408. package/src/main/lib/__tests__/schedulerBatchLaunchHold.test.cjs +0 -125
  409. package/src/main/lib/__tests__/schedulerBatchProjectCap.test.cjs +0 -127
  410. package/src/main/lib/__tests__/schedulerBatchQuietMachine.test.cjs +0 -109
  411. package/src/main/lib/__tests__/schedulerMcpServerHeadlessRefusal.test.cjs +0 -71
  412. package/src/main/lib/__tests__/schedulerMcpServerHelp.test.cjs +0 -216
  413. package/src/main/lib/__tests__/schedulerMcpServerProjectHome.test.cjs +0 -183
  414. package/src/main/lib/__tests__/schedulerPaths.test.cjs +0 -226
  415. package/src/main/lib/__tests__/schedulerPathsWorktree.test.cjs +0 -133
  416. package/src/main/lib/__tests__/schedulerRuntimeState.test.cjs +0 -56
  417. package/src/main/lib/__tests__/sessionSlots.test.cjs +0 -144
  418. package/src/main/lib/__tests__/telemetryBacklog.test.cjs +0 -626
  419. package/src/main/lib/__tests__/telemetryBoot.test.cjs +0 -134
  420. package/src/main/lib/__tests__/telemetryConsent.test.cjs +0 -136
  421. package/src/main/lib/__tests__/telemetryCounters.test.cjs +0 -57
  422. package/src/main/lib/__tests__/telemetryCountersMetadataColumn.test.cjs +0 -98
  423. package/src/main/lib/__tests__/terminalRunOutcome.test.cjs +0 -200
  424. package/src/main/lib/__tests__/toolUseClassify.test.cjs +0 -53
  425. package/src/main/lib/__tests__/updateCheck.test.cjs +0 -63
  426. package/src/main/lib/__tests__/upgradeDrain.test.cjs +0 -130
  427. package/src/main/lib/__tests__/usageCircuit.test.cjs +0 -354
  428. package/src/main/lib/__tests__/watchdog-helpers.test.cjs +0 -375
  429. package/src/main/lib/__tests__/watchdog-relaunch.test.cjs +0 -266
  430. package/src/main/lib/kgExchangePairing.cjs +0 -75
@@ -0,0 +1,68 @@
1
+ /**
2
+ * preload-surface.test.cjs — guards against a declared api.d.ts method with
3
+ * no matching contextBridge expose in preload/index.cjs (the gap this PRD
4
+ * closes: installSelfScheduleGuard was declared in api.d.ts and handled in
5
+ * index.cjs, but never exposed on the preload bridge, so the renderer could
6
+ * never actually call it).
7
+ *
8
+ * Outside an Electron runtime, `require('electron')` resolves to a path
9
+ * string (see node_modules/electron/index.js), not {contextBridge,
10
+ * ipcRenderer} — and vi.mock('electron') does not reliably intercept a
11
+ * plain require() of an npm package from a .cjs test file under this
12
+ * project's vitest setup. So this stubs 'electron' directly in Node's
13
+ * require cache before requiring preload/index.cjs, which is the real
14
+ * module under test here.
15
+ *
16
+ * Run: timeout 120 npx vitest run src/preload/__tests__/preload-surface.test.cjs
17
+ */
18
+
19
+ 'use strict';
20
+
21
+ import { test, beforeAll } from 'vitest';
22
+ const assert = require('node:assert/strict');
23
+
24
+ let exposedApi;
25
+ const invokeCalls = [];
26
+
27
+ const electronPath = require.resolve('electron');
28
+ require.cache[electronPath] = {
29
+ id: electronPath,
30
+ filename: electronPath,
31
+ loaded: true,
32
+ exports: {
33
+ contextBridge: {
34
+ exposeInMainWorld: (_name, api) => { exposedApi = api; },
35
+ },
36
+ ipcRenderer: {
37
+ invoke: (channel, payload) => {
38
+ invokeCalls.push({ channel, payload });
39
+ return Promise.resolve({ ok: true });
40
+ },
41
+ send: () => {},
42
+ on: () => {},
43
+ removeListener: () => {},
44
+ },
45
+ },
46
+ };
47
+
48
+ beforeAll(() => {
49
+ require('../index.cjs');
50
+ });
51
+
52
+ test('exposes installSelfScheduleGuard, wired to app:install-self-schedule-guard', async () => {
53
+ assert.strictEqual(typeof exposedApi.app.installSelfScheduleGuard, 'function');
54
+ await exposedApi.app.installSelfScheduleGuard('/tmp/proj');
55
+ const call = invokeCalls.find((c) => c.channel === 'app:install-self-schedule-guard');
56
+ assert.ok(call, 'expected an invoke call on app:install-self-schedule-guard');
57
+ assert.deepStrictEqual(call.payload, { cwd: '/tmp/proj' });
58
+ });
59
+
60
+ test('schedule.resetJob sends cwd only when given', async () => {
61
+ invokeCalls.length = 0;
62
+ await exposedApi.schedule.resetJob('my-slug');
63
+ await exposedApi.schedule.resetJob('my-slug', '/tmp/proj');
64
+ const calls = invokeCalls.filter((c) => c.channel === 'schedule:reset-job');
65
+ assert.strictEqual(calls.length, 2);
66
+ assert.deepStrictEqual(calls[0].payload, { slug: 'my-slug' });
67
+ assert.deepStrictEqual(calls[1].payload, { slug: 'my-slug', cwd: '/tmp/proj' });
68
+ });
@@ -1,13 +1,5 @@
1
1
  import type { PromptSession } from '../renderer/state/promptSessions';
2
2
 
3
- export interface BuildTarget {
4
- registry: string;
5
- packageName: string;
6
- versionBumpPolicy: string;
7
- gates: string[];
8
- discovered?: boolean;
9
- }
10
-
11
3
  export interface ActionOutcome {
12
4
  ok: boolean;
13
5
  kind?: 'info' | 'warn' | 'error';
@@ -240,7 +232,29 @@ export interface McpCatalogResult {
240
232
  /** Mirrors WorkType (src/main/lib/workTypeLibrary.cjs) / EpicTag (tagLibrary.ts) — the
241
233
  * same Epic-mission taxonomy, reused here since an Agent persona's `tags` field is that
242
234
  * same concept, not a free-form string list. */
243
- export type AgentPersonaTag = 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder' | 'bilko-host-publisher';
235
+ export type AgentPersonaTag = 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder';
236
+
237
+ /** One user-defined sidebar HOT KEYS macro (macroLibrary.cjs). `projects` = absolute cwds or `'*'` (every project). */
238
+ export interface Macro {
239
+ id: string;
240
+ label: string;
241
+ agentName: string;
242
+ tag: AgentPersonaTag;
243
+ prompt: string;
244
+ projects: string[];
245
+ createdAt: string;
246
+ updatedAt: string;
247
+ }
248
+
249
+ /** Omit `id` to create; set it to update an existing macro. */
250
+ export interface MacroSaveInput {
251
+ id?: string;
252
+ label: string;
253
+ agentName: string;
254
+ tag: AgentPersonaTag;
255
+ prompt: string;
256
+ projects?: string[];
257
+ }
244
258
 
245
259
  /** One global `~/.claude/agents/<name>.md` persona, per the Agent Library nav page. */
246
260
  export interface AgentPersona {
@@ -264,6 +278,8 @@ export interface AgentPersona {
264
278
  /** "<Department> — <Human title>" (e.g. "Engineering — Architect"), free text — drives
265
279
  * department grouping in the New Epic Agent picker. Optional/null when not set. */
266
280
  title?: string | null;
281
+ /** Bundled-persona version stamp (seedAgentPersonas.cjs). Null for a persona that was never seeded, or has no stamp. */
282
+ seedVersion?: number | null;
267
283
  path: string;
268
284
  body: string;
269
285
  /** Project names (basename of cwd) whose currently-open tab overlays this agent. */
@@ -293,6 +309,8 @@ export interface AgentPersonaSaveInput {
293
309
  title?: string;
294
310
  /** Open project name: write that project's frontmatter-only override (only `model`/`effort` are used) instead of the global file. */
295
311
  projectName?: string;
312
+ /** Bundled-persona version stamp (seedAgentPersonas.cjs). Omit to carry over the existing file's stamp unchanged. */
313
+ seedVersion?: number;
296
314
  body: string;
297
315
  }
298
316
 
@@ -1309,76 +1327,6 @@ export interface ProjectPagesGetResult {
1309
1327
  mtimeMs: number | null;
1310
1328
  }
1311
1329
 
1312
- // ────────────────────────────────────────────── Host on Bilko.run
1313
- export interface BilkoHostBundleManifest {
1314
- schemaVersion: 1;
1315
- slug: string;
1316
- version: string;
1317
- builtAt: string;
1318
- gitSha: string;
1319
- gitBranch: string;
1320
- hostKit: { version: string };
1321
- golden: { path: string; expect: string };
1322
- health: Record<string, unknown>;
1323
- bundle: { sizeBytesGz: number; fileCount: number };
1324
- /** Not part of the host-contract schema itself — this app's own staleness bookkeeping (see BilkoHostGetResult.bundleStale). */
1325
- documentCount: number;
1326
- documents: Array<{ subpath: string; title: string }>;
1327
- }
1328
-
1329
- export type BilkoHostPublishStatus =
1330
- | 'not-published'
1331
- | 'bundle-ready'
1332
- | 'publishing'
1333
- | 'published'
1334
- | 'publish-failed';
1335
-
1336
- export interface BilkoHostPublishState {
1337
- status: BilkoHostPublishStatus;
1338
- slug: string;
1339
- url?: string;
1340
- lastAttemptAt?: string;
1341
- lastError?: string;
1342
- }
1343
-
1344
- export type BilkoHostDocumentSource =
1345
- | { kind: 'project-page-lens'; lens: 'home' | 'marketing' | 'feature' | 'architecture' }
1346
- | { kind: 'file'; path: string };
1347
-
1348
- export interface BilkoHostDocument {
1349
- id: string;
1350
- /** '' for the root document (dist/index.html); otherwise a '/'-joined lowercase-kebab path, e.g. 'special-doc/01'. */
1351
- subpath: string;
1352
- title: string;
1353
- source: BilkoHostDocumentSource;
1354
- addedAt: string;
1355
- /** Where this document resolves once published, given the project's current/derived slug. */
1356
- url: string;
1357
- }
1358
-
1359
- export interface BilkoHostGetResult {
1360
- hasMarketingPage: boolean;
1361
- projectName: string;
1362
- packagePrivate: boolean;
1363
- packageHomepage: string | null;
1364
- packageVersion: string;
1365
- defaultSlug: string;
1366
- documents: BilkoHostDocument[];
1367
- /** True when the on-disk dist/ bundle doesn't reflect the current document list — Prepare Bundle (then Publish) is owed. */
1368
- bundleStale: boolean;
1369
- bundleManifest: BilkoHostBundleManifest | null;
1370
- publishState: BilkoHostPublishState | null;
1371
- }
1372
-
1373
- export interface BilkoHostPrepareBundleResult {
1374
- distPath: string;
1375
- manifest: BilkoHostBundleManifest;
1376
- }
1377
-
1378
- export interface BilkoHostDocumentListResult {
1379
- documents: Array<Omit<BilkoHostDocument, 'url'>>;
1380
- }
1381
-
1382
1330
  // ────────────────────────────────────────────── Per-subagent memory
1383
1331
  // Stored at ~/.claude/session-manager/agent-memory/<agentId>.json. Keyed by
1384
1332
  // agent name (the .md filename in ~/.claude/agents/), not by workspace cwd.
@@ -1489,7 +1437,7 @@ export interface ChatCreatePrdPayload {
1489
1437
  /** Originating tab id — used at job completion to route a status prompt back into the tab. */
1490
1438
  sourceTabId?: string;
1491
1439
  /** User-selected Feature/Bug tag (PRD 774) carried from the originating PromptTicket. */
1492
- tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder' | 'bilko-host-publisher';
1440
+ tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder';
1493
1441
  }
1494
1442
 
1495
1443
  export type ChatCreatePrdResult =
@@ -1580,8 +1528,6 @@ export interface SessionManagerAPI {
1580
1528
  engageRulesPath: () => Promise<string | null>;
1581
1529
  pickDirectory: () => Promise<string | null>;
1582
1530
  gitBranch: (cwd: string) => Promise<string | null>;
1583
- /** Publish target for 'build'-tagged Epics — null disables the Build toolbar button. */
1584
- resolveBuildTarget: (cwd: string) => Promise<BuildTarget | null>;
1585
1531
  /** Default: request a drain-first restart. `force: true` restarts immediately, killing running jobs. */
1586
1532
  rebootApp: (opts?: { force?: boolean }) => void;
1587
1533
  testFireHook: (args: TestFireHookArgs) => Promise<TestFireHookResult>;
@@ -1708,6 +1654,15 @@ export interface SessionManagerAPI {
1708
1654
  /** Fires after any save/delete/removeOverride — subscribers should re-fetch listPersonas(). */
1709
1655
  onChanged: (handler: () => void) => () => void;
1710
1656
  };
1657
+ macros: {
1658
+ list: () => Promise<Macro[]>;
1659
+ save: (payload: MacroSaveInput) => Promise<Macro>;
1660
+ delete: (payload: { id: string }) => Promise<{ ok: boolean }>;
1661
+ /** Add/remove one project cwd. A macro shown in every project (`'*'`) cannot be narrowed: `{ ok: false, error: 'macro is shown in every project' }`. */
1662
+ setProject: (payload: { id: string; cwd: string; enabled: boolean }) => Promise<{ ok: true; macro: Macro } | { ok: false; error: string }>;
1663
+ /** Fires after any save/delete/setProject — re-fetch list(). */
1664
+ onChanged: (handler: () => void) => () => void;
1665
+ };
1711
1666
  models: {
1712
1667
  /** Live model/effort catalog (`modelCatalog.cjs`'s `resolveModelCatalog`). Never rejects from
1713
1668
  * the resolver itself — a failed probe degrades down cache → floor and sets `degraded`.
@@ -1855,7 +1810,9 @@ export interface SessionManagerAPI {
1855
1810
  min: number; max: number; default: number; envOverride: boolean;
1856
1811
  }>;
1857
1812
  setConfig: (partial: Partial<ScheduleConfig & { supervisor?: Partial<SupervisorConfig> }>) => Promise<{ ok: boolean; config: ScheduleConfig }>;
1858
- resetJob: (slug: string) => Promise<{ ok: boolean; error?: string }>;
1813
+ /** `cwd`, when given, narrows the match to that project's job row — two
1814
+ * different projects can independently produce the identical slug. */
1815
+ resetJob: (slug: string, cwd?: string) => Promise<{ ok: boolean; error?: string }>;
1859
1816
  runNow: () => Promise<{ ok: boolean }>;
1860
1817
  forceTick: () => Promise<ActionOutcome>;
1861
1818
  pause: () => Promise<{ ok: boolean }>;
@@ -1968,16 +1925,6 @@ export interface SessionManagerAPI {
1968
1925
  /** Fires whenever a watched cwd's home.html is added/changed/removed, carrying the freshly read result. */
1969
1926
  onChanged: (handler: (payload: { cwd: string } & ProjectPagesGetResult) => void) => () => void;
1970
1927
  };
1971
- bilkoHost: {
1972
- /** Read compatibility-gate inputs + any existing bundle/publish state. Never fires an LLM call. */
1973
- get: (cwd: string) => Promise<BilkoHostGetResult>;
1974
- /** Stage A: rebuild the whole dist/ tree + dist/manifest.json from the current document list. Pure, no cost, idempotent. */
1975
- prepareBundle: (cwd: string, slug: string) => Promise<BilkoHostPrepareBundleResult>;
1976
- /** Add a hosted sub-path document (never the root, which always exists). Does not touch dist/ — Prepare Bundle picks it up. */
1977
- addDocument: (cwd: string, subpath: string, title: string, source: BilkoHostDocumentSource) => Promise<BilkoHostDocumentListResult>;
1978
- /** Remove a hosted document (never the root). Only updates documents.json — the file stays live until the next Prepare Bundle + Publish. */
1979
- removeDocument: (cwd: string, id: string) => Promise<BilkoHostDocumentListResult>;
1980
- };
1981
1928
  promptSessionTranscript: {
1982
1929
  /** Append one full-text turn to an Epic's durable JSONL transcript. Best-effort — resolves `{ok:false}` rather than throwing on failure. */
1983
1930
  append: (
@@ -2116,7 +2063,7 @@ export interface PromptSessionsMergeActiveIndexResult {
2116
2063
  export interface PromptSessionsCreateEpicPayload {
2117
2064
  cwd: string;
2118
2065
  goalText: string;
2119
- tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder' | 'bilko-host-publisher';
2066
+ tag?: 'feature' | 'bug' | 'discussion' | 'build' | 'project-home-builder';
2120
2067
  agentType?: string;
2121
2068
  /** Per-Epic model/effort overrides (New Session card); omitted = the persona's own. */
2122
2069
  model?: string;
@@ -9,7 +9,6 @@ contextBridge.exposeInMainWorld('api', {
9
9
  engageRulesPath: () => ipcRenderer.invoke('app:engage-rules-path'),
10
10
  pickDirectory: () => ipcRenderer.invoke('app:pick-directory'),
11
11
  gitBranch: (cwd) => ipcRenderer.invoke('app:git-branch', { cwd }),
12
- resolveBuildTarget: (cwd) => ipcRenderer.invoke('build:resolve-target', { cwd }),
13
12
  rebootApp: (opts) => ipcRenderer.send('app:reboot-app', opts),
14
13
  archiveProject: (encoded) => ipcRenderer.invoke('app:archive-project', { encoded }),
15
14
  testFireHook: (args) => ipcRenderer.invoke('app:test-fire-hook', args),
@@ -27,6 +26,7 @@ contextBridge.exposeInMainWorld('api', {
27
26
  installPrdWriteGuard: (cwd) => ipcRenderer.invoke('app:install-prd-write-guard', { cwd }),
28
27
  installDestructiveGitGuard: (cwd) => ipcRenderer.invoke('app:install-destructive-git-guard', { cwd }),
29
28
  installInlineImplementationGuard: (cwd) => ipcRenderer.invoke('app:install-inline-implementation-guard', { cwd }),
29
+ installSelfScheduleGuard: (cwd) => ipcRenderer.invoke('app:install-self-schedule-guard', { cwd }),
30
30
  onNewSession: (handler) => {
31
31
  const listener = () => handler();
32
32
  ipcRenderer.on('app:new-session', listener);
@@ -117,6 +117,18 @@ contextBridge.exposeInMainWorld('api', {
117
117
  return () => ipcRenderer.removeListener('agents:changed', listener);
118
118
  },
119
119
  },
120
+ macros: {
121
+ list: () => ipcRenderer.invoke('macros:list'),
122
+ save: (payload) => ipcRenderer.invoke('macros:save', payload),
123
+ delete: (payload) => ipcRenderer.invoke('macros:delete', payload),
124
+ setProject: (payload) => ipcRenderer.invoke('macros:set-project', payload),
125
+ // Fired after any save/delete/set-project so every subscriber re-fetches list().
126
+ onChanged: (handler) => {
127
+ const listener = () => handler();
128
+ ipcRenderer.on('macros:changed', listener);
129
+ return () => ipcRenderer.removeListener('macros:changed', listener);
130
+ },
131
+ },
120
132
  models: {
121
133
  catalog: (payload) => ipcRenderer.invoke('models:catalog', payload),
122
134
  },
@@ -239,7 +251,7 @@ contextBridge.exposeInMainWorld('api', {
239
251
  worktreeBase: () => ipcRenderer.invoke('schedule:worktree-base'),
240
252
  setSessionSlots: (cap) => ipcRenderer.invoke('schedule:set-session-slots', { cap }),
241
253
  setConfig: (partial) => ipcRenderer.invoke('schedule:set-config', partial),
242
- resetJob: (slug) => ipcRenderer.invoke('schedule:reset-job', { slug }),
254
+ resetJob: (slug, cwd) => ipcRenderer.invoke('schedule:reset-job', cwd ? { slug, cwd } : { slug }),
243
255
  runNow: () => ipcRenderer.invoke('schedule:run-now'),
244
256
  forceTick: () => ipcRenderer.invoke('schedule:force-tick'),
245
257
  pause: () => ipcRenderer.invoke('schedule:pause'),
@@ -336,13 +348,6 @@ contextBridge.exposeInMainWorld('api', {
336
348
  return () => ipcRenderer.removeListener('project-pages:changed', listener);
337
349
  },
338
350
  },
339
- bilkoHost: {
340
- get: (cwd) => ipcRenderer.invoke('bilko-host:get', { cwd }),
341
- prepareBundle: (cwd, slug) => ipcRenderer.invoke('bilko-host:prepare-bundle', { cwd, slug }),
342
- addDocument: (cwd, subpath, title, source) =>
343
- ipcRenderer.invoke('bilko-host:add-document', { cwd, subpath, title, source }),
344
- removeDocument: (cwd, id) => ipcRenderer.invoke('bilko-host:remove-document', { cwd, id }),
345
- },
346
351
  promptSessionTranscript: {
347
352
  append: (cwd, epicId, turn) =>
348
353
  ipcRenderer.invoke('promptSessionTranscript:append', { cwd, epicId, ...turn }),
@@ -5,6 +5,7 @@ tools: Read, Grep, Glob, Bash, Edit, Write
5
5
  model: opus
6
6
  tags: feature, bug, discussion
7
7
  title: Engineering — Architect
8
+ seedVersion: 1
8
9
  ---
9
10
 
10
11
  You are the architect. You are the one Actor a human talks to for the whole life of an Epic's
@@ -4,6 +4,7 @@ description: Executes exactly one already-scoped PRD at a time, headless, start
4
4
  tools: Read, Grep, Glob, Bash, Edit, Write
5
5
  model: sonnet
6
6
  title: Engineering — Software Engineer
7
+ seedVersion: 2
7
8
  ---
8
9
 
9
10
  You are dev-lead. You execute one PRD — nothing above it, nothing beyond it. You don't decide
@@ -25,24 +26,22 @@ points you at), and the project's own files.
25
26
 
26
27
  ## Run contract (execute in this order — the scheduler grades you on it)
27
28
 
28
- 0. ORIENT (≤ 8 tool calls): read the PRD's `Read first:` files and ONLY those. Do not survey the repo.
29
- 1. RED: write or extend the named test so it fails for the right reason. Run it once, captured: `<test cmd> 2>&1 | tail -20 || true`.
30
- 2. BUILD: make exactly the changes the AC names. Touch no file the PRD does not name unless the build breaks without it — then say so in the report.
31
- 3. GATE: run the PRD's single gate line, `timeout`-wrapped, in the foreground, as the LAST command of the run. Red → fix it or `exit 1`; never continue on red.
32
- 4. COMMIT: `git add <exact paths>` then `git commit -m "<type>(<scope>): <summary>"`. Never `git add -A` / `git add .`; never stash, reset, checkout or clean anything you did not create.
33
- 5. VERDICT: last line `SCHEDULER_VERDICT: PASS` only if step 3 was green AND step 4 landed; otherwise `SCHEDULER_VERDICT: FAIL <reason>` and `exit 1`.
34
-
35
- Verifier traps — each has parked a green run before:
36
- - Absence checks: `if grep …; then echo HALT; exit 1; fi; echo clean` — a bare no-match grep exits 1 and reads as an error.
37
- - Expected failures (a red test, a probe) run EARLY and captured; nothing may error after the gate.
38
- - A probe that errors: re-run it corrected at once, or print `# expected/handled: <why>` on the next line.
39
- - A `timeout` exit 124 you expected: branch on 124 and print OK; never leave a bare 124.
40
- - Never background a verification, never call ScheduleWakeup/Monitor/agents, never invoke /develop or queue work — this process has no next turn.
41
- - `gh pr checks` exits 8 while pending: wrap it and annotate; poll with the identical command each time.
42
- - Retry a transient failure with the SAME command text so the verifier pairs the recovery with the failure.
43
-
44
- Out of contract: anything past the AC list. If the PRD looks wrong, do the AC as written and say why in the report.
45
- Reasoning for every line above: `standards.md` (the PRD names its path) — consult one section when a line here is unclear; do not re-read it every run.
29
+ 0. ORIENT. Make at most 8 tool calls. Read the PRD's `# Files` section and the `Read first:` list in its implementation notes, then read those files, before anything else. Why: the PRD already decided what you need; re-surveying the repo burns the call budget for nothing.
30
+ 1. RED. Write or extend the test the PRD names so it fails for the right reason. Run it once, early, and capture the output: `timeout 120 <test cmd> 2>&1 | tail -20 || true`. Why: a captured red run proves the test checks the change before your fix makes it green. If the PRD changes only docs or config and names no test, skip this step.
31
+ 2. BUILD. Change only the files listed in `# Files`. If you need another file, change it and say why in your report. Why: an edit outside the list collides with another PRD's own edit to that file.
32
+ 3. FINISH. Follow the SCHEDULER FINISH PROTOCOL at the end of your prompt — do not run the gate, commit, or print a verdict yourself outside it. That protocol runs the `# Gate` commands in order, commits with exact paths, and prints the scheduler's own last line, `SCHEDULER_VERDICT: PASS`, only when the gate came back green and the commit landed.
33
+
34
+ Verifier traps — each one has parked a green run before:
35
+ - A bare absence check reads as an error. Write it `if grep …; then echo HALT; exit 1; fi; echo clean` so a clean result exits 0.
36
+ - Run an expected failure (a red test, a probe) early and capture its output. Nothing may error after the gate runs.
37
+ - When a probe errors, re-run it corrected at once, or print `# expected/handled: <why>` on the next line. Never leave an unexplained error in the transcript.
38
+ - A `timeout` that exits 124 as expected still needs a branch: print OK on 124, never leave a bare 124 in the output.
39
+ - Never call ScheduleWakeup or Monitor, never start background work, never invoke /develop or queue work. The finish protocol's review steps are the only exception: run them in the foreground.
40
+ - `gh pr checks` exits 8 while a run is still pending. Wrap it, annotate the exit code, and poll with the identical command each time.
41
+ - Retry a transient failure with the exact same command text, so the verifier can pair the recovery with the failure it recovered from.
42
+
43
+ Out of contract: anything past the Acceptance Criteria list. If the PRD looks wrong, do the AC as written anyway and say why in your report — don't expand or redesign it yourself.
44
+ `standards.md` (the PRD names its path) carries the reasoning behind every line above. Open the one section you need; don't re-read the whole file every run.
46
45
 
47
46
  ## What you don't do
48
47
 
@@ -3,6 +3,7 @@ name: project-home-builder
3
3
  description: Reads a project and writes ONE self-contained overview page (home.html) for its Project Home tab, then saves it with a single project_home_write call.
4
4
  tools: Read, Grep, Glob, Bash, Write, Edit
5
5
  title: Project Home — Builder
6
+ seedVersion: 1
6
7
  ---
7
8
 
8
9
  You are the project-home-builder. Your whole job is to read the real project and produce a single
@@ -1,9 +1,10 @@
1
1
  ---
2
2
  name: validator
3
- description: Validates a finished PLAN (the PRDs that share one planId) once, after its last PRD lands — re-runs each PRD's gate, checks every acceptance criterion against the real tree, reviews the plan's combined diff, and reports one VERIFIED/REFUTED verdict per PRD via sentinel lines. Runs headless as a scheduled PRD (agentType: validator); never edits product code and never queues work.
3
+ description: Validates a finished PLAN (the PRDs its validate PRD lists) once, after its last PRD lands — re-runs each PRD's gate, checks every acceptance criterion against the real tree, reviews the plan's combined diff, and reports one VERIFIED/REFUTED verdict per PRD via sentinel lines. Runs headless as a scheduled PRD (agentType: validator); never edits product code and never queues work.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: sonnet
6
6
  title: Engineering — Plan Validator
7
+ seedVersion: 2
7
8
  ---
8
9
 
9
10
  You are validator. You judge whether a plan's PRDs actually landed what they promised. You do not fix anything, you do not re-implement, you do not queue PRDs — your output is evidence and verdicts, read by the architect who owns the plan.
@@ -14,9 +15,14 @@ Your PRD's `# Acceptance criteria` lists the plan's PRD slugs and where each PRD
14
15
 
15
16
  ## Procedure (in this order)
16
17
 
17
- 1. For each PRD slug, find its landed commit(s): `git log --oneline --since=<plan start> --grep=<slug>`, then the paths its AC names. No commit and no diff on an implementation PRD → REFUTED ("nothing landed").
18
- 2. For each AC line, produce ONE line of evidence: the `file:line` you read, or the captured output of the command it names. Re-run each PRD's gate command exactly as written (foreground, `timeout`-wrapped).
19
- 3. Review the plan's combined diff once: `git diff <base>..HEAD --stat`, then the diff. Run `/code-review` and `/security-review` on it if available in this environment — synchronously, never as a background agent; otherwise self-review for correctness, unsafe input handling, secrets, path traversal, and duplication of an existing helper.
18
+ 1. Read the `Base: <sha>` line in your PRD's implementation notes. For each PRD slug, list its
19
+ commits: `git log --oneline <base>..HEAD -- <each path in that PRD's # Files section>`. Why:
20
+ commit messages do not carry the slug. No `Base:` line → use
21
+ `git log --oneline -30 -- <paths>` and say in the record that the base was unknown. No commit
22
+ and no diff on an implementation PRD → REFUTED ("nothing landed").
23
+ 2. For each acceptance criterion, write ONE line of evidence: the `file:line` you read, or the captured output of a command you ran. Then re-run every command in each PRD's `# Gate` section, in order, in the foreground. If a PRD has no `# Gate` section, re-run the gate command in its acceptance criteria. If the gate is `none`, the per-criterion evidence is the whole check.
24
+ 3. Review the plan's combined diff once: `git diff <base>..HEAD --stat` (<base> is the SHA from
25
+ step 1), then the diff. Run `/code-review` and `/security-review` on it if available in this environment — synchronously, never as a background agent; otherwise self-review for correctness, unsafe input handling, secrets, path traversal, and duplication of an existing helper.
20
26
  4. Write the review record to the path your PRD names (Markdown: one section per PRD with verdict + evidence, then a Findings section ranked Critical / Important / Minor with `file:line`), `git add` that ONE file, commit it.
21
27
  5. Finish with the sentinel block — one line per PRD, then the scheduler's own verdict line:
22
28
  VALIDATION: <slug> VERIFIED
@@ -1 +0,0 @@
1
- import{az as i,aO as Q,b0 as P,aN as m,a0 as V,aQ as Y,ak as t,m as T,aI as W}from"./index-tn5JIVPj.js";import"./monaco-editor-BW5C4Iv1.js";function X(r){return r.hasMarketingPage?r.packagePrivate&&!r.packageHomepage?{kind:"private-needs-confirm"}:{kind:"ready"}:{kind:"no-marketing-page"}}const Z=["home","marketing","feature","architecture"],ee={home:"Home page",marketing:"Marketing page",feature:"Feature page",architecture:"Architecture page"};function $(r){return ee[r]}function D(r){const n=r.find(l=>l.subpath==="");return Z.map(l=>{const p=r.find(h=>h.source.kind==="project-page-lens"&&h.source.lens===l);return p?{lens:l,status:p.subpath===""?"root":"hosted",subpath:p.subpath,documentId:p.id}:!n&&l==="marketing"?{lens:l,status:"root",subpath:"",documentId:null}:{lens:l,status:"available",subpath:l,documentId:null}})}function te(r){return r.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"project"}const j="bilko-host-publisher",se="bilko-host-publisher",ne=[{value:"home",label:"Home lens"},{value:"marketing",label:"Marketing lens"},{value:"feature",label:"Feature lens"},{value:"architecture",label:"Architecture lens"}];function ae(r,n){for(const l of Object.values(r))if(l.cwd===n&&l.tag===j&&l.status==="active")return l;return null}function _(r){W(r),window.dispatchEvent(new CustomEvent("sm:navigate",{detail:"terminal"}))}function oe(){const r=Q(),n=(r==null?void 0:r.cwd)??null,l=P(e=>e.sessions),p=P(e=>e.createPromptSession),h=P(e=>e.approveProposed),[o,C]=i.useState(null),[O,k]=i.useState(!1),[b,v]=i.useState(""),[E,H]=i.useState(!1),[B,M]=i.useState(!1),[u,A]=i.useState(null),[N,L]=i.useState(""),[f,I]=i.useState(""),[w,R]=i.useState("feature");i.useEffect(()=>{let e=!1;return window.api.agents.listPersonas().then(a=>{if(e)return;const s=a.find(g=>g.name===se);A(s?{name:s.name,description:s.description}:null)}).catch(()=>{e||A(null)}),()=>{e=!0}},[]);const c=i.useCallback(()=>{n&&(k(!1),window.api.bilkoHost.get(n).then(e=>{C(e),v(a=>{var s;return a||((s=e.bundleManifest)==null?void 0:s.slug)||e.defaultSlug}),k(!0)}).catch(e=>{k(!0),m.error(`Could not load bilko-host status: ${e instanceof Error?e.message:String(e)}`)}))},[n]);i.useEffect(()=>{C(null),v(""),H(!1),c()},[c]);const x=n?ae(l,n):null,z=i.useCallback(()=>{!n||!b||(M(!0),window.api.bilkoHost.prepareBundle(n,b).then(()=>c()).catch(e=>m.error(`Could not prepare bundle: ${e instanceof Error?e.message:String(e)}`)).finally(()=>M(!1)))},[n,b,c]),F=i.useCallback(()=>{if(!n)return;const e=te(N).replace(/^-+|-+$/g,"");if(!e||!f.trim()){m.error("A sub-path and a title are required.");return}const a={kind:"project-page-lens",lens:w};window.api.bilkoHost.addDocument(n,e,f.trim(),a).then(()=>{L(""),I(""),c()}).catch(s=>m.error(`Could not add document: ${s instanceof Error?s.message:String(s)}`))},[n,N,f,w,c]),G=i.useCallback((e,a)=>{n&&window.api.bilkoHost.addDocument(n,a,$(e),{kind:"project-page-lens",lens:e}).then(()=>c()).catch(s=>m.error(`Could not add ${e} page: ${s instanceof Error?s.message:String(s)}`))},[n,c]),U=i.useCallback(async()=>{if(!n||!o)return;const e=D(o.documents).filter(a=>a.status==="available");for(const a of e)try{await window.api.bilkoHost.addDocument(n,a.subpath,$(a.lens),{kind:"project-page-lens",lens:a.lens})}catch(s){m.error(`Could not add ${a.lens} page: ${s instanceof Error?s.message:String(s)}`)}c()},[n,o,c]),q=i.useCallback(e=>{n&&window.api.bilkoHost.removeDocument(n,e).then(()=>c()).catch(a=>m.error(`Could not remove document: ${a instanceof Error?a.message:String(a)}`))},[n,c]),J=i.useCallback(async()=>{if(!n||!b)return;if(x){_(x.id);return}const e=`Publish this project to bilko.run as a static-path listing, slug "${b}". Bundle is at session-manager-operations/bilko-host/dist/ (prepare it first via Prepare Bundle if it's missing or stale) — it may contain multiple documents (a root page plus sub-paths); publish the whole dist/ tree as one static-path app.`,{goalText:a,openingPrompt:s}=V({title:"",goal:e,tag:j,agentName:u==null?void 0:u.name,agentDescription:(u==null?void 0:u.description)??void 0}),g=u?await p(n,a,j,"HostBilko",u.name):await p(n,a,j,"HostBilko");h(g.id,"HostBilko"),Y.getState().send({tabId:g.id,sessionId:g.claudeSessionId,cwd:n,prompt:s}),_(g.id)},[n,b,x,p,h,u]);if(!n)return t.jsx(T,{title:"Open a project to host it on Bilko.run"});if(!O||!o)return null;const y=X(o);if(y.kind==="no-marketing-page")return t.jsx(T,{title:"No Marketing page yet",hint:"Generate this project's Project Pages from Project Home first — the root document publishes the Marketing lens."});const d=o.publishState,K=(d==null?void 0:d.status)??(o.bundleManifest?"bundle-ready":"not-published"),S=y.kind==="ready"||E;return t.jsxs("div",{className:"max-w-2xl space-y-4",children:[t.jsxs("div",{className:"rounded-card border border-line bg-bg-hi p-5 space-y-4",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxs("div",{children:[t.jsx("div",{className:"font-serif text-lg text-fg",children:o.projectName}),t.jsxs("div",{className:"text-xs text-fg-faint mt-0.5",children:["Status: ",t.jsx("span",{className:"font-mono",children:K}),o.bundleStale&&o.bundleManifest&&t.jsx("span",{className:"ml-2 text-accent",children:"bundle out of date — Prepare Bundle again"})]})]}),(d==null?void 0:d.status)==="published"&&d.url&&t.jsx("a",{href:d.url,target:"_blank",rel:"noreferrer",className:"text-xs text-accent hover:underline",children:d.url})]}),y.kind==="private-needs-confirm"&&!E&&t.jsxs("div",{className:"rounded-md border border-line bg-bg p-3 text-xs text-fg-dim",children:["This project's package.json is marked private with no public homepage. Confirm you want to publish it to bilko.run anyway.",t.jsx("button",{type:"button",onClick:()=>H(!0),className:"mt-2 block rounded-md bg-accent px-3 py-1.5 text-xs font-semibold text-bg-hi hover:bg-accent-dark",children:"Yes, this can be public"})]}),S&&t.jsxs(t.Fragment,{children:[t.jsxs("label",{className:"block text-xs text-fg-faint",children:["Slug (bilko.run/projects/<slug>/)",t.jsx("input",{value:b,onChange:e=>v(e.target.value.toLowerCase()),className:"mt-1 block w-full rounded-md border border-line bg-bg px-2.5 py-1.5 text-sm font-mono text-fg"})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("button",{type:"button",onClick:z,disabled:B,className:"rounded-md border border-line bg-bg px-3.5 py-1.5 text-xs font-semibold text-fg hover:bg-bg-hi disabled:opacity-50",children:B?"Preparing…":"Prepare Bundle"}),t.jsx("button",{type:"button",onClick:()=>{J().catch(e=>{m.error(e instanceof Error?e.message:String(e))})},disabled:!o.bundleManifest,title:o.bundleManifest?void 0:"Prepare a bundle first",className:"rounded-md bg-accent px-3.5 py-1.5 text-xs font-semibold text-bg-hi hover:bg-accent-dark disabled:opacity-50",children:x?"View publish in progress":"Publish"})]}),o.bundleManifest&&t.jsxs("div",{className:"text-[11px] text-fg-faint font-mono",children:["bundle: ",(o.bundleManifest.bundle.sizeBytesGz/1024).toFixed(1)," KB gz ·"," ",o.bundleManifest.bundle.fileCount," document",o.bundleManifest.bundle.fileCount===1?"":"s"," · built"," ",new Date(o.bundleManifest.builtAt).toLocaleString()," · ",o.bundleManifest.gitSha]}),(d==null?void 0:d.status)==="publish-failed"&&d.lastError&&t.jsxs("div",{className:"text-xs text-accent",children:["Last publish failed: ",d.lastError]})]})]}),S&&(()=>{const e=D(o.documents),a=e.filter(s=>s.status==="available").length;return t.jsxs("div",{className:"rounded-card border border-line bg-bg-hi p-5 space-y-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("div",{className:"font-serif text-base text-fg",children:"Project Pages"}),a>1&&t.jsxs("button",{type:"button",onClick:U,className:"text-xs text-accent hover:underline",children:["Host all ",a," remaining"]})]}),t.jsxs("p",{className:"text-xs text-fg-faint",children:["This project generates 4 pages (Home / Marketing / Feature / Architecture). Marketing is the project's root (bilko.run/projects/",b||"<slug>","/); host any of the others as their own sub-page if you want them public too."]}),t.jsx("ul",{className:"space-y-1.5",children:e.map(s=>t.jsxs("li",{className:"flex items-center justify-between gap-2 rounded-md border border-line bg-bg px-3 py-2 text-xs",children:[t.jsxs("div",{className:"min-w-0",children:[t.jsx("div",{className:"text-fg capitalize",children:s.lens}),t.jsx("div",{className:"text-fg-faint font-mono truncate",children:s.status==="root"?"(project root)":`/${s.subpath}/`})]}),s.status==="available"?t.jsxs("button",{type:"button",onClick:()=>G(s.lens,s.subpath),className:"shrink-0 rounded-md border border-line px-2 py-1 text-fg hover:bg-bg-hi",children:["+ Host as /",s.subpath,"/"]}):t.jsx("span",{className:"shrink-0 text-fg-faint",children:s.status==="root"?"root":"hosted"})]},s.lens))})]})})(),S&&t.jsxs("div",{className:"rounded-card border border-line bg-bg-hi p-5 space-y-3",children:[t.jsx("div",{className:"font-serif text-base text-fg",children:"Hosted documents"}),t.jsx("p",{className:"text-xs text-fg-faint",children:"One project, one Bilko listing — add as many explanatory pages as you want under it, each at its own sub-path. Removing one here takes it down on the next Publish."}),t.jsx("ul",{className:"space-y-1.5",children:o.documents.map(e=>t.jsxs("li",{className:"flex items-center justify-between gap-2 rounded-md border border-line bg-bg px-3 py-2 text-xs",children:[t.jsxs("div",{className:"min-w-0",children:[t.jsx("div",{className:"text-fg truncate",children:e.title}),t.jsxs("div",{className:"text-fg-faint font-mono truncate",children:[e.subpath===""?"(root)":`/${e.subpath}/`," · ",e.url]})]}),e.subpath!==""&&t.jsx("button",{type:"button",onClick:()=>q(e.id),title:"Remove — takes effect on the next Publish",className:"shrink-0 rounded-md border border-line px-2 py-1 text-fg-faint hover:text-accent hover:border-accent/40",children:"Remove"})]},e.id))}),t.jsxs("div",{className:"rounded-md border border-line bg-bg p-3 space-y-2",children:[t.jsx("div",{className:"text-[11px] font-semibold uppercase tracking-wide text-fg-faint",children:"Add a document"}),t.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[t.jsx("input",{value:N,onChange:e=>L(e.target.value),placeholder:"sub-path, e.g. special-doc/01",className:"rounded-md border border-line bg-bg-hi px-2.5 py-1.5 text-xs font-mono text-fg"}),t.jsx("input",{value:f,onChange:e=>I(e.target.value),placeholder:"Title",className:"rounded-md border border-line bg-bg-hi px-2.5 py-1.5 text-xs text-fg"})]}),t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx("select",{value:w,onChange:e=>R(e.target.value),className:"rounded-md border border-line bg-bg-hi px-2.5 py-1.5 text-xs text-fg",children:ne.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))}),t.jsx("button",{type:"button",onClick:F,className:"rounded-md border border-line bg-bg-hi px-3.5 py-1.5 text-xs font-semibold text-fg hover:bg-bg",children:"Add document"})]})]})]})]})}const le=i.memo(oe);export{le as HostBilko};