claude-code-session-manager 0.86.0 → 0.88.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 +26 -53
- package/dist/assets/AgentLibrary-BZ6IY2g1.js +3 -0
- package/dist/assets/{DataModel-Q4jhl24R.js → DataModel-dAoGAODX.js} +1 -1
- package/dist/assets/{History-Cj2FejEo.js → History-CF157HyX.js} +2 -2
- package/dist/assets/{Hooks-CaelQI6t.js → Hooks-CCPPipBk.js} +3 -3
- package/dist/assets/{HostBilko--v7cMR8I.js → HostBilko-Dlmz2m06.js} +1 -1
- package/dist/assets/{Library-DgI9oCCZ.js → Library-BaXcboWX.js} +1 -1
- package/dist/assets/{ListDetail-DYUZN-x-.js → ListDetail-CoUCzG5S.js} +1 -1
- package/dist/assets/MarkdownEditor-DTg3JlOT.js +1 -0
- package/dist/assets/{McpServers-ypCYURh3.js → McpServers-DdjY1sA3.js} +2 -2
- package/dist/assets/{Memory-C2qYp-3M.js → Memory-BJ3Jlw0C.js} +4 -4
- package/dist/assets/{Panel-Cj2kw-Zv.js → Panel-ygRSgc41.js} +1 -1
- package/dist/assets/Permissions-m0KAnccF.js +3 -0
- package/dist/assets/{Plugins-C1Vj8_dU.js → Plugins-CJRl6B3Q.js} +2 -2
- package/dist/assets/{ProvenanceBadge-DczPNM5U.js → ProvenanceBadge-w8cnlVvW.js} +1 -1
- package/dist/assets/{SaveBar-Cd_7U6Gb.js → SaveBar-BpyPcUIk.js} +1 -1
- package/dist/assets/Scheduler-D2ppxSfy.js +14 -0
- package/dist/assets/{ScopeSwitcher-DVSyI44-.js → ScopeSwitcher-EyuIwt-j.js} +1 -1
- package/dist/assets/Settings-BHSGGFEc.js +3 -0
- package/dist/assets/{SkillReferenceGraph-CUv1_Q2c.js → SkillReferenceGraph-BNaZ2JCF.js} +1 -1
- package/dist/assets/{Skills-C_YHkAy-.js → Skills-Dl3q75QV.js} +2 -2
- package/dist/assets/{SystemPrompt-B8R7T9xn.js → SystemPrompt-Bg6F-Cyp.js} +1 -1
- package/dist/assets/{TagLibrary-dj9YHWyy.js → TagLibrary-BSutflCy.js} +1 -1
- package/dist/assets/{TiptapBody-DnSBUjHE.js → TiptapBody-CXih4xrc.js} +1 -1
- package/dist/assets/{Toggle-CjV_BJn6.js → Toggle-2qtUHhA9.js} +1 -1
- package/dist/assets/{index-CXFQIPhO.js → index-B3emy2oI.js} +583 -583
- package/dist/assets/{index-CDo9xBR9.css → index-BHTX4OTc.css} +1 -1
- package/dist/assets/settingsSchema-CdzxaqwM.js +3 -0
- package/dist/assets/{whisperWorker-Dbia1OpC.js → whisperWorker-C7ZGQwKg.js} +7 -7
- package/dist/index.html +2 -2
- package/dist/vad/ort-wasm-simd-threaded.asyncify.mjs +106 -110
- package/dist/vad/ort-wasm-simd-threaded.asyncify.wasm +0 -0
- package/dist/vad/ort-wasm-simd-threaded.jsep.mjs +98 -98
- package/dist/vad/ort-wasm-simd-threaded.jsep.wasm +0 -0
- package/dist/vad/ort-wasm-simd-threaded.jspi.mjs +99 -102
- package/dist/vad/ort-wasm-simd-threaded.jspi.wasm +0 -0
- package/dist/vad/ort-wasm-simd-threaded.mjs +46 -46
- package/dist/vad/ort-wasm-simd-threaded.wasm +0 -0
- package/package.json +14 -17
- package/plugins/CLAUDE.md +61 -0
- package/plugins/session-manager-dev/.claude-plugin/plugin.json +1 -1
- package/plugins/session-manager-dev/skills/builder/4-manual/SKILL.md +1 -1
- package/plugins/session-manager-dev/skills/ops-sweep/SKILL.md +1 -1
- package/scripts/README.md +59 -0
- package/scripts/audit-ops-hygiene.cjs +350 -0
- package/scripts/hooks/guard-destructive-git.cjs +10 -34
- package/scripts/hooks/guard-inline-implementation.cjs +14 -8
- package/scripts/hooks/guard-prd-writes.cjs +7 -36
- package/scripts/hooks/guard-self-schedule.cjs +175 -0
- package/scripts/ops-sweep.cjs +355 -0
- package/scripts/scheduler-mcp-server.cjs +35 -71
- package/src/main/__tests__/agentModelResolve.test.cjs +100 -9
- package/src/main/__tests__/bilkoHost-integration.test.cjs +3 -3
- package/src/main/__tests__/broadcastCoalescer.test.cjs +18 -0
- package/src/main/__tests__/chat-cancel-terminal.test.cjs +6 -9
- package/src/main/__tests__/chat-exit-close-race.test.cjs +3 -3
- package/src/main/__tests__/chat-mcp-consent-notice.test.cjs +4 -5
- package/src/main/__tests__/chat-queue.test.cjs +2 -2
- package/src/main/__tests__/chat-stop-signal.test.cjs +2 -2
- package/src/main/__tests__/dep-orphan-archive-health.test.cjs +77 -0
- package/src/main/__tests__/dod-batchkey.test.cjs +2 -2
- package/src/main/__tests__/dod-drain-hook.test.cjs +2 -2
- package/src/main/__tests__/dod-report.test.cjs +2 -2
- package/src/main/__tests__/dod-reverify.test.cjs +2 -2
- package/src/main/__tests__/epicMint.test.cjs +4 -4
- package/src/main/__tests__/exchanges.test.cjs +2 -2
- package/src/main/__tests__/extractJson.test.cjs +2 -2
- package/src/main/__tests__/files-reject-credentials.test.cjs +1 -1
- package/src/main/__tests__/fixtures/1218-fo-01-move-scripts-lib-into-src-main-lib.log +556 -0
- package/src/main/__tests__/health-build-freshness.test.cjs +39 -0
- package/src/main/__tests__/health-delegation-chain.test.cjs +17 -2
- package/src/main/__tests__/health-queue-dispatch.test.cjs +58 -7
- package/src/main/__tests__/health-tick-liveness.test.cjs +11 -3
- package/src/main/__tests__/health-usage-poller.test.cjs +70 -23
- package/src/main/__tests__/historyRollup.test.cjs +2 -2
- package/src/main/__tests__/kg-augment.test.cjs +2 -2
- package/src/main/__tests__/mcpStatus.test.cjs +2 -2
- package/src/main/__tests__/memoryAggregate.test.cjs +1 -1
- package/src/main/__tests__/memoryStale.test.cjs +1 -1
- package/src/main/__tests__/needsReviewLedger.test.cjs +162 -0
- package/src/main/__tests__/opsErrorLogTelemetryTap.test.cjs +28 -4
- package/src/main/__tests__/pollLoop-dispatch-on-failure.test.cjs +48 -4
- package/src/main/__tests__/prd-group-allocator.test.cjs +2 -2
- package/src/main/__tests__/prdAdminRouteParity.test.cjs +2 -0
- package/src/main/__tests__/prdAdminRoutes.test.cjs +14 -2
- package/src/main/__tests__/prdAuthoringSeed.test.cjs +39 -0
- package/src/main/__tests__/prdCreateDisposition.test.cjs +201 -0
- package/src/main/__tests__/prdFrontmatterDisposition.test.cjs +125 -0
- package/src/main/__tests__/prdLocations.test.cjs +100 -2
- package/src/main/__tests__/prdLocationsArchived.test.cjs +50 -1
- package/src/main/__tests__/prdSetDisposition.test.cjs +222 -0
- package/src/main/__tests__/proc-role-env.test.cjs +125 -0
- package/src/main/__tests__/procname-claude-spawn-sites.test.cjs +304 -0
- package/src/main/__tests__/procname-sm-processes.test.cjs +127 -0
- package/src/main/__tests__/projectHomeAdminRoutes.test.cjs +81 -401
- package/src/main/__tests__/projectPages.test.cjs +63 -149
- package/src/main/__tests__/queue-health-verdict.test.cjs +170 -0
- package/src/main/__tests__/queue-starvation-dispatch-driver.test.cjs +117 -20
- package/src/main/__tests__/queue-starvation-per-project.test.cjs +14 -2
- package/src/main/__tests__/queueHistory.test.cjs +65 -2
- package/src/main/__tests__/rateLimitPollerStreak.test.cjs +38 -3
- package/src/main/__tests__/reconcileTiming.test.cjs +135 -0
- package/src/main/__tests__/runVerify-landed-commit-outranks.test.cjs +181 -0
- package/src/main/__tests__/runVerify.test.cjs +5 -5
- package/src/main/__tests__/scheduleJobStatusDrift.test.cjs +3 -3
- package/src/main/__tests__/scheduleJobTransitions.test.cjs +103 -3
- package/src/main/__tests__/scheduler-adopted-run-supervision.test.cjs +143 -0
- package/src/main/__tests__/scheduler-autofix-select.test.cjs +2 -2
- package/src/main/__tests__/scheduler-autopromote.test.cjs +2 -2
- package/src/main/__tests__/scheduler-bash-timeout-env.test.cjs +3 -5
- package/src/main/__tests__/scheduler-boot-orphans.test.cjs +79 -98
- package/src/main/__tests__/scheduler-broadcast-reconcile.test.cjs +121 -0
- package/src/main/__tests__/scheduler-cross-project-batch.test.cjs +43 -0
- package/src/main/__tests__/scheduler-default-eligible-heal.test.cjs +161 -0
- package/src/main/__tests__/scheduler-dispatch-loop.test.cjs +58 -0
- package/src/main/__tests__/scheduler-epic-digest.test.cjs +3 -5
- package/src/main/__tests__/scheduler-force-tick-outcome.test.cjs +2 -2
- package/src/main/__tests__/scheduler-gate-shadow.test.cjs +119 -0
- package/src/main/__tests__/scheduler-guard-verdict-autoresolve.test.cjs +390 -0
- package/src/main/__tests__/scheduler-heartbeat-payload.test.cjs +80 -0
- package/src/main/__tests__/scheduler-inplace-salvage.test.cjs +25 -18
- package/src/main/__tests__/scheduler-investigation-prompt.test.cjs +4 -4
- package/src/main/__tests__/scheduler-job-budget.test.cjs +172 -0
- package/src/main/__tests__/scheduler-launch-failure.test.cjs +3 -5
- package/src/main/__tests__/scheduler-looks-done.test.cjs +119 -10
- package/src/main/__tests__/scheduler-manual-pause.test.cjs +118 -0
- package/src/main/__tests__/scheduler-meta-code-sha.test.cjs +26 -3
- package/src/main/__tests__/scheduler-porcelain-rename.test.cjs +164 -0
- package/src/main/__tests__/scheduler-prd-missing-skip.test.cjs +17 -2
- package/src/main/__tests__/scheduler-prd-persona-spawn.test.cjs +3 -5
- package/src/main/__tests__/scheduler-quiet-machine-lease.test.cjs +41 -6
- package/src/main/__tests__/scheduler-rate-limit-pause.test.cjs +62 -6
- package/src/main/__tests__/scheduler-rate-limit-spin-guard.test.cjs +3 -5
- package/src/main/__tests__/scheduler-reap-dead-running-jobs.test.cjs +182 -3
- package/src/main/__tests__/scheduler-reaper-helpers-basics.test.cjs +87 -0
- package/src/main/__tests__/scheduler-reconcile-cwd-preserve.test.cjs +100 -0
- package/src/main/__tests__/scheduler-reconcile-invalid-repair.test.cjs +3 -3
- package/src/main/__tests__/scheduler-reconcile-quarantine.test.cjs +4 -4
- package/src/main/__tests__/scheduler-shard-quarantine.test.cjs +110 -0
- package/src/main/__tests__/scheduler-shared-tree-guard.test.cjs +168 -0
- package/src/main/__tests__/scheduler-starve-escalation.test.cjs +18 -8
- package/src/main/__tests__/scheduler-stranded-autofix-park.test.cjs +245 -0
- package/src/main/__tests__/scheduler-supervisor-record.test.cjs +81 -0
- package/src/main/__tests__/scheduler-tick-cancel-token.test.cjs +2 -2
- package/src/main/__tests__/scheduler-tick-wedge.test.cjs +172 -0
- package/src/main/__tests__/scheduler-transient-failure.test.cjs +2 -2
- package/src/main/__tests__/scheduler-worktree-cap-defer.test.cjs +51 -11
- package/src/main/__tests__/scheduler-worktree-exec-cwd.test.cjs +3 -5
- package/src/main/__tests__/usageSingleFlight.test.cjs +157 -0
- package/src/main/__tests__/workTypeLibrary.test.cjs +1 -1
- package/src/main/bilkoHost.cjs +16 -7
- package/src/main/build-info.json +8 -0
- package/src/main/chatRunner.cjs +12 -7
- package/src/main/config.cjs +2 -3
- package/src/main/docEdit.cjs +4 -2
- package/src/main/health.cjs +268 -52
- package/src/main/heapSnapshot.cjs +2 -2
- package/src/main/historyAggregator.cjs +6 -1
- package/src/main/index.cjs +152 -50
- package/src/main/ipcSchemas.cjs +53 -17
- package/src/main/lib/__tests__/active-sessions.test.cjs +251 -0
- package/src/main/lib/__tests__/auditLog.test.cjs +38 -0
- package/src/main/lib/__tests__/bootSelfHeal.test.cjs +107 -0
- package/src/main/lib/__tests__/buildIdentity.test.cjs +121 -0
- package/src/main/lib/__tests__/cwdClassify.test.cjs +111 -0
- package/src/main/lib/__tests__/definitionOfDoneSequence.test.cjs +95 -0
- package/src/main/lib/__tests__/delegationReadiness.test.cjs +323 -44
- package/src/main/lib/__tests__/dispatchLoop.test.cjs +63 -0
- package/src/main/lib/__tests__/effectiveModelInfo.test.cjs +239 -0
- package/src/main/lib/__tests__/gateFixtures.json +20 -0
- package/src/main/lib/__tests__/gitWorktree.test.cjs +97 -1
- package/src/main/lib/__tests__/guardShims.test.cjs +151 -0
- package/src/main/lib/__tests__/instanceLock.test.cjs +93 -7
- package/src/main/lib/__tests__/jobSupervisorRecord.test.cjs +78 -0
- package/src/main/lib/__tests__/jobWorktreeBootLive.test.cjs +11 -0
- package/src/main/lib/__tests__/localAdminHttp.test.cjs +1 -1
- package/src/main/lib/__tests__/mcpToolCatalog.test.cjs +6 -1
- package/src/main/lib/__tests__/opsRootAbsoluteCwd.test.cjs +5 -5
- package/src/main/lib/__tests__/prdDisposition.test.cjs +224 -0
- package/src/main/lib/__tests__/procIdentity.test.cjs +119 -0
- package/src/main/lib/__tests__/procName.test.cjs +92 -0
- package/src/main/lib/__tests__/queueStoreMachineStateRecovery.test.cjs +67 -0
- package/src/main/lib/__tests__/reaperHelpers.test.cjs +179 -1
- package/src/main/lib/__tests__/schedulerMcpServerHelp.test.cjs +6 -7
- package/src/main/lib/__tests__/schedulerMcpServerProjectHome.test.cjs +37 -204
- package/src/main/lib/__tests__/schedulerPaths.test.cjs +226 -0
- package/src/main/lib/__tests__/schedulerPathsWorktree.test.cjs +94 -0
- package/src/main/lib/__tests__/schedulerRuntimeState.test.cjs +56 -0
- package/src/main/lib/__tests__/sessionSlots.test.cjs +45 -0
- package/src/main/lib/__tests__/telemetryBacklog.test.cjs +1 -1
- package/src/main/lib/__tests__/upgradeDrain.test.cjs +130 -0
- package/src/main/lib/__tests__/usageCircuit.test.cjs +285 -0
- package/src/main/lib/__tests__/watchdog-helpers.test.cjs +375 -0
- package/src/main/lib/__tests__/watchdog-relaunch.test.cjs +266 -0
- package/src/main/lib/activeIndexRebuild.cjs +1 -3
- package/{scripts → src/main}/lib/activeSessions.cjs +67 -89
- package/src/main/lib/adoptedRunSupervisor.cjs +136 -0
- package/src/main/lib/agentModelResolve.cjs +94 -24
- package/src/main/lib/agentPersonaSchema.cjs +2 -2
- package/src/main/lib/auditLog.cjs +30 -5
- package/src/main/lib/bootSelfHeal.cjs +88 -0
- package/src/main/lib/buildIdentity.cjs +113 -0
- package/src/main/lib/classifyPromptTicket.cjs +3 -2
- package/src/main/lib/claudeBin.cjs +37 -2
- package/src/main/lib/cleanEnv.cjs +27 -1
- package/src/main/lib/credentials.cjs +4 -2
- package/src/main/lib/cwdClassify.cjs +185 -0
- package/src/main/lib/definitionOfDone.cjs +296 -52
- package/src/main/lib/delegationReadiness.cjs +290 -225
- package/src/main/lib/dispatchLoop.cjs +40 -0
- package/src/main/lib/effectiveModelInfo.cjs +332 -0
- package/src/main/lib/ephemeralCwd.cjs +7 -28
- package/src/main/lib/epicMint.cjs +3 -3
- package/src/main/lib/gitWorktree.cjs +136 -19
- package/src/main/lib/guardShims.cjs +156 -0
- package/src/main/lib/historyRollup.cjs +6 -7
- package/src/main/lib/instanceLock.cjs +32 -5
- package/src/main/lib/jobDirtFilter.cjs +7 -2
- package/src/main/lib/jobSupervisorRecord.cjs +147 -0
- package/src/main/lib/jobWorktreeBootLive.cjs +9 -5
- package/src/main/lib/launchFailure.cjs +2 -1
- package/src/main/lib/localAdminHttp.cjs +9 -27
- package/src/main/lib/mcpToolCatalog.cjs +33 -78
- package/src/main/lib/needsReviewLedger.cjs +205 -0
- package/src/main/lib/opsErrorLog.cjs +1 -1
- package/src/main/lib/opsOwnership.cjs +27 -19
- package/src/main/lib/prdAuthoringSeed.cjs +36 -0
- package/src/main/lib/prdCreate.cjs +56 -1
- package/src/main/lib/prdDisposition.cjs +199 -0
- package/src/main/lib/prdFrontmatter.cjs +8 -2
- package/src/main/lib/prdLocations.cjs +214 -45
- package/src/main/lib/procIdentity.cjs +126 -0
- package/src/main/lib/procName.cjs +98 -0
- package/src/main/lib/projectHomeAdminRoutes.cjs +56 -327
- package/src/main/lib/projectRootResolve.cjs +1 -1
- package/src/main/lib/queueHistory.cjs +27 -8
- package/src/main/lib/queueStore.cjs +63 -38
- package/src/main/lib/quietMachineLease.cjs +19 -2
- package/src/main/lib/reaperHelpers.cjs +181 -15
- package/src/main/lib/reservationExpiry.cjs +30 -0
- package/src/main/lib/runClaudeP.cjs +4 -2
- package/src/main/lib/runLogRetention.cjs +3 -2
- package/src/main/lib/scheduleJobSchema.cjs +10 -2
- package/src/main/lib/scheduleJobTransitions.cjs +60 -0
- package/src/main/lib/schedulerBatch.cjs +27 -2
- package/src/main/lib/schedulerConfig.cjs +24 -0
- package/src/main/lib/schedulerPaths.cjs +175 -0
- package/src/main/lib/schedulerRuntimeState.cjs +59 -0
- package/src/main/lib/sessionSlots.cjs +47 -9
- package/src/main/lib/smProcNames.cjs +51 -0
- package/src/main/lib/upgradeDrain.cjs +188 -0
- package/src/main/lib/usageCircuit.cjs +206 -0
- package/{scripts → src/main}/lib/watchdogHelpers.cjs +71 -38
- package/src/main/lib/withTimeout.cjs +33 -0
- package/src/main/mcpStatus.cjs +4 -2
- package/src/main/pluginInstall.cjs +6 -2
- package/src/main/projectPages.cjs +41 -145
- package/src/main/pty.cjs +8 -1
- package/src/main/queueOps.cjs +10 -10
- package/src/main/runVerify.cjs +69 -3
- package/src/main/scheduler/prdParser.cjs +13 -0
- package/src/main/scheduler.cjs +2841 -482
- package/src/main/seedAgentPersonas.cjs +1 -1
- package/src/main/seedDevPlugin.cjs +1 -1
- package/src/main/seedSchedulerMcp.cjs +7 -6
- package/src/main/seedStatus.cjs +1 -1
- package/src/main/supervisor.cjs +5 -3
- package/src/main/templates/PRD_AUTHORING.md +50 -0
- package/src/main/usage.cjs +140 -58
- package/src/preload/api.d.ts +110 -65
- package/src/preload/index.cjs +12 -4
- package/src/seed/agents/project-home-builder.md +31 -48
- package/dist/assets/AgentLibrary-DTFL7y8G.js +0 -3
- package/dist/assets/MarkdownEditor-DCIubYWf.js +0 -1
- package/dist/assets/Permissions-BiYZNGYW.js +0 -3
- package/dist/assets/Scheduler-DcLBiJBq.js +0 -14
- package/dist/assets/Settings-Cv-pRyms.js +0 -3
- package/dist/assets/settingsSchema-BJVciriw.js +0 -3
- package/screenshots/.gitkeep +0 -0
- package/screenshots/README-screenshots.md +0 -13
- package/scripts/project-pages-logic/dist/logic.cjs +0 -4709
- package/scripts/render-project-pages/dist/renderer.cjs +0 -18900
- package/scripts/render-project-pages.cjs +0 -70
- package/scripts/validate-project-pages-summary.cjs +0 -62
- package/src/main/lib/projectPageSummarySchema.cjs +0 -181
- package/src/main/teams.cjs +0 -95
- package/src/main/templates/project-pages-catalog.json +0 -741
- package/src/main/templates/project-pages-default-home.html +0 -123
- package/src/main/templates/project-pages-pipeline.md +0 -417
- package/src/seed/prompts/code-review/ac-coverage-check.md +0 -8
- package/src/seed/prompts/code-review/correctness-only.md +0 -8
- package/src/seed/prompts/code-review/full-spectrum-high.md +0 -8
- package/src/seed/prompts/code-review/hallucination-check.md +0 -8
- package/src/seed/prompts/code-review/public-api-compat.md +0 -8
- package/src/seed/prompts/code-review/readability-naming.md +0 -8
- package/src/seed/prompts/debugging/bug-as-failing-test.md +0 -8
- package/src/seed/prompts/debugging/git-bisect-regression.md +0 -8
- package/src/seed/prompts/debugging/instrument-intermittent-bug.md +0 -8
- package/src/seed/prompts/debugging/localize-pipeline-failure.md +0 -8
- package/src/seed/prompts/debugging/reproduce-then-diagnose.md +0 -8
- package/src/seed/prompts/documentation/adr-from-change.md +0 -8
- package/src/seed/prompts/documentation/module-readme.md +0 -8
- package/src/seed/prompts/documentation/onboarding-plan.md +0 -8
- package/src/seed/prompts/documentation/refresh-claude-md.md +0 -8
- package/src/seed/prompts/documentation/tsdoc-public-exports.md +0 -8
- package/src/seed/prompts/git-pr/conventional-commit.md +0 -8
- package/src/seed/prompts/git-pr/draft-pr-title-body.md +0 -8
- package/src/seed/prompts/git-pr/pre-commit-safety-sweep.md +0 -8
- package/src/seed/prompts/git-pr/release-notes-block.md +0 -8
- package/src/seed/prompts/git-pr/split-large-pr.md +0 -8
- package/src/seed/prompts/performance/bundle-startup-audit.md +0 -8
- package/src/seed/prompts/performance/complexity-audit.md +0 -8
- package/src/seed/prompts/performance/cpu-profile-hot-path.md +0 -8
- package/src/seed/prompts/performance/db-query-plan-review.md +0 -8
- package/src/seed/prompts/performance/memory-leak-hunt.md +0 -8
- package/src/seed/prompts/qa/api-contract-tests.md +0 -8
- package/src/seed/prompts/qa/e2e-critical-path.md +0 -8
- package/src/seed/prompts/qa/failing-test-for-bug.md +0 -8
- package/src/seed/prompts/qa/find-missing-test-coverage.md +0 -8
- package/src/seed/prompts/qa/stabilize-flaky-test.md +0 -8
- package/src/seed/prompts/qa/tdd-red-first.md +0 -8
- package/src/seed/prompts/qa/visual-regression-review.md +0 -8
- package/src/seed/prompts/qa/wcag-axe-scan.md +0 -8
- package/src/seed/prompts/refactoring/dead-code-sweep.md +0 -8
- package/src/seed/prompts/refactoring/extract-duplicated-pattern.md +0 -8
- package/src/seed/prompts/refactoring/modernize-legacy-file.md +0 -8
- package/src/seed/prompts/refactoring/reduce-cyclomatic-complexity.md +0 -8
- package/src/seed/prompts/refactoring/tighten-module-boundaries.md +0 -8
- package/src/seed/prompts/security/authz-audit.md +0 -8
- package/src/seed/prompts/security/crypto-correctness.md +0 -8
- package/src/seed/prompts/security/cwe-top-25-hunt.md +0 -8
- package/src/seed/prompts/security/dependency-audit.md +0 -8
- package/src/seed/prompts/security/ipc-boundary-hardening.md +0 -8
- package/src/seed/prompts/security/owasp-top-10-staged-diff.md +0 -8
- package/src/seed/prompts/security/secret-credential-scan.md +0 -8
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Bash-invocable CLI wrapping the Stage 0 renderer (render.tsx →
|
|
3
|
-
// scripts/render-project-pages/dist/renderer.cjs, built by
|
|
4
|
-
// `npm run build:project-pages`). Requires that build to have already run —
|
|
5
|
-
// this script does NOT bundle on the fly, since PRD authoring standards
|
|
6
|
-
// forbid unbounded/slow steps inside a headless job.
|
|
7
|
-
//
|
|
8
|
-
// Usage:
|
|
9
|
-
// node scripts/render-project-pages.cjs <summary.json> <picks.json> <output dir> <generatedAt>
|
|
10
|
-
//
|
|
11
|
-
// generatedAt (4th arg, required) is an ISO 8601 timestamp string the CALLER
|
|
12
|
-
// stamps — Date.now() is unavailable in some execution contexts (e.g.
|
|
13
|
-
// workflow scripts) that may drive this CLI, so this script never generates
|
|
14
|
-
// its own timestamp. This is the "accept generatedAt as a 4th CLI arg"
|
|
15
|
-
// option from the PRD's two documented choices (the alternative — omitting
|
|
16
|
-
// generatedAt from manifest.json entirely — was not taken).
|
|
17
|
-
//
|
|
18
|
-
// Writes <output dir>/home.html, marketing.html, feature.html,
|
|
19
|
-
// architecture.html, brief.html, and manifest.json ({ generatedAt }).
|
|
20
|
-
//
|
|
21
|
-
// Path arguments are used as-is (no allowedRoots validation like
|
|
22
|
-
// config.cjs's validatePath) — this is a standalone local dev/ops script run
|
|
23
|
-
// by a trusted human or agent shell, not an IPC-reachable surface, so it's
|
|
24
|
-
// out of scope for that guard by design.
|
|
25
|
-
'use strict';
|
|
26
|
-
|
|
27
|
-
const fs = require('node:fs');
|
|
28
|
-
const path = require('node:path');
|
|
29
|
-
|
|
30
|
-
function fail(message) {
|
|
31
|
-
console.error(`render-project-pages: ${message}`);
|
|
32
|
-
process.exit(1);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function main() {
|
|
36
|
-
const [summaryPath, picksPath, outDir, generatedAt] = process.argv.slice(2);
|
|
37
|
-
if (!summaryPath || !picksPath || !outDir || !generatedAt) {
|
|
38
|
-
fail('usage: node scripts/render-project-pages.cjs <summary.json> <picks.json> <output dir> <generatedAt>');
|
|
39
|
-
}
|
|
40
|
-
if (Number.isNaN(Date.parse(generatedAt))) {
|
|
41
|
-
fail(`generatedAt must be an ISO 8601 timestamp, got: ${generatedAt}`);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const bundlePath = path.join(__dirname, 'render-project-pages', 'dist', 'renderer.cjs');
|
|
45
|
-
if (!fs.existsSync(bundlePath)) {
|
|
46
|
-
fail(`build bundle not found at ${bundlePath} — run "npm run build:project-pages" first`);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
let renderProjectPages;
|
|
50
|
-
try {
|
|
51
|
-
({ renderProjectPages } = require(bundlePath));
|
|
52
|
-
} catch (err) {
|
|
53
|
-
fail(`failed to load ${bundlePath}: ${err.message}`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const summary = JSON.parse(fs.readFileSync(summaryPath, 'utf8'));
|
|
57
|
-
const picks = JSON.parse(fs.readFileSync(picksPath, 'utf8'));
|
|
58
|
-
|
|
59
|
-
const pages = renderProjectPages(summary, picks);
|
|
60
|
-
|
|
61
|
-
fs.mkdirSync(outDir, { recursive: true });
|
|
62
|
-
for (const lens of ['home', 'marketing', 'feature', 'architecture', 'brief']) {
|
|
63
|
-
fs.writeFileSync(path.join(outDir, `${lens}.html`), pages[lens]);
|
|
64
|
-
}
|
|
65
|
-
fs.writeFileSync(path.join(outDir, 'manifest.json'), JSON.stringify({ generatedAt }, null, 2));
|
|
66
|
-
|
|
67
|
-
console.log(`Wrote home.html, marketing.html, feature.html, architecture.html, brief.html, manifest.json to ${outDir}`);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
main();
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// Thin CLI wrapper around validateProjectPageSummary (src/renderer/lib/
|
|
3
|
-
// projectPages/summaryValidate.ts), compiled into
|
|
4
|
-
// scripts/project-pages-logic/dist/logic.cjs by `npm run
|
|
5
|
-
// build:project-pages-logic`. The project-home-builder Epic runs this
|
|
6
|
-
// against its own summary.json before proceeding to Stage 2/3 (see
|
|
7
|
-
// .claude/agents/project-home-builder.md).
|
|
8
|
-
//
|
|
9
|
-
// Usage: node scripts/validate-project-pages-summary.cjs <summary.json path>
|
|
10
|
-
// Exits 0 and prints "valid" on success; exits 1 and prints each error on
|
|
11
|
-
// failure. Same CLI-wrapper pattern as scripts/render-project-pages.cjs.
|
|
12
|
-
//
|
|
13
|
-
// The path argument is used as-is (no allowedRoots validation like
|
|
14
|
-
// config.cjs's validatePath) — this is a standalone local dev/ops script run
|
|
15
|
-
// by a trusted human or agent shell, not an IPC-reachable surface, so it's
|
|
16
|
-
// out of scope for that guard by design.
|
|
17
|
-
'use strict';
|
|
18
|
-
|
|
19
|
-
const fs = require('node:fs');
|
|
20
|
-
const path = require('node:path');
|
|
21
|
-
|
|
22
|
-
function fail(message) {
|
|
23
|
-
console.error(`validate-project-pages-summary: ${message}`);
|
|
24
|
-
process.exit(1);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function main() {
|
|
28
|
-
const [summaryPath] = process.argv.slice(2);
|
|
29
|
-
if (!summaryPath) {
|
|
30
|
-
fail('usage: node scripts/validate-project-pages-summary.cjs <summary.json path>');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const bundlePath = path.join(__dirname, 'project-pages-logic', 'dist', 'logic.cjs');
|
|
34
|
-
if (!fs.existsSync(bundlePath)) {
|
|
35
|
-
fail(`build bundle not found at ${bundlePath} — run "npm run build:project-pages-logic" first`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
let validateProjectPageSummary;
|
|
39
|
-
try {
|
|
40
|
-
({ validateProjectPageSummary } = require(bundlePath));
|
|
41
|
-
} catch (err) {
|
|
42
|
-
fail(`failed to load ${bundlePath}: ${err.message}`);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
let summary;
|
|
46
|
-
try {
|
|
47
|
-
summary = JSON.parse(fs.readFileSync(summaryPath, 'utf8'));
|
|
48
|
-
} catch (err) {
|
|
49
|
-
fail(`could not read/parse ${summaryPath}: ${err.message}`);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const result = validateProjectPageSummary(summary);
|
|
53
|
-
if (!result.ok) {
|
|
54
|
-
console.error('validate-project-pages-summary: invalid summary:');
|
|
55
|
-
for (const err of result.errors) console.error(` - ${err}`);
|
|
56
|
-
process.exit(1);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
console.log('valid');
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
main();
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* projectPageSummarySchema.cjs — hand-authored JSON Schema description of
|
|
5
|
-
* `ProjectPageSummary` (src/renderer/lib/projectPages/summaryType.ts), for
|
|
6
|
-
* the /admin/project-home/contract route (PRD: project-home-admin-routes).
|
|
7
|
-
*
|
|
8
|
-
* This schema is DESCRIPTIVE, not the enforcement mechanism — the actual
|
|
9
|
-
* gate a posted summary must pass is `validateProjectPageSummary` (shipped
|
|
10
|
-
* in scripts/project-pages-logic/dist/logic.cjs, called by
|
|
11
|
-
* /admin/project-home/validate-summary and /admin/project-home/render).
|
|
12
|
-
* Kept hand-written rather than derived at runtime so the contract route
|
|
13
|
-
* never needs to load the TypeScript source; if summaryType.ts's shape
|
|
14
|
-
* changes, update this alongside it (same discipline as any other
|
|
15
|
-
* TS-type-mirrored constant in this codebase).
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const PROJECT_PAGE_SUMMARY_JSON_SCHEMA = Object.freeze({
|
|
19
|
-
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
20
|
-
title: 'ProjectPageSummary',
|
|
21
|
-
type: 'object',
|
|
22
|
-
required: ['identity', 'stats', 'pillars', 'feature', 'architecture', 'quotes'],
|
|
23
|
-
properties: {
|
|
24
|
-
identity: {
|
|
25
|
-
type: 'object',
|
|
26
|
-
required: ['name', 'tag', 'version', 'oneLine', 'claim', 'sub', 'audience', 'install'],
|
|
27
|
-
properties: {
|
|
28
|
-
name: { type: 'string' },
|
|
29
|
-
tag: { type: 'string' },
|
|
30
|
-
version: { type: 'string' },
|
|
31
|
-
oneLine: { type: 'string' },
|
|
32
|
-
claim: { type: 'string' },
|
|
33
|
-
sub: { type: 'string' },
|
|
34
|
-
audience: { type: 'string' },
|
|
35
|
-
install: { type: 'string' },
|
|
36
|
-
},
|
|
37
|
-
description: 'Every string field must be non-empty and must not be the literal "TODO".',
|
|
38
|
-
},
|
|
39
|
-
stats: {
|
|
40
|
-
type: 'array',
|
|
41
|
-
items: {
|
|
42
|
-
type: 'object',
|
|
43
|
-
required: ['v', 'k', 'n'],
|
|
44
|
-
properties: { v: { type: 'string' }, k: { type: 'string' }, n: { type: 'string' } },
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
pillars: {
|
|
48
|
-
type: 'array',
|
|
49
|
-
items: {
|
|
50
|
-
type: 'object',
|
|
51
|
-
required: ['t', 'd', 'k'],
|
|
52
|
-
properties: { t: { type: 'string' }, d: { type: 'string' }, k: { type: 'string' } },
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
quotes: {
|
|
56
|
-
type: 'array',
|
|
57
|
-
description: 'Never fabricate testimonials — omit entirely rather than invent a quote.',
|
|
58
|
-
items: {
|
|
59
|
-
type: 'object',
|
|
60
|
-
required: ['q', 'a', 'r'],
|
|
61
|
-
properties: { q: { type: 'string' }, a: { type: 'string' }, r: { type: 'string' } },
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
feature: {
|
|
65
|
-
type: 'object',
|
|
66
|
-
required: ['name', 'kicker', 'status', 'owner', 'oneLine', 'problem', 'solution', 'steps', 'rules', 'specs', 'faq', 'timeline'],
|
|
67
|
-
properties: {
|
|
68
|
-
name: { type: 'string' },
|
|
69
|
-
kicker: { type: 'string' },
|
|
70
|
-
status: { type: 'string' },
|
|
71
|
-
owner: { type: 'string' },
|
|
72
|
-
oneLine: { type: 'string' },
|
|
73
|
-
problem: { type: 'string' },
|
|
74
|
-
solution: { type: 'string' },
|
|
75
|
-
steps: { type: 'array', items: { type: 'object', required: ['t', 'd'], properties: { t: { type: 'string' }, d: { type: 'string' } } } },
|
|
76
|
-
rules: { type: 'array', items: { type: 'object', required: ['t', 'd'], properties: { t: { type: 'string' }, d: { type: 'string' } } } },
|
|
77
|
-
specs: { type: 'array', items: { type: 'array', description: '[label, value, note]', items: { type: 'string' }, minItems: 3, maxItems: 3 } },
|
|
78
|
-
faq: { type: 'array', items: { type: 'object', required: ['q', 'a'], properties: { q: { type: 'string' }, a: { type: 'string' } } } },
|
|
79
|
-
timeline: {
|
|
80
|
-
type: 'array',
|
|
81
|
-
items: {
|
|
82
|
-
type: 'object',
|
|
83
|
-
required: ['w', 't', 's'],
|
|
84
|
-
properties: { w: { type: 'string' }, t: { type: 'string' }, s: { type: 'string', enum: ['done', 'next', 'idea'] } },
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
architecture: {
|
|
90
|
-
type: 'object',
|
|
91
|
-
required: ['summary', 'principles', 'layers', 'modules', 'flow', 'decisions', 'risks'],
|
|
92
|
-
properties: {
|
|
93
|
-
summary: { type: 'string' },
|
|
94
|
-
principles: { type: 'array', items: { type: 'object', required: ['t', 'd'], properties: { t: { type: 'string' }, d: { type: 'string' } } } },
|
|
95
|
-
layers: {
|
|
96
|
-
type: 'array',
|
|
97
|
-
items: {
|
|
98
|
-
type: 'object',
|
|
99
|
-
required: ['n', 'd', 'f', 'tone'],
|
|
100
|
-
properties: { n: { type: 'string' }, d: { type: 'string' }, f: { type: 'string' }, tone: { type: 'string', enum: ['accent', 'butter', 'sage', 'mute'] } },
|
|
101
|
-
},
|
|
102
|
-
},
|
|
103
|
-
modules: {
|
|
104
|
-
type: 'array',
|
|
105
|
-
items: {
|
|
106
|
-
type: 'object',
|
|
107
|
-
required: ['n', 'd', 'f', 'dep', 'heat'],
|
|
108
|
-
properties: { n: { type: 'string' }, d: { type: 'string' }, f: { type: 'number' }, dep: { type: 'array', items: { type: 'string' } }, heat: { type: 'number' } },
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
flow: {
|
|
112
|
-
type: 'array',
|
|
113
|
-
items: {
|
|
114
|
-
type: 'object',
|
|
115
|
-
required: ['a', 'b', 't', 'n'],
|
|
116
|
-
properties: { a: { type: 'string' }, b: { type: 'string' }, t: { type: 'string' }, n: { type: 'string' } },
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
decisions: {
|
|
120
|
-
type: 'array',
|
|
121
|
-
items: {
|
|
122
|
-
type: 'object',
|
|
123
|
-
required: ['id', 't', 'w', 's'],
|
|
124
|
-
properties: { id: { type: 'string' }, t: { type: 'string' }, w: { type: 'string' }, s: { type: 'string', enum: ['accepted', 'proposed', 'superseded'] } },
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
risks: {
|
|
128
|
-
type: 'array',
|
|
129
|
-
description: 'No clean source in the Brief — leave empty rather than invent.',
|
|
130
|
-
items: {
|
|
131
|
-
type: 'object',
|
|
132
|
-
required: ['t', 'd', 's'],
|
|
133
|
-
properties: { t: { type: 'string' }, d: { type: 'string' }, s: { type: 'string', enum: ['open', 'watching', 'mitigated'] } },
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
},
|
|
138
|
-
brief: {
|
|
139
|
-
type: 'object',
|
|
140
|
-
description: 'OPTIONAL — omit entirely when this project has no generated brief.json yet.',
|
|
141
|
-
required: ['purpose', 'what', 'areas', 'scope', 'conventions'],
|
|
142
|
-
properties: {
|
|
143
|
-
purpose: { type: 'string' },
|
|
144
|
-
what: { type: 'array', items: { type: 'string' } },
|
|
145
|
-
areas: {
|
|
146
|
-
type: 'array',
|
|
147
|
-
items: {
|
|
148
|
-
type: 'object',
|
|
149
|
-
required: ['name', 'files', 'note', 'epic', 'heat'],
|
|
150
|
-
properties: { name: { type: 'string' }, files: { type: 'number' }, note: { type: 'string' }, epic: { type: ['string', 'null'] }, heat: { type: 'number' } },
|
|
151
|
-
},
|
|
152
|
-
},
|
|
153
|
-
scope: {
|
|
154
|
-
type: 'array',
|
|
155
|
-
items: {
|
|
156
|
-
type: 'object',
|
|
157
|
-
required: ['when', 'kind', 'text', 'src'],
|
|
158
|
-
properties: { when: { type: 'string' }, kind: { type: 'string', enum: ['added', 'narrowed', 'decided'] }, text: { type: 'string' }, src: { type: 'string' } },
|
|
159
|
-
},
|
|
160
|
-
},
|
|
161
|
-
conventions: { type: 'array', items: { type: 'string' } },
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
},
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// ProjectPagePicks — Record<lensId, Record<slotId, variantId>>. Matched
|
|
168
|
-
// against each lens's own catalog.slots[].variants[].id at render time by
|
|
169
|
-
// the renderer bundle itself, so this schema only bounds the wire shape.
|
|
170
|
-
const PROJECT_PAGE_PICKS_JSON_SCHEMA = Object.freeze({
|
|
171
|
-
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
172
|
-
title: 'ProjectPagePicks',
|
|
173
|
-
type: 'object',
|
|
174
|
-
additionalProperties: {
|
|
175
|
-
type: 'object',
|
|
176
|
-
additionalProperties: { type: 'string' },
|
|
177
|
-
},
|
|
178
|
-
description: 'lensId -> slotId -> variantId. Every lensId/slotId/variantId must match one from the catalog.',
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
module.exports = { PROJECT_PAGE_SUMMARY_JSON_SCHEMA, PROJECT_PAGE_PICKS_JSON_SCHEMA };
|
package/src/main/teams.cjs
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Teams enumerator — surfaces ~/.claude/teams/<name>/ to the renderer.
|
|
3
|
-
*
|
|
4
|
-
* Each team is a directory containing:
|
|
5
|
-
* - config.json: { name, description?, members: [{ name, agentType, model, cwd?, ... }], ... }
|
|
6
|
-
* - inboxes/<thread>.json: one file per pending message thread (depth = file count)
|
|
7
|
-
*
|
|
8
|
-
* We treat teams as feature-flagged: enabled when env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS === "1"
|
|
9
|
-
* is set in merged Claude settings. The renderer does its own check; this
|
|
10
|
-
* handler always returns the on-disk roster so the UI can keep recovering
|
|
11
|
-
* gracefully even if settings are unparseable.
|
|
12
|
-
*
|
|
13
|
-
* All reads route through config.cjs (validatePath + atomic semantics).
|
|
14
|
-
* Complexity: O(T·M) where T = teams and M = members; both are small (< 20).
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const { ipcMain } = require('electron');
|
|
18
|
-
const os = require('node:os');
|
|
19
|
-
const path = require('node:path');
|
|
20
|
-
const configMgr = require('./config.cjs');
|
|
21
|
-
const logs = require('./logs.cjs');
|
|
22
|
-
|
|
23
|
-
const TEAMS_ROOT = path.join(os.homedir(), '.claude', 'teams');
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Enumerate teams. Returns { teams: TeamInfo[] }.
|
|
27
|
-
* Failures per-team (unreadable config.json, missing inbox dir) are swallowed —
|
|
28
|
-
* the team is included with whatever data we could recover. The renderer
|
|
29
|
-
* decides how to render incomplete entries.
|
|
30
|
-
*/
|
|
31
|
-
async function listTeams() {
|
|
32
|
-
let dir;
|
|
33
|
-
try {
|
|
34
|
-
dir = await configMgr.listDir(TEAMS_ROOT, { dirsOnly: true });
|
|
35
|
-
} catch {
|
|
36
|
-
// listDir throws when path is outside allowed boundaries — should not
|
|
37
|
-
// happen for ~/.claude/teams, but guard anyway.
|
|
38
|
-
return { teams: [] };
|
|
39
|
-
}
|
|
40
|
-
if (!dir.ok) {
|
|
41
|
-
if (dir.error) logs.writeLine({ level: 'warn', scope: 'teams', message: 'listDir failed', meta: { error: dir.error } });
|
|
42
|
-
return { teams: [] };
|
|
43
|
-
}
|
|
44
|
-
if (dir.entries.length === 0) return { teams: [] };
|
|
45
|
-
|
|
46
|
-
const teams = [];
|
|
47
|
-
for (const entry of dir.entries) {
|
|
48
|
-
const teamName = entry.name;
|
|
49
|
-
const configPath = path.join(entry.path, 'config.json');
|
|
50
|
-
const inboxDir = path.join(entry.path, 'inboxes');
|
|
51
|
-
|
|
52
|
-
let config = null;
|
|
53
|
-
try {
|
|
54
|
-
const r = await configMgr.readJson(configPath);
|
|
55
|
-
if (r.exists && !r.parseError) config = r.data;
|
|
56
|
-
} catch { /* unreadable — leave config null */ }
|
|
57
|
-
|
|
58
|
-
let inboxDepth = 0;
|
|
59
|
-
try {
|
|
60
|
-
const inbox = await configMgr.listDir(inboxDir, { filesOnly: true });
|
|
61
|
-
if (inbox.ok) {
|
|
62
|
-
inboxDepth = inbox.entries.filter((f) => f.name.endsWith('.json')).length;
|
|
63
|
-
}
|
|
64
|
-
} catch { /* no inbox dir is fine */ }
|
|
65
|
-
|
|
66
|
-
const members = Array.isArray(config?.members)
|
|
67
|
-
? config.members.map((m) => ({
|
|
68
|
-
name: typeof m?.name === 'string' ? m.name : 'unnamed',
|
|
69
|
-
agentType: typeof m?.agentType === 'string' ? m.agentType : null,
|
|
70
|
-
model: typeof m?.model === 'string' ? m.model : null,
|
|
71
|
-
}))
|
|
72
|
-
: [];
|
|
73
|
-
|
|
74
|
-
teams.push({
|
|
75
|
-
name: teamName,
|
|
76
|
-
configPath,
|
|
77
|
-
description: typeof config?.description === 'string' ? config.description : null,
|
|
78
|
-
leadAgentId: typeof config?.leadAgentId === 'string' ? config.leadAgentId : null,
|
|
79
|
-
members,
|
|
80
|
-
memberCount: members.length,
|
|
81
|
-
inboxDepth,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
return { teams };
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function registerTeamsHandlers() {
|
|
88
|
-
ipcMain.handle('teams:list', () => listTeams());
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
module.exports = {
|
|
92
|
-
registerTeamsHandlers,
|
|
93
|
-
// exported for direct use / tests
|
|
94
|
-
listTeams,
|
|
95
|
-
};
|