@decibelsystems/tools 2.2.0-beta.0 → 3.1.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/CHANGELOG.md +226 -0
- package/dist/agentCommands.d.ts +0 -1
- package/dist/agentCommands.d.ts.map +1 -1
- package/dist/agentCommands.js +19 -8
- package/dist/agentCommands.js.map +1 -1
- package/dist/agentPresence.d.ts +82 -0
- package/dist/agentPresence.d.ts.map +1 -1
- package/dist/agentPresence.js +194 -26
- package/dist/agentPresence.js.map +1 -1
- package/dist/agentic/index.d.ts +18 -8
- package/dist/agentic/index.d.ts.map +1 -1
- package/dist/agentic/index.js +18 -144
- package/dist/agentic/index.js.map +1 -1
- package/dist/agentic/types.d.ts +106 -0
- package/dist/agentic/types.d.ts.map +1 -1
- package/dist/agentic/types.js +77 -1
- package/dist/agentic/types.js.map +1 -1
- package/dist/architectAdrs.d.ts +27 -3
- package/dist/architectAdrs.d.ts.map +1 -1
- package/dist/architectAdrs.js +92 -4
- package/dist/architectAdrs.js.map +1 -1
- package/dist/artifacts.d.ts +60 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +208 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/asks.d.ts +93 -0
- package/dist/asks.d.ts.map +1 -0
- package/dist/asks.js +383 -0
- package/dist/asks.js.map +1 -0
- package/dist/chat.d.ts +47 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +288 -0
- package/dist/chat.js.map +1 -0
- package/dist/client/transports.d.ts.map +1 -1
- package/dist/client/transports.js +13 -3
- package/dist/client/transports.js.map +1 -1
- package/dist/daemon.d.ts +33 -3
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +225 -52
- package/dist/daemon.js.map +1 -1
- package/dist/daemonConfig.d.ts +46 -0
- package/dist/daemonConfig.d.ts.map +1 -1
- package/dist/daemonConfig.js +57 -12
- package/dist/daemonConfig.js.map +1 -1
- package/dist/decibelPaths.d.ts.map +1 -1
- package/dist/decibelPaths.js +39 -6
- package/dist/decibelPaths.js.map +1 -1
- package/dist/domain/issue.d.ts +81 -0
- package/dist/domain/issue.d.ts.map +1 -0
- package/dist/domain/issue.js +106 -0
- package/dist/domain/issue.js.map +1 -0
- package/dist/domain/issueCodec.d.ts +39 -0
- package/dist/domain/issueCodec.d.ts.map +1 -0
- package/dist/domain/issueCodec.js +308 -0
- package/dist/domain/issueCodec.js.map +1 -0
- package/dist/domain/issueRepository.d.ts +124 -0
- package/dist/domain/issueRepository.d.ts.map +1 -0
- package/dist/domain/issueRepository.js +296 -0
- package/dist/domain/issueRepository.js.map +1 -0
- package/dist/domain/uid.d.ts +16 -0
- package/dist/domain/uid.d.ts.map +1 -0
- package/dist/domain/uid.js +43 -0
- package/dist/domain/uid.js.map +1 -0
- package/dist/facades/definitions.d.ts +0 -1
- package/dist/facades/definitions.d.ts.map +1 -1
- package/dist/facades/definitions.js +140 -116
- package/dist/facades/definitions.js.map +1 -1
- package/dist/facades/index.d.ts +2 -1
- package/dist/facades/index.d.ts.map +1 -1
- package/dist/facades/index.js +1 -1
- package/dist/facades/index.js.map +1 -1
- package/dist/facades/types.d.ts +17 -0
- package/dist/facades/types.d.ts.map +1 -1
- package/dist/hq/defineAgent.d.ts.map +1 -1
- package/dist/hq/defineAgent.js +7 -11
- package/dist/hq/defineAgent.js.map +1 -1
- package/dist/httpArgs.d.ts +11 -0
- package/dist/httpArgs.d.ts.map +1 -0
- package/dist/httpArgs.js +39 -0
- package/dist/httpArgs.js.map +1 -0
- package/dist/httpServer.d.ts +1 -12
- package/dist/httpServer.d.ts.map +1 -1
- package/dist/httpServer.js +298 -144
- package/dist/httpServer.js.map +1 -1
- package/dist/identity.d.ts +123 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +312 -0
- package/dist/identity.js.map +1 -0
- package/dist/kernel.d.ts +46 -1
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +334 -26
- package/dist/kernel.js.map +1 -1
- package/dist/killSwitch.d.ts +117 -0
- package/dist/killSwitch.d.ts.map +1 -0
- package/dist/killSwitch.js +161 -0
- package/dist/killSwitch.js.map +1 -0
- package/dist/lib/agent-services/assumptions.d.ts.map +1 -1
- package/dist/lib/agent-services/assumptions.js +8 -2
- package/dist/lib/agent-services/assumptions.js.map +1 -1
- package/dist/lib/atomicWrite.d.ts +49 -0
- package/dist/lib/atomicWrite.d.ts.map +1 -0
- package/dist/lib/atomicWrite.js +157 -0
- package/dist/lib/atomicWrite.js.map +1 -0
- package/dist/lib/envelope.d.ts +31 -0
- package/dist/lib/envelope.d.ts.map +1 -0
- package/dist/lib/envelope.js +80 -0
- package/dist/lib/envelope.js.map +1 -0
- package/dist/lib/fileLock.d.ts +38 -0
- package/dist/lib/fileLock.d.ts.map +1 -0
- package/dist/lib/fileLock.js +124 -0
- package/dist/lib/fileLock.js.map +1 -0
- package/dist/lib/recordIdAllocator.d.ts +102 -0
- package/dist/lib/recordIdAllocator.d.ts.map +1 -0
- package/dist/lib/recordIdAllocator.js +179 -0
- package/dist/lib/recordIdAllocator.js.map +1 -0
- package/dist/orgId.d.ts +23 -0
- package/dist/orgId.d.ts.map +1 -0
- package/dist/orgId.js +73 -0
- package/dist/orgId.js.map +1 -0
- package/dist/pairCli.d.ts +2 -0
- package/dist/pairCli.d.ts.map +1 -0
- package/dist/pairCli.js +97 -0
- package/dist/pairCli.js.map +1 -0
- package/dist/peerBroker.d.ts +40 -0
- package/dist/peerBroker.d.ts.map +1 -0
- package/dist/peerBroker.js +70 -0
- package/dist/peerBroker.js.map +1 -0
- package/dist/peerBrokerSupervisor.d.ts +21 -0
- package/dist/peerBrokerSupervisor.d.ts.map +1 -0
- package/dist/peerBrokerSupervisor.js +131 -0
- package/dist/peerBrokerSupervisor.js.map +1 -0
- package/dist/projectPaths.d.ts.map +1 -1
- package/dist/projectPaths.js +1 -19
- package/dist/projectPaths.js.map +1 -1
- package/dist/projectRegistry.d.ts +22 -0
- package/dist/projectRegistry.d.ts.map +1 -1
- package/dist/projectRegistry.js +69 -2
- package/dist/projectRegistry.js.map +1 -1
- package/dist/pty/boundary.d.ts +39 -0
- package/dist/pty/boundary.d.ts.map +1 -0
- package/dist/pty/boundary.js +100 -0
- package/dist/pty/boundary.js.map +1 -0
- package/dist/pty/errors.d.ts +6 -0
- package/dist/pty/errors.d.ts.map +1 -0
- package/dist/pty/errors.js +12 -0
- package/dist/pty/errors.js.map +1 -0
- package/dist/pty/fleet.d.ts +159 -0
- package/dist/pty/fleet.d.ts.map +1 -0
- package/dist/pty/fleet.js +543 -0
- package/dist/pty/fleet.js.map +1 -0
- package/dist/pty/launchProfile.d.ts +45 -0
- package/dist/pty/launchProfile.d.ts.map +1 -0
- package/dist/pty/launchProfile.js +149 -0
- package/dist/pty/launchProfile.js.map +1 -0
- package/dist/pty/openTerminal.d.ts +48 -0
- package/dist/pty/openTerminal.d.ts.map +1 -0
- package/dist/pty/openTerminal.js +185 -0
- package/dist/pty/openTerminal.js.map +1 -0
- package/dist/pty/pairDialog.d.ts +16 -0
- package/dist/pty/pairDialog.d.ts.map +1 -0
- package/dist/pty/pairDialog.js +121 -0
- package/dist/pty/pairDialog.js.map +1 -0
- package/dist/pty/pairing.d.ts +86 -0
- package/dist/pty/pairing.d.ts.map +1 -0
- package/dist/pty/pairing.js +351 -0
- package/dist/pty/pairing.js.map +1 -0
- package/dist/pty/routes.d.ts +49 -0
- package/dist/pty/routes.d.ts.map +1 -0
- package/dist/pty/routes.js +624 -0
- package/dist/pty/routes.js.map +1 -0
- package/dist/pty/sessions.d.ts +167 -0
- package/dist/pty/sessions.d.ts.map +1 -0
- package/dist/pty/sessions.js +513 -0
- package/dist/pty/sessions.js.map +1 -0
- package/dist/pty/tmux.d.ts +109 -0
- package/dist/pty/tmux.d.ts.map +1 -0
- package/dist/pty/tmux.js +271 -0
- package/dist/pty/tmux.js.map +1 -0
- package/dist/roster.d.ts +37 -0
- package/dist/roster.d.ts.map +1 -0
- package/dist/roster.js +126 -0
- package/dist/roster.js.map +1 -0
- package/dist/runtime/circuitBreaker.d.ts +95 -0
- package/dist/runtime/circuitBreaker.d.ts.map +1 -0
- package/dist/runtime/circuitBreaker.js +178 -0
- package/dist/runtime/circuitBreaker.js.map +1 -0
- package/dist/runtime/daemonMeta.d.ts +53 -0
- package/dist/runtime/daemonMeta.d.ts.map +1 -0
- package/dist/runtime/daemonMeta.js +121 -0
- package/dist/runtime/daemonMeta.js.map +1 -0
- package/dist/runtime/ensureRuntime.d.ts +103 -0
- package/dist/runtime/ensureRuntime.d.ts.map +1 -0
- package/dist/runtime/ensureRuntime.js +276 -0
- package/dist/runtime/ensureRuntime.js.map +1 -0
- package/dist/runtime/extensions.d.ts +57 -0
- package/dist/runtime/extensions.d.ts.map +1 -0
- package/dist/runtime/extensions.js +216 -0
- package/dist/runtime/extensions.js.map +1 -0
- package/dist/runtime/localHttp.d.ts +24 -0
- package/dist/runtime/localHttp.d.ts.map +1 -0
- package/dist/runtime/localHttp.js +84 -0
- package/dist/runtime/localHttp.js.map +1 -0
- package/dist/runtime/projectResolution.d.ts +29 -0
- package/dist/runtime/projectResolution.d.ts.map +1 -0
- package/dist/runtime/projectResolution.js +67 -0
- package/dist/runtime/projectResolution.js.map +1 -0
- package/dist/runtime/protocol.d.ts +62 -0
- package/dist/runtime/protocol.d.ts.map +1 -0
- package/dist/runtime/protocol.js +74 -0
- package/dist/runtime/protocol.js.map +1 -0
- package/dist/sentinelIssues.d.ts +42 -2
- package/dist/sentinelIssues.d.ts.map +1 -1
- package/dist/sentinelIssues.js +167 -65
- package/dist/sentinelIssues.js.map +1 -1
- package/dist/server.js +123 -15
- package/dist/server.js.map +1 -1
- package/dist/toolConfig.d.ts.map +1 -1
- package/dist/toolConfig.js +12 -0
- package/dist/toolConfig.js.map +1 -1
- package/dist/tools/agentic/agentQueue.d.ts.map +1 -1
- package/dist/tools/agentic/agentQueue.js +4 -0
- package/dist/tools/agentic/agentQueue.js.map +1 -1
- package/dist/tools/agentic/index.d.ts.map +1 -1
- package/dist/tools/agentic/index.js +28 -2
- package/dist/tools/agentic/index.js.map +1 -1
- package/dist/tools/architect/index.d.ts +1 -0
- package/dist/tools/architect/index.d.ts.map +1 -1
- package/dist/tools/architect/index.js +52 -3
- package/dist/tools/architect/index.js.map +1 -1
- package/dist/tools/architect.d.ts.map +1 -1
- package/dist/tools/architect.js +59 -8
- package/dist/tools/architect.js.map +1 -1
- package/dist/tools/artifacts.d.ts +5 -0
- package/dist/tools/artifacts.d.ts.map +1 -0
- package/dist/tools/artifacts.js +89 -0
- package/dist/tools/artifacts.js.map +1 -0
- package/dist/tools/asks.d.ts +6 -0
- package/dist/tools/asks.d.ts.map +1 -0
- package/dist/tools/asks.js +104 -0
- package/dist/tools/asks.js.map +1 -0
- package/dist/tools/context.d.ts +10 -5
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +45 -18
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/coordinator/coordinator.d.ts.map +1 -1
- package/dist/tools/coordinator/coordinator.js +48 -19
- package/dist/tools/coordinator/coordinator.js.map +1 -1
- package/dist/tools/coordinator/index.d.ts +1 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +42 -2
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/crit.d.ts +2 -1
- package/dist/tools/crit.d.ts.map +1 -1
- package/dist/tools/crit.js +19 -4
- package/dist/tools/crit.js.map +1 -1
- package/dist/tools/data-inspector.d.ts +1 -1
- package/dist/tools/data-inspector.d.ts.map +1 -1
- package/dist/tools/data-inspector.js +1 -1
- package/dist/tools/data-inspector.js.map +1 -1
- package/dist/tools/designer/index.d.ts.map +1 -1
- package/dist/tools/designer/index.js +4 -3
- package/dist/tools/designer/index.js.map +1 -1
- package/dist/tools/designer/lateral-tools.d.ts.map +1 -1
- package/dist/tools/designer/lateral-tools.js +4 -2
- package/dist/tools/designer/lateral-tools.js.map +1 -1
- package/dist/tools/designer.d.ts +2 -1
- package/dist/tools/designer.d.ts.map +1 -1
- package/dist/tools/designer.js +24 -12
- package/dist/tools/designer.js.map +1 -1
- package/dist/tools/dojo/index.d.ts.map +1 -1
- package/dist/tools/dojo/index.js +52 -3
- package/dist/tools/dojo/index.js.map +1 -1
- package/dist/tools/dojo.d.ts +65 -3
- package/dist/tools/dojo.d.ts.map +1 -1
- package/dist/tools/dojo.js +148 -23
- package/dist/tools/dojo.js.map +1 -1
- package/dist/tools/friction.d.ts.map +1 -1
- package/dist/tools/friction.js +16 -6
- package/dist/tools/friction.js.map +1 -1
- package/dist/tools/guardian.d.ts +7 -0
- package/dist/tools/guardian.d.ts.map +1 -1
- package/dist/tools/guardian.js +152 -11
- package/dist/tools/guardian.js.map +1 -1
- package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -1
- package/dist/tools/hygiene/oracle-hygiene.js +8 -2
- package/dist/tools/hygiene/oracle-hygiene.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +33 -18
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/killswitch/index.d.ts +13 -0
- package/dist/tools/killswitch/index.d.ts.map +1 -0
- package/dist/tools/killswitch/index.js +138 -0
- package/dist/tools/killswitch/index.js.map +1 -0
- package/dist/tools/learnings.d.ts +2 -1
- package/dist/tools/learnings.d.ts.map +1 -1
- package/dist/tools/learnings.js +31 -15
- package/dist/tools/learnings.js.map +1 -1
- package/dist/tools/oracle/index.d.ts.map +1 -1
- package/dist/tools/oracle/index.js +8 -0
- package/dist/tools/oracle/index.js.map +1 -1
- package/dist/tools/oracle.d.ts +7 -0
- package/dist/tools/oracle.d.ts.map +1 -1
- package/dist/tools/oracle.js +41 -12
- package/dist/tools/oracle.js.map +1 -1
- package/dist/tools/policy.d.ts +2 -1
- package/dist/tools/policy.d.ts.map +1 -1
- package/dist/tools/policy.js +28 -9
- package/dist/tools/policy.js.map +1 -1
- package/dist/tools/postoffice/index.d.ts +10 -0
- package/dist/tools/postoffice/index.d.ts.map +1 -0
- package/dist/tools/postoffice/index.js +218 -0
- package/dist/tools/postoffice/index.js.map +1 -0
- package/dist/tools/postoffice.d.ts +78 -0
- package/dist/tools/postoffice.d.ts.map +1 -0
- package/dist/tools/postoffice.js +199 -0
- package/dist/tools/postoffice.js.map +1 -0
- package/dist/tools/provenance.d.ts +18 -2
- package/dist/tools/provenance.d.ts.map +1 -1
- package/dist/tools/provenance.js +68 -40
- package/dist/tools/provenance.js.map +1 -1
- package/dist/tools/registry/index.d.ts.map +1 -1
- package/dist/tools/registry/index.js +24 -0
- package/dist/tools/registry/index.js.map +1 -1
- package/dist/tools/sentinel/index.d.ts +1 -0
- package/dist/tools/sentinel/index.d.ts.map +1 -1
- package/dist/tools/sentinel/index.js +142 -6
- package/dist/tools/sentinel/index.js.map +1 -1
- package/dist/tools/sentinel.d.ts +152 -1
- package/dist/tools/sentinel.d.ts.map +1 -1
- package/dist/tools/sentinel.js +609 -328
- package/dist/tools/sentinel.js.map +1 -1
- package/dist/tools/shared/index.d.ts +2 -1
- package/dist/tools/shared/index.d.ts.map +1 -1
- package/dist/tools/shared/index.js +2 -1
- package/dist/tools/shared/index.js.map +1 -1
- package/dist/tools/shared/response.d.ts +24 -0
- package/dist/tools/shared/response.d.ts.map +1 -1
- package/dist/tools/shared/response.js +61 -7
- package/dist/tools/shared/response.js.map +1 -1
- package/dist/tools/shared/runTracker.d.ts +2 -0
- package/dist/tools/shared/runTracker.d.ts.map +1 -1
- package/dist/tools/shared/runTracker.js +38 -0
- package/dist/tools/shared/runTracker.js.map +1 -1
- package/dist/tools/shared/storeRead.d.ts +153 -0
- package/dist/tools/shared/storeRead.d.ts.map +1 -0
- package/dist/tools/shared/storeRead.js +242 -0
- package/dist/tools/shared/storeRead.js.map +1 -0
- package/dist/tools/swarm.d.ts +3 -1
- package/dist/tools/swarm.d.ts.map +1 -1
- package/dist/tools/swarm.js +6 -12
- package/dist/tools/swarm.js.map +1 -1
- package/dist/tools/testSpec.d.ts +3 -2
- package/dist/tools/testSpec.d.ts.map +1 -1
- package/dist/tools/testSpec.js +51 -14
- package/dist/tools/testSpec.js.map +1 -1
- package/dist/tools/vector.d.ts +33 -1
- package/dist/tools/vector.d.ts.map +1 -1
- package/dist/tools/vector.js +31 -5
- package/dist/tools/vector.js.map +1 -1
- package/dist/tools/voice/index.d.ts +1 -0
- package/dist/tools/voice/index.d.ts.map +1 -1
- package/dist/tools/voice/index.js +33 -2
- package/dist/tools/voice/index.js.map +1 -1
- package/dist/tools/voice.d.ts +48 -1
- package/dist/tools/voice.d.ts.map +1 -1
- package/dist/tools/voice.js +63 -3
- package/dist/tools/voice.js.map +1 -1
- package/dist/tools/zoom/index.d.ts +15 -0
- package/dist/tools/zoom/index.d.ts.map +1 -0
- package/dist/tools/zoom/index.js +174 -0
- package/dist/tools/zoom/index.js.map +1 -0
- package/dist/tools/zoom.d.ts +234 -0
- package/dist/tools/zoom.d.ts.map +1 -0
- package/dist/tools/zoom.js +627 -0
- package/dist/tools/zoom.js.map +1 -0
- package/dist/transports/bridge.d.ts +1 -1
- package/dist/transports/bridge.d.ts.map +1 -1
- package/dist/transports/bridge.js +4 -1
- package/dist/transports/bridge.js.map +1 -1
- package/dist/transports/http.d.ts +1 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +3 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/index.d.ts +1 -0
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports/index.js +1 -0
- package/dist/transports/index.js.map +1 -1
- package/dist/transports/mcp.d.ts +1 -1
- package/dist/transports/mcp.d.ts.map +1 -1
- package/dist/transports/mcp.js +9 -4
- package/dist/transports/mcp.js.map +1 -1
- package/dist/transports/stdio.d.ts +1 -1
- package/dist/transports/stdio.d.ts.map +1 -1
- package/dist/transports/stdio.js +2 -0
- package/dist/transports/stdio.js.map +1 -1
- package/dist/transports/thinStdio.d.ts +22 -0
- package/dist/transports/thinStdio.d.ts.map +1 -0
- package/dist/transports/thinStdio.js +218 -0
- package/dist/transports/thinStdio.js.map +1 -0
- package/dist/transports/types.d.ts +8 -1
- package/dist/transports/types.d.ts.map +1 -1
- package/dist/types/agent-services.d.ts +7 -0
- package/dist/types/agent-services.d.ts.map +1 -1
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +23 -0
- package/dist/version.js.map +1 -0
- package/package.json +20 -4
- package/templates/AGENT.md +3 -0
- package/templates/CLAUDE-decibel.md +11 -0
- package/templates/com.decibel.daemon.plist +6 -1
- package/dist/tools/deck.d.ts +0 -11
- package/dist/tools/deck.d.ts.map +0 -1
- package/dist/tools/deck.js +0 -1656
- package/dist/tools/deck.js.map +0 -1
- package/dist/tools/mother.d.ts +0 -11
- package/dist/tools/mother.d.ts.map +0 -1
- package/dist/tools/mother.js +0 -503
- package/dist/tools/mother.js.map +0 -1
- package/dist/tools/registry.d.ts +0 -3
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/registry.js +0 -189
- package/dist/tools/registry.js.map +0 -1
- package/dist/tools/senken.d.ts +0 -11
- package/dist/tools/senken.d.ts.map +0 -1
- package/dist/tools/senken.js +0 -482
- package/dist/tools/senken.js.map +0 -1
- package/dist/tools/terminal.d.ts +0 -17
- package/dist/tools/terminal.d.ts.map +0 -1
- package/dist/tools/terminal.js +0 -968
- package/dist/tools/terminal.js.map +0 -1
- package/dist/tools/toolsIndex.d.ts +0 -5
- package/dist/tools/toolsIndex.d.ts.map +0 -1
- package/dist/tools/toolsIndex.js +0 -37
- package/dist/tools/toolsIndex.js.map +0 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Issue codec — EPIC-0038 Phase 3
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Translates between on-disk records and the canonical Issue model. This is the
|
|
5
|
+
// only place that knows there are two formats.
|
|
6
|
+
//
|
|
7
|
+
// Two rules shape the whole file:
|
|
8
|
+
//
|
|
9
|
+
// 1. DECODE IS LOSSLESS. Every frontmatter key survives a decode/encode round
|
|
10
|
+
// trip, whether or not the model has a field for it. Records in this store
|
|
11
|
+
// carry keys no interface declares — `repo`, `closed_reason`, `degraded`,
|
|
12
|
+
// `source`, `projectId` alongside `project` — and a codec that emitted only
|
|
13
|
+
// the fields it recognized would silently delete them on the first write.
|
|
14
|
+
// The precedent is real: update_issue once rewrote markdown records as bare
|
|
15
|
+
// YAML and dropped the delimiters, the heading and the body.
|
|
16
|
+
//
|
|
17
|
+
// 2. THE BODY MIRROR IS OUTPUT, NEVER INPUT. Markdown records repeat status and
|
|
18
|
+
// severity in the body as `**Status:** x` for human readers. Decode ignores
|
|
19
|
+
// those lines entirely and reads frontmatter; encode regenerates them from
|
|
20
|
+
// the model. That asymmetry is the point — it makes the drift that hit
|
|
21
|
+
// sixteen records structurally impossible rather than merely fixed. There is
|
|
22
|
+
// no code path that can write a mirror disagreeing with its frontmatter.
|
|
23
|
+
// ============================================================================
|
|
24
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
25
|
+
import { isUid, normalizeStatus, } from './issue.js';
|
|
26
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
27
|
+
/** Keys the model owns. Everything else is preserved verbatim in raw.data. */
|
|
28
|
+
const MODEL_KEYS = new Set([
|
|
29
|
+
'uid',
|
|
30
|
+
'id',
|
|
31
|
+
'title',
|
|
32
|
+
'status',
|
|
33
|
+
'severity',
|
|
34
|
+
'priority',
|
|
35
|
+
'assignee',
|
|
36
|
+
'team',
|
|
37
|
+
'tags',
|
|
38
|
+
'epic_id',
|
|
39
|
+
'epicId',
|
|
40
|
+
'project',
|
|
41
|
+
'description',
|
|
42
|
+
'details',
|
|
43
|
+
'resolution',
|
|
44
|
+
'created_at',
|
|
45
|
+
'updated_at',
|
|
46
|
+
'closed_at',
|
|
47
|
+
]);
|
|
48
|
+
function normalizeTags(v) {
|
|
49
|
+
if (!Array.isArray(v))
|
|
50
|
+
return undefined;
|
|
51
|
+
const tags = v.filter((t) => typeof t === 'string' && t.trim() !== '');
|
|
52
|
+
return tags.length > 0 ? tags : undefined;
|
|
53
|
+
}
|
|
54
|
+
function str(v) {
|
|
55
|
+
return typeof v === 'string' && v.trim() !== '' ? v : undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Split a bare-YAML record into its YAML head and any markdown tail at column 0.
|
|
59
|
+
*
|
|
60
|
+
* The column-0 anchor is load-bearing and must not gain `\s*`: headings indented
|
|
61
|
+
* inside a `description:` block scalar are body text, not a tail, and matching
|
|
62
|
+
* them would truncate the record at parse time. Phase 2 verified no record in
|
|
63
|
+
* the store relies on the difference, but nothing else pins it, so it is pinned
|
|
64
|
+
* by test here.
|
|
65
|
+
*/
|
|
66
|
+
export function splitBareYaml(content) {
|
|
67
|
+
const lines = content.split('\n');
|
|
68
|
+
const idx = lines.findIndex((l) => /^#{1,6}\s/.test(l));
|
|
69
|
+
if (idx < 0)
|
|
70
|
+
return { head: content, tail: '' };
|
|
71
|
+
return { head: lines.slice(0, idx).join('\n'), tail: lines.slice(idx).join('\n') };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Prose under `## Details`, which is where the markdown format keeps the body.
|
|
75
|
+
*
|
|
76
|
+
* This used to stop at the next `##` heading of any kind, which quietly made
|
|
77
|
+
* the format unable to hold a structured issue. Authors write `## Problem`,
|
|
78
|
+
* `## Root Cause`, `## Fix` — 44 records in this store did, and every one read
|
|
79
|
+
* back truncated at the first of them, in two cases from 107 characters to 30.
|
|
80
|
+
*
|
|
81
|
+
* Only ONE trailing section is not the author's: `## Resolution`, which
|
|
82
|
+
* encodeIssue regenerates from `issue.resolution` and which decode reads from
|
|
83
|
+
* frontmatter. Including it here would duplicate it into details and then
|
|
84
|
+
* re-append it on every write. Everything else belongs to the body.
|
|
85
|
+
*
|
|
86
|
+
* The trailing occurrence is the one stripped, not the first — an issue whose
|
|
87
|
+
* prose discusses a resolution mid-body keeps it.
|
|
88
|
+
*/
|
|
89
|
+
function extractDetails(body) {
|
|
90
|
+
const m = body.match(/^##\s+Details\s*\n([\s\S]*)$/m);
|
|
91
|
+
if (!m)
|
|
92
|
+
return undefined;
|
|
93
|
+
let rest = m[1];
|
|
94
|
+
const headings = [...rest.matchAll(/\n##\s+Resolution\s*(?:\n|$)/g)];
|
|
95
|
+
const last = headings[headings.length - 1];
|
|
96
|
+
if (last?.index !== undefined)
|
|
97
|
+
rest = rest.slice(0, last.index);
|
|
98
|
+
return rest.trim() || undefined;
|
|
99
|
+
}
|
|
100
|
+
export function decodeIssue(filename, content) {
|
|
101
|
+
const warnings = [];
|
|
102
|
+
const fm = FRONTMATTER_RE.exec(content);
|
|
103
|
+
let data;
|
|
104
|
+
let body;
|
|
105
|
+
let format;
|
|
106
|
+
if (fm) {
|
|
107
|
+
format = 'md';
|
|
108
|
+
body = fm[2];
|
|
109
|
+
try {
|
|
110
|
+
data = parseYaml(fm[1]) ?? {};
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
data = {};
|
|
114
|
+
warnings.push(`frontmatter did not parse: ${err instanceof Error ? err.message : String(err)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
format = 'yaml';
|
|
119
|
+
const split = splitBareYaml(content);
|
|
120
|
+
body = split.tail;
|
|
121
|
+
if (split.tail.trim()) {
|
|
122
|
+
// Phase 2 repaired every instance of this. A new one means a writer is
|
|
123
|
+
// appending markdown to bare YAML again.
|
|
124
|
+
warnings.push('bare-YAML record has a markdown tail — a writer is appending prose outside the YAML');
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
data = parseYaml(split.head) ?? {};
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
data = {};
|
|
131
|
+
warnings.push(`YAML did not parse: ${err instanceof Error ? err.message : String(err)}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (typeof data !== 'object' || data === null) {
|
|
135
|
+
data = {};
|
|
136
|
+
warnings.push('record did not parse to an object');
|
|
137
|
+
}
|
|
138
|
+
// ---- id: frontmatter ISS-NNNN, else the filename ------------------------
|
|
139
|
+
const fmId = str(data.id);
|
|
140
|
+
const id = (fmId && /^ISS-\d+$/i.test(fmId) ? fmId.toUpperCase() : undefined) ??
|
|
141
|
+
filename.match(/^(ISS-\d+)/i)?.[1]?.toUpperCase() ??
|
|
142
|
+
fmId ??
|
|
143
|
+
filename.replace(/\.(md|ya?ml)$/i, '');
|
|
144
|
+
// ---- title: frontmatter wins, then the heading, then the filename -------
|
|
145
|
+
//
|
|
146
|
+
// Frontmatter first, because the writer puts a title there ONLY when the
|
|
147
|
+
// body cannot hold it — no heading at all, or a title containing a newline,
|
|
148
|
+
// which a `# heading` truncates at the line break. Reading the heading first
|
|
149
|
+
// meant a multi-line title came back as its first line, from a record whose
|
|
150
|
+
// frontmatter held the whole thing: "first line\nsecond line" read back as
|
|
151
|
+
// "first line", with create_issue reporting success.
|
|
152
|
+
//
|
|
153
|
+
// Preferring frontmatter cannot regress a record that predates this, because
|
|
154
|
+
// the writer never emitted both: `title` went to frontmatter exactly when
|
|
155
|
+
// there was no heading to compete with it.
|
|
156
|
+
const heading = body.match(/^#\s+(.+)$/m)?.[1]?.trim();
|
|
157
|
+
const fmTitle = str(data.title);
|
|
158
|
+
const title = fmTitle ?? heading ?? filename.replace(/\.(md|ya?ml)$/i, '');
|
|
159
|
+
if (!heading && !fmTitle) {
|
|
160
|
+
warnings.push('no title in heading or frontmatter — fell back to the filename');
|
|
161
|
+
}
|
|
162
|
+
// ---- status: the whole reason this codec exists -------------------------
|
|
163
|
+
const norm = normalizeStatus(data.status);
|
|
164
|
+
if (norm.unrecognized) {
|
|
165
|
+
warnings.push(`unrecognized status ${JSON.stringify(data.status)} — read as ${norm.status}`);
|
|
166
|
+
}
|
|
167
|
+
else if (norm.normalizedFrom) {
|
|
168
|
+
warnings.push(`status ${JSON.stringify(norm.normalizedFrom)} normalized to ${norm.status}`);
|
|
169
|
+
}
|
|
170
|
+
const uid = isUid(data.uid) ? data.uid : undefined;
|
|
171
|
+
if (data.uid !== undefined && !uid) {
|
|
172
|
+
warnings.push(`uid ${JSON.stringify(data.uid)} is not a valid UUIDv7 — ignored`);
|
|
173
|
+
}
|
|
174
|
+
const issue = {
|
|
175
|
+
uid,
|
|
176
|
+
id,
|
|
177
|
+
title,
|
|
178
|
+
status: norm.status,
|
|
179
|
+
severity: str(data.severity),
|
|
180
|
+
priority: str(data.priority),
|
|
181
|
+
// An empty tag list and no tag list mean the same thing, and encode omits
|
|
182
|
+
// empty arrays — so decoding [] to [] would make the codec non-idempotent.
|
|
183
|
+
// Twelve records in the store carry `tags: []`; the corpus test caught it.
|
|
184
|
+
tags: normalizeTags(data.tags),
|
|
185
|
+
// EPIC-0040. Read leniently and warn, matching how this codec treats every
|
|
186
|
+
// other damaged value: a record whose assignee is malformed is still a
|
|
187
|
+
// record, and refusing to decode it would hide the rest of its content.
|
|
188
|
+
// The strict assertion lives at the write boundary.
|
|
189
|
+
assignee: str(data.assignee),
|
|
190
|
+
team: str(data.team),
|
|
191
|
+
epicId: str(data.epic_id) ?? str(data.epicId),
|
|
192
|
+
// Both spellings exist; `projectId` is the markdown writer's, `project` the
|
|
193
|
+
// YAML writer's. The model has one, and encode puts it back where it came from.
|
|
194
|
+
project: str(data.project) ?? str(data.projectId),
|
|
195
|
+
details: str(data.description) ?? extractDetails(body),
|
|
196
|
+
resolution: str(data.resolution),
|
|
197
|
+
created_at: str(data.created_at),
|
|
198
|
+
updated_at: str(data.updated_at),
|
|
199
|
+
closed_at: str(data.closed_at),
|
|
200
|
+
};
|
|
201
|
+
// Strip model-owned keys; whatever remains is carried through untouched.
|
|
202
|
+
const preserved = {};
|
|
203
|
+
for (const [k, v] of Object.entries(data)) {
|
|
204
|
+
if (!MODEL_KEYS.has(k) && k !== 'projectId')
|
|
205
|
+
preserved[k] = v;
|
|
206
|
+
}
|
|
207
|
+
return { issue, format, raw: { data: preserved, body }, warnings };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Rewrite the derived header lines in a markdown body from the model.
|
|
211
|
+
*
|
|
212
|
+
* Only lines that already exist are updated — this does not inject a mirror
|
|
213
|
+
* into a record that never had one, because the mirror is a convention of the
|
|
214
|
+
* markdown writer's layout, not a requirement of the format.
|
|
215
|
+
*/
|
|
216
|
+
function syncBodyMirror(body, issue) {
|
|
217
|
+
let out = body;
|
|
218
|
+
out = out.replace(/^\*\*Status:\*\* .*$/m, `**Status:** ${issue.status}`);
|
|
219
|
+
if (issue.severity) {
|
|
220
|
+
out = out.replace(/^\*\*Severity:\*\* .*$/m, `**Severity:** ${issue.severity}`);
|
|
221
|
+
}
|
|
222
|
+
if (issue.epicId) {
|
|
223
|
+
out = out.replace(/^\*\*Epic:\*\* .*$/m, `**Epic:** ${issue.epicId}`);
|
|
224
|
+
}
|
|
225
|
+
// The heading is the title's home in this format; keep them in step.
|
|
226
|
+
//
|
|
227
|
+
// Only ever the FIRST LINE. Splicing a multi-line title into the heading
|
|
228
|
+
// line pushed its remaining lines into the body as loose prose — and since
|
|
229
|
+
// the writer had already put them there once, they appeared twice. The
|
|
230
|
+
// authoritative copy of such a title is in frontmatter (see encodeIssue);
|
|
231
|
+
// this is the human-readable rendering of it.
|
|
232
|
+
out = out.replace(/^#\s+.+$/m, `# ${issue.title.split(/\r?\n/)[0]}`);
|
|
233
|
+
// Resolution is rendered into the body for the same reason status is: a
|
|
234
|
+
// markdown record is read by people, and `## Resolution` is where they look.
|
|
235
|
+
// It is regenerated from the model rather than stored there, so it cannot
|
|
236
|
+
// drift from frontmatter the way the status mirror did. Writing it ONLY to
|
|
237
|
+
// frontmatter would have been the tidier data model and the worse record —
|
|
238
|
+
// the prose would have silently vanished from every closed issue.
|
|
239
|
+
if (issue.resolution) {
|
|
240
|
+
const section = `## Resolution\n\n${issue.resolution}\n`;
|
|
241
|
+
out = /^##\s+Resolution\s*$/m.test(out)
|
|
242
|
+
? out.replace(/^##\s+Resolution\s*\n[\s\S]*?(?=\n##\s|$)/m, section)
|
|
243
|
+
: `${out.replace(/\s+$/, '')}\n\n${section}`;
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
export function encodeIssue(decoded) {
|
|
248
|
+
const { issue, format, raw } = decoded;
|
|
249
|
+
const data = {};
|
|
250
|
+
const put = (k, v) => {
|
|
251
|
+
if (v !== undefined && v !== null && !(Array.isArray(v) && v.length === 0))
|
|
252
|
+
data[k] = v;
|
|
253
|
+
};
|
|
254
|
+
// Field order is stable so diffs stay readable across writes.
|
|
255
|
+
put('uid', issue.uid);
|
|
256
|
+
put('id', issue.id);
|
|
257
|
+
// Markdown records normally carry the title in the `# heading`, and writing
|
|
258
|
+
// it to frontmatter as well would create a second copy to drift — the same
|
|
259
|
+
// mistake as the status mirror. But a record with no heading has nowhere else
|
|
260
|
+
// to keep it, and omitting it there means the title is silently replaced by
|
|
261
|
+
// the filename on the next read. So: frontmatter holds the title exactly when
|
|
262
|
+
// the body cannot.
|
|
263
|
+
//
|
|
264
|
+
// A MULTI-LINE TITLE IS A TITLE THE BODY CANNOT HOLD. A markdown heading ends
|
|
265
|
+
// at the newline, so `# first\nsecond` is a heading reading "first" followed
|
|
266
|
+
// by a stray paragraph, and the record came back a line long with no error
|
|
267
|
+
// anywhere in the chain (ISS-0155). YAML quotes and escapes it exactly, so
|
|
268
|
+
// frontmatter is the only container that round-trips one.
|
|
269
|
+
const bodyHasHeading = /^#\s+.+$/m.test(raw.body);
|
|
270
|
+
const titleFitsAHeading = !/[\r\n]/.test(issue.title);
|
|
271
|
+
if (format === 'yaml' || !bodyHasHeading || !titleFitsAHeading)
|
|
272
|
+
put('title', issue.title);
|
|
273
|
+
// The markdown writer spells it projectId; keep each format's own spelling so
|
|
274
|
+
// a rewrite is not a gratuitous diff on every record.
|
|
275
|
+
put(format === 'md' ? 'projectId' : 'project', issue.project);
|
|
276
|
+
put('severity', issue.severity);
|
|
277
|
+
put('status', issue.status);
|
|
278
|
+
put('priority', issue.priority);
|
|
279
|
+
put('assignee', issue.assignee);
|
|
280
|
+
put('team', issue.team);
|
|
281
|
+
put('epic_id', issue.epicId);
|
|
282
|
+
put('tags', issue.tags);
|
|
283
|
+
put('created_at', issue.created_at);
|
|
284
|
+
put('updated_at', issue.updated_at);
|
|
285
|
+
put('closed_at', issue.closed_at);
|
|
286
|
+
// Bare YAML keeps prose in `description`; markdown keeps it in the body.
|
|
287
|
+
if (format === 'yaml')
|
|
288
|
+
put('description', issue.details);
|
|
289
|
+
put('resolution', issue.resolution);
|
|
290
|
+
// Preserved unknown keys land after the model's, so they never displace a
|
|
291
|
+
// known field's position but are never lost either.
|
|
292
|
+
for (const [k, v] of Object.entries(raw.data))
|
|
293
|
+
if (!(k in data))
|
|
294
|
+
data[k] = v;
|
|
295
|
+
const yaml = stringifyYaml(data, { lineWidth: 0 });
|
|
296
|
+
if (format === 'md') {
|
|
297
|
+
const body = syncBodyMirror(raw.body, issue);
|
|
298
|
+
return `---\n${yaml}---\n${body}`;
|
|
299
|
+
}
|
|
300
|
+
// A bare-YAML tail should not exist post-Phase-2, but if one is present it is
|
|
301
|
+
// pre-existing prose and gets preserved rather than dropped.
|
|
302
|
+
return raw.body.trim() ? `${yaml}\n${raw.body}` : yaml;
|
|
303
|
+
}
|
|
304
|
+
/** Apply changes to a decoded record, keeping derived state consistent. */
|
|
305
|
+
export function applyIssueChanges(decoded, changes) {
|
|
306
|
+
return { ...decoded, issue: { ...decoded.issue, ...changes } };
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=issueCodec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issueCodec.js","sourceRoot":"","sources":["../../src/domain/issueCodec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Issue, IssuePriority, IssueSeverity, IssueStatus } from './issue.js';
|
|
2
|
+
import { IssueFormat } from './issueCodec.js';
|
|
3
|
+
/** An issue plus where it lives. The path is for diagnostics, not for callers to write through. */
|
|
4
|
+
/**
|
|
5
|
+
* What a close actually did. `preservedResolution` is the difference between a
|
|
6
|
+
* first close and a re-close that kept the original reasoning — without it the
|
|
7
|
+
* caller cannot tell the two apart, which is how ISS-0168 stayed silent.
|
|
8
|
+
*/
|
|
9
|
+
export interface CloseResult {
|
|
10
|
+
stored: StoredIssue;
|
|
11
|
+
preservedResolution: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface StoredIssue {
|
|
14
|
+
issue: Issue;
|
|
15
|
+
filename: string;
|
|
16
|
+
path: string;
|
|
17
|
+
format: IssueFormat;
|
|
18
|
+
/** Integrity observations from decoding. Empty for a healthy record. */
|
|
19
|
+
warnings: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface IssueListFilter {
|
|
22
|
+
status?: IssueStatus;
|
|
23
|
+
/** All non-terminal statuses. Distinct from status:'open', which is one value. */
|
|
24
|
+
liveOnly?: boolean;
|
|
25
|
+
epicId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CreateIssueSpec {
|
|
28
|
+
title: string;
|
|
29
|
+
details: string;
|
|
30
|
+
severity: IssueSeverity;
|
|
31
|
+
priority?: IssuePriority;
|
|
32
|
+
epicId?: string;
|
|
33
|
+
tags?: string[];
|
|
34
|
+
project?: string;
|
|
35
|
+
/** Prefixed identity — user:/agent:/human:. Validated at the tool boundary. */
|
|
36
|
+
assignee?: string;
|
|
37
|
+
/** `team:<uuid>`. Validated at the tool boundary. */
|
|
38
|
+
team?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Integrity state of the whole store, reported alongside a listing rather than
|
|
42
|
+
* discovered mid-incident.
|
|
43
|
+
*
|
|
44
|
+
* The distinction that matters: `malformed` records are invisible to callers,
|
|
45
|
+
* so a silent skip would make a broken store look like a shorter clean one.
|
|
46
|
+
* `degraded` records are readable but carry something the codec had to
|
|
47
|
+
* interpret. Both are repair queues, not cosmetics — a duplicate id makes an
|
|
48
|
+
* issue unwritable, because the repository refuses an ambiguous target.
|
|
49
|
+
*/
|
|
50
|
+
export interface StoreIntegrity {
|
|
51
|
+
malformed: string[];
|
|
52
|
+
degraded: Array<{
|
|
53
|
+
filename: string;
|
|
54
|
+
warnings: string[];
|
|
55
|
+
}>;
|
|
56
|
+
duplicateIds: Record<string, string[]>;
|
|
57
|
+
}
|
|
58
|
+
export interface IssueRepository {
|
|
59
|
+
integrity(): Promise<StoreIntegrity>;
|
|
60
|
+
list(filter?: IssueListFilter): Promise<StoredIssue[]>;
|
|
61
|
+
get(idOrFilename: string): Promise<StoredIssue | null>;
|
|
62
|
+
create(spec: CreateIssueSpec): Promise<StoredIssue>;
|
|
63
|
+
update(idOrFilename: string, changes: Partial<Issue>): Promise<StoredIssue>;
|
|
64
|
+
close(idOrFilename: string, resolution: string, status?: 'closed' | 'wontfix'): Promise<CloseResult>;
|
|
65
|
+
}
|
|
66
|
+
export declare class AmbiguousIssueIdError extends Error {
|
|
67
|
+
readonly issueId: string;
|
|
68
|
+
readonly candidates: string[];
|
|
69
|
+
readonly code = "AMBIGUOUS_ISSUE_ID";
|
|
70
|
+
constructor(issueId: string, candidates: string[]);
|
|
71
|
+
}
|
|
72
|
+
export declare class IssueNotFoundError extends Error {
|
|
73
|
+
readonly issueId: string;
|
|
74
|
+
readonly code = "ISSUE_NOT_FOUND";
|
|
75
|
+
constructor(issueId: string);
|
|
76
|
+
}
|
|
77
|
+
export declare class FsIssueRepository implements IssueRepository {
|
|
78
|
+
private readonly issuesDir;
|
|
79
|
+
constructor(issuesDir: string);
|
|
80
|
+
private readAll;
|
|
81
|
+
/**
|
|
82
|
+
* Duplicate detection deliberately runs over EVERY record, never a filtered
|
|
83
|
+
* subset: a closed twin still makes an id ambiguous for writers, so filtering
|
|
84
|
+
* it out of a listing must not filter it out of the collision report.
|
|
85
|
+
*/
|
|
86
|
+
integrity(): Promise<StoreIntegrity>;
|
|
87
|
+
list(filter?: IssueListFilter): Promise<StoredIssue[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Resolve an id to exactly one record, in tiers of decreasing specificity.
|
|
90
|
+
*
|
|
91
|
+
* Only the first non-empty tier is considered, and ambiguity is reported
|
|
92
|
+
* within a tier rather than across tiers — so naming a record by its filename
|
|
93
|
+
* stays a reliable way to pick one member of a duplicate pair even while the
|
|
94
|
+
* shared ISS-NNNN remains ambiguous. uid is checked first because it is the
|
|
95
|
+
* only identifier guaranteed unique by construction.
|
|
96
|
+
*/
|
|
97
|
+
private resolve;
|
|
98
|
+
get(idOrFilename: string): Promise<StoredIssue | null>;
|
|
99
|
+
private requireOne;
|
|
100
|
+
create(spec: CreateIssueSpec): Promise<StoredIssue>;
|
|
101
|
+
update(idOrFilename: string, changes: Partial<Issue>): Promise<StoredIssue>;
|
|
102
|
+
/**
|
|
103
|
+
* Close a record, or report that it was already closed without touching what
|
|
104
|
+
* the first close recorded.
|
|
105
|
+
*
|
|
106
|
+
* A re-close used to overwrite `resolution` and move `closed_at` forward
|
|
107
|
+
* (ISS-0168). That is data loss, and silent: the resolution field is the only
|
|
108
|
+
* place the reasoning behind a fix survives outside a commit message, and the
|
|
109
|
+
* caller was told "closed" either way. The trigger was operator error — a
|
|
110
|
+
* `Closes:` trailer naming an already-closed issue — but the failure mode is
|
|
111
|
+
* not: citing the issue a piece of follow-up work came from is normal, and
|
|
112
|
+
* every such citation destroyed the original reasoning.
|
|
113
|
+
*
|
|
114
|
+
* So a record that is already terminal AND already carries a resolution keeps
|
|
115
|
+
* both. A status move between closed and wontfix is still honoured, since
|
|
116
|
+
* that is a real decision; a missing `closed_at` is filled in, since that only
|
|
117
|
+
* adds. When nothing is left to change the file is not rewritten at all, so a
|
|
118
|
+
* re-close does not even bump `updated_at`.
|
|
119
|
+
*
|
|
120
|
+
* Amending a resolution on purpose is `update`, which says what it does.
|
|
121
|
+
*/
|
|
122
|
+
close(idOrFilename: string, resolution: string, status?: 'closed' | 'wontfix'): Promise<CloseResult>;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=issueRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issueRepository.d.ts","sourceRoot":"","sources":["../../src/domain/issueRepository.ts"],"names":[],"mappings":"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"}
|