claude-code-session-manager 0.111.0 → 0.113.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/dist/assets/{AgentLibrary-rBO1daqM.js → AgentLibrary-wvrcLGGS.js} +2 -2
- package/dist/assets/{Button-DsEYRZg0.js → Button-B6h0F0XT.js} +1 -1
- package/dist/assets/{DataModel-D8sbvvBC.js → DataModel-C5pW9E3u.js} +1 -1
- package/dist/assets/{History-BEHLtxia.js → History-BV4e8YOM.js} +2 -2
- package/dist/assets/{Hooks-CKpvlXrg.js → Hooks-CrFSv4x1.js} +3 -3
- package/dist/assets/{Library-CeF4qh9d.js → Library-D-GIt3EY.js} +5 -5
- package/dist/assets/{ListDetail-DcfmxPFk.js → ListDetail-Bco_wfs6.js} +1 -1
- package/dist/assets/{MarkdownEditor-CvK1pyto.js → MarkdownEditor-C-yHSXNV.js} +1 -1
- package/dist/assets/{McpServers-D-h2ihzJ.js → McpServers-CfDekadG.js} +2 -2
- package/dist/assets/{Memory-BnF89x8v.js → Memory-CGGLexkR.js} +4 -4
- package/dist/assets/{Panel-CQY5zano.js → Panel-DGMEuYYG.js} +1 -1
- package/dist/assets/{Permissions-DLukmmsz.js → Permissions-Cx2zjtYZ.js} +3 -3
- package/dist/assets/{Plugins-0Pf0OZ4l.js → Plugins-Bc_W3IyR.js} +2 -2
- package/dist/assets/ProvenanceBadge-DiKAUR1u.js +1 -0
- package/dist/assets/RemoteMachines-8_77-WPD.js +3 -0
- package/dist/assets/{SaveBar-DjijiUb0.js → SaveBar-Blpzdq1R.js} +1 -1
- package/dist/assets/{Scheduler-Cm3EXZvE.js → Scheduler-Bd70AM4X.js} +9 -9
- package/dist/assets/{ScopeSwitcher-B-P-kSfq.js → ScopeSwitcher-wxN0h4YW.js} +1 -1
- package/dist/assets/Settings-CQ7DA3zW.js +4 -0
- package/dist/assets/{SkillReferenceGraph-Epv2GJmj.js → SkillReferenceGraph-DH1NLOiS.js} +1 -1
- package/dist/assets/Skills-CmyRyu4_.js +2 -0
- package/dist/assets/SystemPrompt-KAc3UMCd.js +1 -0
- package/dist/assets/TagLibrary-C8EvHnpg.js +1 -0
- package/dist/assets/{TiptapBody-DAMO3DhO.js → TiptapBody-d423mH6D.js} +1 -1
- package/dist/assets/{Toggle-Ba_f7q_m.js → Toggle-D1wsGE9S.js} +1 -1
- package/dist/assets/{ViewTabs-CGX6MAhc.js → ViewTabs-CjHw3kGY.js} +1 -1
- package/dist/assets/{historyTotals-vgfk8EOL.js → historyTotals-DFHzqLt7.js} +1 -1
- package/dist/assets/{index-CPieAFsl.js → index-Ci1u018F.js} +266 -266
- package/dist/assets/{settingsSchema-D0FxNrTy.js → settingsSchema-Ctf3pZVI.js} +1 -1
- package/dist/assets/{useAgentsDirWatch-DCu6BNYN.js → useAgentsDirWatch-B1NBmOAe.js} +1 -1
- package/dist/assets/{useRemotePeers-D4cdJDyh.js → useRemotePeers-BHjSJs9D.js} +1 -1
- package/dist/index.html +1 -1
- package/package.json +3 -2
- package/plugins/CLAUDE.md +5 -8
- package/plugins/session-manager-dev/.claude-plugin/plugin.json +3 -6
- package/plugins/session-manager-dev/skills/builder/1-classify-and-bump/SKILL.md +2 -2
- package/plugins/session-manager-dev/skills/builder/SKILL.md +2 -3
- package/plugins/session-manager-dev/skills/develop/SKILL.md +1 -1
- package/plugins/session-manager-dev/skills/develop/standards.md +3 -3
- package/plugins/session-manager-dev/skills/send-feedback/SKILL.md +13 -0
- package/scripts/README.md +3 -3
- package/scripts/audit-ops-hygiene.cjs +4 -4
- package/scripts/hooks/guard-destructive-git.cjs +4 -4
- package/scripts/hooks/guard-inline-implementation.cjs +1 -1
- package/scripts/hooks/guard-prd-writes.cjs +2 -2
- package/scripts/hooks/lib/guard-destructive-git-policy.cjs +1 -1
- package/scripts/mint-epic.cjs +2 -2
- package/scripts/scheduler-mcp-server.cjs +27 -9
- package/src/main/agentLibrary.cjs +5 -5
- package/src/main/agentsIpc.cjs +76 -0
- package/src/main/build-info.json +4 -4
- package/src/main/chatRunner.cjs +30 -13
- package/src/main/config.cjs +20 -3
- package/src/main/crashDiagnostics.cjs +2 -2
- package/src/main/docEdit.cjs +5 -5
- package/src/main/files.cjs +2 -2
- package/src/main/git.cjs +1 -1
- package/src/main/health.cjs +20 -18
- package/src/main/heapSnapshot.cjs +1 -1
- package/src/main/historyAggregator.cjs +2 -2
- package/src/main/index.cjs +50 -132
- package/src/main/ipcSchemas.cjs +13 -10
- package/src/main/lib/CLAUDE.md +48 -0
- package/src/main/lib/activeSessions.cjs +14 -1
- package/src/main/lib/classifyPromptTicket.cjs +2 -2
- package/src/main/lib/{agentModelResolve.cjs → claude/agentModelResolve.cjs} +7 -7
- package/src/main/lib/{claudeBin.cjs → claude/claudeBin.cjs} +4 -4
- package/src/main/lib/{effectiveModelInfo.cjs → claude/effectiveModelInfo.cjs} +9 -9
- package/src/main/lib/{modelCatalog.cjs → claude/modelCatalog.cjs} +3 -3
- package/src/main/lib/claude/rateLimitDetect.cjs +54 -0
- package/src/main/lib/{rateLimitWindow.cjs → claude/rateLimitWindow.cjs} +24 -12
- package/src/main/lib/{runClaudeP.cjs → claude/runClaudeP.cjs} +1 -1
- package/src/main/lib/credentials.cjs +18 -92
- package/src/main/lib/cwdClassify.cjs +1 -1
- package/src/main/lib/{activeIndexMerge.cjs → epic/activeIndexMerge.cjs} +3 -3
- package/src/main/lib/{activeIndexRebuild.cjs → epic/activeIndexRebuild.cjs} +1 -1
- package/src/main/lib/{delegationReadiness.cjs → epic/delegationReadiness.cjs} +21 -29
- package/src/main/lib/{epicContextDigest.cjs → epic/epicContextDigest.cjs} +1 -1
- package/src/main/lib/{epicDelegationStats.cjs → epic/epicDelegationStats.cjs} +2 -2
- package/src/main/lib/{epicMint.cjs → epic/epicMint.cjs} +11 -11
- package/src/main/lib/{epicSpawnPlan.cjs → epic/epicSpawnPlan.cjs} +3 -3
- package/src/main/lib/{epicStatusMirror.cjs → epic/epicStatusMirror.cjs} +2 -2
- package/src/main/lib/{epicTranscriptDiagnostic.cjs → epic/epicTranscriptDiagnostic.cjs} +2 -2
- package/src/main/lib/{epicTranscriptPath.cjs → epic/epicTranscriptPath.cjs} +2 -2
- package/src/main/lib/{epicValidationHook.cjs → epic/epicValidationHook.cjs} +3 -3
- package/src/main/lib/{epicWorktreeBoot.cjs → epic/epicWorktreeBoot.cjs} +1 -1
- package/src/main/lib/{epicWorktreeMerge.cjs → epic/epicWorktreeMerge.cjs} +3 -3
- package/src/main/lib/{epicWorktreeMint.cjs → epic/epicWorktreeMint.cjs} +3 -3
- package/src/main/lib/{epicWorktreeProjectConfig.cjs → epic/epicWorktreeProjectConfig.cjs} +4 -4
- package/src/main/lib/{promptSessionsCreateEpic.cjs → epic/promptSessionsCreateEpic.cjs} +4 -4
- package/src/main/lib/{crossProjectFeedback.cjs → feedback-remote/crossProjectFeedback.cjs} +114 -16
- package/src/main/lib/{customerFeedbackClient.cjs → feedback-remote/customerFeedbackClient.cjs} +3 -3
- package/src/main/lib/{customerFeedbackInbox.cjs → feedback-remote/customerFeedbackInbox.cjs} +2 -2
- package/src/main/lib/{customerFeedbackIpc.cjs → feedback-remote/customerFeedbackIpc.cjs} +1 -1
- package/src/main/lib/feedback-remote/humanPromptLedger.cjs +93 -0
- package/src/main/lib/{localAdminHttp.cjs → feedback-remote/localAdminHttp.cjs} +2 -2
- package/src/main/lib/{macroAdminRoutes.cjs → feedback-remote/macroAdminRoutes.cjs} +1 -1
- package/src/main/lib/{projectHomeAdminRoutes.cjs → feedback-remote/projectHomeAdminRoutes.cjs} +4 -4
- package/src/main/lib/{relayClientAuth.cjs → feedback-remote/relayClientAuth.cjs} +2 -2
- package/src/main/lib/{remoteClientSessions.cjs → feedback-remote/remoteClientSessions.cjs} +1 -1
- package/src/main/lib/{gitWorktree.cjs → git/gitWorktree.cjs} +7 -7
- package/src/main/lib/historyRollup.cjs +1 -1
- package/src/main/lib/importReferences.cjs +1 -1
- package/src/main/lib/machineProfile.cjs +1 -1
- package/src/main/lib/mcpToolCatalog.cjs +9 -3
- package/src/main/lib/openExternalApp.cjs +1 -1
- package/src/main/lib/opsOwnership.cjs +3 -3
- package/src/main/lib/{agentPersonaSchema.cjs → persona-macro/agentPersonaSchema.cjs} +2 -2
- package/src/main/lib/{macroLibrary.cjs → persona-macro/macroLibrary.cjs} +5 -5
- package/src/main/lib/{personaMerge.cjs → persona-macro/personaMerge.cjs} +4 -4
- package/src/main/lib/{depSlugResolve.cjs → prd/depSlugResolve.cjs} +16 -1
- package/src/main/lib/{prdAdminRoutes.cjs → prd/prdAdminRoutes.cjs} +7 -7
- package/src/main/lib/{prdAgentType.cjs → prd/prdAgentType.cjs} +3 -3
- package/src/main/lib/{prdCreate.cjs → prd/prdCreate.cjs} +12 -12
- package/src/main/lib/{prdDeclaredPaths.cjs → prd/prdDeclaredPaths.cjs} +1 -1
- package/src/main/lib/{prdGateFiles.cjs → prd/prdGateFiles.cjs} +1 -1
- package/src/main/lib/{prdLocations.cjs → prd/prdLocations.cjs} +2 -2
- package/src/main/lib/{prdMigration.cjs → prd/prdMigration.cjs} +3 -3
- package/src/main/lib/prereqs.cjs +2 -2
- package/src/main/lib/{instanceLock.cjs → process/instanceLock.cjs} +4 -11
- package/src/main/lib/{pidAlive.cjs → process/pidAlive.cjs} +1 -1
- package/src/main/lib/{procName.cjs → process/procName.cjs} +2 -2
- package/src/main/lib/{timeoutShim.cjs → process/timeoutShim.cjs} +1 -1
- package/src/main/lib/projectRootResolve.cjs +1 -1
- package/src/main/lib/promptSessionSchema.cjs +1 -1
- package/src/main/lib/{definitionOfDone.cjs → scheduler/definitionOfDone.cjs} +6 -12
- package/src/main/lib/scheduler/finalizeReason.cjs +30 -0
- package/src/main/lib/{fixChainDepth.cjs → scheduler/fixChainDepth.cjs} +1 -1
- package/src/main/lib/scheduler/flatSweepThrottle.cjs +17 -0
- package/src/main/lib/{jobDirtFilter.cjs → scheduler/jobDirtFilter.cjs} +1 -1
- package/src/main/lib/{jobSupervisorRecord.cjs → scheduler/jobSupervisorRecord.cjs} +1 -1
- package/src/main/lib/{launchFailure.cjs → scheduler/launchFailure.cjs} +2 -2
- package/src/main/lib/{queueStore.cjs → scheduler/queueStore.cjs} +6 -6
- package/src/main/lib/{quietMachineLease.cjs → scheduler/quietMachineLease.cjs} +1 -1
- package/src/main/lib/{rcaReport.cjs → scheduler/rcaReport.cjs} +4 -4
- package/src/main/lib/{reaperHelpers.cjs → scheduler/reaperHelpers.cjs} +3 -3
- package/src/main/lib/{reservationExpiry.cjs → scheduler/reservationExpiry.cjs} +4 -11
- package/src/main/lib/{reviewNotice.cjs → scheduler/reviewNotice.cjs} +1 -1
- package/src/main/lib/{runLogRetention.cjs → scheduler/runLogRetention.cjs} +34 -13
- package/src/main/lib/{scheduleJobTransitions.cjs → scheduler/scheduleJobTransitions.cjs} +3 -3
- package/src/main/lib/{schedulerBatch.cjs → scheduler/schedulerBatch.cjs} +9 -13
- package/src/main/lib/{schedulerConfig.cjs → scheduler/schedulerConfig.cjs} +1 -1
- package/src/main/lib/{schedulerRuntimeState.cjs → scheduler/schedulerRuntimeState.cjs} +1 -1
- package/src/main/lib/{sessionSlots.cjs → scheduler/sessionSlots.cjs} +2 -2
- package/src/main/lib/{upgradeDrain.cjs → scheduler/upgradeDrain.cjs} +8 -11
- package/src/main/lib/{watchdogHelpers.cjs → scheduler/watchdogHelpers.cjs} +5 -19
- package/src/main/lib/{auditLog.cjs → telemetry/auditLog.cjs} +1 -1
- package/src/main/lib/{opsErrorLog.cjs → telemetry/opsErrorLog.cjs} +4 -4
- package/src/main/lib/{telemetryBacklog.cjs → telemetry/telemetryBacklog.cjs} +4 -4
- package/src/main/lib/{telemetryBoot.cjs → telemetry/telemetryBoot.cjs} +1 -1
- package/src/main/lib/{telemetryClient.cjs → telemetry/telemetryClient.cjs} +12 -8
- package/src/main/lib/{telemetrySettings.cjs → telemetry/telemetrySettings.cjs} +1 -1
- package/src/main/lib/{atomicFs.cjs → util/atomicFs.cjs} +42 -0
- package/src/main/lib/{loopDelay.cjs → util/loopDelay.cjs} +1 -1
- package/src/main/logs.cjs +1 -1
- package/src/main/mcpStatus.cjs +2 -2
- package/src/main/memoryAggregate.cjs +3 -3
- package/src/main/memoryTool.cjs +1 -1
- package/src/main/otel.cjs +2 -2
- package/src/main/pluginInstall.cjs +29 -3
- package/src/main/projectBrief.cjs +6 -6
- package/src/main/projectPages.cjs +1 -1
- package/src/main/promptSessionEvents.cjs +2 -2
- package/src/main/pty.cjs +7 -7
- package/src/main/queueOps.cjs +6 -6
- package/src/main/remoteClient.cjs +4 -4
- package/src/main/remoteClientIpc.cjs +1 -1
- package/src/main/runVerify.cjs +6 -3
- package/src/main/scheduler/CLAUDE.md +26 -0
- package/src/main/scheduler/budget.cjs +576 -0
- package/src/main/scheduler/gitTreeGuard.cjs +672 -0
- package/src/main/scheduler/prdParser.cjs +4 -4
- package/src/main/scheduler/prdPaths.cjs +487 -0
- package/src/main/scheduler/reviewLadder.cjs +1011 -0
- package/src/main/scheduler/starvation.cjs +390 -0
- package/src/main/scheduler.cjs +331 -3320
- package/src/main/seedAgentPersonas.cjs +5 -5
- package/src/main/seedDevPlugin.cjs +70 -3
- package/src/main/seedSchedulerMcp.cjs +2 -2
- package/src/main/supervisor.cjs +50 -27
- package/src/main/telemetryIpc.cjs +51 -0
- package/src/main/transcripts.cjs +3 -3
- package/src/main/updaterIpc.cjs +1 -1
- package/src/main/usage.cjs +1 -1
- package/src/main/watchers.cjs +1 -1
- package/src/main/webRemote.cjs +22 -7
- package/src/preload/api.d.ts +14 -8
- package/src/preload/index.cjs +9 -3
- package/dist/assets/ProvenanceBadge-vC7Tj-JP.js +0 -1
- package/dist/assets/RemoteMachines-CWnKbFHc.js +0 -3
- package/dist/assets/Settings-DYDlp2m_.js +0 -4
- package/dist/assets/Skills-DHO0N0C2.js +0 -2
- package/dist/assets/SystemPrompt-DxeNofL9.js +0 -1
- package/dist/assets/TagLibrary-QOAs7ISO.js +0 -1
- package/plugins/session-manager-dev/skills/blog-for-project-feature/0-select/SKILL.md +0 -39
- package/plugins/session-manager-dev/skills/blog-for-project-feature/1-research/SKILL.md +0 -37
- package/plugins/session-manager-dev/skills/blog-for-project-feature/2-storyboard/SKILL.md +0 -64
- package/plugins/session-manager-dev/skills/blog-for-project-feature/3-capture/SKILL.md +0 -52
- package/plugins/session-manager-dev/skills/blog-for-project-feature/4-draft-copy/SKILL.md +0 -37
- package/plugins/session-manager-dev/skills/blog-for-project-feature/5-illustrate/SKILL.md +0 -50
- package/plugins/session-manager-dev/skills/blog-for-project-feature/6-compose/SKILL.md +0 -51
- package/plugins/session-manager-dev/skills/blog-for-project-feature/7-review/SKILL.md +0 -54
- package/plugins/session-manager-dev/skills/blog-for-project-feature/SKILL.md +0 -144
- package/plugins/session-manager-dev/skills/blog-for-project-feature/feature.config.yaml +0 -90
- package/plugins/session-manager-dev/skills/discover-features/SKILL.md +0 -95
- package/plugins/session-manager-dev/skills/explain-to-me/SKILL.md +0 -205
- package/plugins/session-manager-dev/skills/explain-to-me/assets/style-reference.html +0 -163
- package/plugins/session-manager-dev/skills/find-opportunity/SKILL.md +0 -83
- package/plugins/session-manager-dev/skills/issue-address/0-select/0-fetch-pool/SKILL.md +0 -38
- package/plugins/session-manager-dev/skills/issue-address/0-select/1-reject-fixed/SKILL.md +0 -64
- package/plugins/session-manager-dev/skills/issue-address/0-select/2-reject-claimed/SKILL.md +0 -71
- package/plugins/session-manager-dev/skills/issue-address/0-select/3-rank-impact/SKILL.md +0 -39
- package/plugins/session-manager-dev/skills/issue-address/0-select/SKILL.md +0 -75
- package/plugins/session-manager-dev/skills/issue-address/1-confirm-open/SKILL.md +0 -39
- package/plugins/session-manager-dev/skills/issue-address/2-claim/SKILL.md +0 -57
- package/plugins/session-manager-dev/skills/issue-address/3-reproduce/SKILL.md +0 -40
- package/plugins/session-manager-dev/skills/issue-address/4-fix/SKILL.md +0 -33
- package/plugins/session-manager-dev/skills/issue-address/5-verify/SKILL.md +0 -40
- package/plugins/session-manager-dev/skills/issue-address/SKILL.md +0 -120
- package/plugins/session-manager-dev/skills/local-project-health/SKILL.md +0 -58
- package/plugins/session-manager-dev/skills/memory-sanitation/SKILL.md +0 -147
- package/plugins/session-manager-dev/skills/ops-sweep/SKILL.md +0 -137
- package/plugins/session-manager-dev/skills/pr-review-sweep/0-fetch/SKILL.md +0 -41
- package/plugins/session-manager-dev/skills/pr-review-sweep/1-classify/SKILL.md +0 -56
- package/plugins/session-manager-dev/skills/pr-review-sweep/2-check-fixed/SKILL.md +0 -49
- package/plugins/session-manager-dev/skills/pr-review-sweep/3-queue/SKILL.md +0 -57
- package/plugins/session-manager-dev/skills/pr-review-sweep/4-land-and-resolve/SKILL.md +0 -60
- package/plugins/session-manager-dev/skills/pr-review-sweep/SKILL.md +0 -124
- package/plugins/session-manager-dev/skills/pr-signal/SKILL.md +0 -67
- package/plugins/session-manager-dev/skills/project-status/SKILL.md +0 -243
- package/plugins/session-manager-dev/skills/requesting-code-review/SKILL.md +0 -98
- package/plugins/session-manager-dev/skills/requesting-code-review/code-reviewer.md +0 -146
- package/src/main/lib/rateLimitDetect.cjs +0 -35
- /package/src/main/lib/{agentEffortResolve.cjs → claude/agentEffortResolve.cjs} +0 -0
- /package/src/main/lib/{claudeCliCaps.cjs → claude/claudeCliCaps.cjs} +0 -0
- /package/src/main/lib/{usageCircuit.cjs → claude/usageCircuit.cjs} +0 -0
- /package/src/main/lib/{epicSpawnCwd.cjs → epic/epicSpawnCwd.cjs} +0 -0
- /package/src/main/lib/{customerFeedbackAdminRoutes.cjs → feedback-remote/customerFeedbackAdminRoutes.cjs} +0 -0
- /package/src/main/lib/{remoteE2eCrypto.cjs → feedback-remote/remoteE2eCrypto.cjs} +0 -0
- /package/src/main/lib/{branchSweep.cjs → git/branchSweep.cjs} +0 -0
- /package/src/main/lib/{gitExec.cjs → git/gitExec.cjs} +0 -0
- /package/src/main/lib/{jobWorktree.cjs → git/jobWorktree.cjs} +0 -0
- /package/src/main/lib/{jobWorktreeBootLive.cjs → git/jobWorktreeBootLive.cjs} +0 -0
- /package/src/main/lib/{jobWorktreeTerminalOrphanLive.cjs → git/jobWorktreeTerminalOrphanLive.cjs} +0 -0
- /package/src/main/lib/{builtinMacros.cjs → persona-macro/builtinMacros.cjs} +0 -0
- /package/src/main/lib/{personaImportHealth.cjs → persona-macro/personaImportHealth.cjs} +0 -0
- /package/src/main/lib/{shippedPersonaSeeds.cjs → persona-macro/shippedPersonaSeeds.cjs} +0 -0
- /package/src/main/lib/{planValidator.cjs → prd/planValidator.cjs} +0 -0
- /package/src/main/lib/{prdAuthoringSeed.cjs → prd/prdAuthoringSeed.cjs} +0 -0
- /package/src/main/lib/{prdDisposition.cjs → prd/prdDisposition.cjs} +0 -0
- /package/src/main/lib/{prdFrontmatter.cjs → prd/prdFrontmatter.cjs} +0 -0
- /package/src/main/lib/{prdSizing.cjs → prd/prdSizing.cjs} +0 -0
- /package/src/main/lib/{workTypeLibrary.cjs → prd/workTypeLibrary.cjs} +0 -0
- /package/src/main/lib/{childWithLog.cjs → process/childWithLog.cjs} +0 -0
- /package/src/main/lib/{cleanEnv.cjs → process/cleanEnv.cjs} +0 -0
- /package/src/main/lib/{defaultShell.cjs → process/defaultShell.cjs} +0 -0
- /package/src/main/lib/{killTree.cjs → process/killTree.cjs} +0 -0
- /package/src/main/lib/{loginShellPath.cjs → process/loginShellPath.cjs} +0 -0
- /package/src/main/lib/{procIdentity.cjs → process/procIdentity.cjs} +0 -0
- /package/src/main/lib/{singleInstanceGuard.cjs → process/singleInstanceGuard.cjs} +0 -0
- /package/src/main/lib/{smProcNames.cjs → process/smProcNames.cjs} +0 -0
- /package/src/main/lib/{timeoutShimScript.cjs → process/timeoutShimScript.cjs} +0 -0
- /package/src/main/lib/{winSpawn.cjs → process/winSpawn.cjs} +0 -0
- /package/src/main/lib/{adoptedRunSupervisor.cjs → scheduler/adoptedRunSupervisor.cjs} +0 -0
- /package/src/main/lib/{dispatchLoop.cjs → scheduler/dispatchLoop.cjs} +0 -0
- /package/src/main/lib/{dodDrainHook.cjs → scheduler/dodDrainHook.cjs} +0 -0
- /package/src/main/lib/{fixPlanSlug.cjs → scheduler/fixPlanSlug.cjs} +0 -0
- /package/src/main/lib/{gateAuthority.cjs → scheduler/gateAuthority.cjs} +0 -0
- /package/src/main/lib/{landedSinceRun.cjs → scheduler/landedSinceRun.cjs} +0 -0
- /package/src/main/lib/{loadGate.cjs → scheduler/loadGate.cjs} +0 -0
- /package/src/main/lib/{needsReviewLedger.cjs → scheduler/needsReviewLedger.cjs} +0 -0
- /package/src/main/lib/{queueHealth.cjs → scheduler/queueHealth.cjs} +0 -0
- /package/src/main/lib/{queueHistory.cjs → scheduler/queueHistory.cjs} +0 -0
- /package/src/main/lib/{scheduleJobSchema.cjs → scheduler/scheduleJobSchema.cjs} +0 -0
- /package/src/main/lib/{schedulerPaths.cjs → scheduler/schedulerPaths.cjs} +0 -0
- /package/src/main/lib/{terminalRunOutcome.cjs → scheduler/terminalRunOutcome.cjs} +0 -0
- /package/src/main/lib/{validationSentinels.cjs → scheduler/validationSentinels.cjs} +0 -0
- /package/src/main/lib/{crashTelemetry.cjs → telemetry/crashTelemetry.cjs} +0 -0
- /package/src/main/lib/{otlpTraceExporter.cjs → telemetry/otlpTraceExporter.cjs} +0 -0
- /package/src/main/lib/{telemetryConsent.cjs → telemetry/telemetryConsent.cjs} +0 -0
- /package/src/main/lib/{telemetryCounters.cjs → telemetry/telemetryCounters.cjs} +0 -0
- /package/src/main/lib/{encodeCwd.cjs → util/encodeCwd.cjs} +0 -0
- /package/src/main/lib/{expandHome.cjs → util/expandHome.cjs} +0 -0
- /package/src/main/lib/{extractJson.cjs → util/extractJson.cjs} +0 -0
- /package/src/main/lib/{fileTail.cjs → util/fileTail.cjs} +0 -0
- /package/src/main/lib/{headTailBuffer.cjs → util/headTailBuffer.cjs} +0 -0
- /package/src/main/lib/{kebabCase.cjs → util/kebabCase.cjs} +0 -0
- /package/src/main/lib/{lruCache.cjs → util/lruCache.cjs} +0 -0
- /package/src/main/lib/{withTimeout.cjs → util/withTimeout.cjs} +0 -0
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>explain-to-me · style reference (copy this)</title>
|
|
7
|
-
<!--
|
|
8
|
-
STYLE REFERENCE for the /explain-to-me skill.
|
|
9
|
-
This is a complete, self-contained exemplar page. When writing a HUMAN_LEARN
|
|
10
|
-
page, mirror this structure and CSS. Replace the placeholder "Widget Pipeline"
|
|
11
|
-
content with the real, file:line-grounded explanation of the user's topic.
|
|
12
|
-
Every component below is optional — use the ones the topic needs.
|
|
13
|
-
-->
|
|
14
|
-
<style>
|
|
15
|
-
:root{
|
|
16
|
-
--bg:#0d1117; --panel:#161b22; --panel2:#1c2330; --line:#2d333b;
|
|
17
|
-
--fg:#e6edf3; --dim:#9da7b3; --faint:#6e7681;
|
|
18
|
-
--blue:#60a5fa; --green:#34d399; --amber:#fbbf24; --violet:#a78bfa;
|
|
19
|
-
--pink:#f472b6; --red:#f87171; --cyan:#22d3ee;
|
|
20
|
-
--mono:ui-monospace,'SF Mono',Menlo,Consolas,monospace;
|
|
21
|
-
}
|
|
22
|
-
*{box-sizing:border-box;margin:0;padding:0}
|
|
23
|
-
html{scroll-behavior:smooth}
|
|
24
|
-
body{background:var(--bg);color:var(--fg);font:15px/1.6 ui-sans-serif,system-ui,sans-serif;padding:0 20px 80px}
|
|
25
|
-
.wrap{max-width:980px;margin:0 auto}
|
|
26
|
-
a{color:var(--blue);text-decoration:none} a:hover{text-decoration:underline}
|
|
27
|
-
.crumb{font-size:12px;color:var(--faint);margin:24px 0 14px}
|
|
28
|
-
h1{font-size:28px;letter-spacing:-.5px;margin-top:26px}
|
|
29
|
-
.sub{color:var(--dim);margin:8px 0 6px;max-width:780px}
|
|
30
|
-
h2{font-size:22px;margin:44px 0 12px;padding-top:18px;border-top:1px solid var(--line)}
|
|
31
|
-
h3{font-size:16px;margin:24px 0 8px}
|
|
32
|
-
p{margin:8px 0;color:var(--dim)} p strong,li strong{color:var(--fg)}
|
|
33
|
-
ul.tight{margin:6px 0 6px 20px;color:var(--dim);font-size:13.5px} ul.tight li{margin:4px 0}
|
|
34
|
-
code{font-family:var(--mono);font-size:12.5px;background:var(--panel2);border:1px solid var(--line);border-radius:4px;padding:1px 5px;color:var(--fg);white-space:nowrap}
|
|
35
|
-
pre{font-family:var(--mono);font-size:12px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:14px 16px;overflow-x:auto;margin:10px 0;line-height:1.55}
|
|
36
|
-
pre code{background:none;border:none;padding:0;white-space:pre}
|
|
37
|
-
|
|
38
|
-
/* signature element: every file:line reference is a traceable chip */
|
|
39
|
-
.loc{font-family:var(--mono);font-size:11px;color:var(--cyan);background:rgba(34,211,238,.08);border:1px solid rgba(34,211,238,.25);border-radius:99px;padding:1px 9px;white-space:nowrap}
|
|
40
|
-
|
|
41
|
-
/* layer badges — one color per place a step runs */
|
|
42
|
-
.proc{font-size:11px;text-transform:uppercase;letter-spacing:.08em;padding:1px 8px;border-radius:99px;border:1px solid}
|
|
43
|
-
.proc.hook{color:var(--amber);border-color:rgba(251,191,36,.4);background:rgba(251,191,36,.07)}
|
|
44
|
-
.proc.main{color:var(--green);border-color:rgba(52,211,153,.4);background:rgba(52,211,153,.07)}
|
|
45
|
-
.proc.sub{color:var(--violet);border-color:rgba(167,139,250,.4);background:rgba(167,139,250,.07)}
|
|
46
|
-
.proc.rend{color:var(--pink);border-color:rgba(244,114,182,.4);background:rgba(244,114,182,.07)}
|
|
47
|
-
.proc.disk{color:var(--cyan);border-color:rgba(34,211,238,.4);background:rgba(34,211,238,.07)}
|
|
48
|
-
.legend{display:flex;flex-wrap:wrap;gap:14px;margin:10px 0;font-size:12px;color:var(--dim)}
|
|
49
|
-
|
|
50
|
-
/* sticky in-page nav */
|
|
51
|
-
nav.toc{position:sticky;top:0;z-index:10;background:rgba(13,17,23,.92);backdrop-filter:blur(6px);border-bottom:1px solid var(--line);margin:0 -20px;padding:10px 20px}
|
|
52
|
-
nav.toc .row{max-width:980px;margin:0 auto;display:flex;gap:8px;flex-wrap:wrap}
|
|
53
|
-
nav.toc a{font-size:13px;padding:4px 14px;border-radius:99px;border:1px solid var(--line);color:var(--dim)}
|
|
54
|
-
nav.toc a:hover{color:var(--fg);border-color:var(--faint);text-decoration:none}
|
|
55
|
-
|
|
56
|
-
/* stat strip */
|
|
57
|
-
.statline{display:flex;gap:18px;flex-wrap:wrap;margin:16px 0}
|
|
58
|
-
.stat{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:10px 18px}
|
|
59
|
-
.stat .v{font-size:22px;font-weight:700} .stat .k{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:var(--faint)}
|
|
60
|
-
|
|
61
|
-
/* horizontal flow diagram */
|
|
62
|
-
.flow{display:flex;flex-wrap:wrap;gap:8px;align-items:stretch;margin:16px 0}
|
|
63
|
-
.flow .box{flex:1 1 150px;min-width:150px;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 12px}
|
|
64
|
-
.flow .box .bt{font-weight:700;font-size:13px;margin-bottom:2px}
|
|
65
|
-
.flow .box .bd{font-size:12px;color:var(--dim)}
|
|
66
|
-
.flow .box .where{font-family:var(--mono);font-size:10px;color:var(--cyan);margin-top:6px}
|
|
67
|
-
.flow .arrow{align-self:center;color:var(--faint);font-size:18px;flex:0 0 auto}
|
|
68
|
-
.box.b-amber{border-top:3px solid var(--amber)} .box.b-green{border-top:3px solid var(--green)}
|
|
69
|
-
.box.b-violet{border-top:3px solid var(--violet)} .box.b-cyan{border-top:3px solid var(--cyan)}
|
|
70
|
-
.box.b-pink{border-top:3px solid var(--pink)}
|
|
71
|
-
|
|
72
|
-
/* callouts */
|
|
73
|
-
.callout{border-left:3px solid var(--amber);background:rgba(251,191,36,.06);border-radius:0 8px 8px 0;padding:12px 16px;margin:14px 0;font-size:14px;color:var(--dim)}
|
|
74
|
-
.callout.ok{border-color:var(--green);background:rgba(52,211,153,.06)}
|
|
75
|
-
.callout.bad{border-color:var(--red);background:rgba(248,113,113,.06)}
|
|
76
|
-
.callout strong{color:var(--fg)}
|
|
77
|
-
|
|
78
|
-
/* tables + collapsible knobs */
|
|
79
|
-
table{border-collapse:collapse;width:100%;margin:12px 0;font-size:13px}
|
|
80
|
-
th,td{text-align:left;padding:6px 11px;border:1px solid var(--line)}
|
|
81
|
-
th{background:var(--panel2);font-size:11.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--dim)}
|
|
82
|
-
td{background:var(--panel);color:var(--dim)} td code{white-space:nowrap}
|
|
83
|
-
details.consts summary{cursor:pointer;font-size:13px;color:var(--blue);margin:10px 0}
|
|
84
|
-
|
|
85
|
-
/* two-column rationale */
|
|
86
|
-
.twocol{display:grid;grid-template-columns:1fr 1fr;gap:16px}
|
|
87
|
-
@media(max-width:760px){.twocol{grid-template-columns:1fr}.flow .box{flex-basis:100%}}
|
|
88
|
-
|
|
89
|
-
footer{margin-top:60px;padding-top:16px;border-top:1px solid var(--line);font-size:12px;color:var(--faint)}
|
|
90
|
-
</style>
|
|
91
|
-
</head>
|
|
92
|
-
<body>
|
|
93
|
-
|
|
94
|
-
<nav class="toc"><div class="row">
|
|
95
|
-
<a href="index.html">📖 HOME</a>
|
|
96
|
-
<a href="#flow">Flow</a>
|
|
97
|
-
<a href="#knobs">Knobs</a>
|
|
98
|
-
<a href="#why">Why</a>
|
|
99
|
-
</div></nav>
|
|
100
|
-
|
|
101
|
-
<div class="wrap">
|
|
102
|
-
<div class="crumb"><a href="index.html">HUMAN_LEARN</a> / Widget Pipeline</div>
|
|
103
|
-
<h1>⚙️ Widget Pipeline — how a request becomes a widget</h1>
|
|
104
|
-
<p class="sub">
|
|
105
|
-
One-sentence lead: what this is and when it runs. (Replace this whole page with the
|
|
106
|
-
real, <code>file:line</code>-grounded explanation of the user's topic — this file is only the
|
|
107
|
-
visual template.)
|
|
108
|
-
</p>
|
|
109
|
-
<div class="legend">
|
|
110
|
-
<span><span class="proc hook">trigger</span> what kicks it off</span>
|
|
111
|
-
<span><span class="proc main">core</span> main logic</span>
|
|
112
|
-
<span><span class="proc sub">worker</span> spawned work</span>
|
|
113
|
-
<span><span class="proc disk">store</span> persistence</span>
|
|
114
|
-
</div>
|
|
115
|
-
|
|
116
|
-
<div class="statline">
|
|
117
|
-
<div class="stat"><div class="v">5</div><div class="k">stages</div></div>
|
|
118
|
-
<div class="stat"><div class="v">20</div><div class="k">batch cap</div></div>
|
|
119
|
-
<div class="stat"><div class="v">8 MB</div><div class="k">read window</div></div>
|
|
120
|
-
</div>
|
|
121
|
-
|
|
122
|
-
<h2 id="flow">The flow, step by step</h2>
|
|
123
|
-
<div class="flow">
|
|
124
|
-
<div class="box b-amber"><div class="bt">1 · Trigger</div><div class="bd">what starts it</div><div class="where">file.ext:NN</div></div>
|
|
125
|
-
<div class="arrow">→</div>
|
|
126
|
-
<div class="box b-green"><div class="bt">2 · Read</div><div class="bd">bounded input read</div><div class="where">file.ext:NN</div></div>
|
|
127
|
-
<div class="arrow">→</div>
|
|
128
|
-
<div class="box b-green"><div class="bt">3 · Transform</div><div class="bd">the core step</div><div class="where">file.ext:NN</div></div>
|
|
129
|
-
<div class="arrow">→</div>
|
|
130
|
-
<div class="box b-sub b-violet"><div class="bt">4 · Work</div><div class="bd">spawned subprocess</div><div class="where">file.ext:NN</div></div>
|
|
131
|
-
<div class="arrow">→</div>
|
|
132
|
-
<div class="box b-cyan"><div class="bt">5 · Persist</div><div class="bd">atomic write</div><div class="where">file.ext:NN</div></div>
|
|
133
|
-
</div>
|
|
134
|
-
|
|
135
|
-
<h3>3 · Transform <span class="proc main">core</span> <span class="loc">file.ext:120-148</span></h3>
|
|
136
|
-
<p>Prose explaining the step, with inline <code>constants</code> and a <span class="loc">file.ext:NN</span> for
|
|
137
|
-
each claim. Show a real snippet when it clarifies:</p>
|
|
138
|
-
<pre><code>doThing(input, { cap: 20, windowBytes: 8 * 1024 * 1024 })</code></pre>
|
|
139
|
-
|
|
140
|
-
<div class="callout ok"><strong>Key insight.</strong> The one thing a reader must take away —
|
|
141
|
-
e.g. why the design is correct, or the invariant it preserves.</div>
|
|
142
|
-
|
|
143
|
-
<h2 id="knobs">The knobs</h2>
|
|
144
|
-
<details class="consts" open><summary>All constants (real names + values)</summary>
|
|
145
|
-
<table>
|
|
146
|
-
<tr><th>Constant</th><th>Value</th><th>Where</th><th>Bounds</th></tr>
|
|
147
|
-
<tr><td><code>BATCH</code></td><td>20</td><td><span class="loc">file.ext:50</span></td><td>items per unit of work</td></tr>
|
|
148
|
-
<tr><td><code>MAX_BYTES</code></td><td>8 MB</td><td><span class="loc">file.ext:52</span></td><td>read window per run</td></tr>
|
|
149
|
-
</table>
|
|
150
|
-
</details>
|
|
151
|
-
|
|
152
|
-
<h2 id="why">Why it's shaped this way</h2>
|
|
153
|
-
<div class="twocol">
|
|
154
|
-
<div><h3>Constraint A</h3><p>The real reason — an incident, a platform limit, a cost guard.</p></div>
|
|
155
|
-
<div><h3>Constraint B</h3><p>Another forcing function that explains a non-obvious choice.</p></div>
|
|
156
|
-
</div>
|
|
157
|
-
|
|
158
|
-
<footer>
|
|
159
|
-
HUMAN_LEARN · <project> · generated <date> from <code>file.ext</code> + live on-disk state.
|
|
160
|
-
</footer>
|
|
161
|
-
</div>
|
|
162
|
-
</body>
|
|
163
|
-
</html>
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: find-opportunity
|
|
3
|
-
description: >-
|
|
4
|
-
Triage a shared repo's open issues against open PRs and main to produce a ranked
|
|
5
|
-
shortlist of what to work on next, PLUS an explicit, reasoned skip-list of what NOT to
|
|
6
|
-
pick (already claimed by a PR — even one only referenced via the PR's title, not a
|
|
7
|
-
"Closes #" line — or would conflict with an open PR's diff, or is blocked/needs-decision).
|
|
8
|
-
Recommendation only; the human picks. Never opens or files anything. Use whenever the
|
|
9
|
-
user says "/find-opportunity", "what should I work on next", "pick the next issue", or
|
|
10
|
-
wants a ranked backlog triage for a repo with multiple contributors/open PRs. Keywords:
|
|
11
|
-
triage, backlog, next issue, opportunity, ranked shortlist, skip list, PR conflict,
|
|
12
|
-
issue claimed.
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
# /find-opportunity — rank what to work on next, and say what NOT to touch
|
|
16
|
-
|
|
17
|
-
**Role:** the *triage* front-half of a "work the backlog well" loop
|
|
18
|
-
(`find-opportunity → develop → repeat`). It answers "what should I pick up next in this
|
|
19
|
-
repo" for a shared/multi-contributor project where picking wrong (a duplicate, a merge
|
|
20
|
-
fight) wastes real work. It never implements — that's `/develop`'s job once a human
|
|
21
|
-
approves a pick.
|
|
22
|
-
|
|
23
|
-
**The skip-list is the point, not a footnote.** Knowing what *not* to pick is as
|
|
24
|
-
important as ranking what to pick. Every skip gets a reason and, where applicable, the
|
|
25
|
-
blocking PR number — never a silent omission.
|
|
26
|
-
|
|
27
|
-
## Procedure
|
|
28
|
-
|
|
29
|
-
1. **Gather.** For the target repo (current cwd unless the user names another):
|
|
30
|
-
- Open issues: `gh issue list --state open --json number,title,labels,assignees,body`
|
|
31
|
-
(or the project's own issue tracker if it doesn't use GitHub issues — ask if unclear).
|
|
32
|
-
- Open PRs: `gh pr list --state open --json number,title,body,headRefName,files`.
|
|
33
|
-
- `main`'s current state (`git log --oneline -20`, `git status`) for recency context.
|
|
34
|
-
|
|
35
|
-
2. **Claim-match each issue against open PRs — match aggressively, not just `Closes #`.**
|
|
36
|
-
An issue is CLAIMED when any of these link it to an open PR:
|
|
37
|
-
- The PR body has `Closes #N` / `Fixes #N` / `Resolves #N` (the obvious case).
|
|
38
|
-
- The PR **title** references the issue number (`(#N)`, `#N:`, etc.) — don't rely on
|
|
39
|
-
body-only scanning; a title-only reference is real and easy to miss with a naive
|
|
40
|
-
`Closes #` grep.
|
|
41
|
-
- The PR's branch name encodes the issue number or a close paraphrase of its title.
|
|
42
|
-
- A linked-PR field the tracker itself exposes (GitHub's "Development" issue↔PR link,
|
|
43
|
-
if the API surfaces it).
|
|
44
|
-
|
|
45
|
-
3. **Conflict-match each remaining issue against open PRs' diffs.** For an issue not
|
|
46
|
-
already claimed, check whether fixing it would likely touch files an open PR is
|
|
47
|
-
actively rewriting (`gh pr list --json files` per PR, cross-referenced against the
|
|
48
|
-
issue's likely target files — infer from the issue body/title, or a quick grep for the
|
|
49
|
-
feature area named). High churn overlap on shared/hot files (a core module, a global
|
|
50
|
-
stylesheet several PRs touch) → SKIP or DEFER. Cold files (isolated tests, an
|
|
51
|
-
untouched route) → safe to proceed even if some other PR is open elsewhere in the repo.
|
|
52
|
-
|
|
53
|
-
4. **Skip anything blocked or owned.** `status: needs-decision`, an assignee already set,
|
|
54
|
-
or a "discussion"/"blocked" label → SKIP, not ranked. Not actionable solo.
|
|
55
|
-
|
|
56
|
-
5. **Rank what survives** by impact ÷ conflict-risk. Impact from priority/severity labels,
|
|
57
|
-
blast radius (how many surfaces/users it affects), and staleness (an old high-severity
|
|
58
|
-
bug outranks a new low one). Conflict-risk from step 3's file-overlap check (even a
|
|
59
|
-
non-blocking overlap lowers rank — prefer the fully-cold pick when impact is close).
|
|
60
|
-
|
|
61
|
-
6. **Report both lists, every entry reasoned:**
|
|
62
|
-
- **Shortlist** (ranked): issue #, title, one-line reasoning (why this rank), impact
|
|
63
|
-
signal, conflict-risk signal.
|
|
64
|
-
- **Skip list** (unranked, exhaustive over everything considered): issue #, title,
|
|
65
|
-
reason (claimed by PR #N via <title/body/branch> / conflicts with PR #M's diff on
|
|
66
|
-
`<file>` / blocked-status / needs-decision / assignee set). Never drop an item
|
|
67
|
-
silently — if it was considered, it's in one list or the other.
|
|
68
|
-
|
|
69
|
-
7. **Recommend, don't act.** End with the top pick and why, but the human chooses. Do not
|
|
70
|
-
open an issue, start work, or file a PR from this skill — that's `/develop`'s job,
|
|
71
|
-
invoked separately once a pick is approved.
|
|
72
|
-
|
|
73
|
-
## Notes
|
|
74
|
-
|
|
75
|
-
- This skill only *reads* the tracker (issues/PRs) and git state — it makes no commits,
|
|
76
|
-
opens nothing, and files nothing. If the loop surfaces a genuine follow-up that can't be
|
|
77
|
-
picked now, note it in the report; do not auto-file a new issue or open an Epic
|
|
78
|
-
for it. Filing anything public/outward is a human decision, not this skill's default.
|
|
79
|
-
- Don't rank an item you couldn't verify is actually unclaimed and non-conflicting — when
|
|
80
|
-
in doubt, put it in the skip list with the uncertainty stated, rather than ranking a
|
|
81
|
-
risky guess highly.
|
|
82
|
-
- Standalone-useful on its own (triage without ever running `quality: high` on the pick) —
|
|
83
|
-
don't assume this skill is only ever the front-half of a longer loop.
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-address:select:fetch-pool
|
|
3
|
-
description: Fetch the FULL open-issue pool on the current project's repo with bodies, with verified completeness (not just a fixed --limit guess). First sub-step of issue-address:select.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# issue-address:select:fetch-pool
|
|
7
|
-
|
|
8
|
-
## Steps
|
|
9
|
-
|
|
10
|
-
1. **Fetch with a generous limit, then verify nothing was truncated** — don't trust a
|
|
11
|
-
single fixed `--limit` the way an earlier version of this skill (and, separately,
|
|
12
|
-
`pr-review-sweep`'s original GraphQL query) did; both silently truncated real data on
|
|
13
|
-
this repo before. Converge instead of guessing:
|
|
14
|
-
```bash
|
|
15
|
-
LIMIT=100
|
|
16
|
-
while true; do
|
|
17
|
-
COUNT=$(gh issue list --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --state open --limit "$LIMIT" --json number --jq 'length')
|
|
18
|
-
if [ "$COUNT" -lt "$LIMIT" ]; then break; fi # got everything — count came in under the cap
|
|
19
|
-
LIMIT=$((LIMIT * 2)) # cap was hit exactly — double and re-check
|
|
20
|
-
done
|
|
21
|
-
gh issue list --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --state open --limit "$LIMIT" \
|
|
22
|
-
--json number,title,body,labels,assignees,comments,createdAt,reactionGroups
|
|
23
|
-
```
|
|
24
|
-
`COUNT == LIMIT` is the tell that you hit the ceiling, not the true end of the list —
|
|
25
|
-
never treat that as "done." Only stop once a fetch returns fewer results than it was
|
|
26
|
-
capped at.
|
|
27
|
-
|
|
28
|
-
2. **Fetch bodies, not just titles.** Title-only scanning is what let issue #180 get
|
|
29
|
-
picked without anyone reading its file/line citations first. `body` and `comments` are
|
|
30
|
-
required output fields, not optional — the next sub-steps depend on them.
|
|
31
|
-
|
|
32
|
-
3. **Also fetch `reactionGroups`** (👍/👎 counts) — a real, if imperfect, community-signal
|
|
33
|
-
input for `issue-address:select:rank-impact` later, beyond just label text.
|
|
34
|
-
|
|
35
|
-
## Output
|
|
36
|
-
|
|
37
|
-
The full, verified-complete list of open issues with bodies, labels, assignees, comments,
|
|
38
|
-
and reaction counts — handed to `issue-address:select:reject-fixed` next.
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-address:select:reject-fixed
|
|
3
|
-
description: Reject candidates from issue-address:select:fetch-pool's pool that are already fixed in current code, by checking the actual file/behavior each issue cites against a freshly-fetched origin/main — semantically, not just a literal string grep. Second sub-step of issue-address:select.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# issue-address:select:reject-fixed
|
|
7
|
-
|
|
8
|
-
The check that would have caught issue #180 before any other work started — its body
|
|
9
|
-
cited `apps/web/app/app.css` around specific line numbers, and the current code already
|
|
10
|
-
had the exact fix (`min-width: 0`) the issue was reporting the absence of.
|
|
11
|
-
|
|
12
|
-
## Steps
|
|
13
|
-
|
|
14
|
-
0. **Fetch fresh before checking anything.** `git fetch origin main` first, and read
|
|
15
|
-
against `origin/main`, not a local branch — a local checkout can be stale or on an
|
|
16
|
-
unrelated feature branch, and a stale read produces a false "still broken" verdict.
|
|
17
|
-
(Found live: `#194` looked unfixed against a stale local branch, but `origin/main` had
|
|
18
|
-
merged the fix days earlier.)
|
|
19
|
-
|
|
20
|
-
1. **For each candidate whose body cites a specific file, line, function, or CSS
|
|
21
|
-
selector/rule**, read the actual current code at that location:
|
|
22
|
-
```bash
|
|
23
|
-
git show origin/main:<cited-path> | sed -n '<start>,<end>p'
|
|
24
|
-
```
|
|
25
|
-
or grep for the cited selector/function name if line numbers have drifted (files get
|
|
26
|
-
reorganized — issue #180's citation was for `apps/web/app/app.css`, which had since
|
|
27
|
-
been split into `apps/web/app/styles/*.css`; searching by class/function name across
|
|
28
|
-
the styles directory found the real current location).
|
|
29
|
-
|
|
30
|
-
2. **Check the behavior semantically, not just for the literal string the issue used.** A
|
|
31
|
-
fix can land in a different code *shape* than the issue's own words. (Found live: `#57`
|
|
32
|
-
asked for a `<link rel="canonical">` tag; a literal grep for `rel="canonical"` found
|
|
33
|
-
nothing, so the naive check would have called it unfixed — but the actual fix was a
|
|
34
|
-
data-driven React Router `meta()` descriptor, `{ tagName: 'link', rel: 'canonical', href
|
|
35
|
-
}`, which produces the same tag at render time without ever containing that literal
|
|
36
|
-
string in source.) Before concluding "not fixed" on a bare grep miss:
|
|
37
|
-
- Search one level broader — the surrounding directory/module, a shared
|
|
38
|
-
helper/util file, a `meta.ts`/`config.ts`-style indirection layer — for the *behavior*
|
|
39
|
-
the issue describes, not just its exact wording.
|
|
40
|
-
- If the issue names a concrete symptom (a missing tag, a wrong computed value, a
|
|
41
|
-
missing gate), look for whatever code *produces* that output, however it's
|
|
42
|
-
structured, before deciding the symptom is still present.
|
|
43
|
-
|
|
44
|
-
3. **Compare what the issue describes as broken against what the code currently does.**
|
|
45
|
-
If the issue's own hypothesized fix (or an equivalent one, per step 2) is already
|
|
46
|
-
present — reject, log as `already-fixed`, cite the exact current file:line as evidence.
|
|
47
|
-
Don't spend a full `issue-address:reproduce` pass confirming what a direct code read
|
|
48
|
-
already answered.
|
|
49
|
-
|
|
50
|
-
4. **If the citation is vague, or the file has moved/renamed and a reasonably broadened
|
|
51
|
-
search (step 2) still finds nothing**, don't reject on inconclusive evidence — mark the
|
|
52
|
-
candidate `unconfirmed` and let it pass through to the next sub-step. This step only
|
|
53
|
-
rejects on positive evidence of an existing fix, never on failure-to-locate.
|
|
54
|
-
|
|
55
|
-
5. **If the git history around that file shows the fix landed suspiciously close to the
|
|
56
|
-
issue's `createdAt`** (within a day or two, either direction), note that explicitly —
|
|
57
|
-
it's a strong signal the report and the fix crossed in flight (exactly what happened
|
|
58
|
-
with #180: fix committed 2026-06-29, issue filed 2026-06-30).
|
|
59
|
-
|
|
60
|
-
## Output
|
|
61
|
-
|
|
62
|
-
Two lists: `already-fixed` (rejected, with evidence) and `survives` (candidates to pass to
|
|
63
|
-
`issue-address:select:reject-claimed` next, tagged `unconfirmed` where this step couldn't
|
|
64
|
-
conclusively check).
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-address:select:reject-claimed
|
|
3
|
-
description: Reject candidates already covered by a PR (open, OR closed-but-superseded-by-a-merged-successor) or already claimed by an assignee/comment/supersede-note — with every text-search hit manually confirmed before being trusted. Third sub-step of issue-address:select.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# issue-address:select:reject-claimed
|
|
7
|
-
|
|
8
|
-
## Steps
|
|
9
|
-
|
|
10
|
-
1. **Search for a PR that might already cover each surviving candidate — open AND
|
|
11
|
-
closed, not just open:**
|
|
12
|
-
```bash
|
|
13
|
-
gh pr list --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --state all --search "<N> in:body"
|
|
14
|
-
gh api search/issues -f q='repo:$(gh repo view --json nameWithOwner -q .nameWithOwner) is:pr <N>'
|
|
15
|
-
```
|
|
16
|
-
Also skim PR titles for matching subject matter (same file area, same symptom) — a PR
|
|
17
|
-
can fix an issue's bug without a formal `Closes #N` link. Searching only `state:open`
|
|
18
|
-
misses the real case found live: `#194` had two closed (not merged) PRs, `#203`/`#215`,
|
|
19
|
-
each superseded — but the actual fix landed in a *third*, later PR (`#251`) that neither
|
|
20
|
-
text-search-by-issue-number pass would find unless the closed ones are read first and
|
|
21
|
-
followed to what replaced them (step 3).
|
|
22
|
-
|
|
23
|
-
2. **Never trust a text-search hit without reading it.** This already produced a false
|
|
24
|
-
positive once: searching `"180 in:body"` matched PR #239 ("add automated price-anomaly
|
|
25
|
-
screen"), which had nothing to do with issue #180 — the digit string almost certainly
|
|
26
|
-
matched a line number or unrelated number elsewhere in that PR's body. For every
|
|
27
|
-
text-search hit:
|
|
28
|
-
- Open the matched PR's actual title + description.
|
|
29
|
-
- Confirm it genuinely addresses the same file area / same symptom the issue describes
|
|
30
|
-
— not just that the issue number appears somewhere in the text.
|
|
31
|
-
- If it's a false positive (number coincidence, unrelated context), **discard the match
|
|
32
|
-
and keep the candidate as unclaimed** — don't reject on a search artifact.
|
|
33
|
-
|
|
34
|
-
3. **For every closed-but-not-merged PR found in step 1, read its closing comment before
|
|
35
|
-
deciding the candidate survives.** A PR closed without merging is not automatically
|
|
36
|
-
"unclaimed again" — read why it closed:
|
|
37
|
-
```bash
|
|
38
|
-
gh pr view <PR#> --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --json state,mergedAt,closedAt,comments
|
|
39
|
-
```
|
|
40
|
-
- If the closing comment says the work was split/replaced ("затварям... но не защото
|
|
41
|
-
работата е отпаднала", "closing in favor of #N", "superseded by #N", "merged into
|
|
42
|
-
#N"), **follow the chain to whatever PR(s) it names**, and check *their* merge state
|
|
43
|
-
the same way. Keep following until you reach a terminal state (merged = reject as
|
|
44
|
-
already-fixed; still open = reject as already-covered; abandoned with no successor =
|
|
45
|
-
candidate survives).
|
|
46
|
-
- This chain can be more than one hop deep (found live: `#194`'s PR `#203` was split
|
|
47
|
-
into `#251`/`#252`/`#253`; a sibling PR `#215` was independently closed in favor of
|
|
48
|
-
the same `#251`) — don't stop at the first successor if its own comments point
|
|
49
|
-
further.
|
|
50
|
-
|
|
51
|
-
4. **Reject candidates already claimed by a person, or already noted as superseded in the
|
|
52
|
-
issue's OWN comments** (not just a linked PR's). Check `assignees` (non-empty =
|
|
53
|
-
explicit claim) and skim the issue's `comments` for:
|
|
54
|
-
- Claim language: "работя по това", "assigned to me", "I'll pick this up".
|
|
55
|
-
- Supersede/decompose language: "предлагам да се затвори в полза на", "closing in
|
|
56
|
-
favor of", "split into #N / #M / #P", "superseded by". (Found live: `#154`'s own
|
|
57
|
-
comment thread explicitly proposed closing it in favor of child issues `#156`/`#158`/
|
|
58
|
-
`#163` — a signal that lives in the issue's comments, not in any PR search at all.)
|
|
59
|
-
Reject on either signal — don't take work someone else already started or already
|
|
60
|
-
restructured, even informally.
|
|
61
|
-
|
|
62
|
-
5. **Search for a duplicate open issue** describing the same underlying bug under a
|
|
63
|
-
different number — `gh issue list --state open --search "<keywords>"`, same
|
|
64
|
-
confirm-before-trusting rule as step 2 applies here too. If a better-established
|
|
65
|
-
duplicate exists, flag it rather than silently picking one.
|
|
66
|
-
|
|
67
|
-
## Output
|
|
68
|
-
|
|
69
|
-
`survives` list (candidates cleared of PR/claim/supersede/duplicate overlap — including
|
|
70
|
-
resolved multi-hop PR chains — with any false-positive search hits explicitly noted as
|
|
71
|
-
discarded) handed to `issue-address:select:rank-impact`.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-address:select:rank-impact
|
|
3
|
-
description: Rank surviving candidates by a composite impact signal (priority label + community reactions + cross-references + repro quality), not label text alone, and output exactly one issue number. Final sub-step of issue-address:select.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# issue-address:select:rank-impact
|
|
7
|
-
|
|
8
|
-
## Steps
|
|
9
|
-
|
|
10
|
-
1. **Score each surviving candidate on multiple signals, not just its `priority:` label**
|
|
11
|
-
(a label-only heuristic silently mis-ranks an unlabeled-but-severe issue below a
|
|
12
|
-
labeled-but-minor one):
|
|
13
|
-
- **Priority label**: `high` > `medium` > `low` > none (weakest single signal alone).
|
|
14
|
-
- **Category label**: `bug`/`security`/`data-quality` outrank `enhancement`/
|
|
15
|
-
`discussion`/`docs` for this skill's purpose (fixing something broken, not building
|
|
16
|
-
something new).
|
|
17
|
-
- **Community reaction count** (from `fetch-pool`'s `reactionGroups`) — more 👍 reactions
|
|
18
|
-
is a real signal of user-felt impact independent of whatever label was applied at
|
|
19
|
-
triage time.
|
|
20
|
-
- **Cross-references** — check `gh issue view <N> --json timelineItems` (or equivalent)
|
|
21
|
-
for how many other issues/PRs reference this one; a heavily-cross-referenced issue is
|
|
22
|
-
blocking or informing other work, raising its effective priority above its label.
|
|
23
|
-
- **Repro quality** — concrete repro steps / cited file-line locations beat a vague
|
|
24
|
-
report; cheaper to reproduce reliably, lower risk of another #180-style dead end.
|
|
25
|
-
|
|
26
|
-
2. **Combine into a ranked order** — no single signal should override all others (e.g.
|
|
27
|
-
don't let one 👍 reaction alone outrank an explicit `priority: high` label; use
|
|
28
|
-
priority + category as the primary sort, reaction count + cross-references as
|
|
29
|
-
tie-breakers within a tier, repro quality as the final tie-breaker).
|
|
30
|
-
|
|
31
|
-
3. **Output exactly one issue number** — the top of the ranked list — with a one-line
|
|
32
|
-
justification citing which signals won, plus the full ranked list (not just the
|
|
33
|
-
winner) and the rejected list from the earlier two sub-steps, so the whole selection
|
|
34
|
-
is auditable, not just its conclusion.
|
|
35
|
-
|
|
36
|
-
## Output
|
|
37
|
-
|
|
38
|
-
Hand off the single selected issue number to `issue-address:confirm-open`, which
|
|
39
|
-
re-verifies it fresh (state, PR/duplicate claims) immediately before work starts.
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-address:select
|
|
3
|
-
description: Step 0 of issue-address — select exactly ONE open issue on the current project's repo to work, by orchestrating 4 nested sub-skills (fetch-pool, reject-fixed, reject-claimed, rank-impact) in sequence. Only invoked when the caller hasn't already named a specific issue number.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# issue-address:select (sub-orchestrator)
|
|
7
|
-
|
|
8
|
-
Only runs when `issue-address` is invoked without a specific issue number already named
|
|
9
|
-
(if the caller already has one, skip straight to `issue-address:confirm-open` — that step
|
|
10
|
-
re-verifies the single chosen issue right before work starts, as a freshness guard; this
|
|
11
|
-
skill's job is choosing which issue out of many, cheaply and verifiably, across the whole
|
|
12
|
-
pool).
|
|
13
|
-
|
|
14
|
-
Exists because of a real incident: issue #180 was picked by title/label alone, and 2 full
|
|
15
|
-
`issue-address` steps ran before discovering — only once `issue-address:reproduce`
|
|
16
|
-
actually tried to reproduce it — that the fix had already shipped a day before the issue
|
|
17
|
-
was even filed. The information needed to catch that (the issue's own cited file/line + a
|
|
18
|
-
grep of current code) was available for free at selection time and simply wasn't checked.
|
|
19
|
-
|
|
20
|
-
This skill is itself further decomposed into 4 nested sub-skills, for the same reason
|
|
21
|
-
`issue-address` is decomposed: so each check is independently invokable and its result
|
|
22
|
-
inspectable, instead of one opaque scan-and-pick pass. It also closes two gaps found after
|
|
23
|
-
the first version shipped: an unverified fetch limit (the same class of silent-truncation
|
|
24
|
-
bug that hit `pr-review-sweep`), and an unconfirmed PR-search false positive (seen live in
|
|
25
|
-
the #180 trial — a text search on "180" matched an unrelated PR by number coincidence).
|
|
26
|
-
|
|
27
|
-
**Naming convention:** sub-directories are prefixed `0-`, `1-`, `2-`, `3-` in execution
|
|
28
|
-
order (see `issue-address/SKILL.md` for the repo-wide rule) — a plain directory listing of
|
|
29
|
-
this folder sorts in DAG order without opening any file.
|
|
30
|
-
|
|
31
|
-
## Pipeline DAG
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
open-issue pool
|
|
35
|
-
│
|
|
36
|
-
▼
|
|
37
|
-
┌─────────────────────────────┐
|
|
38
|
-
│ 0. select:fetch-pool │ verified-complete fetch (no silent truncation)
|
|
39
|
-
└─────────────────────────────┘
|
|
40
|
-
│ full pool w/ bodies, labels, assignees, comments, reactions
|
|
41
|
-
▼
|
|
42
|
-
┌─────────────────────────────┐
|
|
43
|
-
│ 1. select:reject-fixed │ grep current code at each cited file/line
|
|
44
|
-
└─────────────────────────────┘
|
|
45
|
-
│ survives (already-fixed candidates dropped, evidence logged)
|
|
46
|
-
▼
|
|
47
|
-
┌─────────────────────────────┐
|
|
48
|
-
│ 2. select:reject-claimed │ PR-search hits confirmed, not trusted blind
|
|
49
|
-
└─────────────────────────────┘
|
|
50
|
-
│ survives (PR'd/claimed/duplicate candidates dropped, evidence logged)
|
|
51
|
-
▼
|
|
52
|
-
┌─────────────────────────────┐
|
|
53
|
-
│ 3. select:rank-impact │ composite score, not label text alone
|
|
54
|
-
└─────────────────────────────┘
|
|
55
|
-
│
|
|
56
|
-
▼
|
|
57
|
-
one issue number + full audit trail (ranked list, rejected list, why)
|
|
58
|
-
│
|
|
59
|
-
▼
|
|
60
|
-
issue-address:confirm-open (next skill up the chain, outside this sub-orchestrator)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
| Step | Input | Output | On failure/empty |
|
|
64
|
-
|---|---|---|---|
|
|
65
|
-
| 0. `select:fetch-pool` | none (repo-wide `gh issue list`) | full open-issue pool, verified-complete | n/a — loops its own fetch until verified complete |
|
|
66
|
-
| 1. `select:reject-fixed` | full pool | `already-fixed` list (w/ evidence) + `survives` list | if pool empties out here, report "no candidates, all already fixed" |
|
|
67
|
-
| 2. `select:reject-claimed` | `survives` from step 1 | `already-claimed` list (w/ evidence) + `survives` list | if pool empties out here, report "no candidates, all claimed/PR'd" |
|
|
68
|
-
| 3. `select:rank-impact` | `survives` from step 2 | one issue number + ranked list + justification | if `survives` was already empty, report the empty pool rather than fabricating a pick |
|
|
69
|
-
|
|
70
|
-
## Output
|
|
71
|
-
|
|
72
|
-
Hand off the single selected issue number to `issue-address:confirm-open`, which
|
|
73
|
-
re-verifies it fresh (state, PR/duplicate claims) immediately before work starts — this
|
|
74
|
-
skill's checks are about narrowing a big pool cheaply and verifiably; confirm-open's
|
|
75
|
-
checks are about not acting on stale information for the one issue actually chosen.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-address:confirm-open
|
|
3
|
-
description: Step 1 of issue-address — confirm a named GitHub issue on the current project's repo is genuinely OPEN and not already claimed/fixed by another PR or duplicate issue, before any work starts. Returns a clear go/no-go.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# issue-address:confirm-open
|
|
7
|
-
|
|
8
|
-
Called with one issue number `<N>`. Produces a go/no-go verdict before any code work begins.
|
|
9
|
-
|
|
10
|
-
## Steps
|
|
11
|
-
|
|
12
|
-
1. **Fetch the issue.**
|
|
13
|
-
```bash
|
|
14
|
-
gh issue view <N> --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --json state,title,body,comments,url
|
|
15
|
-
```
|
|
16
|
-
If `state` is not `OPEN` — **stop, no-go.** Report the actual state (closed/merged
|
|
17
|
-
reference) and why. Do not proceed to reproduce or fix a closed issue.
|
|
18
|
-
|
|
19
|
-
2. **Search for an existing open PR that already covers it** — check both explicit links
|
|
20
|
-
and subject-matter overlap, since a PR can fix the bug without a formal `Closes #N`:
|
|
21
|
-
```bash
|
|
22
|
-
gh pr list --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --state open --search "<N> in:body"
|
|
23
|
-
gh api search/issues -f q='repo:$(gh repo view --json nameWithOwner -q .nameWithOwner) is:pr is:open <N>'
|
|
24
|
-
```
|
|
25
|
-
Also skim open PR titles for matching subject matter (same file area, same symptom).
|
|
26
|
-
If found — **stop, no-go.** Report which PR number and why it looks like a match; don't
|
|
27
|
-
duplicate work already in flight.
|
|
28
|
-
|
|
29
|
-
3. **Search for a duplicate open issue** covering the same underlying bug (different
|
|
30
|
-
number, same root cause) — `gh issue list --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --state open --search
|
|
31
|
-
"<keywords>"`. If a duplicate exists and is a better-established report, flag it — the
|
|
32
|
-
caller decides which one to actually work.
|
|
33
|
-
|
|
34
|
-
4. **Verdict.** Return one of:
|
|
35
|
-
- **GO** — issue is open, unclaimed, no duplicate blocking it. Include the issue title,
|
|
36
|
-
body, and any repro steps mentioned in comments, so the next step doesn't have to
|
|
37
|
-
re-fetch them.
|
|
38
|
-
- **NO-GO** — state why (closed / already covered by PR #X / duplicate of #Y), and stop
|
|
39
|
-
the whole `issue-address` sequence here. Do not continue to reproduce/fix.
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: issue-address:claim
|
|
3
|
-
description: Step 2 of issue-address — claim a confirmed-open, confirmed-unclaimed issue on the current project's repo before reproducing/fixing it, by self-assigning and posting a claim comment via the gh CLI (no dedicated GitHub MCP server is connected in this environment — gh is the actual mechanism). Closes the race condition where two runs could pick the same issue.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# issue-address:claim
|
|
7
|
-
|
|
8
|
-
Runs immediately after `issue-address:confirm-open` returns GO, and before
|
|
9
|
-
`issue-address:reproduce` starts any work. Exists because confirming an issue is
|
|
10
|
-
open/unclaimed and then *starting work on it* are two different moments in time — without
|
|
11
|
-
an explicit claim in between, a second concurrent run of this same skill (or a human
|
|
12
|
-
contributor) could pick the same issue, and nothing in `issue-address:select`'s
|
|
13
|
-
`reject-claimed` check would have caught it, since that check only looks for assignees and
|
|
14
|
-
existing claim-language comments — which don't exist yet for an issue nobody has started.
|
|
15
|
-
|
|
16
|
-
**No dedicated GitHub/issue-tracking MCP server is connected in this environment** — every
|
|
17
|
-
GitHub interaction in this whole skill chain (and everywhere else this session) goes
|
|
18
|
-
through the `gh` CLI via Bash. If a GitHub MCP server becomes available later, swap the
|
|
19
|
-
commands below for its equivalent calls; until then, `gh` is the actual mechanism, not a
|
|
20
|
-
gap to work around.
|
|
21
|
-
|
|
22
|
-
## Steps
|
|
23
|
-
|
|
24
|
-
1. **Self-assign**, so the issue shows a claim to anyone else's `select:reject-claimed`
|
|
25
|
-
pass or manual look:
|
|
26
|
-
```bash
|
|
27
|
-
gh issue edit <N> --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --add-assignee "@me"
|
|
28
|
-
```
|
|
29
|
-
If self-assignment fails (e.g. insufficient repo permissions — a common case for
|
|
30
|
-
external contributors on a repo they don't have write access to), don't halt the
|
|
31
|
-
sequence on that alone; fall back to step 2's comment as the claim signal, and note in
|
|
32
|
-
the report that assignment wasn't possible so a human knows to check.
|
|
33
|
-
|
|
34
|
-
2. **Post a claim comment** — visible even to someone who doesn't check assignees,
|
|
35
|
-
and consistent with the claim-language `select:reject-claimed` already scans for
|
|
36
|
-
("I'll pick this up", "working on this"; a project with a non-English contributor base,
|
|
37
|
-
e.g. `midt-bg/sigma`'s Bulgarian-speaking reviewers, may localize this string — check
|
|
38
|
-
the project's own `AGENTS.md`/`CLAUDE.local.md` for a house phrase before defaulting to
|
|
39
|
-
English):
|
|
40
|
-
```bash
|
|
41
|
-
gh issue comment <N> --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --body "Working on this issue (issue-address skill chain). Will link the PR here after fix + verify."
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
3. **Re-confirm the claim actually landed** before proceeding — read the issue back and
|
|
45
|
-
check the assignee list and/or the posted comment are present:
|
|
46
|
-
```bash
|
|
47
|
-
gh issue view <N> --repo "$(gh repo view --json nameWithOwner -q .nameWithOwner)" --json assignees,comments
|
|
48
|
-
```
|
|
49
|
-
If neither the assignment nor the comment is visible, don't silently proceed as if
|
|
50
|
-
claimed — report the failure; a claim that didn't actually post protects nobody.
|
|
51
|
-
|
|
52
|
-
## Output
|
|
53
|
-
|
|
54
|
-
Hand off to `issue-address:reproduce` — same issue number, now with a real claim on
|
|
55
|
-
record. If this step's own re-confirmation fails (step 3), stop the sequence and report,
|
|
56
|
-
same severity as a `confirm-open` NO-GO — proceeding to reproduce/fix on an issue that
|
|
57
|
-
isn't actually marked claimed defeats the point of adding this step.
|