codetrellis 0.0.0-stage → 0.2.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 +43 -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/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/child.js +4 -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/read.js +430 -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 +268 -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 +201 -0
- package/src/cli/conformity.js +106 -0
- package/src/cli/desktop.js +91 -0
- package/src/cli/main.js +409 -0
- package/src/cli/pipeline.js +109 -0
- package/src/cli/plan-verbs.js +259 -0
- package/src/cli/review-adapters.js +218 -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 +359 -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,121 @@
|
|
|
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_env_exports = {};
|
|
19
|
+
__export(git_env_exports, {
|
|
20
|
+
GIT_CONCURRENCY: () => GIT_CONCURRENCY,
|
|
21
|
+
REFRESH_EVERY_MS: () => REFRESH_EVERY_MS,
|
|
22
|
+
gitAsync: () => gitAsync,
|
|
23
|
+
gitAsyncLoad: () => gitAsyncLoad,
|
|
24
|
+
inBackground: () => inBackground,
|
|
25
|
+
quietGitLocks: () => quietGitLocks,
|
|
26
|
+
refreshIndexOccasionally: () => refreshIndexOccasionally,
|
|
27
|
+
refreshIndexOccasionallyAsync: () => refreshIndexOccasionallyAsync
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(git_env_exports);
|
|
30
|
+
var import_node_child_process = require("node:child_process");
|
|
31
|
+
var import_node_async_hooks = require("node:async_hooks");
|
|
32
|
+
function quietGitLocks(env = process.env) {
|
|
33
|
+
if (env.GIT_OPTIONAL_LOCKS === void 0) env.GIT_OPTIONAL_LOCKS = "0";
|
|
34
|
+
}
|
|
35
|
+
quietGitLocks();
|
|
36
|
+
const REFRESH_EVERY_MS = 10 * 60 * 1e3;
|
|
37
|
+
const refreshedAt = /* @__PURE__ */ new Map();
|
|
38
|
+
function refreshIndexOccasionally(folder, now = Date.now()) {
|
|
39
|
+
if (now - (refreshedAt.get(folder) ?? -Infinity) < REFRESH_EVERY_MS) return false;
|
|
40
|
+
refreshedAt.set(folder, now);
|
|
41
|
+
try {
|
|
42
|
+
(0, import_node_child_process.execFileSync)("git", ["-C", folder, "update-index", "-q", "--refresh"], {
|
|
43
|
+
stdio: "ignore",
|
|
44
|
+
timeout: 3e4,
|
|
45
|
+
env: { ...process.env, GIT_OPTIONAL_LOCKS: "1" }
|
|
46
|
+
});
|
|
47
|
+
} catch {
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
async function refreshIndexOccasionallyAsync(folder, now = Date.now()) {
|
|
52
|
+
if (now - (refreshedAt.get(folder) ?? -Infinity) < REFRESH_EVERY_MS) return false;
|
|
53
|
+
refreshedAt.set(folder, now);
|
|
54
|
+
await gitAsync(folder, ["update-index", "-q", "--refresh"], { timeout: 3e4, env: { ...process.env, GIT_OPTIONAL_LOCKS: "1" } }).catch(() => {
|
|
55
|
+
});
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
const GIT_CONCURRENCY = 4;
|
|
59
|
+
let running = 0;
|
|
60
|
+
const queued = [];
|
|
61
|
+
const behind = [];
|
|
62
|
+
const background = new import_node_async_hooks.AsyncLocalStorage();
|
|
63
|
+
function inBackground(fn) {
|
|
64
|
+
return background.run(true, fn);
|
|
65
|
+
}
|
|
66
|
+
function next() {
|
|
67
|
+
if (running >= GIT_CONCURRENCY) return;
|
|
68
|
+
const now = queued.shift() ?? (running < GIT_CONCURRENCY - 1 ? behind.shift() : void 0);
|
|
69
|
+
if (now) {
|
|
70
|
+
running += 1;
|
|
71
|
+
now();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function release() {
|
|
75
|
+
running -= 1;
|
|
76
|
+
next();
|
|
77
|
+
}
|
|
78
|
+
async function slot() {
|
|
79
|
+
if (background.getStore()) {
|
|
80
|
+
if (!queued.length && !behind.length && running < GIT_CONCURRENCY - 1) {
|
|
81
|
+
running += 1;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
await new Promise((resolve) => behind.push(resolve));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!queued.length && running < GIT_CONCURRENCY) {
|
|
88
|
+
running += 1;
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await new Promise((resolve) => queued.push(resolve));
|
|
92
|
+
}
|
|
93
|
+
function gitAsyncLoad() {
|
|
94
|
+
return { running, queued: queued.length + behind.length, behind: behind.length };
|
|
95
|
+
}
|
|
96
|
+
async function gitAsync(cwd, args, opts = {}) {
|
|
97
|
+
await slot();
|
|
98
|
+
try {
|
|
99
|
+
return await new Promise((resolve, reject) => {
|
|
100
|
+
(0, import_node_child_process.execFile)("git", ["-C", cwd, ...args], {
|
|
101
|
+
encoding: "utf-8",
|
|
102
|
+
timeout: opts.timeout ?? 5e3,
|
|
103
|
+
maxBuffer: opts.maxBuffer ?? 16 * 1024 * 1024,
|
|
104
|
+
...opts.env ? { env: opts.env } : {}
|
|
105
|
+
}, (err, out) => err ? reject(err) : resolve(out)).stdin?.end();
|
|
106
|
+
});
|
|
107
|
+
} finally {
|
|
108
|
+
release();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
112
|
+
0 && (module.exports = {
|
|
113
|
+
GIT_CONCURRENCY,
|
|
114
|
+
REFRESH_EVERY_MS,
|
|
115
|
+
gitAsync,
|
|
116
|
+
gitAsyncLoad,
|
|
117
|
+
inBackground,
|
|
118
|
+
quietGitLocks,
|
|
119
|
+
refreshIndexOccasionally,
|
|
120
|
+
refreshIndexOccasionallyAsync
|
|
121
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
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_identity_exports = {};
|
|
29
|
+
__export(git_identity_exports, {
|
|
30
|
+
getNormalisedOriginUrl: () => getNormalisedOriginUrl,
|
|
31
|
+
getOriginUrl: () => getOriginUrl,
|
|
32
|
+
normaliseRepoUrl: () => normaliseRepoUrl
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(git_identity_exports);
|
|
35
|
+
var import_node_child_process = require("node:child_process");
|
|
36
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
37
|
+
var import_node_path = __toESM(require("node:path"));
|
|
38
|
+
function getOriginUrl(projectPath) {
|
|
39
|
+
try {
|
|
40
|
+
if (!import_node_fs.default.existsSync(import_node_path.default.join(projectPath, ".git"))) return null;
|
|
41
|
+
const url = (0, import_node_child_process.execFileSync)("git", ["remote", "get-url", "origin"], {
|
|
42
|
+
cwd: projectPath,
|
|
43
|
+
encoding: "utf-8",
|
|
44
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
45
|
+
}).trim();
|
|
46
|
+
return url || null;
|
|
47
|
+
} catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function normaliseRepoUrl(raw) {
|
|
52
|
+
if (!raw) return "";
|
|
53
|
+
let s = String(raw).trim();
|
|
54
|
+
if (!s) return "";
|
|
55
|
+
const shortSsh = s.match(/^git@([^:]+):(.+)$/);
|
|
56
|
+
if (shortSsh) {
|
|
57
|
+
s = `https://${shortSsh[1]}/${shortSsh[2]}`;
|
|
58
|
+
}
|
|
59
|
+
const longSsh = s.match(/^ssh:\/\/(?:[^@/]+@)?([^/]+)\/(.+)$/);
|
|
60
|
+
if (longSsh) {
|
|
61
|
+
s = `https://${longSsh[1]}/${longSsh[2]}`;
|
|
62
|
+
}
|
|
63
|
+
s = s.replace(/\.git\/?$/, "");
|
|
64
|
+
s = s.replace(/\/+$/, "");
|
|
65
|
+
try {
|
|
66
|
+
const u = new URL(s);
|
|
67
|
+
u.host = u.host.toLowerCase();
|
|
68
|
+
const path2 = u.pathname.replace(/\/+$/, "");
|
|
69
|
+
s = `${u.protocol}//${u.host}${path2}`;
|
|
70
|
+
} catch {
|
|
71
|
+
}
|
|
72
|
+
return s;
|
|
73
|
+
}
|
|
74
|
+
function getNormalisedOriginUrl(projectPath) {
|
|
75
|
+
const raw = getOriginUrl(projectPath);
|
|
76
|
+
if (!raw) return null;
|
|
77
|
+
return normaliseRepoUrl(raw);
|
|
78
|
+
}
|
|
79
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
80
|
+
0 && (module.exports = {
|
|
81
|
+
getNormalisedOriginUrl,
|
|
82
|
+
getOriginUrl,
|
|
83
|
+
normaliseRepoUrl
|
|
84
|
+
});
|
|
@@ -0,0 +1,386 @@
|
|
|
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_refs_exports = {};
|
|
29
|
+
__export(git_refs_exports, {
|
|
30
|
+
diffCommand: () => diffCommand,
|
|
31
|
+
fetchedAt: () => fetchedAt,
|
|
32
|
+
filesBetween: () => filesBetween,
|
|
33
|
+
findWorkstream: () => findWorkstream,
|
|
34
|
+
listRefs: () => listRefs,
|
|
35
|
+
mergeBase: () => mergeBase,
|
|
36
|
+
parseMergeBase: () => parseMergeBase,
|
|
37
|
+
shortRefName: () => shortRefName,
|
|
38
|
+
sideLabel: () => sideLabel,
|
|
39
|
+
treeOf: () => treeOf,
|
|
40
|
+
whenWords: () => whenWords,
|
|
41
|
+
workingCopyTree: () => workingCopyTree,
|
|
42
|
+
worktreesForCompare: () => worktreesForCompare
|
|
43
|
+
});
|
|
44
|
+
module.exports = __toCommonJS(git_refs_exports);
|
|
45
|
+
var import_node_child_process = require("node:child_process");
|
|
46
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
47
|
+
var import_node_os = __toESM(require("node:os"));
|
|
48
|
+
var import_node_path = __toESM(require("node:path"));
|
|
49
|
+
var import_git_safety = require("./git-safety");
|
|
50
|
+
var import_source_control = require("./source-control");
|
|
51
|
+
var import_worktree_service = require("./worktree-service");
|
|
52
|
+
const MAX_PER_KIND = 200;
|
|
53
|
+
const MAX_FILES = 1e3;
|
|
54
|
+
const SHA = /^[0-9a-f]{7,64}$/;
|
|
55
|
+
function git(cwd, args, env) {
|
|
56
|
+
return (0, import_node_child_process.execFileSync)("git", args, {
|
|
57
|
+
cwd,
|
|
58
|
+
encoding: "utf-8",
|
|
59
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
60
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
61
|
+
...env ? { env: { ...process.env, ...env } } : {}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
const trim = (p) => p.replace(/[\\/]+$/, "");
|
|
65
|
+
const short = (sha) => sha ? sha.slice(0, 7) : "";
|
|
66
|
+
function shortRefName(ref) {
|
|
67
|
+
if (ref.startsWith("refs/heads/")) return ref.slice("refs/heads/".length);
|
|
68
|
+
if (ref.startsWith("refs/remotes/")) return ref.slice("refs/remotes/".length);
|
|
69
|
+
if (ref.startsWith("refs/tags/")) return ref.slice("refs/tags/".length);
|
|
70
|
+
return ref;
|
|
71
|
+
}
|
|
72
|
+
function parseMergeBase(spec) {
|
|
73
|
+
if (!spec.startsWith("merge-base:")) return null;
|
|
74
|
+
const parts = spec.slice("merge-base:".length).split("...");
|
|
75
|
+
if (parts.length !== 2 || !(0, import_git_safety.isSafeGitRef)(parts[0]) || !(0, import_git_safety.isSafeGitRef)(parts[1])) return null;
|
|
76
|
+
return { a: parts[0], b: parts[1] };
|
|
77
|
+
}
|
|
78
|
+
function mergeBase(projectRoot, a, b) {
|
|
79
|
+
if (!(0, import_git_safety.isSafeGitRef)(a) || !(0, import_git_safety.isSafeGitRef)(b)) return null;
|
|
80
|
+
try {
|
|
81
|
+
const sha = git(projectRoot, ["merge-base", a, b]).trim();
|
|
82
|
+
return SHA.test(sha) ? sha : null;
|
|
83
|
+
} catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function findWorkstream(workstreams, id) {
|
|
88
|
+
const exact = workstreams.find((w) => w.root === id);
|
|
89
|
+
if (exact || !import_node_path.default.isAbsolute(id)) return exact ?? null;
|
|
90
|
+
const real = (p) => {
|
|
91
|
+
try {
|
|
92
|
+
return import_node_fs.default.realpathSync.native(p);
|
|
93
|
+
} catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const target = real(id);
|
|
98
|
+
if (!target) return null;
|
|
99
|
+
return workstreams.find((w) => import_node_path.default.isAbsolute(w.root) && real(w.root) === target) ?? null;
|
|
100
|
+
}
|
|
101
|
+
function worktreesForCompare(projectRoot) {
|
|
102
|
+
try {
|
|
103
|
+
return (0, import_worktree_service.listWorktrees)(projectRoot).filter((w) => !w.bare && !w.prunable).map((w) => ({
|
|
104
|
+
root: w.path,
|
|
105
|
+
branch: w.branch,
|
|
106
|
+
head: w.head,
|
|
107
|
+
main: w.isMain,
|
|
108
|
+
shape: "worktree",
|
|
109
|
+
agents: [],
|
|
110
|
+
idle: false,
|
|
111
|
+
changes: { base: null, files: [], truncated: false }
|
|
112
|
+
}));
|
|
113
|
+
} catch {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function workingCopyTree(root) {
|
|
118
|
+
let tmp = null;
|
|
119
|
+
try {
|
|
120
|
+
const indexPath = import_node_path.default.resolve(root, git(root, ["rev-parse", "--git-path", "index"]).trim());
|
|
121
|
+
tmp = import_node_path.default.join(import_node_fs.default.mkdtempSync(import_node_path.default.join(import_node_os.default.tmpdir(), "ct-tree-")), "index");
|
|
122
|
+
if (import_node_fs.default.existsSync(indexPath)) {
|
|
123
|
+
import_node_fs.default.copyFileSync(indexPath, tmp);
|
|
124
|
+
const st = import_node_fs.default.statSync(indexPath);
|
|
125
|
+
import_node_fs.default.utimesSync(tmp, st.atime, st.mtime);
|
|
126
|
+
}
|
|
127
|
+
const env = { GIT_INDEX_FILE: tmp };
|
|
128
|
+
git(root, ["add", "-A", "--", ":/"], env);
|
|
129
|
+
const tree = git(root, ["write-tree"], env).trim();
|
|
130
|
+
return SHA.test(tree) ? tree : null;
|
|
131
|
+
} catch {
|
|
132
|
+
return null;
|
|
133
|
+
} finally {
|
|
134
|
+
if (tmp) import_node_fs.default.rmSync(import_node_path.default.dirname(tmp), { recursive: true, force: true });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function indexTree(root) {
|
|
138
|
+
try {
|
|
139
|
+
const tree = git(root, ["write-tree"]).trim();
|
|
140
|
+
return SHA.test(tree) ? tree : null;
|
|
141
|
+
} catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function treeOf(projectRoot, spec, workstreams) {
|
|
146
|
+
if (spec === "live") return workingCopyTree(projectRoot);
|
|
147
|
+
if (spec === "index") return indexTree(projectRoot);
|
|
148
|
+
if (spec === "none") {
|
|
149
|
+
try {
|
|
150
|
+
return git(projectRoot, ["hash-object", "-t", "tree", "--stdin"]).trim() || null;
|
|
151
|
+
} catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (spec.startsWith("commit:")) {
|
|
156
|
+
const ref = spec.slice("commit:".length);
|
|
157
|
+
if (!(0, import_git_safety.isSafeGitRef)(ref)) return null;
|
|
158
|
+
try {
|
|
159
|
+
const sha = git(projectRoot, ["rev-parse", "--verify", "--quiet", `${ref}^{commit}`]).trim();
|
|
160
|
+
return SHA.test(sha) ? sha : null;
|
|
161
|
+
} catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const mb = parseMergeBase(spec);
|
|
166
|
+
if (mb) return mergeBase(projectRoot, mb.a, mb.b);
|
|
167
|
+
if (spec.startsWith("workstream:")) {
|
|
168
|
+
const w = findWorkstream(workstreams, spec.slice("workstream:".length));
|
|
169
|
+
if (!w) return null;
|
|
170
|
+
if (w.root.startsWith("branch:")) return w.head && SHA.test(w.head) ? w.head : null;
|
|
171
|
+
if (trim(w.root) === trim(projectRoot)) return workingCopyTree(projectRoot);
|
|
172
|
+
return workingCopyTree(w.root);
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
function gitName(spec, workstreams) {
|
|
177
|
+
if (spec.startsWith("commit:")) return shortRefName(spec.slice("commit:".length));
|
|
178
|
+
const mb = parseMergeBase(spec);
|
|
179
|
+
if (mb) return `$(git merge-base ${shortRefName(mb.a)} ${shortRefName(mb.b)})`;
|
|
180
|
+
if (spec.startsWith("workstream:")) {
|
|
181
|
+
const w = findWorkstream(workstreams, spec.slice("workstream:".length));
|
|
182
|
+
return w?.branch ?? null;
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
function diffCommand(before, after, workstreams, file) {
|
|
187
|
+
const tail = file ? ` -- ${file}` : "";
|
|
188
|
+
const mb = parseMergeBase(before);
|
|
189
|
+
if (mb && after.startsWith("commit:") && shortRefName(after.slice("commit:".length)) === shortRefName(mb.b)) {
|
|
190
|
+
return `git diff ${shortRefName(mb.a)}...${shortRefName(mb.b)}${tail}`;
|
|
191
|
+
}
|
|
192
|
+
if (before === "index" && after === "live") return `git diff${tail}`;
|
|
193
|
+
if (before === "commit:HEAD" && after === "index") return `git diff --cached${tail}`;
|
|
194
|
+
const b = gitName(before, workstreams);
|
|
195
|
+
if (after === "live" && b && !before.startsWith("workstream:")) return `git diff ${b}${tail}`;
|
|
196
|
+
if (after === "index" && b && !before.startsWith("workstream:")) return `git diff --cached ${b}${tail}`;
|
|
197
|
+
if (after.startsWith("workstream:")) {
|
|
198
|
+
const w = findWorkstream(workstreams, after.slice("workstream:".length));
|
|
199
|
+
if (w && !w.root.startsWith("branch:") && b && !before.startsWith("workstream:")) return `git -C ${w.root} diff ${b}${tail}`;
|
|
200
|
+
}
|
|
201
|
+
const a = gitName(after, workstreams);
|
|
202
|
+
if (b && a && !before.startsWith("workstream:") && !after.startsWith("workstream:")) return `git diff ${b} ${a}${tail}`;
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
function sideLabel(projectRoot, spec, workstreams) {
|
|
206
|
+
if (spec === "live") return "Your working copy";
|
|
207
|
+
if (spec === "index") return "Staged";
|
|
208
|
+
if (spec === "none") return "Nothing";
|
|
209
|
+
if (spec === "commit:HEAD") {
|
|
210
|
+
try {
|
|
211
|
+
return `Last commit (${short(git(projectRoot, ["rev-parse", "HEAD"]).trim())})`;
|
|
212
|
+
} catch {
|
|
213
|
+
return "Last commit";
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const mb = parseMergeBase(spec);
|
|
217
|
+
if (mb) {
|
|
218
|
+
const sha = mergeBase(projectRoot, mb.a, mb.b);
|
|
219
|
+
return `Where ${shortRefName(mb.a)} and ${shortRefName(mb.b)} split${sha ? ` (${short(sha)})` : ""}`;
|
|
220
|
+
}
|
|
221
|
+
if (spec.startsWith("workstream:")) {
|
|
222
|
+
const w = findWorkstream(workstreams, spec.slice("workstream:".length));
|
|
223
|
+
return w ? `${w.branch ?? import_node_path.default.basename(w.root)}, its working copy` : "A worktree";
|
|
224
|
+
}
|
|
225
|
+
if (spec.startsWith("commit:")) {
|
|
226
|
+
const ref = spec.slice("commit:".length);
|
|
227
|
+
if (ref.startsWith("refs/remotes/")) return `${shortRefName(ref)} (remote, as last fetched)`;
|
|
228
|
+
if (ref.startsWith("refs/tags/")) return `Tag ${shortRefName(ref)}`;
|
|
229
|
+
if (ref.startsWith("refs/heads/")) return shortRefName(ref);
|
|
230
|
+
return SHA.test(ref) ? `Commit ${short(ref)}` : ref;
|
|
231
|
+
}
|
|
232
|
+
return spec;
|
|
233
|
+
}
|
|
234
|
+
function filesBetween(projectRoot, before, after, workstreams) {
|
|
235
|
+
const a = treeOf(projectRoot, before, workstreams);
|
|
236
|
+
if (!a) return { ok: false, error: `Could not read \u201C${sideLabel(projectRoot, before, workstreams)}\u201D: it is not a ref, worktree or point this repository has.` };
|
|
237
|
+
const b = treeOf(projectRoot, after, workstreams);
|
|
238
|
+
if (!b) return { ok: false, error: `Could not read \u201C${sideLabel(projectRoot, after, workstreams)}\u201D: it is not a ref, worktree or point this repository has.` };
|
|
239
|
+
let out;
|
|
240
|
+
try {
|
|
241
|
+
out = git(projectRoot, ["diff-tree", "-r", "-z", "-M", "--name-status", "--relative", a, b]);
|
|
242
|
+
} catch {
|
|
243
|
+
return { ok: false, error: "git could not compare these two." };
|
|
244
|
+
}
|
|
245
|
+
const files = (0, import_source_control.parseNameStatus)(out, "");
|
|
246
|
+
return { ok: true, files: files.slice(0, MAX_FILES), truncated: files.length > MAX_FILES };
|
|
247
|
+
}
|
|
248
|
+
function fetchedAt(projectRoot) {
|
|
249
|
+
try {
|
|
250
|
+
const p = import_node_path.default.resolve(projectRoot, git(projectRoot, ["rev-parse", "--git-path", "FETCH_HEAD"]).trim());
|
|
251
|
+
return import_node_fs.default.existsSync(p) ? import_node_fs.default.statSync(p).mtimeMs : null;
|
|
252
|
+
} catch {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function whenWords(ms, now) {
|
|
257
|
+
if (ms === null) return "never";
|
|
258
|
+
const mins = Math.round((now - ms) / 6e4);
|
|
259
|
+
if (mins < 1) return "just now";
|
|
260
|
+
if (mins < 60) return `${mins} min ago`;
|
|
261
|
+
const hours = Math.round(mins / 60);
|
|
262
|
+
if (hours < 48) return `${hours} h ago`;
|
|
263
|
+
return `${Math.round(hours / 24)} days ago`;
|
|
264
|
+
}
|
|
265
|
+
function listRefs(projectRoot, workstreams, now = Date.now()) {
|
|
266
|
+
let branch = null;
|
|
267
|
+
let head = null;
|
|
268
|
+
try {
|
|
269
|
+
head = git(projectRoot, ["rev-parse", "HEAD"]).trim();
|
|
270
|
+
} catch {
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
branch = git(projectRoot, ["symbolic-ref", "--short", "-q", "HEAD"]).trim() || null;
|
|
274
|
+
} catch {
|
|
275
|
+
}
|
|
276
|
+
try {
|
|
277
|
+
git(projectRoot, ["rev-parse", "--git-dir"]);
|
|
278
|
+
} catch {
|
|
279
|
+
return { project: projectRoot, git: false, branch: null, groups: [], fetchedAt: null };
|
|
280
|
+
}
|
|
281
|
+
const groups = [];
|
|
282
|
+
const headSubject = head ? (() => {
|
|
283
|
+
try {
|
|
284
|
+
return git(projectRoot, ["log", "-1", "--format=%s"]).trim();
|
|
285
|
+
} catch {
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
})() : null;
|
|
289
|
+
groups.push({
|
|
290
|
+
kind: "checkout",
|
|
291
|
+
title: "This checkout",
|
|
292
|
+
words: `Your working copy, what is staged, and the last commit${branch ? ` on ${branch}` : ""}`,
|
|
293
|
+
git: { term: "HEAD", command: "git status" },
|
|
294
|
+
refs: [
|
|
295
|
+
{ spec: "live", kind: "checkout", name: "Working copy", words: "Your files as they are now, saved or not committed", term: "working tree", sha: null, at: null, subject: null },
|
|
296
|
+
{ spec: "index", kind: "checkout", name: "Staged", words: "What goes into the next commit", term: "index", sha: null, at: null, subject: null },
|
|
297
|
+
...head ? [{ spec: "commit:HEAD", kind: "checkout", name: "Last commit", words: `${short(head)} \u201C${headSubject ?? ""}\u201D`, term: "HEAD", sha: short(head), at: null, subject: headSubject }] : []
|
|
298
|
+
]
|
|
299
|
+
});
|
|
300
|
+
const fetched = fetchedAt(projectRoot);
|
|
301
|
+
let rows = [];
|
|
302
|
+
try {
|
|
303
|
+
rows = git(projectRoot, [
|
|
304
|
+
"for-each-ref",
|
|
305
|
+
"--sort=-creatordate",
|
|
306
|
+
"--format=%(refname)%00%(objectname)%00%(*objectname)%00%(creatordate:unix)%00%(subject)",
|
|
307
|
+
"refs/heads",
|
|
308
|
+
"refs/remotes",
|
|
309
|
+
"refs/tags"
|
|
310
|
+
]).split("\n").filter(Boolean);
|
|
311
|
+
} catch {
|
|
312
|
+
}
|
|
313
|
+
const byKind = { branch: [], remote: [], tag: [] };
|
|
314
|
+
for (const row of rows) {
|
|
315
|
+
const [ref, obj, peeled, unix, subject] = row.split("\0");
|
|
316
|
+
if (!(0, import_git_safety.isSafeGitRef)(ref) || ref.endsWith("/HEAD")) continue;
|
|
317
|
+
const kind = ref.startsWith("refs/heads/") ? "branch" : ref.startsWith("refs/remotes/") ? "remote" : "tag";
|
|
318
|
+
if (byKind[kind].length >= MAX_PER_KIND) continue;
|
|
319
|
+
const name = shortRefName(ref);
|
|
320
|
+
const at = unix ? Number(unix) * 1e3 : null;
|
|
321
|
+
const sha = short(peeled || obj);
|
|
322
|
+
const when = whenWords(at, now);
|
|
323
|
+
byKind[kind].push({
|
|
324
|
+
spec: `commit:${ref}`,
|
|
325
|
+
kind,
|
|
326
|
+
name,
|
|
327
|
+
sha,
|
|
328
|
+
at,
|
|
329
|
+
subject: subject || null,
|
|
330
|
+
current: kind === "branch" && name === branch,
|
|
331
|
+
term: kind === "remote" ? "remote-tracking branch" : kind,
|
|
332
|
+
words: kind === "branch" ? `A branch here, last changed ${when}` : kind === "remote" ? `${name.split("/")[0]}'s ${name.split("/").slice(1).join("/")}, as last fetched (${whenWords(fetched, now)})` : `A tag, made ${when}`
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
groups.push({ kind: "branch", title: "Branches", words: "Branches in this repository", git: { term: "branch", command: "git branch" }, refs: byKind.branch });
|
|
336
|
+
if (byKind.remote.length) {
|
|
337
|
+
groups.push({
|
|
338
|
+
kind: "remote",
|
|
339
|
+
title: "Remote branches",
|
|
340
|
+
words: `Other copies' branches as this repository last fetched them: ${fetched === null ? "never fetched" : `fetched ${whenWords(fetched, now)}`}`,
|
|
341
|
+
git: { term: "remote-tracking", command: "git branch -r" },
|
|
342
|
+
refs: byKind.remote
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
if (byKind.tag.length) groups.push({ kind: "tag", title: "Tags", words: "Named points, usually releases", git: { term: "tag", command: "git tag" }, refs: byKind.tag });
|
|
346
|
+
const worktrees = workstreams.filter((w) => !w.root.startsWith("branch:") && !w.main && trim(w.root) !== trim(projectRoot) && !trim(projectRoot).startsWith(`${trim(w.root)}/`));
|
|
347
|
+
if (worktrees.length) {
|
|
348
|
+
groups.push({
|
|
349
|
+
kind: "worktree",
|
|
350
|
+
title: "Worktrees",
|
|
351
|
+
words: "Other working copies of this repository, as they are now, saved or not committed",
|
|
352
|
+
git: { term: "worktree", command: "git worktree list" },
|
|
353
|
+
refs: worktrees.map((w) => {
|
|
354
|
+
const agents = [...new Set(w.agents.map((a) => a.agentType))];
|
|
355
|
+
return {
|
|
356
|
+
spec: `workstream:${w.root}`,
|
|
357
|
+
kind: "worktree",
|
|
358
|
+
name: w.branch ?? import_node_path.default.basename(w.root),
|
|
359
|
+
sha: w.head ? short(w.head) : null,
|
|
360
|
+
at: null,
|
|
361
|
+
subject: null,
|
|
362
|
+
term: "worktree",
|
|
363
|
+
agents,
|
|
364
|
+
words: `A worktree at ${w.root}${agents.length ? `, worked on by ${agents.join(" and ")}` : ""}: its files now, committed or not`
|
|
365
|
+
};
|
|
366
|
+
})
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return { project: projectRoot, git: true, branch, groups, fetchedAt: fetched };
|
|
370
|
+
}
|
|
371
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
372
|
+
0 && (module.exports = {
|
|
373
|
+
diffCommand,
|
|
374
|
+
fetchedAt,
|
|
375
|
+
filesBetween,
|
|
376
|
+
findWorkstream,
|
|
377
|
+
listRefs,
|
|
378
|
+
mergeBase,
|
|
379
|
+
parseMergeBase,
|
|
380
|
+
shortRefName,
|
|
381
|
+
sideLabel,
|
|
382
|
+
treeOf,
|
|
383
|
+
whenWords,
|
|
384
|
+
workingCopyTree,
|
|
385
|
+
worktreesForCompare
|
|
386
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
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_safety_exports = {};
|
|
19
|
+
__export(git_safety_exports, {
|
|
20
|
+
assertSafeGitPathArg: () => assertSafeGitPathArg,
|
|
21
|
+
assertSafeGitRef: () => assertSafeGitRef,
|
|
22
|
+
isSafeGitRef: () => isSafeGitRef
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(git_safety_exports);
|
|
25
|
+
const SAFE_REF = /^(?!-)(?!\.)[A-Za-z0-9_][A-Za-z0-9._/~^@-]{0,254}$/;
|
|
26
|
+
const RANGE = /\.\./;
|
|
27
|
+
function isSafeGitRef(value) {
|
|
28
|
+
if (typeof value !== "string") return false;
|
|
29
|
+
if (value.length === 0) return false;
|
|
30
|
+
if (RANGE.test(value)) return false;
|
|
31
|
+
return SAFE_REF.test(value);
|
|
32
|
+
}
|
|
33
|
+
function assertSafeGitRef(value, label) {
|
|
34
|
+
if (!isSafeGitRef(value)) {
|
|
35
|
+
const shown = typeof value === "string" ? value.slice(0, 80) : typeof value;
|
|
36
|
+
throw new Error(
|
|
37
|
+
`${label}: refusing to pass "${shown}" to git \u2014 not a valid commit or ref. Refs must not start with "-" or ".", contain ".." ranges, whitespace, colons or shell metacharacters.`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
function assertSafeGitPathArg(value, label) {
|
|
43
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
44
|
+
throw new Error(`${label}: expected a non-empty path`);
|
|
45
|
+
}
|
|
46
|
+
if (value.startsWith("-")) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`${label}: refusing to pass "${value.slice(0, 80)}" to git \u2014 a leading "-" would be parsed as an option.`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
54
|
+
0 && (module.exports = {
|
|
55
|
+
assertSafeGitPathArg,
|
|
56
|
+
assertSafeGitRef,
|
|
57
|
+
isSafeGitRef
|
|
58
|
+
});
|