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