codetrellis 0.0.0-stage → 0.3.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/LICENSE +201 -0
- package/README.md +27 -2
- package/bin/codetrellis.mjs +4 -0
- package/package.json +41 -4
- package/reader/material-reader.mjs +130346 -0
- package/resources/tree-sitter/README.md +150 -0
- package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
- package/resources/tree-sitter/tree-sitter.wasm +0 -0
- package/src/backend/agent/claude-code-watcher.js +270 -0
- package/src/backend/index.js +8 -0
- package/src/backend/lib/sha256-file.js +39 -0
- package/src/backend/lib/zip-entries.js +98 -0
- package/src/backend/lifecycle.js +102 -0
- package/src/backend/mcp/binding-headers.js +54 -0
- package/src/backend/mcp/client-identity.js +44 -0
- package/src/backend/mcp/connector/command.js +110 -0
- package/src/backend/mcp/connector/core.js +278 -0
- package/src/backend/mcp/connector/files.js +121 -0
- package/src/backend/mcp/connector/hook.js +284 -0
- package/src/backend/mcp/connector/main.js +126 -0
- package/src/backend/mcp/connector/sse-upstream.js +152 -0
- package/src/backend/mcp/helpers.js +43 -0
- package/src/backend/mcp/prompt-builders.js +104 -0
- package/src/backend/mcp/resources.js +197 -0
- package/src/backend/mcp/server.js +813 -0
- package/src/backend/mcp/skill-guide.js +1528 -0
- package/src/backend/mcp/tools/architecture-tools.js +273 -0
- package/src/backend/mcp/tools/audio-tools.js +117 -0
- package/src/backend/mcp/tools/awareness-tools.js +623 -0
- package/src/backend/mcp/tools/budget-tools.js +185 -0
- package/src/backend/mcp/tools/channel-tools.js +205 -0
- package/src/backend/mcp/tools/contribution-tools.js +181 -0
- package/src/backend/mcp/tools/drift-tools.js +252 -0
- package/src/backend/mcp/tools/git-tools.js +316 -0
- package/src/backend/mcp/tools/governance-tools.js +175 -0
- package/src/backend/mcp/tools/graph-tools.js +181 -0
- package/src/backend/mcp/tools/intake-tools.js +244 -0
- package/src/backend/mcp/tools/mobile-tools.js +118 -0
- package/src/backend/mcp/tools/peer-tools.js +330 -0
- package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
- package/src/backend/mcp/tools/plan-tools.js +680 -0
- package/src/backend/mcp/tools/presence-tools.js +185 -0
- package/src/backend/mcp/tools/project-config-tools.js +150 -0
- package/src/backend/mcp/tools/review-tools.js +172 -0
- package/src/backend/mcp/tools/session-tools.js +554 -0
- package/src/backend/mcp/tools/system-docs-tools.js +168 -0
- package/src/backend/mcp/tools/terminal-tools.js +186 -0
- package/src/backend/mcp/tools/test-tools.js +117 -0
- package/src/backend/mcp/tools/ui-tools.js +356 -0
- package/src/backend/mcp/types.js +15 -0
- package/src/backend/middleware/local-auth.js +116 -0
- package/src/backend/server.js +5951 -0
- package/src/backend/services/agent-event-log.js +350 -0
- package/src/backend/services/architecture-rule.js +584 -0
- package/src/backend/services/architecture-rules.js +275 -0
- package/src/backend/services/artefact-content-service.js +181 -0
- package/src/backend/services/artefact-service.js +305 -0
- package/src/backend/services/artefact-watcher.js +167 -0
- package/src/backend/services/ast-parser.js +327 -0
- package/src/backend/services/audio-buffer-service.js +152 -0
- package/src/backend/services/awareness-notices.js +139 -0
- package/src/backend/services/awareness-replies.js +194 -0
- package/src/backend/services/awareness-service.js +344 -0
- package/src/backend/services/awareness-signals.js +267 -0
- package/src/backend/services/baseline-store.js +83 -0
- package/src/backend/services/branch-workstreams.js +341 -0
- package/src/backend/services/breakpoint-service.js +584 -0
- package/src/backend/services/brief-service.js +299 -0
- package/src/backend/services/budget-service.js +528 -0
- package/src/backend/services/callsites/base.js +15 -0
- package/src/backend/services/callsites/csharp.js +148 -0
- package/src/backend/services/callsites/go.js +163 -0
- package/src/backend/services/callsites/index.js +53 -0
- package/src/backend/services/callsites/kotlin.js +123 -0
- package/src/backend/services/callsites/process-env.js +125 -0
- package/src/backend/services/callsites/python.js +91 -0
- package/src/backend/services/callsites/ruby.js +164 -0
- package/src/backend/services/callsites/shared.js +198 -0
- package/src/backend/services/callsites/swift.js +115 -0
- package/src/backend/services/callsites/typescript.js +87 -0
- package/src/backend/services/capability-token.js +108 -0
- package/src/backend/services/change-check.js +156 -0
- package/src/backend/services/channel-dispatcher-service.js +235 -0
- package/src/backend/services/channel-event-file-service.js +125 -0
- package/src/backend/services/channel-event-service.js +297 -0
- package/src/backend/services/check-runs.js +177 -0
- package/src/backend/services/checkout-identity.js +73 -0
- package/src/backend/services/claude-code-parallel.js +221 -0
- package/src/backend/services/claude-desktop-config.js +186 -0
- package/src/backend/services/cli-install.js +249 -0
- package/src/backend/services/clock.js +57 -0
- package/src/backend/services/cloud-files.js +191 -0
- package/src/backend/services/coalesce.js +50 -0
- package/src/backend/services/code-breakpoints.js +291 -0
- package/src/backend/services/comment-service.js +168 -0
- package/src/backend/services/commit-attribution.js +134 -0
- package/src/backend/services/commit-edges.js +99 -0
- package/src/backend/services/confined-fs.js +241 -0
- package/src/backend/services/conformity-gate.js +132 -0
- package/src/backend/services/contribution-service.js +409 -0
- package/src/backend/services/coverage-service.js +173 -0
- package/src/backend/services/criteria-service.js +721 -0
- package/src/backend/services/criterion-checks.js +387 -0
- package/src/backend/services/criterion-loop-service.js +411 -0
- package/src/backend/services/cross-system-service.js +231 -0
- package/src/backend/services/database.js +916 -0
- package/src/backend/services/db-schema.js +1358 -0
- package/src/backend/services/deviation-service.js +344 -0
- package/src/backend/services/diff-engine.js +168 -0
- package/src/backend/services/evidence.js +363 -0
- package/src/backend/services/external-intake-service.js +269 -0
- package/src/backend/services/external-pointer-service.js +195 -0
- package/src/backend/services/external-refs-service.js +214 -0
- package/src/backend/services/file-history.js +158 -0
- package/src/backend/services/file-watcher.js +193 -0
- package/src/backend/services/folder-requests.js +118 -0
- package/src/backend/services/freeze-service.js +189 -0
- package/src/backend/services/gemini-cli-hook.js +172 -0
- package/src/backend/services/git-activity-service.js +325 -0
- package/src/backend/services/git-blobs.js +70 -0
- package/src/backend/services/git-branches.js +357 -0
- package/src/backend/services/git-checkout.js +153 -0
- package/src/backend/services/git-commit-service.js +91 -0
- package/src/backend/services/git-env.js +121 -0
- package/src/backend/services/git-identity.js +84 -0
- package/src/backend/services/git-refs.js +386 -0
- package/src/backend/services/git-safety.js +58 -0
- package/src/backend/services/grant-guard.js +67 -0
- package/src/backend/services/html-view-policy.js +135 -0
- package/src/backend/services/human-decision.js +55 -0
- package/src/backend/services/importers.js +159 -0
- package/src/backend/services/intent-service.js +105 -0
- package/src/backend/services/ipc-dispatcher.js +164 -0
- package/src/backend/services/item-git-state.js +208 -0
- package/src/backend/services/line-changes.js +232 -0
- package/src/backend/services/line-history.js +174 -0
- package/src/backend/services/local-api-changes.js +40 -0
- package/src/backend/services/logger.js +217 -0
- package/src/backend/services/material-footprints.js +203 -0
- package/src/backend/services/material-place.js +82 -0
- package/src/backend/services/material-reader/docx-markdown.js +198 -0
- package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
- package/src/backend/services/material-reader/quote.js +44 -0
- package/src/backend/services/material-reader/reader-host.js +202 -0
- package/src/backend/services/material-signals.js +141 -0
- package/src/backend/services/mcp-capabilities.js +390 -0
- package/src/backend/services/mdns-service.js +304 -0
- package/src/backend/services/mobile-api-server.js +281 -0
- package/src/backend/services/mobile-approvals.js +306 -0
- package/src/backend/services/mobile-awareness.js +180 -0
- package/src/backend/services/mobile-breakpoints.js +115 -0
- package/src/backend/services/mobile-budget.js +98 -0
- package/src/backend/services/mobile-freeze.js +106 -0
- package/src/backend/services/mobile-proposals.js +100 -0
- package/src/backend/services/mobile-rpc-service.js +1289 -0
- package/src/backend/services/mobile-workstreams.js +160 -0
- package/src/backend/services/monorepo-detector.js +131 -0
- package/src/backend/services/other-work.js +45 -0
- package/src/backend/services/pack-seal.js +129 -0
- package/src/backend/services/paired-device-service.js +192 -0
- package/src/backend/services/pairing-server.js +323 -0
- package/src/backend/services/pairing-service.js +200 -0
- package/src/backend/services/pantry-resolution-service.js +166 -0
- package/src/backend/services/parsers/base.js +124 -0
- package/src/backend/services/parsers/csharp.js +224 -0
- package/src/backend/services/parsers/go.js +180 -0
- package/src/backend/services/parsers/index.js +101 -0
- package/src/backend/services/parsers/java.js +103 -0
- package/src/backend/services/parsers/kotlin.js +252 -0
- package/src/backend/services/parsers/php.js +113 -0
- package/src/backend/services/parsers/python.js +189 -0
- package/src/backend/services/parsers/ruby.js +212 -0
- package/src/backend/services/parsers/rust.js +97 -0
- package/src/backend/services/parsers/swift.js +221 -0
- package/src/backend/services/parsers/typescript.js +235 -0
- package/src/backend/services/pattern-scan.js +65 -0
- package/src/backend/services/patterns.js +281 -0
- package/src/backend/services/peer-audit-service.js +123 -0
- package/src/backend/services/peer-auth.js +153 -0
- package/src/backend/services/peer-capabilities.js +209 -0
- package/src/backend/services/peer-connection-service.js +450 -0
- package/src/backend/services/peer-grants.js +33 -0
- package/src/backend/services/persistence.js +116 -0
- package/src/backend/services/personal-sync-service.js +232 -0
- package/src/backend/services/pipeline-approvals.js +72 -0
- package/src/backend/services/pipeline.js +232 -0
- package/src/backend/services/plan-arrivals.js +68 -0
- package/src/backend/services/plan-changes-service.js +273 -0
- package/src/backend/services/plan-conflict-service.js +288 -0
- package/src/backend/services/plan-dependencies.js +91 -0
- package/src/backend/services/plan-doc-guard.js +90 -0
- package/src/backend/services/plan-documents-service.js +275 -0
- package/src/backend/services/plan-event-service.js +154 -0
- package/src/backend/services/plan-file-refs.js +106 -0
- package/src/backend/services/plan-file-service.js +1564 -0
- package/src/backend/services/plan-history-service.js +156 -0
- package/src/backend/services/plan-import-service.js +261 -0
- package/src/backend/services/plan-item-service.js +1223 -0
- package/src/backend/services/plan-migrate-service.js +395 -0
- package/src/backend/services/plan-overlay-service.js +173 -0
- package/src/backend/services/plan-phases-service.js +182 -0
- package/src/backend/services/plan-progress-service.js +134 -0
- package/src/backend/services/plan-review-service.js +262 -0
- package/src/backend/services/plan-service.js +682 -0
- package/src/backend/services/plan-status.js +113 -0
- package/src/backend/services/plan-template-publish-service.js +217 -0
- package/src/backend/services/plan-templates-service.js +242 -0
- package/src/backend/services/plan-templates.js +1164 -0
- package/src/backend/services/planned-overlap-actions.js +200 -0
- package/src/backend/services/plans-home.js +224 -0
- package/src/backend/services/play-forward.js +256 -0
- package/src/backend/services/playback-service.js +117 -0
- package/src/backend/services/power-service.js +167 -0
- package/src/backend/services/power-signals.js +81 -0
- package/src/backend/services/pr-draft-service.js +142 -0
- package/src/backend/services/presence-service.js +122 -0
- package/src/backend/services/pricing.js +60 -0
- package/src/backend/services/project-config-service.js +474 -0
- package/src/backend/services/project-scanner.js +184 -0
- package/src/backend/services/projection-service.js +69 -0
- package/src/backend/services/push-notification-service.js +288 -0
- package/src/backend/services/recent-projects-service.js +204 -0
- package/src/backend/services/record-chain.js +162 -0
- package/src/backend/services/recurrence-rule.js +63 -0
- package/src/backend/services/recurring-agent.js +89 -0
- package/src/backend/services/recurring-scheduler.js +77 -0
- package/src/backend/services/recurring-service.js +276 -0
- package/src/backend/services/reference-service.js +169 -0
- package/src/backend/services/release-public-key.js +30 -0
- package/src/backend/services/release-signature.js +64 -0
- package/src/backend/services/remote-audio-service.js +224 -0
- package/src/backend/services/remote-interaction-service.js +275 -0
- package/src/backend/services/remote-terminal-service.js +324 -0
- package/src/backend/services/rendition/child/main.js +76 -0
- package/src/backend/services/rendition/engine-host.js +249 -0
- package/src/backend/services/rendition/engine-lock.js +39 -0
- package/src/backend/services/rendition/engine-lock.json +14 -0
- package/src/backend/services/rendition/engine-manifest.js +97 -0
- package/src/backend/services/rendition/network-proof.js +73 -0
- package/src/backend/services/rendition/rendition-service.js +175 -0
- package/src/backend/services/replay-frames.js +387 -0
- package/src/backend/services/replay-state.js +201 -0
- package/src/backend/services/resolvers/base.js +108 -0
- package/src/backend/services/resolvers/csharp.js +109 -0
- package/src/backend/services/resolvers/go.js +105 -0
- package/src/backend/services/resolvers/index.js +60 -0
- package/src/backend/services/resolvers/java.js +63 -0
- package/src/backend/services/resolvers/kotlin.js +109 -0
- package/src/backend/services/resolvers/php.js +89 -0
- package/src/backend/services/resolvers/python.js +154 -0
- package/src/backend/services/resolvers/ruby.js +103 -0
- package/src/backend/services/resolvers/rust.js +77 -0
- package/src/backend/services/resolvers/swift.js +98 -0
- package/src/backend/services/resolvers/typescript.js +71 -0
- package/src/backend/services/retention.js +54 -0
- package/src/backend/services/review-architecture.js +236 -0
- package/src/backend/services/review-attest.js +68 -0
- package/src/backend/services/review-bundle.js +226 -0
- package/src/backend/services/review-graduation.js +93 -0
- package/src/backend/services/review-host/bitbucket.js +79 -0
- package/src/backend/services/review-host/detect.js +80 -0
- package/src/backend/services/review-host/github.js +97 -0
- package/src/backend/services/review-host/gitlab.js +77 -0
- package/src/backend/services/review-host/host-state.js +103 -0
- package/src/backend/services/review-host/http.js +58 -0
- package/src/backend/services/review-host/switch.js +120 -0
- package/src/backend/services/review-marks.js +72 -0
- package/src/backend/services/review-notes.js +169 -0
- package/src/backend/services/review-other-work.js +90 -0
- package/src/backend/services/review-queue-service.js +147 -0
- package/src/backend/services/review-risk.js +127 -0
- package/src/backend/services/review-task.js +121 -0
- package/src/backend/services/rule-approvals.js +275 -0
- package/src/backend/services/rule-baseline.js +134 -0
- package/src/backend/services/rule-changes.js +162 -0
- package/src/backend/services/rule-preview.js +47 -0
- package/src/backend/services/rule-proposals.js +104 -0
- package/src/backend/services/rule-scope.js +76 -0
- package/src/backend/services/rulebook.js +286 -0
- package/src/backend/services/rules-at.js +56 -0
- package/src/backend/services/rules-overview.js +88 -0
- package/src/backend/services/schema-reconciler.js +250 -0
- package/src/backend/services/secret-store.js +119 -0
- package/src/backend/services/section-workstreams.js +95 -0
- package/src/backend/services/self-write-tracker.js +75 -0
- package/src/backend/services/sensor-bridge-service.js +285 -0
- package/src/backend/services/session-service.js +192 -0
- package/src/backend/services/settings-service.js +324 -0
- package/src/backend/services/signal-breakpoints.js +172 -0
- package/src/backend/services/signed-approval-record.js +86 -0
- package/src/backend/services/signed-approvals.js +244 -0
- package/src/backend/services/signoff-pack.js +328 -0
- package/src/backend/services/signoff-rows.js +114 -0
- package/src/backend/services/skill-arrival-service.js +138 -0
- package/src/backend/services/skill-model.js +193 -0
- package/src/backend/services/skill-use-service.js +140 -0
- package/src/backend/services/skills-service.js +150 -0
- package/src/backend/services/snapshot-compare-service.js +397 -0
- package/src/backend/services/source-control.js +189 -0
- package/src/backend/services/spec-links-service.js +123 -0
- package/src/backend/services/spec-proposal-withdraw.js +50 -0
- package/src/backend/services/spec-proposals-service.js +470 -0
- package/src/backend/services/sql/embedded.js +95 -0
- package/src/backend/services/sql/index.js +63 -0
- package/src/backend/services/sql/refs.js +357 -0
- package/src/backend/services/sql/schema.js +312 -0
- package/src/backend/services/sql/tokenizer.js +195 -0
- package/src/backend/services/stack-overlaps.js +117 -0
- package/src/backend/services/stack-service.js +225 -0
- package/src/backend/services/state-sync-service.js +384 -0
- package/src/backend/services/stuck-sensor-service.js +200 -0
- package/src/backend/services/system-discovery.js +481 -0
- package/src/backend/services/system-docs-service.js +701 -0
- package/src/backend/services/task-attachments-service.js +340 -0
- package/src/backend/services/task-grounding.js +60 -0
- package/src/backend/services/task-records/check-run-record.js +146 -0
- package/src/backend/services/task-records/check-runs.js +115 -0
- package/src/backend/services/task-records/heads.js +88 -0
- package/src/backend/services/task-records/material-reads.js +225 -0
- package/src/backend/services/task-records/read-record.js +100 -0
- package/src/backend/services/task-records/record.js +173 -0
- package/src/backend/services/task-records/run-record.js +136 -0
- package/src/backend/services/task-records/shared-state.js +548 -0
- package/src/backend/services/task-records/signing.js +140 -0
- package/src/backend/services/task-records/split-signals.js +52 -0
- package/src/backend/services/task-records/test-runs.js +164 -0
- package/src/backend/services/task-records/trust.js +243 -0
- package/src/backend/services/task-rules.js +81 -0
- package/src/backend/services/task-workstreams.js +90 -0
- package/src/backend/services/terminal-history-service.js +266 -0
- package/src/backend/services/terminal-service.js +267 -0
- package/src/backend/services/test-clock.js +53 -0
- package/src/backend/services/tests/grounding.js +266 -0
- package/src/backend/services/tests/junit.js +104 -0
- package/src/backend/services/tests/teammate-runs.js +134 -0
- package/src/backend/services/tests/test-results.js +234 -0
- package/src/backend/services/tree-watcher.js +204 -0
- package/src/backend/services/trellis-service.js +204 -0
- package/src/backend/services/trusted-roots.js +186 -0
- package/src/backend/services/update-download-service.js +342 -0
- package/src/backend/services/update-service.js +266 -0
- package/src/backend/services/watch-ignore.js +76 -0
- package/src/backend/services/webhook-egress.js +206 -0
- package/src/backend/services/webrtc-service.js +413 -0
- package/src/backend/services/work-changes.js +59 -0
- package/src/backend/services/workstream-binding.js +82 -0
- package/src/backend/services/workstream-commits.js +116 -0
- package/src/backend/services/workstream-imports.js +177 -0
- package/src/backend/services/workstream-service.js +335 -0
- package/src/backend/services/workstream-symbols.js +223 -0
- package/src/backend/services/workstream-watch-service.js +391 -0
- package/src/backend/services/worktree-service.js +235 -0
- package/src/cli/agent.js +100 -0
- package/src/cli/args.js +209 -0
- package/src/cli/conformity.js +106 -0
- package/src/cli/desktop.js +91 -0
- package/src/cli/main.js +411 -0
- package/src/cli/pipeline.js +109 -0
- package/src/cli/plan-verbs.js +259 -0
- package/src/cli/review-adapters.js +220 -0
- package/src/cli/review-output.js +93 -0
- package/src/cli/review-post.js +89 -0
- package/src/cli/review-sink.js +183 -0
- package/src/cli/review-skill.js +44 -0
- package/src/cli/review-verify.js +104 -0
- package/src/cli/review.js +386 -0
- package/src/cli/sarif.js +148 -0
- package/src/cli/verbs.js +360 -0
- package/src/shared/build-info.js +39 -0
- package/src/shared/lib/agent-review.js +199 -0
- package/src/shared/lib/agent-turns.js +140 -0
- package/src/shared/lib/awareness-digest.js +120 -0
- package/src/shared/lib/branch-name.js +45 -0
- package/src/shared/lib/breakpoint-words.js +118 -0
- package/src/shared/lib/budget-words.js +56 -0
- package/src/shared/lib/burst.js +69 -0
- package/src/shared/lib/call-entry.js +105 -0
- package/src/shared/lib/check-compare.js +42 -0
- package/src/shared/lib/check-words.js +216 -0
- package/src/shared/lib/csv.js +62 -0
- package/src/shared/lib/folder-entry.js +87 -0
- package/src/shared/lib/freeze-words.js +60 -0
- package/src/shared/lib/fuzzy.js +84 -0
- package/src/shared/lib/git-state-words.js +80 -0
- package/src/shared/lib/grep-entry.js +86 -0
- package/src/shared/lib/grounding-line.js +61 -0
- package/src/shared/lib/import-line.js +71 -0
- package/src/shared/lib/item-status.js +249 -0
- package/src/shared/lib/line-changes.js +53 -0
- package/src/shared/lib/locator.js +71 -0
- package/src/shared/lib/matcher.js +120 -0
- package/src/shared/lib/merge-order.js +65 -0
- package/src/shared/lib/open-findings.js +68 -0
- package/src/shared/lib/other-work.js +108 -0
- package/src/shared/lib/package-entry.js +142 -0
- package/src/shared/lib/plan-vocab.js +40 -0
- package/src/shared/lib/pptx-xml.js +86 -0
- package/src/shared/lib/proposal-words.js +61 -0
- package/src/shared/lib/recurrence.js +183 -0
- package/src/shared/lib/references.js +72 -0
- package/src/shared/lib/rule-pattern.js +56 -0
- package/src/shared/lib/sdp-fingerprint.js +115 -0
- package/src/shared/lib/sdp-minimal.js +123 -0
- package/src/shared/lib/secret-paths.js +34 -0
- package/src/shared/lib/signal-words.js +172 -0
- package/src/shared/lib/signoff.js +56 -0
- package/src/shared/lib/skills-note.js +60 -0
- package/src/shared/lib/spec-sections.js +78 -0
- package/src/shared/lib/symbol-entry.js +60 -0
- package/src/shared/lib/tool-phrasing.js +338 -0
- package/src/shared/lib/turn-gap.js +27 -0
- package/src/shared/lib/workstream-words.js +38 -0
- package/src/shared/lib/xlsx-xml.js +144 -0
- package/src/shared/lib/zip-reader.js +99 -0
- package/src/shared/types/agent.js +27 -0
- package/src/shared/types/architecture-rules.js +30 -0
- package/src/shared/types/ast.js +15 -0
- package/src/shared/types/breakpoint.js +33 -0
- package/src/shared/types/channel.js +41 -0
- package/src/shared/types/criteria.js +15 -0
- package/src/shared/types/graph.js +15 -0
- package/src/shared/types/index.js +53 -0
- package/src/shared/types/peer.js +36 -0
- package/src/shared/types/pipeline.js +15 -0
- package/src/shared/types/plan.js +15 -0
- package/src/shared/types/play-forward.js +15 -0
- package/src/shared/types/power.js +15 -0
- package/src/shared/types/presence.js +15 -0
- package/src/shared/types/project-config.js +35 -0
- package/src/shared/types/project.js +15 -0
- package/src/shared/types/record.js +15 -0
- package/src/shared/types/recurring.js +15 -0
- package/src/shared/types/review.js +15 -0
- package/src/shared/types/settings.js +114 -0
- package/src/shared/types/stack.js +15 -0
- package/src/shared/types/system-doc.js +15 -0
- package/src/shared/types/system.js +15 -0
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var git_branches_exports = {};
|
|
19
|
+
__export(git_branches_exports, {
|
|
20
|
+
FETCH_COMMAND: () => FETCH_COMMAND,
|
|
21
|
+
PR_COMMAND: () => PR_COMMAND,
|
|
22
|
+
autoWords: () => autoWords,
|
|
23
|
+
fetchRemotes: () => fetchRemotes,
|
|
24
|
+
ghBinary: () => ghBinary,
|
|
25
|
+
ghStatus: () => ghStatus,
|
|
26
|
+
keeperDue: () => keeperDue,
|
|
27
|
+
keeperTick: () => keeperTick,
|
|
28
|
+
listBranches: () => listBranches,
|
|
29
|
+
parseTrack: () => parseTrack,
|
|
30
|
+
pullListing: () => pullListing,
|
|
31
|
+
pullWords: () => pullWords,
|
|
32
|
+
readPullRequests: () => readPullRequests,
|
|
33
|
+
resetBranchState: () => resetBranchState,
|
|
34
|
+
startRemoteKeeper: () => startRemoteKeeper,
|
|
35
|
+
toPulls: () => toPulls,
|
|
36
|
+
trackWords: () => trackWords
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(git_branches_exports);
|
|
39
|
+
var import_node_child_process = require("node:child_process");
|
|
40
|
+
var import_types = require("../../shared/types");
|
|
41
|
+
var import_git_safety = require("./git-safety");
|
|
42
|
+
var import_git_refs = require("./git-refs");
|
|
43
|
+
const FETCH_COMMAND = "git fetch --all --prune";
|
|
44
|
+
const PR_COMMAND = "gh pr list --state all";
|
|
45
|
+
const MAX_BRANCHES = 200;
|
|
46
|
+
const MAX_PULLS = 50;
|
|
47
|
+
const FETCH_TIMEOUT_MS = 12e4;
|
|
48
|
+
const GH_TIMEOUT_MS = 6e4;
|
|
49
|
+
const ghBinary = () => process.env.CODETRELLIS_GH || "gh";
|
|
50
|
+
function run(bin, args, cwd, timeout, env = {}) {
|
|
51
|
+
return new Promise((resolve) => {
|
|
52
|
+
(0, import_node_child_process.execFile)(bin, args, {
|
|
53
|
+
cwd,
|
|
54
|
+
timeout,
|
|
55
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
56
|
+
windowsHide: true,
|
|
57
|
+
env: { ...process.env, ...env }
|
|
58
|
+
}, (err, stdout, stderr) => {
|
|
59
|
+
const e = err;
|
|
60
|
+
resolve({
|
|
61
|
+
code: e ? typeof e.code === "number" ? e.code : -1 : 0,
|
|
62
|
+
stdout: String(stdout ?? ""),
|
|
63
|
+
stderr: String(stderr ?? ""),
|
|
64
|
+
missing: e?.code === "ENOENT"
|
|
65
|
+
});
|
|
66
|
+
}).stdin?.end();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
const QUIET_GIT = { GIT_TERMINAL_PROMPT: "0", GCM_INTERACTIVE: "never", GIT_ASKPASS: "", SSH_ASKPASS: "" };
|
|
70
|
+
const QUIET_GH = { GH_PROMPT_DISABLED: "1", GH_NO_UPDATE_NOTIFIER: "1", GH_SPINNER_DISABLED: "1", NO_COLOR: "1", CLICOLOR: "0" };
|
|
71
|
+
const gitSync = (root, args) => run("git", args, root, 3e4, QUIET_GIT);
|
|
72
|
+
function parseTrack(track) {
|
|
73
|
+
if (/\bgone\b/.test(track)) return { ahead: 0, behind: 0, gone: true };
|
|
74
|
+
const ahead = /ahead (\d+)/.exec(track);
|
|
75
|
+
const behind = /behind (\d+)/.exec(track);
|
|
76
|
+
return { ahead: ahead ? Number(ahead[1]) : 0, behind: behind ? Number(behind[1]) : 0, gone: false };
|
|
77
|
+
}
|
|
78
|
+
const commits = (n) => `${n} commit${n === 1 ? "" : "s"}`;
|
|
79
|
+
function trackWords(upstream, t) {
|
|
80
|
+
if (!upstream) return { words: "Only here: not pushed anywhere yet", term: "no upstream" };
|
|
81
|
+
if (t.gone) return { words: `Its upstream ${upstream} was deleted on the remote`, term: "upstream gone" };
|
|
82
|
+
if (!t.ahead && !t.behind) return { words: `Level with ${upstream}`, term: "up to date" };
|
|
83
|
+
const parts = [];
|
|
84
|
+
if (t.ahead) parts.push(`${commits(t.ahead)} not pushed yet`);
|
|
85
|
+
if (t.behind) parts.push(`${commits(t.behind)} on ${upstream} not here yet`);
|
|
86
|
+
return {
|
|
87
|
+
words: parts.join("; "),
|
|
88
|
+
term: [t.ahead ? `ahead ${t.ahead}` : "", t.behind ? `behind ${t.behind}` : ""].filter(Boolean).join(", ")
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const REVIEW = {
|
|
92
|
+
APPROVED: "approved",
|
|
93
|
+
CHANGES_REQUESTED: "changes requested",
|
|
94
|
+
REVIEW_REQUIRED: "waiting on review"
|
|
95
|
+
};
|
|
96
|
+
function remoteRefFor(name, remoteRefs2) {
|
|
97
|
+
return remoteRefs2.find((r) => r === `refs/remotes/origin/${name}`) ?? remoteRefs2.find((r) => r.replace(/^refs\/remotes\/[^/]+\//, "") === name) ?? null;
|
|
98
|
+
}
|
|
99
|
+
function toPulls(rows, remoteRefs2, now) {
|
|
100
|
+
return rows.slice(0, MAX_PULLS).map((p) => {
|
|
101
|
+
const state = p.state === "MERGED" ? "merged" : p.state === "CLOSED" ? "closed" : p.isDraft ? "draft" : "open";
|
|
102
|
+
const review = state === "open" ? REVIEW[p.reviewDecision ?? ""] ?? null : null;
|
|
103
|
+
const updatedAt = p.updatedAt ? Date.parse(p.updatedAt) || null : null;
|
|
104
|
+
const head = remoteRefFor(p.headRefName, remoteRefs2);
|
|
105
|
+
const base = remoteRefFor(p.baseRefName, remoteRefs2);
|
|
106
|
+
const stateWords = state === "open" ? review ? `Open, ${review}` : "Open" : state === "draft" ? "Draft, not ready for review" : state === "merged" ? "Merged" : "Closed without merging";
|
|
107
|
+
return {
|
|
108
|
+
number: p.number,
|
|
109
|
+
title: p.title,
|
|
110
|
+
state,
|
|
111
|
+
head: p.headRefName,
|
|
112
|
+
base: p.baseRefName,
|
|
113
|
+
author: p.author?.login ?? null,
|
|
114
|
+
updatedAt,
|
|
115
|
+
url: typeof p.url === "string" && /^https:\/\//.test(p.url) ? p.url : null,
|
|
116
|
+
review,
|
|
117
|
+
words: `${stateWords} \xB7 ${p.headRefName} into ${p.baseRefName}${p.author?.login ? ` \xB7 ${p.author.login}` : ""}${updatedAt ? ` \xB7 ${(0, import_git_refs.whenWords)(updatedAt, now)}` : ""}`,
|
|
118
|
+
compare: head && base ? { before: `merge-base:${base}...${head}`, after: `commit:${head}` } : null
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function ghStatus(r) {
|
|
123
|
+
if (r.missing) return { status: "no-gh", detail: "" };
|
|
124
|
+
const said = `${r.stderr}
|
|
125
|
+
${r.stdout}`;
|
|
126
|
+
if (r.code === 4 || /gh auth login|not logged in|authentication required|GH_TOKEN/i.test(said)) return { status: "signed-out", detail: "" };
|
|
127
|
+
if (/none of the git remotes|no git remotes|known GitHub host|unable to determine|not a git repository/i.test(said)) return { status: "not-github", detail: "" };
|
|
128
|
+
return { status: "error", detail: said.trim().split("\n").find(Boolean)?.slice(0, 200) ?? `gh exited with ${r.code}` };
|
|
129
|
+
}
|
|
130
|
+
function pullWords(status, pulls, readAt, now, detail = "") {
|
|
131
|
+
switch (status) {
|
|
132
|
+
case "never":
|
|
133
|
+
return "Pull requests are read through the gh CLI when you fetch.";
|
|
134
|
+
case "no-gh":
|
|
135
|
+
return "Pull requests need the gh CLI (cli.github.com), installed and signed in. Branches work without it.";
|
|
136
|
+
case "signed-out":
|
|
137
|
+
return "gh is installed but not signed in: run gh auth login in a terminal, then fetch again.";
|
|
138
|
+
case "not-github":
|
|
139
|
+
return "This repository has no GitHub remote, so there are no pull requests for gh to read.";
|
|
140
|
+
case "error":
|
|
141
|
+
return `gh could not read pull requests: ${detail || "it gave no reason"}.`;
|
|
142
|
+
default: {
|
|
143
|
+
const open = pulls.filter((p) => p.state === "open" || p.state === "draft").length;
|
|
144
|
+
const read = `read ${(0, import_git_refs.whenWords)(readAt, now)}`;
|
|
145
|
+
if (!pulls.length) return `No pull requests on this repository, ${read}.`;
|
|
146
|
+
return `${open} open of the ${pulls.length} most recent, ${read}.`;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const pullCache = /* @__PURE__ */ new Map();
|
|
151
|
+
async function readPullRequests(projectRoot, now = Date.now()) {
|
|
152
|
+
const r = await run(ghBinary(), [
|
|
153
|
+
"pr",
|
|
154
|
+
"list",
|
|
155
|
+
"--state",
|
|
156
|
+
"all",
|
|
157
|
+
"--limit",
|
|
158
|
+
String(MAX_PULLS),
|
|
159
|
+
"--json",
|
|
160
|
+
"number,title,state,isDraft,headRefName,baseRefName,author,updatedAt,url,reviewDecision"
|
|
161
|
+
], projectRoot, GH_TIMEOUT_MS, QUIET_GH);
|
|
162
|
+
let entry;
|
|
163
|
+
if (r.code === 0) {
|
|
164
|
+
let rows = [];
|
|
165
|
+
try {
|
|
166
|
+
rows = JSON.parse(r.stdout || "[]");
|
|
167
|
+
} catch {
|
|
168
|
+
rows = [];
|
|
169
|
+
}
|
|
170
|
+
entry = { status: "ok", readAt: now, pulls: Array.isArray(rows) ? toPulls(rows, await remoteRefs(projectRoot), now) : [], detail: "" };
|
|
171
|
+
} else {
|
|
172
|
+
const s = ghStatus(r);
|
|
173
|
+
const prev = pullCache.get(projectRoot);
|
|
174
|
+
entry = { status: s.status, readAt: prev?.readAt ?? null, pulls: prev?.pulls ?? [], detail: s.detail };
|
|
175
|
+
}
|
|
176
|
+
pullCache.set(projectRoot, entry);
|
|
177
|
+
return pullListing(projectRoot, now);
|
|
178
|
+
}
|
|
179
|
+
function pullListing(projectRoot, now = Date.now()) {
|
|
180
|
+
const e = pullCache.get(projectRoot) ?? { status: "never", readAt: null, pulls: [], detail: "" };
|
|
181
|
+
return { status: e.status, readAt: e.readAt, pulls: e.pulls, words: pullWords(e.status, e.pulls, e.readAt, now, e.detail), command: PR_COMMAND };
|
|
182
|
+
}
|
|
183
|
+
async function remoteRefs(projectRoot) {
|
|
184
|
+
const r = await gitSync(projectRoot, ["for-each-ref", "--format=%(refname)", "refs/remotes"]);
|
|
185
|
+
return r.code === 0 ? r.stdout.split("\n").filter((x) => x && (0, import_git_safety.isSafeGitRef)(x) && !x.endsWith("/HEAD")) : [];
|
|
186
|
+
}
|
|
187
|
+
const fetching = /* @__PURE__ */ new Map();
|
|
188
|
+
const fetchError = /* @__PURE__ */ new Map();
|
|
189
|
+
function fetchRemotes(projectRoot) {
|
|
190
|
+
const running = fetching.get(projectRoot);
|
|
191
|
+
if (running) return running;
|
|
192
|
+
const p = (async () => {
|
|
193
|
+
const remotes = await listRemotes(projectRoot);
|
|
194
|
+
if (!remotes.length) {
|
|
195
|
+
fetchError.set(projectRoot, null);
|
|
196
|
+
return { ok: false, at: (0, import_git_refs.fetchedAt)(projectRoot), words: "This repository has no remote to fetch from.", command: FETCH_COMMAND, error: "no remote" };
|
|
197
|
+
}
|
|
198
|
+
const r = await run("git", ["fetch", "--all", "--prune", "--quiet"], projectRoot, FETCH_TIMEOUT_MS, QUIET_GIT);
|
|
199
|
+
const error = r.code === 0 ? null : (r.stderr.trim().split("\n").filter(Boolean).pop() ?? `git fetch exited with ${r.code}`).slice(0, 300);
|
|
200
|
+
fetchError.set(projectRoot, error);
|
|
201
|
+
await readPullRequests(projectRoot);
|
|
202
|
+
const at = (0, import_git_refs.fetchedAt)(projectRoot);
|
|
203
|
+
return {
|
|
204
|
+
ok: !error,
|
|
205
|
+
at,
|
|
206
|
+
command: FETCH_COMMAND,
|
|
207
|
+
error,
|
|
208
|
+
words: error ? `Could not fetch: ${error}` : `Fetched ${remotes.join(", ")} ${(0, import_git_refs.whenWords)(at, Date.now())}.`
|
|
209
|
+
};
|
|
210
|
+
})().finally(() => fetching.delete(projectRoot));
|
|
211
|
+
fetching.set(projectRoot, p);
|
|
212
|
+
return p;
|
|
213
|
+
}
|
|
214
|
+
async function listRemotes(projectRoot) {
|
|
215
|
+
const r = await gitSync(projectRoot, ["remote"]);
|
|
216
|
+
return r.code === 0 ? r.stdout.split("\n").map((s) => s.trim()).filter(Boolean) : [];
|
|
217
|
+
}
|
|
218
|
+
function autoWords(git) {
|
|
219
|
+
return git.keepRemotesCurrent ? `Kept current: fetched every ${git.everyMinutes} min while this project is open (Settings \u2192 Git).` : "Remotes are as last fetched. Fetch now, or keep them current in Settings \u2192 Git (off).";
|
|
220
|
+
}
|
|
221
|
+
async function listBranches(projectRoot, git, now = Date.now()) {
|
|
222
|
+
const empty = (isGit) => ({
|
|
223
|
+
project: projectRoot,
|
|
224
|
+
git: isGit,
|
|
225
|
+
branch: null,
|
|
226
|
+
remotes: [],
|
|
227
|
+
branches: [],
|
|
228
|
+
remoteBranches: [],
|
|
229
|
+
commands: { branches: "git branch -vv", remoteBranches: "git branch -r" },
|
|
230
|
+
fetch: { at: null, words: "Never fetched", command: FETCH_COMMAND, running: false, error: null, auto: { on: git.keepRemotesCurrent, everyMinutes: git.everyMinutes, words: autoWords(git) } },
|
|
231
|
+
pulls: pullListing(projectRoot, now)
|
|
232
|
+
});
|
|
233
|
+
if ((await gitSync(projectRoot, ["rev-parse", "--git-dir"])).code !== 0) return empty(false);
|
|
234
|
+
const listing = empty(true);
|
|
235
|
+
const head = await gitSync(projectRoot, ["symbolic-ref", "--short", "-q", "HEAD"]);
|
|
236
|
+
listing.branch = head.code === 0 ? head.stdout.trim() || null : null;
|
|
237
|
+
listing.remotes = await listRemotes(projectRoot);
|
|
238
|
+
const rows = await gitSync(projectRoot, [
|
|
239
|
+
"for-each-ref",
|
|
240
|
+
"--sort=-committerdate",
|
|
241
|
+
"--format=%(refname)%00%(objectname:short)%00%(committerdate:unix)%00%(subject)%00%(upstream)%00%(upstream:track)",
|
|
242
|
+
"refs/heads",
|
|
243
|
+
"refs/remotes"
|
|
244
|
+
]);
|
|
245
|
+
const trackedBy = /* @__PURE__ */ new Map();
|
|
246
|
+
const parsed = (rows.code === 0 ? rows.stdout.split("\n").filter(Boolean) : []).map((line) => {
|
|
247
|
+
const [ref, sha, unix, subject, upstream, track] = line.split("\0");
|
|
248
|
+
return { ref, sha, at: unix ? Number(unix) * 1e3 : null, subject: subject || null, upstream: upstream || null, track: track ?? "" };
|
|
249
|
+
}).filter((r) => (0, import_git_safety.isSafeGitRef)(r.ref) && !r.ref.endsWith("/HEAD"));
|
|
250
|
+
for (const r of parsed) if (r.ref.startsWith("refs/heads/") && r.upstream) trackedBy.set(r.upstream, (0, import_git_refs.shortRefName)(r.ref));
|
|
251
|
+
const fetched = (0, import_git_refs.fetchedAt)(projectRoot);
|
|
252
|
+
for (const r of parsed) {
|
|
253
|
+
const name = (0, import_git_refs.shortRefName)(r.ref);
|
|
254
|
+
if (r.ref.startsWith("refs/heads/")) {
|
|
255
|
+
if (listing.branches.length >= MAX_BRANCHES) continue;
|
|
256
|
+
const upstream = r.upstream ? (0, import_git_refs.shortRefName)(r.upstream) : null;
|
|
257
|
+
const t = parseTrack(r.track);
|
|
258
|
+
const said = trackWords(upstream, t);
|
|
259
|
+
listing.branches.push({
|
|
260
|
+
spec: `commit:${r.ref}`,
|
|
261
|
+
kind: "branch",
|
|
262
|
+
name,
|
|
263
|
+
sha: r.sha,
|
|
264
|
+
at: r.at,
|
|
265
|
+
subject: r.subject,
|
|
266
|
+
current: name === listing.branch,
|
|
267
|
+
upstream,
|
|
268
|
+
ahead: upstream && !t.gone ? t.ahead : null,
|
|
269
|
+
behind: upstream && !t.gone ? t.behind : null,
|
|
270
|
+
gone: t.gone,
|
|
271
|
+
trackedBy: null,
|
|
272
|
+
words: said.words,
|
|
273
|
+
term: said.term
|
|
274
|
+
});
|
|
275
|
+
} else {
|
|
276
|
+
if (listing.remoteBranches.length >= MAX_BRANCHES) continue;
|
|
277
|
+
const [remote, ...rest] = name.split("/");
|
|
278
|
+
const local = trackedBy.get(r.ref) ?? null;
|
|
279
|
+
listing.remoteBranches.push({
|
|
280
|
+
spec: `commit:${r.ref}`,
|
|
281
|
+
kind: "remote",
|
|
282
|
+
name,
|
|
283
|
+
sha: r.sha,
|
|
284
|
+
at: r.at,
|
|
285
|
+
subject: r.subject,
|
|
286
|
+
current: false,
|
|
287
|
+
upstream: null,
|
|
288
|
+
ahead: null,
|
|
289
|
+
behind: null,
|
|
290
|
+
gone: false,
|
|
291
|
+
trackedBy: local,
|
|
292
|
+
words: `${rest.join("/")} on ${remote}, as last fetched${local ? `; your ${local} follows it` : "; no branch here follows it"}`,
|
|
293
|
+
term: local ? `upstream of ${local}` : "remote-tracking"
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
const error = fetchError.get(projectRoot) ?? null;
|
|
298
|
+
listing.fetch = {
|
|
299
|
+
...listing.fetch,
|
|
300
|
+
at: fetched,
|
|
301
|
+
running: fetching.has(projectRoot),
|
|
302
|
+
error,
|
|
303
|
+
words: listing.remotes.length === 0 ? "No remote: this repository is only here" : fetched === null ? "Never fetched: remote branches are as they were when cloned" : `Last fetched ${(0, import_git_refs.whenWords)(fetched, now)}`
|
|
304
|
+
};
|
|
305
|
+
return listing;
|
|
306
|
+
}
|
|
307
|
+
function keeperDue(git, lastFetched, lastTried, now) {
|
|
308
|
+
if (!git.keepRemotesCurrent) return false;
|
|
309
|
+
const every = import_types.FETCH_INTERVAL_CHOICES.includes(git.everyMinutes) ? git.everyMinutes : 15;
|
|
310
|
+
const since = Math.max(lastFetched ?? -Infinity, lastTried ?? -Infinity);
|
|
311
|
+
return now - since >= every * 6e4;
|
|
312
|
+
}
|
|
313
|
+
const triedAt = /* @__PURE__ */ new Map();
|
|
314
|
+
function keeperTick(deps) {
|
|
315
|
+
const root = deps.activeRoot();
|
|
316
|
+
if (!root || fetching.has(root)) return null;
|
|
317
|
+
const now = (deps.now ?? Date.now)();
|
|
318
|
+
if (!keeperDue(deps.settings(), (0, import_git_refs.fetchedAt)(root), triedAt.get(root) ?? null, now)) return null;
|
|
319
|
+
triedAt.set(root, now);
|
|
320
|
+
return fetchRemotes(root).then((r) => {
|
|
321
|
+
deps.onFetched(root, r);
|
|
322
|
+
return r;
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
function startRemoteKeeper(deps, everyMs = 6e4) {
|
|
326
|
+
const timer = setInterval(() => {
|
|
327
|
+
void keeperTick(deps)?.catch(() => {
|
|
328
|
+
});
|
|
329
|
+
}, everyMs);
|
|
330
|
+
timer.unref?.();
|
|
331
|
+
return () => clearInterval(timer);
|
|
332
|
+
}
|
|
333
|
+
function resetBranchState() {
|
|
334
|
+
pullCache.clear();
|
|
335
|
+
fetchError.clear();
|
|
336
|
+
triedAt.clear();
|
|
337
|
+
}
|
|
338
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
339
|
+
0 && (module.exports = {
|
|
340
|
+
FETCH_COMMAND,
|
|
341
|
+
PR_COMMAND,
|
|
342
|
+
autoWords,
|
|
343
|
+
fetchRemotes,
|
|
344
|
+
ghBinary,
|
|
345
|
+
ghStatus,
|
|
346
|
+
keeperDue,
|
|
347
|
+
keeperTick,
|
|
348
|
+
listBranches,
|
|
349
|
+
parseTrack,
|
|
350
|
+
pullListing,
|
|
351
|
+
pullWords,
|
|
352
|
+
readPullRequests,
|
|
353
|
+
resetBranchState,
|
|
354
|
+
startRemoteKeeper,
|
|
355
|
+
toPulls,
|
|
356
|
+
trackWords
|
|
357
|
+
});
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var git_checkout_exports = {};
|
|
29
|
+
__export(git_checkout_exports, {
|
|
30
|
+
checkoutGitDir: () => checkoutGitDir,
|
|
31
|
+
currentBranch: () => currentBranch,
|
|
32
|
+
hasCommits: () => hasCommits,
|
|
33
|
+
isLinkedWorktreeDir: () => isLinkedWorktreeDir,
|
|
34
|
+
localBranches: () => localBranches,
|
|
35
|
+
withoutNestedCheckouts: () => withoutNestedCheckouts
|
|
36
|
+
});
|
|
37
|
+
module.exports = __toCommonJS(git_checkout_exports);
|
|
38
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
39
|
+
var import_node_path = __toESM(require("node:path"));
|
|
40
|
+
function readText(file) {
|
|
41
|
+
try {
|
|
42
|
+
return import_node_fs.default.readFileSync(file, "utf-8");
|
|
43
|
+
} catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function checkoutGitDir(root) {
|
|
48
|
+
const dotGit = import_node_path.default.resolve(root, ".git");
|
|
49
|
+
let st;
|
|
50
|
+
try {
|
|
51
|
+
st = import_node_fs.default.statSync(dotGit);
|
|
52
|
+
} catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
let dir;
|
|
56
|
+
if (st.isDirectory()) {
|
|
57
|
+
dir = dotGit;
|
|
58
|
+
} else if (st.isFile()) {
|
|
59
|
+
const m = /^gitdir:\s*(.+?)\s*$/m.exec(readText(dotGit) ?? "");
|
|
60
|
+
if (!m) return null;
|
|
61
|
+
dir = import_node_path.default.resolve(root, m[1]);
|
|
62
|
+
} else {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return import_node_fs.default.existsSync(import_node_path.default.join(dir, "HEAD")) ? dir : null;
|
|
66
|
+
}
|
|
67
|
+
function commonGitDir(gitDir) {
|
|
68
|
+
const rel = readText(import_node_path.default.join(gitDir, "commondir"))?.trim();
|
|
69
|
+
return rel ? import_node_path.default.resolve(gitDir, rel) : gitDir;
|
|
70
|
+
}
|
|
71
|
+
function headRef(gitDir) {
|
|
72
|
+
const head = readText(import_node_path.default.join(gitDir, "HEAD"))?.trim();
|
|
73
|
+
if (!head) return null;
|
|
74
|
+
const m = /^ref:\s*(refs\/\S+)$/.exec(head);
|
|
75
|
+
if (m) return m[1].split("/").includes("..") ? null : { ref: m[1], detached: false };
|
|
76
|
+
return /^[0-9a-f]{40,64}$/.test(head) ? { ref: null, detached: true } : null;
|
|
77
|
+
}
|
|
78
|
+
function packedRefs(commonDir) {
|
|
79
|
+
const out = /* @__PURE__ */ new Set();
|
|
80
|
+
for (const line of (readText(import_node_path.default.join(commonDir, "packed-refs")) ?? "").split("\n")) {
|
|
81
|
+
const m = /^[0-9a-f]{40,64} (refs\/\S+)$/.exec(line.trim());
|
|
82
|
+
if (m) out.add(m[1]);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
function currentBranch(root) {
|
|
87
|
+
const gitDir = checkoutGitDir(root);
|
|
88
|
+
if (!gitDir) return null;
|
|
89
|
+
const head = headRef(gitDir);
|
|
90
|
+
if (!head) return null;
|
|
91
|
+
if (head.detached) return "detached";
|
|
92
|
+
return head.ref.replace(/^refs\/heads\//, "");
|
|
93
|
+
}
|
|
94
|
+
function localBranches(root) {
|
|
95
|
+
const gitDir = checkoutGitDir(root);
|
|
96
|
+
if (!gitDir) return [];
|
|
97
|
+
const common = commonGitDir(gitDir);
|
|
98
|
+
const names = /* @__PURE__ */ new Set();
|
|
99
|
+
for (const ref of packedRefs(common)) {
|
|
100
|
+
if (ref.startsWith("refs/heads/")) names.add(ref.slice("refs/heads/".length));
|
|
101
|
+
}
|
|
102
|
+
const walk = (dir, prefix) => {
|
|
103
|
+
let entries;
|
|
104
|
+
try {
|
|
105
|
+
entries = import_node_fs.default.readdirSync(dir, { withFileTypes: true });
|
|
106
|
+
} catch {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
for (const e of entries) {
|
|
110
|
+
if (e.isDirectory()) walk(import_node_path.default.join(dir, e.name), `${prefix}${e.name}/`);
|
|
111
|
+
else if (e.isFile()) names.add(`${prefix}${e.name}`);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
walk(import_node_path.default.join(common, "refs", "heads"), "");
|
|
115
|
+
return [...names].sort();
|
|
116
|
+
}
|
|
117
|
+
function hasCommits(root) {
|
|
118
|
+
const gitDir = checkoutGitDir(root);
|
|
119
|
+
if (!gitDir) return false;
|
|
120
|
+
const head = headRef(gitDir);
|
|
121
|
+
if (!head) return false;
|
|
122
|
+
if (head.detached) return true;
|
|
123
|
+
const common = commonGitDir(gitDir);
|
|
124
|
+
return import_node_fs.default.existsSync(import_node_path.default.join(common, head.ref)) || packedRefs(common).has(head.ref);
|
|
125
|
+
}
|
|
126
|
+
function isLinkedWorktreeDir(dirPath) {
|
|
127
|
+
try {
|
|
128
|
+
const dotGit = import_node_path.default.join(dirPath, ".git");
|
|
129
|
+
const st = import_node_fs.default.lstatSync(dotGit);
|
|
130
|
+
if (!st.isFile() || st.size > 4096) return false;
|
|
131
|
+
const m = /^gitdir:\s*(.+?)\s*$/m.exec(import_node_fs.default.readFileSync(dotGit, "utf-8"));
|
|
132
|
+
if (!m) return false;
|
|
133
|
+
const target = m[1].replace(/[\\/]+$/, "");
|
|
134
|
+
return import_node_path.default.basename(import_node_path.default.dirname(target)) === "worktrees";
|
|
135
|
+
} catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function withoutNestedCheckouts(projectRoot, entries, pathOf) {
|
|
140
|
+
return entries.filter((e) => {
|
|
141
|
+
const p = pathOf(e);
|
|
142
|
+
return !(p.endsWith("/") && isLinkedWorktreeDir(import_node_path.default.join(projectRoot, p)));
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
146
|
+
0 && (module.exports = {
|
|
147
|
+
checkoutGitDir,
|
|
148
|
+
currentBranch,
|
|
149
|
+
hasCommits,
|
|
150
|
+
isLinkedWorktreeDir,
|
|
151
|
+
localBranches,
|
|
152
|
+
withoutNestedCheckouts
|
|
153
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var git_commit_service_exports = {};
|
|
29
|
+
__export(git_commit_service_exports, {
|
|
30
|
+
commitManifestChanges: () => commitManifestChanges,
|
|
31
|
+
composeCommitMessage: () => composeCommitMessage
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(git_commit_service_exports);
|
|
34
|
+
var import_node_child_process = require("node:child_process");
|
|
35
|
+
var import_git_safety = require("./git-safety");
|
|
36
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
37
|
+
var import_node_path = __toESM(require("node:path"));
|
|
38
|
+
function composeCommitMessage(opts) {
|
|
39
|
+
const subject = `[cdev] ${opts.subject.trim()}`;
|
|
40
|
+
const parts = [subject];
|
|
41
|
+
if (opts.body && opts.body.length > 0) {
|
|
42
|
+
parts.push("");
|
|
43
|
+
parts.push(opts.body.map((line) => line.trim()).filter(Boolean).join("\n\n"));
|
|
44
|
+
}
|
|
45
|
+
if (opts.agent) {
|
|
46
|
+
const agentType = opts.agent.agentType.trim();
|
|
47
|
+
const model = (opts.agent.model ?? "").trim();
|
|
48
|
+
const human = (opts.agent.humanIdentity ?? "").trim();
|
|
49
|
+
parts.push("");
|
|
50
|
+
const meta = model ? `agent: ${agentType} \xB7 model: ${model}` : `agent: ${agentType}`;
|
|
51
|
+
parts.push(meta);
|
|
52
|
+
const display = human ? `${human}'s ${agentType}` : agentType;
|
|
53
|
+
parts.push(`Co-Authored-By: ${display} <agent@cdev.example>`);
|
|
54
|
+
}
|
|
55
|
+
return parts.join("\n") + "\n";
|
|
56
|
+
}
|
|
57
|
+
function commitManifestChanges(opts) {
|
|
58
|
+
if (!import_node_fs.default.existsSync(import_node_path.default.join(opts.projectRoot, ".git"))) {
|
|
59
|
+
throw new Error(`Not a git repository: ${opts.projectRoot}`);
|
|
60
|
+
}
|
|
61
|
+
if (opts.paths.length === 0) {
|
|
62
|
+
throw new Error("No paths supplied \u2014 commit would be empty.");
|
|
63
|
+
}
|
|
64
|
+
const message = composeCommitMessage(opts);
|
|
65
|
+
const safePaths = opts.paths.map((p, i) => (0, import_git_safety.assertSafeGitPathArg)(p, `commitPaths[${i}]`));
|
|
66
|
+
runGit(["add", "--", ...safePaths], opts.projectRoot);
|
|
67
|
+
const commitFlags = ["commit", "--file", "-"];
|
|
68
|
+
if (opts.signed) commitFlags.push("-S");
|
|
69
|
+
runGit(commitFlags, opts.projectRoot, message);
|
|
70
|
+
const sha = runGit(["rev-parse", "HEAD"], opts.projectRoot).trim();
|
|
71
|
+
return { sha, message };
|
|
72
|
+
}
|
|
73
|
+
function runGit(args, cwd, input) {
|
|
74
|
+
try {
|
|
75
|
+
return (0, import_node_child_process.execFileSync)("git", args, {
|
|
76
|
+
cwd,
|
|
77
|
+
encoding: "utf-8",
|
|
78
|
+
input,
|
|
79
|
+
stdio: [input === void 0 ? "ignore" : "pipe", "pipe", "pipe"]
|
|
80
|
+
});
|
|
81
|
+
} catch (err) {
|
|
82
|
+
const stderr = (err?.stderr ?? "").toString();
|
|
83
|
+
const message = stderr.trim() || err?.message || "git failed";
|
|
84
|
+
throw new Error(`git ${args[0]} failed: ${message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
88
|
+
0 && (module.exports = {
|
|
89
|
+
commitManifestChanges,
|
|
90
|
+
composeCommitMessage
|
|
91
|
+
});
|