claude-code-session-manager 0.111.0 → 0.112.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 (282) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/dist/assets/{AgentLibrary-rBO1daqM.js → AgentLibrary-RwPvEgqm.js} +2 -2
  3. package/dist/assets/{Button-DsEYRZg0.js → Button-36j3PzYv.js} +1 -1
  4. package/dist/assets/{DataModel-D8sbvvBC.js → DataModel-DUhANo4l.js} +1 -1
  5. package/dist/assets/{History-BEHLtxia.js → History-BeZzNjmv.js} +2 -2
  6. package/dist/assets/{Hooks-CKpvlXrg.js → Hooks-iQ8845Hp.js} +3 -3
  7. package/dist/assets/{Library-CeF4qh9d.js → Library-DPE1h-1L.js} +6 -6
  8. package/dist/assets/{ListDetail-DcfmxPFk.js → ListDetail-PStOuQAo.js} +1 -1
  9. package/dist/assets/{MarkdownEditor-CvK1pyto.js → MarkdownEditor-DPw-N2-m.js} +1 -1
  10. package/dist/assets/{McpServers-D-h2ihzJ.js → McpServers-CUyRTNep.js} +2 -2
  11. package/dist/assets/{Memory-BnF89x8v.js → Memory-bZ2xjBGy.js} +3 -3
  12. package/dist/assets/{Panel-CQY5zano.js → Panel-_VZ_uXNg.js} +1 -1
  13. package/dist/assets/{Permissions-DLukmmsz.js → Permissions-PPRmfNbK.js} +3 -3
  14. package/dist/assets/{Plugins-0Pf0OZ4l.js → Plugins-BFcvfvlx.js} +2 -2
  15. package/dist/assets/{ProvenanceBadge-vC7Tj-JP.js → ProvenanceBadge-B1WUknak.js} +1 -1
  16. package/dist/assets/RemoteMachines-D5V0lzgW.js +3 -0
  17. package/dist/assets/{SaveBar-DjijiUb0.js → SaveBar-Dw64FVdM.js} +1 -1
  18. package/dist/assets/{Scheduler-Cm3EXZvE.js → Scheduler-C8s_pJ3I.js} +9 -9
  19. package/dist/assets/{ScopeSwitcher-B-P-kSfq.js → ScopeSwitcher-D-nKDMAE.js} +1 -1
  20. package/dist/assets/{Settings-DYDlp2m_.js → Settings-CQSrR4mO.js} +4 -4
  21. package/dist/assets/{SkillReferenceGraph-Epv2GJmj.js → SkillReferenceGraph-BbZFMHim.js} +1 -1
  22. package/dist/assets/{Skills-DHO0N0C2.js → Skills-Bzyrh6EQ.js} +1 -1
  23. package/dist/assets/SystemPrompt-DP6i3Dx0.js +1 -0
  24. package/dist/assets/TagLibrary-iip0C6Bl.js +1 -0
  25. package/dist/assets/{TiptapBody-DAMO3DhO.js → TiptapBody-Cr-hxX8L.js} +1 -1
  26. package/dist/assets/Toggle-7WpPzcZH.js +1 -0
  27. package/dist/assets/{ViewTabs-CGX6MAhc.js → ViewTabs-9lQCRwWJ.js} +1 -1
  28. package/dist/assets/{historyTotals-vgfk8EOL.js → historyTotals-BrFxw5J1.js} +1 -1
  29. package/dist/assets/{index-CPieAFsl.js → index-CTBpf-26.js} +250 -250
  30. package/dist/assets/{settingsSchema-D0FxNrTy.js → settingsSchema-Dh5Kl7VO.js} +1 -1
  31. package/dist/assets/{useAgentsDirWatch-DCu6BNYN.js → useAgentsDirWatch-CMpx0d04.js} +1 -1
  32. package/dist/assets/{useRemotePeers-D4cdJDyh.js → useRemotePeers-CI2axd-L.js} +1 -1
  33. package/dist/index.html +1 -1
  34. package/package.json +3 -2
  35. package/plugins/CLAUDE.md +5 -8
  36. package/plugins/session-manager-dev/.claude-plugin/plugin.json +3 -6
  37. package/plugins/session-manager-dev/skills/builder/1-classify-and-bump/SKILL.md +2 -2
  38. package/plugins/session-manager-dev/skills/builder/SKILL.md +2 -3
  39. package/plugins/session-manager-dev/skills/develop/SKILL.md +1 -1
  40. package/plugins/session-manager-dev/skills/develop/standards.md +3 -3
  41. package/scripts/README.md +3 -3
  42. package/scripts/audit-ops-hygiene.cjs +4 -4
  43. package/scripts/hooks/guard-destructive-git.cjs +4 -4
  44. package/scripts/hooks/guard-inline-implementation.cjs +1 -1
  45. package/scripts/hooks/guard-prd-writes.cjs +2 -2
  46. package/scripts/hooks/lib/guard-destructive-git-policy.cjs +1 -1
  47. package/scripts/mint-epic.cjs +2 -2
  48. package/scripts/scheduler-mcp-server.cjs +4 -4
  49. package/src/main/agentLibrary.cjs +5 -5
  50. package/src/main/agentsIpc.cjs +76 -0
  51. package/src/main/build-info.json +4 -4
  52. package/src/main/chatRunner.cjs +12 -12
  53. package/src/main/config.cjs +2 -2
  54. package/src/main/crashDiagnostics.cjs +2 -2
  55. package/src/main/docEdit.cjs +5 -5
  56. package/src/main/files.cjs +2 -2
  57. package/src/main/git.cjs +1 -1
  58. package/src/main/health.cjs +20 -18
  59. package/src/main/heapSnapshot.cjs +1 -1
  60. package/src/main/historyAggregator.cjs +2 -2
  61. package/src/main/index.cjs +44 -132
  62. package/src/main/ipcSchemas.cjs +10 -10
  63. package/src/main/lib/CLAUDE.md +48 -0
  64. package/src/main/lib/activeSessions.cjs +1 -1
  65. package/src/main/lib/classifyPromptTicket.cjs +2 -2
  66. package/src/main/lib/{agentModelResolve.cjs → claude/agentModelResolve.cjs} +7 -7
  67. package/src/main/lib/{claudeBin.cjs → claude/claudeBin.cjs} +4 -4
  68. package/src/main/lib/{effectiveModelInfo.cjs → claude/effectiveModelInfo.cjs} +9 -9
  69. package/src/main/lib/{modelCatalog.cjs → claude/modelCatalog.cjs} +3 -3
  70. package/src/main/lib/{rateLimitDetect.cjs → claude/rateLimitDetect.cjs} +1 -1
  71. package/src/main/lib/{rateLimitWindow.cjs → claude/rateLimitWindow.cjs} +1 -1
  72. package/src/main/lib/{runClaudeP.cjs → claude/runClaudeP.cjs} +1 -1
  73. package/src/main/lib/credentials.cjs +3 -3
  74. package/src/main/lib/cwdClassify.cjs +1 -1
  75. package/src/main/lib/{activeIndexMerge.cjs → epic/activeIndexMerge.cjs} +3 -3
  76. package/src/main/lib/{activeIndexRebuild.cjs → epic/activeIndexRebuild.cjs} +1 -1
  77. package/src/main/lib/{delegationReadiness.cjs → epic/delegationReadiness.cjs} +21 -29
  78. package/src/main/lib/{epicContextDigest.cjs → epic/epicContextDigest.cjs} +1 -1
  79. package/src/main/lib/{epicDelegationStats.cjs → epic/epicDelegationStats.cjs} +2 -2
  80. package/src/main/lib/{epicMint.cjs → epic/epicMint.cjs} +11 -11
  81. package/src/main/lib/{epicSpawnPlan.cjs → epic/epicSpawnPlan.cjs} +3 -3
  82. package/src/main/lib/{epicStatusMirror.cjs → epic/epicStatusMirror.cjs} +2 -2
  83. package/src/main/lib/{epicTranscriptDiagnostic.cjs → epic/epicTranscriptDiagnostic.cjs} +2 -2
  84. package/src/main/lib/{epicTranscriptPath.cjs → epic/epicTranscriptPath.cjs} +2 -2
  85. package/src/main/lib/{epicValidationHook.cjs → epic/epicValidationHook.cjs} +3 -3
  86. package/src/main/lib/{epicWorktreeBoot.cjs → epic/epicWorktreeBoot.cjs} +1 -1
  87. package/src/main/lib/{epicWorktreeMerge.cjs → epic/epicWorktreeMerge.cjs} +3 -3
  88. package/src/main/lib/{epicWorktreeMint.cjs → epic/epicWorktreeMint.cjs} +3 -3
  89. package/src/main/lib/{epicWorktreeProjectConfig.cjs → epic/epicWorktreeProjectConfig.cjs} +4 -4
  90. package/src/main/lib/{promptSessionsCreateEpic.cjs → epic/promptSessionsCreateEpic.cjs} +4 -4
  91. package/src/main/lib/{crossProjectFeedback.cjs → feedback-remote/crossProjectFeedback.cjs} +7 -7
  92. package/src/main/lib/{customerFeedbackClient.cjs → feedback-remote/customerFeedbackClient.cjs} +3 -3
  93. package/src/main/lib/{customerFeedbackInbox.cjs → feedback-remote/customerFeedbackInbox.cjs} +2 -2
  94. package/src/main/lib/{customerFeedbackIpc.cjs → feedback-remote/customerFeedbackIpc.cjs} +1 -1
  95. package/src/main/lib/{localAdminHttp.cjs → feedback-remote/localAdminHttp.cjs} +2 -2
  96. package/src/main/lib/{macroAdminRoutes.cjs → feedback-remote/macroAdminRoutes.cjs} +1 -1
  97. package/src/main/lib/{projectHomeAdminRoutes.cjs → feedback-remote/projectHomeAdminRoutes.cjs} +4 -4
  98. package/src/main/lib/{relayClientAuth.cjs → feedback-remote/relayClientAuth.cjs} +2 -2
  99. package/src/main/lib/{remoteClientSessions.cjs → feedback-remote/remoteClientSessions.cjs} +1 -1
  100. package/src/main/lib/{gitWorktree.cjs → git/gitWorktree.cjs} +7 -7
  101. package/src/main/lib/historyRollup.cjs +1 -1
  102. package/src/main/lib/importReferences.cjs +1 -1
  103. package/src/main/lib/machineProfile.cjs +1 -1
  104. package/src/main/lib/openExternalApp.cjs +1 -1
  105. package/src/main/lib/opsOwnership.cjs +3 -3
  106. package/src/main/lib/{agentPersonaSchema.cjs → persona-macro/agentPersonaSchema.cjs} +2 -2
  107. package/src/main/lib/{macroLibrary.cjs → persona-macro/macroLibrary.cjs} +5 -5
  108. package/src/main/lib/{personaMerge.cjs → persona-macro/personaMerge.cjs} +4 -4
  109. package/src/main/lib/{prdAdminRoutes.cjs → prd/prdAdminRoutes.cjs} +7 -7
  110. package/src/main/lib/{prdAgentType.cjs → prd/prdAgentType.cjs} +3 -3
  111. package/src/main/lib/{prdCreate.cjs → prd/prdCreate.cjs} +12 -12
  112. package/src/main/lib/{prdDeclaredPaths.cjs → prd/prdDeclaredPaths.cjs} +1 -1
  113. package/src/main/lib/{prdGateFiles.cjs → prd/prdGateFiles.cjs} +1 -1
  114. package/src/main/lib/{prdLocations.cjs → prd/prdLocations.cjs} +2 -2
  115. package/src/main/lib/{prdMigration.cjs → prd/prdMigration.cjs} +3 -3
  116. package/src/main/lib/prereqs.cjs +2 -2
  117. package/src/main/lib/{instanceLock.cjs → process/instanceLock.cjs} +4 -11
  118. package/src/main/lib/{pidAlive.cjs → process/pidAlive.cjs} +1 -1
  119. package/src/main/lib/{procName.cjs → process/procName.cjs} +2 -2
  120. package/src/main/lib/{timeoutShim.cjs → process/timeoutShim.cjs} +1 -1
  121. package/src/main/lib/projectRootResolve.cjs +1 -1
  122. package/src/main/lib/promptSessionSchema.cjs +1 -1
  123. package/src/main/lib/{definitionOfDone.cjs → scheduler/definitionOfDone.cjs} +6 -12
  124. package/src/main/lib/{fixChainDepth.cjs → scheduler/fixChainDepth.cjs} +1 -1
  125. package/src/main/lib/{jobDirtFilter.cjs → scheduler/jobDirtFilter.cjs} +1 -1
  126. package/src/main/lib/{jobSupervisorRecord.cjs → scheduler/jobSupervisorRecord.cjs} +1 -1
  127. package/src/main/lib/{launchFailure.cjs → scheduler/launchFailure.cjs} +2 -2
  128. package/src/main/lib/{queueStore.cjs → scheduler/queueStore.cjs} +6 -6
  129. package/src/main/lib/{quietMachineLease.cjs → scheduler/quietMachineLease.cjs} +1 -1
  130. package/src/main/lib/{rcaReport.cjs → scheduler/rcaReport.cjs} +4 -4
  131. package/src/main/lib/{reaperHelpers.cjs → scheduler/reaperHelpers.cjs} +3 -3
  132. package/src/main/lib/{reservationExpiry.cjs → scheduler/reservationExpiry.cjs} +4 -11
  133. package/src/main/lib/{reviewNotice.cjs → scheduler/reviewNotice.cjs} +1 -1
  134. package/src/main/lib/{scheduleJobTransitions.cjs → scheduler/scheduleJobTransitions.cjs} +3 -3
  135. package/src/main/lib/{schedulerBatch.cjs → scheduler/schedulerBatch.cjs} +2 -2
  136. package/src/main/lib/{schedulerConfig.cjs → scheduler/schedulerConfig.cjs} +1 -1
  137. package/src/main/lib/{schedulerRuntimeState.cjs → scheduler/schedulerRuntimeState.cjs} +1 -1
  138. package/src/main/lib/{sessionSlots.cjs → scheduler/sessionSlots.cjs} +2 -2
  139. package/src/main/lib/{upgradeDrain.cjs → scheduler/upgradeDrain.cjs} +8 -11
  140. package/src/main/lib/{watchdogHelpers.cjs → scheduler/watchdogHelpers.cjs} +5 -19
  141. package/src/main/lib/{auditLog.cjs → telemetry/auditLog.cjs} +1 -1
  142. package/src/main/lib/{opsErrorLog.cjs → telemetry/opsErrorLog.cjs} +4 -4
  143. package/src/main/lib/{telemetryBacklog.cjs → telemetry/telemetryBacklog.cjs} +4 -4
  144. package/src/main/lib/{telemetryBoot.cjs → telemetry/telemetryBoot.cjs} +1 -1
  145. package/src/main/lib/{telemetryClient.cjs → telemetry/telemetryClient.cjs} +4 -4
  146. package/src/main/lib/{telemetrySettings.cjs → telemetry/telemetrySettings.cjs} +1 -1
  147. package/src/main/logs.cjs +1 -1
  148. package/src/main/mcpStatus.cjs +2 -2
  149. package/src/main/memoryAggregate.cjs +3 -3
  150. package/src/main/memoryTool.cjs +1 -1
  151. package/src/main/otel.cjs +2 -2
  152. package/src/main/pluginInstall.cjs +29 -3
  153. package/src/main/projectBrief.cjs +6 -6
  154. package/src/main/projectPages.cjs +1 -1
  155. package/src/main/promptSessionEvents.cjs +2 -2
  156. package/src/main/pty.cjs +7 -7
  157. package/src/main/queueOps.cjs +6 -6
  158. package/src/main/remoteClient.cjs +4 -4
  159. package/src/main/remoteClientIpc.cjs +1 -1
  160. package/src/main/runVerify.cjs +1 -1
  161. package/src/main/scheduler/CLAUDE.md +26 -0
  162. package/src/main/scheduler/budget.cjs +576 -0
  163. package/src/main/scheduler/gitTreeGuard.cjs +672 -0
  164. package/src/main/scheduler/prdParser.cjs +4 -4
  165. package/src/main/scheduler/prdPaths.cjs +487 -0
  166. package/src/main/scheduler/reviewLadder.cjs +1011 -0
  167. package/src/main/scheduler/starvation.cjs +390 -0
  168. package/src/main/scheduler.cjs +289 -3311
  169. package/src/main/seedAgentPersonas.cjs +5 -5
  170. package/src/main/seedDevPlugin.cjs +70 -3
  171. package/src/main/seedSchedulerMcp.cjs +2 -2
  172. package/src/main/supervisor.cjs +5 -5
  173. package/src/main/telemetryIpc.cjs +51 -0
  174. package/src/main/transcripts.cjs +3 -3
  175. package/src/main/updaterIpc.cjs +1 -1
  176. package/src/main/usage.cjs +1 -1
  177. package/src/main/watchers.cjs +1 -1
  178. package/src/main/webRemote.cjs +7 -7
  179. package/src/preload/api.d.ts +8 -8
  180. package/src/preload/index.cjs +3 -3
  181. package/dist/assets/RemoteMachines-CWnKbFHc.js +0 -3
  182. package/dist/assets/SystemPrompt-DxeNofL9.js +0 -1
  183. package/dist/assets/TagLibrary-QOAs7ISO.js +0 -1
  184. package/dist/assets/Toggle-Ba_f7q_m.js +0 -1
  185. package/plugins/session-manager-dev/skills/blog-for-project-feature/0-select/SKILL.md +0 -39
  186. package/plugins/session-manager-dev/skills/blog-for-project-feature/1-research/SKILL.md +0 -37
  187. package/plugins/session-manager-dev/skills/blog-for-project-feature/2-storyboard/SKILL.md +0 -64
  188. package/plugins/session-manager-dev/skills/blog-for-project-feature/3-capture/SKILL.md +0 -52
  189. package/plugins/session-manager-dev/skills/blog-for-project-feature/4-draft-copy/SKILL.md +0 -37
  190. package/plugins/session-manager-dev/skills/blog-for-project-feature/5-illustrate/SKILL.md +0 -50
  191. package/plugins/session-manager-dev/skills/blog-for-project-feature/6-compose/SKILL.md +0 -51
  192. package/plugins/session-manager-dev/skills/blog-for-project-feature/7-review/SKILL.md +0 -54
  193. package/plugins/session-manager-dev/skills/blog-for-project-feature/SKILL.md +0 -144
  194. package/plugins/session-manager-dev/skills/blog-for-project-feature/feature.config.yaml +0 -90
  195. package/plugins/session-manager-dev/skills/discover-features/SKILL.md +0 -95
  196. package/plugins/session-manager-dev/skills/explain-to-me/SKILL.md +0 -205
  197. package/plugins/session-manager-dev/skills/explain-to-me/assets/style-reference.html +0 -163
  198. package/plugins/session-manager-dev/skills/find-opportunity/SKILL.md +0 -83
  199. package/plugins/session-manager-dev/skills/issue-address/0-select/0-fetch-pool/SKILL.md +0 -38
  200. package/plugins/session-manager-dev/skills/issue-address/0-select/1-reject-fixed/SKILL.md +0 -64
  201. package/plugins/session-manager-dev/skills/issue-address/0-select/2-reject-claimed/SKILL.md +0 -71
  202. package/plugins/session-manager-dev/skills/issue-address/0-select/3-rank-impact/SKILL.md +0 -39
  203. package/plugins/session-manager-dev/skills/issue-address/0-select/SKILL.md +0 -75
  204. package/plugins/session-manager-dev/skills/issue-address/1-confirm-open/SKILL.md +0 -39
  205. package/plugins/session-manager-dev/skills/issue-address/2-claim/SKILL.md +0 -57
  206. package/plugins/session-manager-dev/skills/issue-address/3-reproduce/SKILL.md +0 -40
  207. package/plugins/session-manager-dev/skills/issue-address/4-fix/SKILL.md +0 -33
  208. package/plugins/session-manager-dev/skills/issue-address/5-verify/SKILL.md +0 -40
  209. package/plugins/session-manager-dev/skills/issue-address/SKILL.md +0 -120
  210. package/plugins/session-manager-dev/skills/local-project-health/SKILL.md +0 -58
  211. package/plugins/session-manager-dev/skills/memory-sanitation/SKILL.md +0 -147
  212. package/plugins/session-manager-dev/skills/ops-sweep/SKILL.md +0 -137
  213. package/plugins/session-manager-dev/skills/pr-review-sweep/0-fetch/SKILL.md +0 -41
  214. package/plugins/session-manager-dev/skills/pr-review-sweep/1-classify/SKILL.md +0 -56
  215. package/plugins/session-manager-dev/skills/pr-review-sweep/2-check-fixed/SKILL.md +0 -49
  216. package/plugins/session-manager-dev/skills/pr-review-sweep/3-queue/SKILL.md +0 -57
  217. package/plugins/session-manager-dev/skills/pr-review-sweep/4-land-and-resolve/SKILL.md +0 -60
  218. package/plugins/session-manager-dev/skills/pr-review-sweep/SKILL.md +0 -124
  219. package/plugins/session-manager-dev/skills/pr-signal/SKILL.md +0 -67
  220. package/plugins/session-manager-dev/skills/project-status/SKILL.md +0 -243
  221. package/plugins/session-manager-dev/skills/requesting-code-review/SKILL.md +0 -98
  222. package/plugins/session-manager-dev/skills/requesting-code-review/code-reviewer.md +0 -146
  223. /package/src/main/lib/{agentEffortResolve.cjs → claude/agentEffortResolve.cjs} +0 -0
  224. /package/src/main/lib/{claudeCliCaps.cjs → claude/claudeCliCaps.cjs} +0 -0
  225. /package/src/main/lib/{usageCircuit.cjs → claude/usageCircuit.cjs} +0 -0
  226. /package/src/main/lib/{epicSpawnCwd.cjs → epic/epicSpawnCwd.cjs} +0 -0
  227. /package/src/main/lib/{customerFeedbackAdminRoutes.cjs → feedback-remote/customerFeedbackAdminRoutes.cjs} +0 -0
  228. /package/src/main/lib/{remoteE2eCrypto.cjs → feedback-remote/remoteE2eCrypto.cjs} +0 -0
  229. /package/src/main/lib/{branchSweep.cjs → git/branchSweep.cjs} +0 -0
  230. /package/src/main/lib/{gitExec.cjs → git/gitExec.cjs} +0 -0
  231. /package/src/main/lib/{jobWorktree.cjs → git/jobWorktree.cjs} +0 -0
  232. /package/src/main/lib/{jobWorktreeBootLive.cjs → git/jobWorktreeBootLive.cjs} +0 -0
  233. /package/src/main/lib/{jobWorktreeTerminalOrphanLive.cjs → git/jobWorktreeTerminalOrphanLive.cjs} +0 -0
  234. /package/src/main/lib/{builtinMacros.cjs → persona-macro/builtinMacros.cjs} +0 -0
  235. /package/src/main/lib/{personaImportHealth.cjs → persona-macro/personaImportHealth.cjs} +0 -0
  236. /package/src/main/lib/{shippedPersonaSeeds.cjs → persona-macro/shippedPersonaSeeds.cjs} +0 -0
  237. /package/src/main/lib/{depSlugResolve.cjs → prd/depSlugResolve.cjs} +0 -0
  238. /package/src/main/lib/{planValidator.cjs → prd/planValidator.cjs} +0 -0
  239. /package/src/main/lib/{prdAuthoringSeed.cjs → prd/prdAuthoringSeed.cjs} +0 -0
  240. /package/src/main/lib/{prdDisposition.cjs → prd/prdDisposition.cjs} +0 -0
  241. /package/src/main/lib/{prdFrontmatter.cjs → prd/prdFrontmatter.cjs} +0 -0
  242. /package/src/main/lib/{prdSizing.cjs → prd/prdSizing.cjs} +0 -0
  243. /package/src/main/lib/{workTypeLibrary.cjs → prd/workTypeLibrary.cjs} +0 -0
  244. /package/src/main/lib/{childWithLog.cjs → process/childWithLog.cjs} +0 -0
  245. /package/src/main/lib/{cleanEnv.cjs → process/cleanEnv.cjs} +0 -0
  246. /package/src/main/lib/{defaultShell.cjs → process/defaultShell.cjs} +0 -0
  247. /package/src/main/lib/{killTree.cjs → process/killTree.cjs} +0 -0
  248. /package/src/main/lib/{loginShellPath.cjs → process/loginShellPath.cjs} +0 -0
  249. /package/src/main/lib/{procIdentity.cjs → process/procIdentity.cjs} +0 -0
  250. /package/src/main/lib/{singleInstanceGuard.cjs → process/singleInstanceGuard.cjs} +0 -0
  251. /package/src/main/lib/{smProcNames.cjs → process/smProcNames.cjs} +0 -0
  252. /package/src/main/lib/{timeoutShimScript.cjs → process/timeoutShimScript.cjs} +0 -0
  253. /package/src/main/lib/{winSpawn.cjs → process/winSpawn.cjs} +0 -0
  254. /package/src/main/lib/{adoptedRunSupervisor.cjs → scheduler/adoptedRunSupervisor.cjs} +0 -0
  255. /package/src/main/lib/{dispatchLoop.cjs → scheduler/dispatchLoop.cjs} +0 -0
  256. /package/src/main/lib/{dodDrainHook.cjs → scheduler/dodDrainHook.cjs} +0 -0
  257. /package/src/main/lib/{fixPlanSlug.cjs → scheduler/fixPlanSlug.cjs} +0 -0
  258. /package/src/main/lib/{gateAuthority.cjs → scheduler/gateAuthority.cjs} +0 -0
  259. /package/src/main/lib/{landedSinceRun.cjs → scheduler/landedSinceRun.cjs} +0 -0
  260. /package/src/main/lib/{loadGate.cjs → scheduler/loadGate.cjs} +0 -0
  261. /package/src/main/lib/{needsReviewLedger.cjs → scheduler/needsReviewLedger.cjs} +0 -0
  262. /package/src/main/lib/{queueHealth.cjs → scheduler/queueHealth.cjs} +0 -0
  263. /package/src/main/lib/{queueHistory.cjs → scheduler/queueHistory.cjs} +0 -0
  264. /package/src/main/lib/{runLogRetention.cjs → scheduler/runLogRetention.cjs} +0 -0
  265. /package/src/main/lib/{scheduleJobSchema.cjs → scheduler/scheduleJobSchema.cjs} +0 -0
  266. /package/src/main/lib/{schedulerPaths.cjs → scheduler/schedulerPaths.cjs} +0 -0
  267. /package/src/main/lib/{terminalRunOutcome.cjs → scheduler/terminalRunOutcome.cjs} +0 -0
  268. /package/src/main/lib/{validationSentinels.cjs → scheduler/validationSentinels.cjs} +0 -0
  269. /package/src/main/lib/{crashTelemetry.cjs → telemetry/crashTelemetry.cjs} +0 -0
  270. /package/src/main/lib/{otlpTraceExporter.cjs → telemetry/otlpTraceExporter.cjs} +0 -0
  271. /package/src/main/lib/{telemetryConsent.cjs → telemetry/telemetryConsent.cjs} +0 -0
  272. /package/src/main/lib/{telemetryCounters.cjs → telemetry/telemetryCounters.cjs} +0 -0
  273. /package/src/main/lib/{atomicFs.cjs → util/atomicFs.cjs} +0 -0
  274. /package/src/main/lib/{encodeCwd.cjs → util/encodeCwd.cjs} +0 -0
  275. /package/src/main/lib/{expandHome.cjs → util/expandHome.cjs} +0 -0
  276. /package/src/main/lib/{extractJson.cjs → util/extractJson.cjs} +0 -0
  277. /package/src/main/lib/{fileTail.cjs → util/fileTail.cjs} +0 -0
  278. /package/src/main/lib/{headTailBuffer.cjs → util/headTailBuffer.cjs} +0 -0
  279. /package/src/main/lib/{kebabCase.cjs → util/kebabCase.cjs} +0 -0
  280. /package/src/main/lib/{loopDelay.cjs → util/loopDelay.cjs} +0 -0
  281. /package/src/main/lib/{lruCache.cjs → util/lruCache.cjs} +0 -0
  282. /package/src/main/lib/{withTimeout.cjs → util/withTimeout.cjs} +0 -0
@@ -1,64 +0,0 @@
1
- ---
2
- name: blog-for-project-feature:storyboard
3
- description: Step 2 of blog-for-project-feature — turn the feature notes into an ordered, one-aspect-at-a-time sequence of demo steps, each with a planned action, expected screen, and caption. A draft for :capture to execute and correct against reality.
4
- ---
5
-
6
- # blog-for-project-feature:storyboard
7
-
8
- ## Input
9
- Mission/description + feature description + demo surface (routes, run command, setup), from
10
- `:research`.
11
-
12
- ## Steps
13
-
14
- 1. **Break the feature into aspects**, not just clicks. Each storyboard step should reveal ONE
15
- idea — a screen, a state change, a result — not an arbitrary UI action. **5-10 steps** ("swipes")
16
- is the target range; fewer feels thin, more starts diluting the "one aspect at a time" promise.
17
-
18
- 2. **For each step, define:**
19
- - `step`: index + short name (e.g. `2-queue-populated`)
20
- - `action`: the exact interaction to perform to reach this state (navigate to X, click Y,
21
- submit form with Z) — precise enough that `:capture` can execute it without re-deciding
22
- - `expected_screen`: what should be visible when the action completes — this is the
23
- hypothesis `:capture` verifies against the real app
24
- - `capture_scope`: `full_page` or `component` (see the composition recipe below) — plus, when
25
- `component`, which element/region to frame (a CSS selector, ARIA role+name, or plain
26
- description precise enough for `:capture` to target a single element screenshot instead of
27
- the whole viewport)
28
- - `caption`: one sentence, written for the reader of the final page, naming what changed on
29
- screen (not internal mechanics)
30
-
31
- 3. **Compose the sequence with this recipe — authoritative, not a suggestion.** A full-page shot
32
- every step is disorienting (the reader has to re-find the relevant thing each time); an
33
- all-component sequence loses context (the reader forgets where they are in the app). Mix them
34
- deliberately in this arc:
35
- - **Orientation (1 step, `full_page`).** Where the feature lives in the real product — the
36
- screen the reader would actually land on. Establishes context before zooming in.
37
- - **Mechanism (2-5 steps, `component`).** The actual control, interaction, or state change,
38
- cropped/framed to just that component so the reader's eye isn't hunting across a full
39
- screen for what changed. This is the bulk of the demo — most features are *shown* here.
40
- - **Variation or depth (0-2 steps, mixed).** Secondary states, options, or edge cases worth
41
- surfacing. Default to `component`; use `full_page` only if the variation reshapes the whole
42
- screen (a new page, a full dashboard swap) rather than one region of it.
43
- - **Outcome (1-2 steps, `full_page`).** The result landing back in the real product, in
44
- context — proof the feature actually changed something the user will encounter, not just a
45
- component in isolation.
46
-
47
- Decision rule when a step doesn't obviously fit: default to `component` — it isolates the
48
- thing being demonstrated and reads more clearly at small size. Only use `full_page` for
49
- orientation/outcome steps, or when the change genuinely spans the whole viewport (new page,
50
- layout shift, multi-panel result) and a cropped shot would lose the point.
51
-
52
- 4. **Order for narrative sense**: entry point → mechanism → variation → outcome, per the recipe
53
- above. Match `content.demo_interaction` in `feature.config.yaml` (one-step reveal, not a
54
- scroll dump) — so the order IS the reveal sequence.
55
-
56
- 5. **Note any setup steps** needed before step 1 is reachable (login, seed data, feature flag)
57
- — hand these to `:capture` explicitly so it isn't guessing at prerequisites.
58
-
59
- ## Output
60
-
61
- Hand off to `:capture`: the ordered step list (`step`, `action`, `expected_screen`,
62
- `capture_scope`, `caption`) plus any setup/prerequisite steps. This is a draft — `:capture` is
63
- expected to correct captions, adjust `capture_scope` if the planned framing doesn't hold up
64
- against the real screen, or drop steps that don't match what the real app actually shows.
@@ -1,52 +0,0 @@
1
- ---
2
- name: blog-for-project-feature:capture
3
- description: Step 3 of blog-for-project-feature — drive the REAL running app and take a real screenshot per storyboard step. Never fabricates or mocks an image; drops and reports any step it can't actually reach.
4
- ---
5
-
6
- # blog-for-project-feature:capture
7
-
8
- ## Input
9
- Ordered storyboard steps (`step`, `action`, `expected_screen`, `capture_scope`, `caption`) +
10
- setup steps, from `:storyboard`.
11
-
12
- ## Steps
13
-
14
- 1. **Get the app running for real.** Check for an existing project skill that already knows how
15
- to launch it (e.g. a `run` skill) before improvising. If none exists, use the project's own
16
- documented run command from `:research`'s demo surface notes.
17
-
18
- 2. **Execute setup steps first** (login, seed data, navigation to the feature's entry point) —
19
- exactly as specified by `:storyboard`, adjusting only if the real app's actual flow differs
20
- (e.g. a login form field is named differently than assumed).
21
-
22
- 3. **For each storyboard step, in order:**
23
- - Perform the `action` using `mcp__playwright__browser_navigate` /
24
- `browser_click` / `browser_type` / etc.
25
- - Take the screenshot per the step's `capture_scope`:
26
- - `full_page`: `mcp__playwright__browser_take_screenshot` for the full viewport/page.
27
- - `component`: use a `ref`/element target (via `browser_snapshot` to locate the element,
28
- then an element-scoped `browser_take_screenshot`) framed to the specific control or
29
- region the step calls out — not the whole viewport. If the described element can't be
30
- resolved to a single clean region, fall back to `full_page` for that step rather than
31
- guessing at a crop.
32
- - Compare what actually rendered against `expected_screen`. If it matches: keep the step,
33
- correct the caption only if something material differs (a number, a label). If the planned
34
- `capture_scope` doesn't hold up (the "component" is actually two disconnected regions, or a
35
- "full_page" shot is so busy the point gets lost), correct `capture_scope` for that step
36
- before saving. If the step doesn't match `expected_screen` at all (error state, feature not
37
- reachable, requires access you don't have): **drop this step and record why** — do not
38
- screenshot an error page and caption around it, and never substitute a mockup, wireframe, or
39
- hand-drawn image for a missing real one.
40
-
41
- 4. **Save images** per `feature.config.yaml`'s `images` block (format, max width, compression) —
42
- downscale before handing to `:compose`, don't pass raw multi-MB captures through.
43
-
44
- 5. **If a majority of steps drop**, stop and report — the feature isn't in a demoable state
45
- right now; that's a valid outcome to surface to the user, not something to force through with
46
- a thin 1-2 step demo.
47
-
48
- ## Output
49
-
50
- Hand off to `:compose`: for each surviving step, the real image file + final caption; plus an
51
- explicit list of any dropped steps and why. `:compose` must never receive more steps than were
52
- actually captured.
@@ -1,37 +0,0 @@
1
- ---
2
- name: blog-for-project-feature:draft-copy
3
- description: Step 4 of blog-for-project-feature — write the FINAL prose for the Mission and Feature Description sections from research notes + captured steps. This finalized text is what :illustrate reads to generate the companion image, and what :compose drops into the page verbatim.
4
- ---
5
-
6
- # blog-for-project-feature:draft-copy
7
-
8
- ## Input
9
- Mission/description + feature description + any flagged gaps (from `:research`), captured
10
- steps with real captions (from `:capture`).
11
-
12
- ## Steps
13
-
14
- 1. **Write the final Mission & Description** (2-4 sentences) from `:research`'s notes — tighten
15
- for the reader of a feature page, but do not add any claim not already in the notes.
16
-
17
- 2. **Write the final Feature Description** (1-2 short paragraphs) — what it does, why it
18
- matters, any real constraint — grounded the same way.
19
-
20
- 3. **Write one "essence" line** (1 sentence, separate from the two sections above): the single
21
- idea this feature page should leave someone with if they read nothing else. This is not
22
- rendered directly on the page — it's the brief `:illustrate` uses to generate a companion
23
- image, so it should be concrete and visual (name the object/action, not an abstract benefit).
24
- Example: not "streamlines developer workflow" but "a terminal tab holding a live Claude Code
25
- session, sitting next to its sibling tabs."
26
-
27
- 4. **Respect `content.tone`** in `feature.config.yaml` (plain, non-salesy, show-don't-tell) —
28
- same bot-tell blocklist bar as `blog-from-git`.
29
-
30
- 5. **If `:research` flagged a gap** (no documented mission, etc.), keep that gap explicit here
31
- rather than papering over it with invented copy — `:compose` renders the gap-note verbatim.
32
-
33
- ## Output
34
-
35
- Hand off to `:illustrate` and `:compose`: final Mission & Description text, final Feature
36
- Description text, the one-sentence essence line, and captured step captions unchanged from
37
- `:capture`.
@@ -1,50 +0,0 @@
1
- ---
2
- name: blog-for-project-feature:illustrate
3
- description: Step 5 of blog-for-project-feature — generate ONE companion illustration that captures the feature's essence, from the finalized copy (not before it exists). Runs after :draft-copy, before :compose. Skips cleanly (never blocks the pipeline) when no image-generation capability is configured.
4
- ---
5
-
6
- # blog-for-project-feature:illustrate
7
-
8
- Runs strictly **after** `:draft-copy` — the companion image is generated from the finalized
9
- essence line, not from raw research notes, so it actually reflects what the page ends up saying
10
- rather than an earlier draft of it.
11
-
12
- ## Input
13
- The one-sentence "essence" line + final Feature Description, from `:draft-copy`.
14
-
15
- ## Steps
16
-
17
- 1. **Check for an available image-generation capability** before doing anything else, in this
18
- order:
19
- - a project-local generator the target project already has wired up (e.g. Burrow's own
20
- `app/shared/image_gen.py`) — reuse it as-is rather than reimplementing
21
- - otherwise, **default to the Gemini API** (same provider/pattern as Burrow's
22
- `image_gen.py`: `gemini-2.5-flash-image` via `google-genai`) using whatever Gemini API key
23
- is available in the environment (`GEMINI_API_KEY` / `GOOGLE_API_KEY`) — this is the
24
- standard path for projects with no generator of their own yet
25
- - **if no Gemini key or other generator is available, skip this step cleanly** — report "no image-generation capability
26
- available, companion image omitted" and hand `:compose` nothing. This is a valid, expected
27
- outcome on environments without a configured image provider — never block the pipeline on
28
- it, and never substitute a stock photo, icon pack graphic, or hand-placed screenshot as a
29
- stand-in for a generated illustration (that would violate the same no-fabrication rule
30
- `:capture` follows, just for a different image class).
31
-
32
- 2. **If available, generate exactly ONE image** from a prompt built as: the essence line +
33
- `feature.config.yaml`'s `illustration` style tokens (mood/palette/composition) + an explicit
34
- instruction that this is a conceptual/editorial illustration, NOT a UI mockup or screenshot
35
- — it must be visually distinguishable at a glance from the real click-through screenshots
36
- (no fake window chrome, no invented UI text). This distinction matters: `:review` gate 2
37
- checks that nothing generated here could be mistaken for a real captured screen.
38
-
39
- 3. **Save and size** per `feature.config.yaml`'s `illustration` block (format, max dimensions,
40
- compression) — same discipline as `:capture`'s screenshot handling.
41
-
42
- 4. **One regeneration attempt max** if the first result is off-brief (wrong subject, contains
43
- text/UI chrome it shouldn't). If still off after one retry, drop it and report rather than
44
- shipping a confusing image.
45
-
46
- ## Output
47
-
48
- Hand off to `:compose`: either one companion image file (clearly tagged as `kind: illustration`,
49
- distinct from `kind: screenshot` steps from `:capture`), or an explicit "omitted — no generator
50
- available" / "omitted — two attempts off-brief" note.
@@ -1,51 +0,0 @@
1
- ---
2
- name: blog-for-project-feature:compose
3
- description: Step 6 of blog-for-project-feature — assemble the finalized copy, the optional companion illustration, and the captured screenshots into one self-contained, portable, click-through HTML page per feature.config.yaml's theme and output conventions.
4
- ---
5
-
6
- # blog-for-project-feature:compose
7
-
8
- ## Input
9
- Final Mission & Description text + final Feature Description text (from `:draft-copy`),
10
- captured steps with real images and captions (from `:capture`), the companion illustration or
11
- its omission-reason (from `:illustrate`).
12
-
13
- ## Steps
14
-
15
- 1. **Pick output mode** per `feature.config.yaml`: default `single_file` with base64-embedded
16
- images. Estimate total size first (sum of image bytes after downscale/compression, including
17
- the companion illustration if present); if it would exceed `single_file_size_ceiling_mb`, use
18
- the `folder_fallback_layout` instead (html + `screenshots/` dir, relative paths).
19
-
20
- 2. **Build the page**, self-contained (inline `<style>`/`<script>`, no external CDN/font/JS
21
- requests — must work fully offline via `file://`), with exactly the three required sections,
22
- **Click-Through Demo first** — the real screenshots are the most persuasive thing on the page,
23
- so they lead, above the fold, before any prose:
24
- - **Click-Through Demo** — the captured steps rendered as a one-step-at-a-time viewer
25
- (numbered tabs or next/prev buttons — vanilla JS, no framework). Each step's real image
26
- renders on top, full width within the viewer, with its caption directly below it — image
27
- first, caption second, never the reverse. Screenshots only — the illustration never appears
28
- in this section. This section opens the page, immediately above the fold.
29
- - **Project Mission & Description** — the finalized text from `:draft-copy`, verbatim
30
- - **Feature Description** — the finalized text from `:draft-copy`, verbatim. If a companion
31
- illustration exists, place it here as a header/hero image for the section — never inside
32
- the Click-Through Demo viewer, so it's never confusable with a real screenshot
33
- - If `:illustrate` reported an omission, skip the hero image silently (it's an optional
34
- companion, not a required section) — do not note the omission on the page itself
35
-
36
- 3. **Apply theme tokens** from `feature.config.yaml`'s `theme` block (font stack, colors,
37
- radius, max width) — keep it minimal and consistent, this is not a place to freelance a new
38
- visual style per run.
39
-
40
- 4. **Write the file** to `output.path_template` (or the folder fallback), resolving
41
- `{feature-slug}` from the confirmed feature name (kebab-case).
42
-
43
- 5. **If a required section would be empty** (e.g. `:research` flagged a real gap and nothing
44
- was found), do not silently omit it — render it with an explicit note ("mission statement not
45
- documented in this project") so `:review` and the reader both see the gap rather than a
46
- silently thinner page.
47
-
48
- ## Output
49
-
50
- Hand off to `:review`: the path to the composed HTML (or html+folder), the output mode used,
51
- final size, and whether a companion illustration was included.
@@ -1,54 +0,0 @@
1
- ---
2
- name: blog-for-project-feature:review
3
- description: Step 7 of blog-for-project-feature — check the composed HTML against feature.config.yaml's gate list before reporting it ready. Loops back to :compose for content issues, :capture for screenshot gaps, or :illustrate for a mislabeled companion image; never ships on a failed gate.
4
- ---
5
-
6
- # blog-for-project-feature:review
7
-
8
- ## Input
9
- Path to the composed HTML (or html+folder) + output mode + size, from `:compose`.
10
-
11
- ## Steps
12
-
13
- Check every item in `feature.config.yaml`'s `gates` list against the actual file:
14
-
15
- 1. Open it (or inspect its markup directly) and confirm every image reference resolves — for
16
- base64-embedded images this means the data URI is present and non-empty; for the folder mode,
17
- confirm each referenced file actually exists on disk.
18
- 2. Confirm zero placeholder/mockup images slipped through — cross-check every `kind: screenshot`
19
- image against `:capture`'s reported real captures; anything not in that list is a violation.
20
- If a companion illustration is present, confirm it's placed only in the Feature Description
21
- header (never inside the Click-Through Demo) and is visually distinguishable from a real
22
- screenshot (no fake window chrome/UI text) — if it could pass as a captured screen, that's a
23
- violation too.
24
- 3. Confirm all three required sections are present and non-empty (or explicitly gap-noted per
25
- `:compose` step 5, which is an acceptable non-empty state). The companion illustration is
26
- optional — its absence is never a gate failure.
27
- 4. Confirm the section order matches `feature.config.yaml`'s `content.sections_required` —
28
- Click-Through Demo leads the page (above the fold, before the prose sections), each visible
29
- step showing its real image on top and the caption directly below it.
30
- 5. Confirm the demo is genuinely click-through — the next/prev or tab controls exist and their
31
- JS actually switches the visible step (not just a cosmetic active-class flip with all steps
32
- rendered stacked underneath).
33
- 6. Confirm no external network calls (grep for `http://`/`https://` in `<script src>`,
34
- `<link href>`, `fetch(`, `@import` — should be none).
35
- 7. Confirm the size ceiling was respected for the mode chosen.
36
- 8. Spot-check 2-3 sentences in the Mission/Feature sections against `:research`'s notes for
37
- traceability — flag anything that reads like invented marketing language.
38
-
39
- ## On failure
40
-
41
- - **Content/structure issue** (sections, theme, controls, external calls, size) → loop back to
42
- `:compose` with the specific gate that failed.
43
- - **Screenshot issue** (missing/broken image, a step that needs re-capturing) → loop back to
44
- `:capture` for that step specifically, then re-run `:compose` for just the affected step.
45
- - **Illustration issue** (looks like a mockup/screenshot, placed in the wrong section) → loop
46
- back to `:illustrate` for one more attempt, or drop it entirely and re-run `:compose` without it.
47
- - Never mark the page ready with a known-failing gate "to save time" — a shorter honest page
48
- beats a complete one that fails its own checklist.
49
-
50
- ## Output
51
-
52
- On all-pass: report the final path, output mode, size, and step count to the user. State clearly
53
- that publishing/uploading/deploying happens **only if explicitly asked next** — this step's job
54
- ends at "ready," not "shipped."
@@ -1,144 +0,0 @@
1
- ---
2
- name: blog-for-project-feature
3
- description: Produce a self-contained, interactive HTML "feature showcase" for one project + one feature — Project Mission & Description, Feature Description (with an optional generated companion illustration), and a Click-Through Demo built from REAL screenshots (never mockups) — one aspect revealed at a time. Output is a single portable HTML file uploadable anywhere (no server, no build step). Distinct from blog-from-git (which drafts narrative bilko.run changelog posts from git history) — this is an evergreen, per-feature product page, not a dated post. Orchestrates 8 nested sub-skills (blog-for-project-feature:select, :research, :storyboard, :capture, :draft-copy, :illustrate, :compose, :review) so each step is independently invokable and inspectable. Use for "make a feature page for X", "showcase this feature", "/blog-for-project-feature", "interactive demo of X", or turning a shipped feature in Session Manager / Social Signal Builder (or any project) into something you can hand someone a link to.
4
- ---
5
-
6
- # blog-for-project-feature (orchestrator)
7
-
8
- Project-agnostic. Runs against whatever project the current working directory (or a named
9
- project path) points to — built first for **Session Manager** and **Social Signal Builder**,
10
- but nothing here is hardcoded to either.
11
-
12
- **Not `blog-from-git`.** That skill drafts a dated, narrative bilko.run post from git activity
13
- ("here's what shipped this week"). This skill produces an **evergreen, single-feature product
14
- page** — no date, no changelog framing, not tied to a publishing cadence. One project, one
15
- feature, three things: what the project is for, what this feature does, and a real click-through
16
- demo of it working. The two skills never share output or ledger state.
17
-
18
- **`feature.config.yaml` in this folder is the grounding authority** for output conventions
19
- (where the HTML lands, image size/compression limits, single-file-vs-folder default, theme
20
- tokens). Read it first, before any sub-skill file. If prose here ever disagrees with the config,
21
- the config wins.
22
-
23
- ## Pipeline DAG
24
-
25
- ```
26
- project (+ optional feature name)
27
- │
28
- ▼
29
- ┌───────────────────────────────┐
30
- │ 0. blog-for-project-feature:select │──▶ one confirmed project + one confirmed feature
31
- └───────────────────────────────┘
32
- │
33
- ▼
34
- ┌───────────────────────────────┐
35
- │ 1. :research │──▶ mission, feature description, key files/entry points
36
- └───────────────────────────────┘
37
- │
38
- ▼
39
- ┌───────────────────────────────┐
40
- │ 2. :storyboard │──▶ ordered demo steps (action, expected screen, caption)
41
- └───────────────────────────────┘
42
- │
43
- ▼
44
- ┌───────────────────────────────┐
45
- │ 3. :capture │──▶ real screenshots per step (+ storyboard corrections)
46
- └───────────────────────────────┘ │ no real screenshot obtainable for a step
47
- │ all steps captured ▼
48
- ▼ STOP — report which step blocked, don't fabricate
49
- ┌───────────────────────────────┐
50
- │ 4. :draft-copy │──▶ FINAL mission/feature text + one-sentence "essence" line
51
- └───────────────────────────────┘
52
- │
53
- ▼
54
- ┌───────────────────────────────┐
55
- │ 5. :illustrate │──▶ one companion illustration from the essence line
56
- └───────────────────────────────┘ (or a clean "omitted" note — never blocks the pipeline)
57
- │
58
- ▼
59
- ┌───────────────────────────────┐
60
- │ 6. :compose │──▶ one self-contained interactive HTML file
61
- └───────────────────────────────┘
62
- │
63
- ▼
64
- ┌───────────────────────────────┐
65
- │ 7. :review │──── fails a check ────┐
66
- └───────────────────────────────┘ │
67
- │ passes │
68
- ▼ │
69
- report path, wait for explicit │
70
- "publish/upload" instruction loop back to :compose / :capture / :illustrate
71
- ```
72
-
73
- | Step | Input | Output | On failure |
74
- |---|---|---|---|
75
- | 0. `:select` | project (cwd or named) + optional feature hint | one confirmed project + one confirmed feature name + why it's demo-worthy | **STOP** — report if no clear feature can be confirmed (don't guess) |
76
- | 1. `:research` | confirmed project + feature | mission/description (project-level), feature description, key files, how it actually works | n/a — always produces notes, flags gaps explicitly rather than inventing claims |
77
- | 2. `:storyboard` | mission + feature notes | ordered list of `{step, action, expected_screen, capture_scope, caption}`, 5-10 steps, a deliberate mix of full-page and component-scoped shots | n/a — storyboard is a draft, `:capture` is allowed to correct it |
78
- | 3. `:capture` | storyboard | one real screenshot file per step + any corrected captions | **STOP** on that step — report what's missing; never substitute a placeholder/mockup image |
79
- | 4. `:draft-copy` | research notes + captured captions | final Mission & Feature Description prose + one-sentence essence line | n/a — always produces final text, gaps stay explicit |
80
- | 5. `:illustrate` | the essence line (text must exist first) | one companion illustration, tagged distinct from screenshots — or an explicit omission note | never blocks — skips cleanly if no image generator is configured, or after one off-brief retry |
81
- | 6. `:compose` | final copy + captured steps + optional illustration | one self-contained HTML file (or html+images folder per config) | loop back to `:capture` if a required image is missing, else fix and retry |
82
- | 7. `:review` | the composed HTML | pass/fail against the gate below | loop back to `:compose` (content), `:capture` (screenshot), or `:illustrate` (mislabeled companion image) — never ship on a failed gate |
83
-
84
- ## Golden rule: screenshots are real or the step doesn't exist
85
-
86
- This skill exists specifically because "feature demo" content is worthless if the images are
87
- invented, stale, or from the wrong build. `:capture` uses `mcp__playwright__*` (or the project's
88
- own screenshot tooling if `run`/a project skill already drives it — check for one first) against
89
- a running instance of the actual project. If a step can't be captured for real (app won't start,
90
- feature is behind auth you don't have, flow requires data that doesn't exist locally), **that
91
- step is dropped and reported, not faked.** A shorter, honest demo beats a complete, fabricated one.
92
-
93
- ## Output
94
-
95
- Default: one self-contained `.html` file (inline CSS/JS, base64-embedded images) written to
96
- `docs/feature-showcase/<project-slug>-<feature-slug>.html` inside **`~/Projects/Bilko`** —
97
- never inside the showcased project's own repo, even when the feature being showcased belongs
98
- to a different project entirely. Bilko is the author/publisher of every showcase (same as
99
- `blog-from-git`'s posts), is guaranteed to be locally writable across sessions, and these pages
100
- are destined to eventually post to bilko.run — so output collects in one place from the start.
101
- See `feature.config.yaml` for the exact path convention, size ceiling, and the single-file vs.
102
- folder fallback (used when embedded images would blow past the size ceiling). This is what
103
- "uploadable anywhere" means: no server, no relative asset paths, no build step — open the file
104
- or drop it on any static host and it works.
105
-
106
- **Only push, deploy, or upload when explicitly asked.** Report the local path and a one-line
107
- description of what the page shows, and wait — same convention as `blog-from-git`'s seed gate
108
- and `issue-address`'s "only push when asked" rule.
109
-
110
- ## Why nested skills instead of one inline pass
111
-
112
- Same reasoning as `issue-address` and `pr-review-sweep`: each phase is a real, independently
113
- invokable `SKILL.md` so progress is visible step by step ("storyboard produced 5 steps, capture
114
- got 4 real screenshots, 1 dropped") instead of one opaque generation pass, and a single phase
115
- (e.g. swapping the screenshot tool, changing the HTML theme) can be edited without touching the
116
- others. If a step is still doing too much once this ships, decompose it further the same way
117
- `issue-address:select` was (nested sub-DAG) — continuously, wherever one file covers too much to
118
- inspect as one unit.
119
-
120
- ## Folder map
121
-
122
- ```
123
- blog-for-project-feature/
124
- feature.config.yaml ← output path convention, size ceiling, theme tokens — read first
125
- SKILL.md ← this file: pipeline, DAG, output contract
126
- 0-select/SKILL.md
127
- 1-research/SKILL.md
128
- 2-storyboard/SKILL.md
129
- 3-capture/SKILL.md
130
- 4-draft-copy/SKILL.md
131
- 5-illustrate/SKILL.md
132
- 6-compose/SKILL.md
133
- 7-review/SKILL.md
134
- ```
135
-
136
- ## What this skill is not
137
-
138
- - Not `blog-from-git` — no dated post, no rotation ledger, no git-diff scan. This is
139
- feature-scoped and evergreen; that skill is time-scoped and narrative.
140
- - Not a marketing copy generator — every claim in `:research`'s output must trace to real code,
141
- docs, or a live screenshot, same evidentiary bar as `blog-from-git`'s `ground.md`.
142
- - Not a full site generator — one feature, one page, per run. A project with N features worth
143
- showcasing gets N runs (and, if wanted later, a separate index/landing skill — not built yet,
144
- don't invent one inline).
@@ -1,90 +0,0 @@
1
- # Grounding authority for blog-for-project-feature. Read this before any sub-skill file.
2
- # If prose in a SKILL.md ever disagrees with this file, this file wins.
3
-
4
- output:
5
- # Path is relative to ~/Projects/Bilko (the Bilko repo) — ALWAYS, regardless of which
6
- # project the showcased feature lives in. Bilko is the author/publisher of every showcase
7
- # (same reason blog-from-git's posts live in Bilko, not in the project they're about) and
8
- # these pages are destined to eventually be posted on bilko.run — Bilko is the one repo
9
- # guaranteed to be locally writable across every session this skill runs in, and keeping
10
- # output there means all showcases accumulate in one place instead of scattering across
11
- # sibling repos. Never write the HTML into the target project's own repo.
12
- base_repo: "~/Projects/Bilko"
13
- path_template: "docs/feature-showcase/{project-slug}-{feature-slug}.html"
14
- project_slug_rule: "kebab-case, the showcased project's own repo/registry slug (e.g. session-manager, signal-builder) — always prefixed so multi-project output never collides"
15
- feature_slug_rule: "kebab-case, derived from the confirmed feature name in :select"
16
- # Prefer one self-contained file. Only fall back to a folder when the size ceiling
17
- # below would be exceeded by inlining images.
18
- default_mode: single_file # single_file | folder
19
- folder_fallback_layout:
20
- html: "docs/feature-showcase/{project-slug}-{feature-slug}/index.html"
21
- images: "docs/feature-showcase/{project-slug}-{feature-slug}/screenshots/"
22
- single_file_size_ceiling_mb: 8 # switch to folder_fallback_layout above this
23
- never_upload_or_deploy_without_explicit_ask: true
24
-
25
- images:
26
- format: png
27
- max_width_px: 1600 # downscale before embedding; demo clarity, not pixel-perfect
28
- compression: "reasonable lossy ok for PNG->WebP if it keeps text legible; never so lossy captions become unreadable"
29
- source_of_truth: "mcp__playwright__browser_take_screenshot against a real running instance"
30
- placeholder_or_mockup_images: forbidden # a dropped step beats a fabricated one
31
- capture_scope: "full_page | component, chosen per step in :storyboard and executed in :capture.
32
- Full-page screenshots are not always the clearest way to show a feature — a control or state
33
- change is often clearer cropped to just that component. Default to component-scoped shots for
34
- mechanism/detail steps; reserve full_page for orientation (where the feature lives) and
35
- outcome (the result landing back in the real product) steps. See :storyboard's composition
36
- recipe for the authoritative mix."
37
-
38
- illustration:
39
- # The ONE companion image, generated by :illustrate — a distinct image class from the
40
- # click-through screenshots above. Optional: omitted cleanly if no generator is configured.
41
- runs_after: draft-copy # never generate from anything but finalized copy
42
- generator: "project-local generator if the target project has one, else Gemini
43
- (gemini-2.5-flash-image via google-genai — same provider/pattern as Burrow's
44
- app/shared/image_gen.py) using GEMINI_API_KEY / GOOGLE_API_KEY from the environment"
45
- count: 1
46
- placement: "Feature Description section header only — never inside the Click-Through Demo"
47
- format: png
48
- max_width_px: 1200
49
- style: "conceptual/editorial illustration — mood/palette should follow the project's own
50
- theme tokens above if it has brand colors, otherwise a clean flat/geometric style"
51
- must_not_resemble: "a UI mockup, screenshot, or contain invented interface text/window chrome
52
- — must be visually distinguishable from a real captured screen at a glance"
53
- max_regeneration_attempts: 1
54
- on_no_generator_available: "skip silently, no page-visible note, report to the operator only"
55
-
56
- content:
57
- sections_required:
58
- # Order matters: this IS the on-page order, top to bottom.
59
- - "Click-Through Demo" # LEADS the page — the storyboard steps, one aspect
60
- # revealed at a time; screenshot on top, caption below
61
- - "Project Mission & Description" # 2-4 sentences, from :research, project-level not feature-level
62
- - "Feature Description" # what it does, why it matters, 1-2 short paragraphs
63
- demo_interaction: "one-step-at-a-time reveal (next/prev controls or numbered tabs) — never a single long scroll dump of every screenshot at once. Each step: real image on top, caption directly below it."
64
- demo_step_count: "5-10 steps (a mix of full_page and component-scoped captures — see :storyboard's composition recipe), not a flat full-page-per-step dump"
65
- tone: "same plain, non-salesy, show-don't-tell bar as blog-from-git/voice.md bot-tell blocklist — no 'excited to share', no grand-implication filler"
66
- caption_rule: "every screenshot has a one-sentence caption naming what changed on screen, not what the code does internally"
67
-
68
- theme:
69
- # Minimal neutral tokens so every showcase looks consistent without importing a design system.
70
- # Swap these per-project only if the project has its own documented brand tokens.
71
- font_stack: "system-ui, -apple-system, 'Segoe UI', sans-serif"
72
- bg: "#0b0d10"
73
- surface: "#15181d"
74
- text: "#e8eaed"
75
- text_muted: "#9aa0a6"
76
- accent: "#5b9dff"
77
- radius_px: 10
78
- max_width_px: 900
79
-
80
- gates:
81
- # Checked in step 7 (:review). All must pass before reporting the page ready.
82
- - "every image referenced actually loads (no broken src, no 404 in a local file:// open)"
83
- - "zero placeholder/mockup images — every screenshot traces to a real :capture run"
84
- - "if present, the companion illustration sits only in the Feature Description header and is
85
- visually distinguishable from a real screenshot (no UI chrome/invented interface text)"
86
- - "all three required sections present and non-empty (illustration is optional, never gates)"
87
- - "demo is click-through (has working next/prev or tab controls), not a flat scroll"
88
- - "file opens correctly via file:// with no console errors (network calls, external CDN fonts/JS forbidden — must be fully offline-capable)"
89
- - "single_file_size_ceiling_mb respected, or folder fallback used instead"
90
- - "no invented claims — every sentence in Mission/Feature sections traces to :research notes"