claude-code-session-manager 0.110.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/dist/assets/{AgentLibrary-Cm6MrOnF.js → AgentLibrary-RwPvEgqm.js} +2 -2
- package/dist/assets/{Button-CGVncJ6a.js → Button-36j3PzYv.js} +1 -1
- package/dist/assets/{DataModel-C3hlMoa8.js → DataModel-DUhANo4l.js} +1 -1
- package/dist/assets/{History-CTyfGNKn.js → History-BeZzNjmv.js} +2 -2
- package/dist/assets/{Hooks-BXxCBibx.js → Hooks-iQ8845Hp.js} +3 -3
- package/dist/assets/{Library-aCs7zxAg.js → Library-DPE1h-1L.js} +6 -6
- package/dist/assets/{ListDetail-B9Hqk1_f.js → ListDetail-PStOuQAo.js} +1 -1
- package/dist/assets/{MarkdownEditor-Djfgp32k.js → MarkdownEditor-DPw-N2-m.js} +1 -1
- package/dist/assets/{McpServers-8HQC6QgR.js → McpServers-CUyRTNep.js} +2 -2
- package/dist/assets/{Memory-c4SVE3l2.js → Memory-bZ2xjBGy.js} +3 -3
- package/dist/assets/{Panel-BEQTwE4z.js → Panel-_VZ_uXNg.js} +1 -1
- package/dist/assets/{Permissions-BaYzgZtc.js → Permissions-PPRmfNbK.js} +3 -3
- package/dist/assets/{Plugins-DnXsVau7.js → Plugins-BFcvfvlx.js} +2 -2
- package/dist/assets/{ProvenanceBadge-CT2vWps1.js → ProvenanceBadge-B1WUknak.js} +1 -1
- package/dist/assets/RemoteMachines-D5V0lzgW.js +3 -0
- package/dist/assets/{SaveBar-DwcHt3iR.js → SaveBar-Dw64FVdM.js} +1 -1
- package/dist/assets/{Scheduler-D6Gcuo0M.js → Scheduler-C8s_pJ3I.js} +9 -9
- package/dist/assets/{ScopeSwitcher-CgvWDc9Y.js → ScopeSwitcher-D-nKDMAE.js} +1 -1
- package/dist/assets/{Settings-CJoogVAB.js → Settings-CQSrR4mO.js} +4 -4
- package/dist/assets/{SkillReferenceGraph-4fq01kxq.js → SkillReferenceGraph-BbZFMHim.js} +1 -1
- package/dist/assets/{Skills-BU4ZX4h4.js → Skills-Bzyrh6EQ.js} +1 -1
- package/dist/assets/SystemPrompt-DP6i3Dx0.js +1 -0
- package/dist/assets/TagLibrary-iip0C6Bl.js +1 -0
- package/dist/assets/{TiptapBody-DVyBsfsT.js → TiptapBody-Cr-hxX8L.js} +1 -1
- package/dist/assets/Toggle-7WpPzcZH.js +1 -0
- package/dist/assets/{ViewTabs-BLHjKUv-.js → ViewTabs-9lQCRwWJ.js} +1 -1
- package/dist/assets/{historyTotals-BXDd3EzP.js → historyTotals-BrFxw5J1.js} +1 -1
- package/dist/assets/{index-CuiU3I-8.js → index-CTBpf-26.js} +250 -249
- package/dist/assets/{settingsSchema-DD4bc5cT.js → settingsSchema-Dh5Kl7VO.js} +1 -1
- package/dist/assets/{useAgentsDirWatch-DMQ_XZtr.js → useAgentsDirWatch-CMpx0d04.js} +1 -1
- package/dist/assets/{useRemotePeers-C9NfteSD.js → useRemotePeers-CI2axd-L.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +3 -2
- package/plugins/CLAUDE.md +5 -8
- package/plugins/session-manager-dev/.claude-plugin/plugin.json +3 -6
- package/plugins/session-manager-dev/skills/builder/1-classify-and-bump/SKILL.md +2 -2
- package/plugins/session-manager-dev/skills/builder/SKILL.md +2 -3
- package/plugins/session-manager-dev/skills/develop/SKILL.md +1 -1
- package/plugins/session-manager-dev/skills/develop/standards.md +3 -3
- package/scripts/README.md +3 -3
- package/scripts/audit-ops-hygiene.cjs +4 -4
- package/scripts/hooks/guard-destructive-git.cjs +4 -4
- package/scripts/hooks/guard-inline-implementation.cjs +1 -1
- package/scripts/hooks/guard-prd-writes.cjs +2 -2
- package/scripts/hooks/lib/guard-destructive-git-policy.cjs +1 -1
- package/scripts/mint-epic.cjs +2 -2
- package/scripts/scheduler-mcp-server.cjs +4 -4
- package/src/main/agentLibrary.cjs +5 -5
- package/src/main/agentsIpc.cjs +76 -0
- package/src/main/build-info.json +4 -4
- package/src/main/chatRunner.cjs +12 -12
- package/src/main/config.cjs +2 -2
- package/src/main/crashDiagnostics.cjs +2 -2
- package/src/main/docEdit.cjs +5 -5
- package/src/main/files.cjs +2 -2
- package/src/main/git.cjs +1 -1
- package/src/main/health.cjs +20 -18
- package/src/main/heapSnapshot.cjs +1 -1
- package/src/main/historyAggregator.cjs +2 -2
- package/src/main/index.cjs +44 -132
- package/src/main/ipcSchemas.cjs +10 -10
- package/src/main/lib/CLAUDE.md +48 -0
- package/src/main/lib/activeSessions.cjs +1 -1
- package/src/main/lib/classifyPromptTicket.cjs +2 -2
- package/src/main/lib/{agentModelResolve.cjs → claude/agentModelResolve.cjs} +7 -7
- package/src/main/lib/{claudeBin.cjs → claude/claudeBin.cjs} +4 -4
- package/src/main/lib/{effectiveModelInfo.cjs → claude/effectiveModelInfo.cjs} +9 -9
- package/src/main/lib/{modelCatalog.cjs → claude/modelCatalog.cjs} +3 -3
- package/src/main/lib/{rateLimitDetect.cjs → claude/rateLimitDetect.cjs} +1 -1
- package/src/main/lib/{rateLimitWindow.cjs → claude/rateLimitWindow.cjs} +1 -1
- package/src/main/lib/{runClaudeP.cjs → claude/runClaudeP.cjs} +1 -1
- package/src/main/lib/credentials.cjs +3 -3
- package/src/main/lib/cwdClassify.cjs +1 -1
- package/src/main/lib/{activeIndexMerge.cjs → epic/activeIndexMerge.cjs} +3 -3
- package/src/main/lib/{activeIndexRebuild.cjs → epic/activeIndexRebuild.cjs} +1 -1
- package/src/main/lib/{delegationReadiness.cjs → epic/delegationReadiness.cjs} +21 -29
- package/src/main/lib/{epicContextDigest.cjs → epic/epicContextDigest.cjs} +1 -1
- package/src/main/lib/{epicDelegationStats.cjs → epic/epicDelegationStats.cjs} +2 -2
- package/src/main/lib/{epicMint.cjs → epic/epicMint.cjs} +11 -11
- package/src/main/lib/{epicSpawnPlan.cjs → epic/epicSpawnPlan.cjs} +3 -3
- package/src/main/lib/{epicStatusMirror.cjs → epic/epicStatusMirror.cjs} +2 -2
- package/src/main/lib/{epicTranscriptDiagnostic.cjs → epic/epicTranscriptDiagnostic.cjs} +2 -2
- package/src/main/lib/{epicTranscriptPath.cjs → epic/epicTranscriptPath.cjs} +2 -2
- package/src/main/lib/{epicValidationHook.cjs → epic/epicValidationHook.cjs} +3 -3
- package/src/main/lib/{epicWorktreeBoot.cjs → epic/epicWorktreeBoot.cjs} +1 -1
- package/src/main/lib/{epicWorktreeMerge.cjs → epic/epicWorktreeMerge.cjs} +3 -3
- package/src/main/lib/{epicWorktreeMint.cjs → epic/epicWorktreeMint.cjs} +3 -3
- package/src/main/lib/{epicWorktreeProjectConfig.cjs → epic/epicWorktreeProjectConfig.cjs} +4 -4
- package/src/main/lib/{promptSessionsCreateEpic.cjs → epic/promptSessionsCreateEpic.cjs} +4 -4
- package/src/main/lib/{crossProjectFeedback.cjs → feedback-remote/crossProjectFeedback.cjs} +7 -7
- package/src/main/lib/{customerFeedbackClient.cjs → feedback-remote/customerFeedbackClient.cjs} +3 -3
- package/src/main/lib/{customerFeedbackInbox.cjs → feedback-remote/customerFeedbackInbox.cjs} +2 -2
- package/src/main/lib/{customerFeedbackIpc.cjs → feedback-remote/customerFeedbackIpc.cjs} +1 -1
- package/src/main/lib/{localAdminHttp.cjs → feedback-remote/localAdminHttp.cjs} +2 -2
- package/src/main/lib/{macroAdminRoutes.cjs → feedback-remote/macroAdminRoutes.cjs} +1 -1
- package/src/main/lib/{projectHomeAdminRoutes.cjs → feedback-remote/projectHomeAdminRoutes.cjs} +4 -4
- package/src/main/lib/{relayClientAuth.cjs → feedback-remote/relayClientAuth.cjs} +2 -2
- package/src/main/lib/{remoteClientSessions.cjs → feedback-remote/remoteClientSessions.cjs} +1 -1
- package/src/main/lib/{gitWorktree.cjs → git/gitWorktree.cjs} +7 -7
- package/src/main/lib/historyRollup.cjs +1 -1
- package/src/main/lib/importReferences.cjs +1 -1
- package/src/main/lib/machineProfile.cjs +1 -1
- package/src/main/lib/openExternalApp.cjs +1 -1
- package/src/main/lib/opsOwnership.cjs +3 -3
- package/src/main/lib/{agentPersonaSchema.cjs → persona-macro/agentPersonaSchema.cjs} +2 -2
- package/src/main/lib/{builtinMacros.cjs → persona-macro/builtinMacros.cjs} +2 -2
- package/src/main/lib/{macroLibrary.cjs → persona-macro/macroLibrary.cjs} +5 -5
- package/src/main/lib/{personaMerge.cjs → persona-macro/personaMerge.cjs} +4 -4
- package/src/main/lib/{shippedPersonaSeeds.cjs → persona-macro/shippedPersonaSeeds.cjs} +11 -0
- package/src/main/lib/{prdAdminRoutes.cjs → prd/prdAdminRoutes.cjs} +7 -7
- package/src/main/lib/{prdAgentType.cjs → prd/prdAgentType.cjs} +3 -3
- package/src/main/lib/{prdCreate.cjs → prd/prdCreate.cjs} +12 -12
- package/src/main/lib/{prdDeclaredPaths.cjs → prd/prdDeclaredPaths.cjs} +1 -1
- package/src/main/lib/{prdGateFiles.cjs → prd/prdGateFiles.cjs} +1 -1
- package/src/main/lib/{prdLocations.cjs → prd/prdLocations.cjs} +2 -2
- package/src/main/lib/{prdMigration.cjs → prd/prdMigration.cjs} +3 -3
- package/src/main/lib/prereqs.cjs +2 -2
- package/src/main/lib/{instanceLock.cjs → process/instanceLock.cjs} +4 -11
- package/src/main/lib/{pidAlive.cjs → process/pidAlive.cjs} +1 -1
- package/src/main/lib/{procName.cjs → process/procName.cjs} +2 -2
- package/src/main/lib/{timeoutShim.cjs → process/timeoutShim.cjs} +1 -1
- package/src/main/lib/projectRootResolve.cjs +1 -1
- package/src/main/lib/promptSessionSchema.cjs +1 -1
- package/src/main/lib/{definitionOfDone.cjs → scheduler/definitionOfDone.cjs} +6 -12
- package/src/main/lib/{fixChainDepth.cjs → scheduler/fixChainDepth.cjs} +1 -1
- package/src/main/lib/{jobDirtFilter.cjs → scheduler/jobDirtFilter.cjs} +1 -1
- package/src/main/lib/{jobSupervisorRecord.cjs → scheduler/jobSupervisorRecord.cjs} +1 -1
- package/src/main/lib/{launchFailure.cjs → scheduler/launchFailure.cjs} +2 -2
- package/src/main/lib/{queueStore.cjs → scheduler/queueStore.cjs} +6 -6
- package/src/main/lib/{quietMachineLease.cjs → scheduler/quietMachineLease.cjs} +1 -1
- package/src/main/lib/{rcaReport.cjs → scheduler/rcaReport.cjs} +4 -4
- package/src/main/lib/{reaperHelpers.cjs → scheduler/reaperHelpers.cjs} +3 -3
- package/src/main/lib/{reservationExpiry.cjs → scheduler/reservationExpiry.cjs} +4 -11
- package/src/main/lib/{reviewNotice.cjs → scheduler/reviewNotice.cjs} +1 -1
- package/src/main/lib/{scheduleJobTransitions.cjs → scheduler/scheduleJobTransitions.cjs} +3 -3
- package/src/main/lib/{schedulerBatch.cjs → scheduler/schedulerBatch.cjs} +2 -2
- package/src/main/lib/{schedulerConfig.cjs → scheduler/schedulerConfig.cjs} +1 -1
- package/src/main/lib/{schedulerRuntimeState.cjs → scheduler/schedulerRuntimeState.cjs} +1 -1
- package/src/main/lib/{sessionSlots.cjs → scheduler/sessionSlots.cjs} +2 -2
- package/src/main/lib/{upgradeDrain.cjs → scheduler/upgradeDrain.cjs} +8 -11
- package/src/main/lib/{watchdogHelpers.cjs → scheduler/watchdogHelpers.cjs} +5 -19
- package/src/main/lib/{auditLog.cjs → telemetry/auditLog.cjs} +1 -1
- package/src/main/lib/{opsErrorLog.cjs → telemetry/opsErrorLog.cjs} +4 -4
- package/src/main/lib/{telemetryBacklog.cjs → telemetry/telemetryBacklog.cjs} +4 -4
- package/src/main/lib/{telemetryBoot.cjs → telemetry/telemetryBoot.cjs} +1 -1
- package/src/main/lib/{telemetryClient.cjs → telemetry/telemetryClient.cjs} +4 -4
- package/src/main/lib/{telemetrySettings.cjs → telemetry/telemetrySettings.cjs} +1 -1
- package/src/main/logs.cjs +1 -1
- package/src/main/mcpStatus.cjs +2 -2
- package/src/main/memoryAggregate.cjs +3 -3
- package/src/main/memoryTool.cjs +1 -1
- package/src/main/otel.cjs +2 -2
- package/src/main/pluginInstall.cjs +29 -3
- package/src/main/projectBrief.cjs +6 -6
- package/src/main/projectPages.cjs +1 -1
- package/src/main/promptSessionEvents.cjs +2 -2
- package/src/main/pty.cjs +7 -7
- package/src/main/queueOps.cjs +6 -6
- package/src/main/remoteClient.cjs +4 -4
- package/src/main/remoteClientIpc.cjs +1 -1
- package/src/main/runVerify.cjs +1 -1
- package/src/main/scheduler/CLAUDE.md +26 -0
- package/src/main/scheduler/budget.cjs +576 -0
- package/src/main/scheduler/gitTreeGuard.cjs +672 -0
- package/src/main/scheduler/prdParser.cjs +4 -4
- package/src/main/scheduler/prdPaths.cjs +487 -0
- package/src/main/scheduler/reviewLadder.cjs +1011 -0
- package/src/main/scheduler/starvation.cjs +390 -0
- package/src/main/scheduler.cjs +289 -3311
- package/src/main/seedAgentPersonas.cjs +5 -5
- package/src/main/seedDevPlugin.cjs +70 -3
- package/src/main/seedSchedulerMcp.cjs +2 -2
- package/src/main/supervisor.cjs +5 -5
- package/src/main/telemetryIpc.cjs +51 -0
- package/src/main/transcripts.cjs +3 -3
- package/src/main/updaterIpc.cjs +1 -1
- package/src/main/usage.cjs +1 -1
- package/src/main/watchers.cjs +1 -1
- package/src/main/webRemote.cjs +7 -7
- package/src/preload/api.d.ts +8 -8
- package/src/preload/index.cjs +3 -3
- package/src/seed/agents/demo-video-builder.md +62 -19
- package/dist/assets/RemoteMachines-DHJZfdJC.js +0 -3
- package/dist/assets/SystemPrompt-BCEyMSEq.js +0 -1
- package/dist/assets/TagLibrary-m3It8Oal.js +0 -1
- package/dist/assets/Toggle-In_AExPV.js +0 -1
- package/plugins/session-manager-dev/skills/blog-for-project-feature/0-select/SKILL.md +0 -39
- package/plugins/session-manager-dev/skills/blog-for-project-feature/1-research/SKILL.md +0 -37
- package/plugins/session-manager-dev/skills/blog-for-project-feature/2-storyboard/SKILL.md +0 -64
- package/plugins/session-manager-dev/skills/blog-for-project-feature/3-capture/SKILL.md +0 -52
- package/plugins/session-manager-dev/skills/blog-for-project-feature/4-draft-copy/SKILL.md +0 -37
- package/plugins/session-manager-dev/skills/blog-for-project-feature/5-illustrate/SKILL.md +0 -50
- package/plugins/session-manager-dev/skills/blog-for-project-feature/6-compose/SKILL.md +0 -51
- package/plugins/session-manager-dev/skills/blog-for-project-feature/7-review/SKILL.md +0 -54
- package/plugins/session-manager-dev/skills/blog-for-project-feature/SKILL.md +0 -144
- package/plugins/session-manager-dev/skills/blog-for-project-feature/feature.config.yaml +0 -90
- package/plugins/session-manager-dev/skills/discover-features/SKILL.md +0 -95
- package/plugins/session-manager-dev/skills/explain-to-me/SKILL.md +0 -205
- package/plugins/session-manager-dev/skills/explain-to-me/assets/style-reference.html +0 -163
- package/plugins/session-manager-dev/skills/find-opportunity/SKILL.md +0 -83
- package/plugins/session-manager-dev/skills/issue-address/0-select/0-fetch-pool/SKILL.md +0 -38
- package/plugins/session-manager-dev/skills/issue-address/0-select/1-reject-fixed/SKILL.md +0 -64
- package/plugins/session-manager-dev/skills/issue-address/0-select/2-reject-claimed/SKILL.md +0 -71
- package/plugins/session-manager-dev/skills/issue-address/0-select/3-rank-impact/SKILL.md +0 -39
- package/plugins/session-manager-dev/skills/issue-address/0-select/SKILL.md +0 -75
- package/plugins/session-manager-dev/skills/issue-address/1-confirm-open/SKILL.md +0 -39
- package/plugins/session-manager-dev/skills/issue-address/2-claim/SKILL.md +0 -57
- package/plugins/session-manager-dev/skills/issue-address/3-reproduce/SKILL.md +0 -40
- package/plugins/session-manager-dev/skills/issue-address/4-fix/SKILL.md +0 -33
- package/plugins/session-manager-dev/skills/issue-address/5-verify/SKILL.md +0 -40
- package/plugins/session-manager-dev/skills/issue-address/SKILL.md +0 -120
- package/plugins/session-manager-dev/skills/local-project-health/SKILL.md +0 -58
- package/plugins/session-manager-dev/skills/memory-sanitation/SKILL.md +0 -147
- package/plugins/session-manager-dev/skills/ops-sweep/SKILL.md +0 -137
- package/plugins/session-manager-dev/skills/pr-review-sweep/0-fetch/SKILL.md +0 -41
- package/plugins/session-manager-dev/skills/pr-review-sweep/1-classify/SKILL.md +0 -56
- package/plugins/session-manager-dev/skills/pr-review-sweep/2-check-fixed/SKILL.md +0 -49
- package/plugins/session-manager-dev/skills/pr-review-sweep/3-queue/SKILL.md +0 -57
- package/plugins/session-manager-dev/skills/pr-review-sweep/4-land-and-resolve/SKILL.md +0 -60
- package/plugins/session-manager-dev/skills/pr-review-sweep/SKILL.md +0 -124
- package/plugins/session-manager-dev/skills/pr-signal/SKILL.md +0 -67
- package/plugins/session-manager-dev/skills/project-status/SKILL.md +0 -243
- package/plugins/session-manager-dev/skills/requesting-code-review/SKILL.md +0 -98
- package/plugins/session-manager-dev/skills/requesting-code-review/code-reviewer.md +0 -146
- /package/src/main/lib/{agentEffortResolve.cjs → claude/agentEffortResolve.cjs} +0 -0
- /package/src/main/lib/{claudeCliCaps.cjs → claude/claudeCliCaps.cjs} +0 -0
- /package/src/main/lib/{usageCircuit.cjs → claude/usageCircuit.cjs} +0 -0
- /package/src/main/lib/{epicSpawnCwd.cjs → epic/epicSpawnCwd.cjs} +0 -0
- /package/src/main/lib/{customerFeedbackAdminRoutes.cjs → feedback-remote/customerFeedbackAdminRoutes.cjs} +0 -0
- /package/src/main/lib/{remoteE2eCrypto.cjs → feedback-remote/remoteE2eCrypto.cjs} +0 -0
- /package/src/main/lib/{branchSweep.cjs → git/branchSweep.cjs} +0 -0
- /package/src/main/lib/{gitExec.cjs → git/gitExec.cjs} +0 -0
- /package/src/main/lib/{jobWorktree.cjs → git/jobWorktree.cjs} +0 -0
- /package/src/main/lib/{jobWorktreeBootLive.cjs → git/jobWorktreeBootLive.cjs} +0 -0
- /package/src/main/lib/{jobWorktreeTerminalOrphanLive.cjs → git/jobWorktreeTerminalOrphanLive.cjs} +0 -0
- /package/src/main/lib/{personaImportHealth.cjs → persona-macro/personaImportHealth.cjs} +0 -0
- /package/src/main/lib/{depSlugResolve.cjs → prd/depSlugResolve.cjs} +0 -0
- /package/src/main/lib/{planValidator.cjs → prd/planValidator.cjs} +0 -0
- /package/src/main/lib/{prdAuthoringSeed.cjs → prd/prdAuthoringSeed.cjs} +0 -0
- /package/src/main/lib/{prdDisposition.cjs → prd/prdDisposition.cjs} +0 -0
- /package/src/main/lib/{prdFrontmatter.cjs → prd/prdFrontmatter.cjs} +0 -0
- /package/src/main/lib/{prdSizing.cjs → prd/prdSizing.cjs} +0 -0
- /package/src/main/lib/{workTypeLibrary.cjs → prd/workTypeLibrary.cjs} +0 -0
- /package/src/main/lib/{childWithLog.cjs → process/childWithLog.cjs} +0 -0
- /package/src/main/lib/{cleanEnv.cjs → process/cleanEnv.cjs} +0 -0
- /package/src/main/lib/{defaultShell.cjs → process/defaultShell.cjs} +0 -0
- /package/src/main/lib/{killTree.cjs → process/killTree.cjs} +0 -0
- /package/src/main/lib/{loginShellPath.cjs → process/loginShellPath.cjs} +0 -0
- /package/src/main/lib/{procIdentity.cjs → process/procIdentity.cjs} +0 -0
- /package/src/main/lib/{singleInstanceGuard.cjs → process/singleInstanceGuard.cjs} +0 -0
- /package/src/main/lib/{smProcNames.cjs → process/smProcNames.cjs} +0 -0
- /package/src/main/lib/{timeoutShimScript.cjs → process/timeoutShimScript.cjs} +0 -0
- /package/src/main/lib/{winSpawn.cjs → process/winSpawn.cjs} +0 -0
- /package/src/main/lib/{adoptedRunSupervisor.cjs → scheduler/adoptedRunSupervisor.cjs} +0 -0
- /package/src/main/lib/{dispatchLoop.cjs → scheduler/dispatchLoop.cjs} +0 -0
- /package/src/main/lib/{dodDrainHook.cjs → scheduler/dodDrainHook.cjs} +0 -0
- /package/src/main/lib/{fixPlanSlug.cjs → scheduler/fixPlanSlug.cjs} +0 -0
- /package/src/main/lib/{gateAuthority.cjs → scheduler/gateAuthority.cjs} +0 -0
- /package/src/main/lib/{landedSinceRun.cjs → scheduler/landedSinceRun.cjs} +0 -0
- /package/src/main/lib/{loadGate.cjs → scheduler/loadGate.cjs} +0 -0
- /package/src/main/lib/{needsReviewLedger.cjs → scheduler/needsReviewLedger.cjs} +0 -0
- /package/src/main/lib/{queueHealth.cjs → scheduler/queueHealth.cjs} +0 -0
- /package/src/main/lib/{queueHistory.cjs → scheduler/queueHistory.cjs} +0 -0
- /package/src/main/lib/{runLogRetention.cjs → scheduler/runLogRetention.cjs} +0 -0
- /package/src/main/lib/{scheduleJobSchema.cjs → scheduler/scheduleJobSchema.cjs} +0 -0
- /package/src/main/lib/{schedulerPaths.cjs → scheduler/schedulerPaths.cjs} +0 -0
- /package/src/main/lib/{terminalRunOutcome.cjs → scheduler/terminalRunOutcome.cjs} +0 -0
- /package/src/main/lib/{validationSentinels.cjs → scheduler/validationSentinels.cjs} +0 -0
- /package/src/main/lib/{crashTelemetry.cjs → telemetry/crashTelemetry.cjs} +0 -0
- /package/src/main/lib/{otlpTraceExporter.cjs → telemetry/otlpTraceExporter.cjs} +0 -0
- /package/src/main/lib/{telemetryConsent.cjs → telemetry/telemetryConsent.cjs} +0 -0
- /package/src/main/lib/{telemetryCounters.cjs → telemetry/telemetryCounters.cjs} +0 -0
- /package/src/main/lib/{atomicFs.cjs → util/atomicFs.cjs} +0 -0
- /package/src/main/lib/{encodeCwd.cjs → util/encodeCwd.cjs} +0 -0
- /package/src/main/lib/{expandHome.cjs → util/expandHome.cjs} +0 -0
- /package/src/main/lib/{extractJson.cjs → util/extractJson.cjs} +0 -0
- /package/src/main/lib/{fileTail.cjs → util/fileTail.cjs} +0 -0
- /package/src/main/lib/{headTailBuffer.cjs → util/headTailBuffer.cjs} +0 -0
- /package/src/main/lib/{kebabCase.cjs → util/kebabCase.cjs} +0 -0
- /package/src/main/lib/{loopDelay.cjs → util/loopDelay.cjs} +0 -0
- /package/src/main/lib/{lruCache.cjs → util/lruCache.cjs} +0 -0
- /package/src/main/lib/{withTimeout.cjs → util/withTimeout.cjs} +0 -0
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: blog-for-project-feature:select
|
|
3
|
-
description: Step 0 of blog-for-project-feature — confirm exactly ONE project and ONE feature to showcase. Only asks the user when the feature genuinely can't be inferred; otherwise picks the most demo-worthy recently-shipped feature and states why.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# blog-for-project-feature:select
|
|
7
|
-
|
|
8
|
-
## Input
|
|
9
|
-
- The project: current working directory's repo, or a project name/path explicitly given by
|
|
10
|
-
the caller.
|
|
11
|
-
- Optional: a feature name or hint from the caller ("showcase the click-run screen", "the new
|
|
12
|
-
ticker-tracker queue").
|
|
13
|
-
|
|
14
|
-
## Steps
|
|
15
|
-
|
|
16
|
-
1. **Confirm the project.** Read its root `CLAUDE.md`/`README.md`/`AGENTS.md` (whichever
|
|
17
|
-
exists) to confirm you're pointed at a real, buildable/runnable project — not an empty or
|
|
18
|
-
scaffold-only repo.
|
|
19
|
-
|
|
20
|
-
2. **If a feature was named**, confirm it exists: grep for it in code, routes, or docs. If it
|
|
21
|
-
doesn't resolve to anything real, say so and stop rather than guessing at a nearby feature.
|
|
22
|
-
|
|
23
|
-
3. **If no feature was named**, pick one:
|
|
24
|
-
- Prefer something with a real UI surface (a screen, a flow, a page) — this skill's whole
|
|
25
|
-
value is a click-through demo, so a pure-backend/CLI-only feature is a weak fit unless the
|
|
26
|
-
project exposes it through a dashboard.
|
|
27
|
-
- Prefer recently shipped (`git log --oneline -20` on the relevant paths) over long-stable —
|
|
28
|
-
showcases are most useful for things a reader hasn't seen yet.
|
|
29
|
-
- Prefer one coherent flow over a grab-bag of unrelated changes — this produces ONE feature
|
|
30
|
-
page, not a changelog.
|
|
31
|
-
|
|
32
|
-
4. **State the justification** in one or two sentences: what the feature is, why it's the right
|
|
33
|
-
one to demo right now.
|
|
34
|
-
|
|
35
|
-
## Output
|
|
36
|
-
|
|
37
|
-
Hand off to `:research`: confirmed project (path/repo), confirmed feature name, one-line
|
|
38
|
-
justification. If no confirmable feature exists, **STOP** and report why instead of forcing a
|
|
39
|
-
pick.
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: blog-for-project-feature:research
|
|
3
|
-
description: Step 1 of blog-for-project-feature — ground the project's mission/description and the confirmed feature's description in real docs and code, before any HTML gets written. Flags gaps explicitly instead of inventing claims.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# blog-for-project-feature:research
|
|
7
|
-
|
|
8
|
-
## Input
|
|
9
|
-
Confirmed project + confirmed feature name + justification, from `:select`.
|
|
10
|
-
|
|
11
|
-
## Steps
|
|
12
|
-
|
|
13
|
-
1. **Project mission & description.** Pull from the project's own root docs (`README.md`,
|
|
14
|
-
`CLAUDE.md`'s "What this project is" section if it has one, `package.json`/`pyproject.toml`
|
|
15
|
-
description field as a fallback). 2-4 sentences, in the project's own words where possible —
|
|
16
|
-
don't invent a mission statement it doesn't already have.
|
|
17
|
-
|
|
18
|
-
2. **Feature description.** Locate the actual entry point(s) — route, component, CLI command,
|
|
19
|
-
pipeline — and read enough of the real implementation to describe, in plain language:
|
|
20
|
-
- what it does (user-facing behavior, not implementation detail)
|
|
21
|
-
- why it matters (what it replaces, what it makes possible)
|
|
22
|
-
- any real constraint worth knowing (auth required, feature-flagged, still in beta) — surface
|
|
23
|
-
these rather than smoothing them over
|
|
24
|
-
|
|
25
|
-
3. **Identify the demo surface.** Note exact URLs/routes, the commands needed to run the app
|
|
26
|
-
locally, any seed data / login required to reach the feature — `:storyboard` and `:capture`
|
|
27
|
-
need this to actually drive the app.
|
|
28
|
-
|
|
29
|
-
4. **Flag gaps.** If the mission statement doesn't exist, or the feature's purpose isn't
|
|
30
|
-
evident from code/docs, say so explicitly in the output rather than filling it in with
|
|
31
|
-
plausible-sounding marketing language.
|
|
32
|
-
|
|
33
|
-
## Output
|
|
34
|
-
|
|
35
|
-
Hand off to `:storyboard`: mission/description (2-4 sentences), feature description (what/why/
|
|
36
|
-
constraints), demo surface (routes, run command, any setup needed to reach the feature), and any
|
|
37
|
-
flagged gaps.
|
|
@@ -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"
|