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,234 @@
|
|
|
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 test_results_exports = {};
|
|
29
|
+
__export(test_results_exports, {
|
|
30
|
+
MAX_REPORT_BYTES: () => MAX_REPORT_BYTES,
|
|
31
|
+
TestReportError: () => TestReportError,
|
|
32
|
+
ingestTestReport: () => ingestTestReport,
|
|
33
|
+
listTestReports: () => listTestReports,
|
|
34
|
+
listTestResults: () => listTestResults,
|
|
35
|
+
setReportListener: () => setReportListener,
|
|
36
|
+
testResultsAt: () => testResultsAt,
|
|
37
|
+
testsSummary: () => testsSummary
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(test_results_exports);
|
|
40
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
41
|
+
var import_node_path = __toESM(require("node:path"));
|
|
42
|
+
var import_node_crypto = __toESM(require("node:crypto"));
|
|
43
|
+
var import_database = require("../database");
|
|
44
|
+
var import_persistence = require("../persistence");
|
|
45
|
+
var import_confined_fs = require("../confined-fs");
|
|
46
|
+
var import_junit = require("./junit");
|
|
47
|
+
var import_retention = require("../retention");
|
|
48
|
+
const MAX_REPORT_BYTES = 20 * 1024 * 1024;
|
|
49
|
+
class TestReportError extends Error {
|
|
50
|
+
constructor(status, message) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.status = status;
|
|
53
|
+
}
|
|
54
|
+
status;
|
|
55
|
+
}
|
|
56
|
+
const keyOf = (c) => JSON.stringify([c.suite ?? "", c.classname ?? "", c.name]);
|
|
57
|
+
function reportRow(r) {
|
|
58
|
+
return {
|
|
59
|
+
id: Number(r[0]),
|
|
60
|
+
path: String(r[1]),
|
|
61
|
+
tests: Number(r[2]),
|
|
62
|
+
passed: Number(r[3]),
|
|
63
|
+
failed: Number(r[4]),
|
|
64
|
+
errors: Number(r[5]),
|
|
65
|
+
skipped: Number(r[6]),
|
|
66
|
+
ranAt: Number(r[7]),
|
|
67
|
+
reportedAt: Number(r[8]),
|
|
68
|
+
reportedBy: String(r[9]),
|
|
69
|
+
reportedByType: String(r[10])
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const REPORT_COLS = "id, path, tests, passed, failed, errors, skipped, ran_at, reported_at, reported_by, reported_by_type";
|
|
73
|
+
function ingestTestReport(projectRoot, candidate, by, now = Date.now()) {
|
|
74
|
+
let target;
|
|
75
|
+
try {
|
|
76
|
+
target = (0, import_confined_fs.resolveWithin)(projectRoot, import_node_path.default.isAbsolute(candidate) ? candidate : import_node_path.default.join(projectRoot, candidate), "test report");
|
|
77
|
+
} catch (err) {
|
|
78
|
+
if (err instanceof import_confined_fs.ConfinementError) throw new TestReportError(400, `${candidate} is not a file inside this project.`);
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
let st;
|
|
82
|
+
try {
|
|
83
|
+
st = import_node_fs.default.statSync(target);
|
|
84
|
+
} catch {
|
|
85
|
+
throw new TestReportError(404, `${candidate} does not exist.`);
|
|
86
|
+
}
|
|
87
|
+
if (!st.isFile()) throw new TestReportError(400, `${candidate} is not a file.`);
|
|
88
|
+
if (st.size > MAX_REPORT_BYTES) throw new TestReportError(413, `${candidate} is larger than a test report can be (20 MB).`);
|
|
89
|
+
let buf;
|
|
90
|
+
try {
|
|
91
|
+
buf = (0, import_confined_fs.readFileWithin)(projectRoot, target, "test report");
|
|
92
|
+
} catch (err) {
|
|
93
|
+
if (err instanceof import_confined_fs.ConfinementError) throw new TestReportError(400, `${candidate} could not be read: ${err.message}`);
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
const parsed = (0, import_junit.parseJUnit)(buf.toString("utf8"));
|
|
97
|
+
if (!parsed) throw new TestReportError(422, `${candidate} is not a JUnit report. Most runners write one: vitest --reporter=junit, jest-junit, pytest --junitxml, go-junit-report, Playwright's junit reporter.`);
|
|
98
|
+
const rel = import_node_path.default.relative(projectRoot, target).split(import_node_path.default.sep).join("/");
|
|
99
|
+
const sha256 = import_node_crypto.default.createHash("sha256").update(buf).digest("hex");
|
|
100
|
+
const failing = parsed.cases.filter((c) => c.result === "failed" || c.result === "error").slice(0, 20).map((c) => ({ label: (0, import_junit.testLabel)(c), result: c.result, message: c.message }));
|
|
101
|
+
const db = (0, import_database.getDb)();
|
|
102
|
+
const ranAt = Math.round(st.mtimeMs);
|
|
103
|
+
const t = parsed.totals;
|
|
104
|
+
const known = db.exec(`SELECT ${REPORT_COLS} FROM test_reports WHERE project_root = ? AND sha256 = ?`, [projectRoot, sha256])[0]?.values[0];
|
|
105
|
+
if (known && ranAt <= reportRow(known).ranAt) return { report: reportRow(known), already: true, failing, truncated: parsed.truncated };
|
|
106
|
+
if (known) {
|
|
107
|
+
db.run(
|
|
108
|
+
"UPDATE test_reports SET path = ?, ran_at = ?, reported_at = ?, reported_by = ?, reported_by_type = ? WHERE id = ?",
|
|
109
|
+
[rel, ranAt, now, by.author, by.authorType, reportRow(known).id]
|
|
110
|
+
);
|
|
111
|
+
} else {
|
|
112
|
+
db.run(
|
|
113
|
+
`INSERT INTO test_reports (project_root, path, sha256, tests, passed, failed, errors, skipped, ran_at, reported_at, reported_by, reported_by_type)
|
|
114
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
115
|
+
[projectRoot, rel, sha256, t.tests, t.passed, t.failed, t.errors, t.skipped, ranAt, now, by.author, by.authorType]
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
const id = Number(db.exec("SELECT id FROM test_reports WHERE project_root = ? AND sha256 = ?", [projectRoot, sha256])[0].values[0][0]);
|
|
119
|
+
const cutoff = (0, import_retention.retentionCutoff)(now);
|
|
120
|
+
if (cutoff !== null) {
|
|
121
|
+
db.run(
|
|
122
|
+
"DELETE FROM test_report_cases WHERE report_id IN (SELECT id FROM test_reports WHERE project_root = ? AND reported_at < ?)",
|
|
123
|
+
[projectRoot, cutoff]
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
for (const c of parsed.cases) {
|
|
127
|
+
db.run(
|
|
128
|
+
`INSERT OR REPLACE INTO test_report_cases (report_id, test_key, suite, classname, name, file, result, duration_ms, message)
|
|
129
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
130
|
+
[id, keyOf(c), c.suite, c.classname, c.name, c.file, c.result, c.durationMs, c.message]
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
for (const c of parsed.cases) {
|
|
134
|
+
db.run(
|
|
135
|
+
`INSERT INTO test_results (project_root, test_key, suite, classname, name, file, result, duration_ms, message, report_id, ran_at)
|
|
136
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
137
|
+
ON CONFLICT(project_root, test_key) DO UPDATE SET
|
|
138
|
+
suite = excluded.suite, classname = excluded.classname, name = excluded.name, file = excluded.file,
|
|
139
|
+
result = excluded.result, duration_ms = excluded.duration_ms, message = excluded.message,
|
|
140
|
+
report_id = excluded.report_id, ran_at = excluded.ran_at
|
|
141
|
+
WHERE excluded.ran_at >= test_results.ran_at`,
|
|
142
|
+
[projectRoot, keyOf(c), c.suite, c.classname, c.name, c.file, c.result, c.durationMs, c.message, id, ranAt]
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
(0, import_persistence.markDirty)();
|
|
146
|
+
const report = reportRow(db.exec(`SELECT ${REPORT_COLS} FROM test_reports WHERE id = ?`, [id])[0].values[0]);
|
|
147
|
+
try {
|
|
148
|
+
reportListener?.({ projectRoot, path: rel, ranAt, by, totals: t, cases: parsed.cases });
|
|
149
|
+
} catch (err) {
|
|
150
|
+
console.warn("[Tests] sharing the run failed:", err);
|
|
151
|
+
}
|
|
152
|
+
return { report, already: false, failing, truncated: parsed.truncated };
|
|
153
|
+
}
|
|
154
|
+
let reportListener;
|
|
155
|
+
function setReportListener(fn) {
|
|
156
|
+
reportListener = fn;
|
|
157
|
+
}
|
|
158
|
+
function listTestResults(projectRoot, opts = {}) {
|
|
159
|
+
const rows = (0, import_database.getDb)().exec(
|
|
160
|
+
`SELECT r.suite, r.classname, r.name, r.file, r.result, r.duration_ms, r.message, r.ran_at, p.path
|
|
161
|
+
FROM test_results r JOIN test_reports p ON p.id = r.report_id
|
|
162
|
+
WHERE r.project_root = ?`,
|
|
163
|
+
[projectRoot]
|
|
164
|
+
)[0]?.values ?? [];
|
|
165
|
+
const order = { error: 0, failed: 1, skipped: 2, passed: 3 };
|
|
166
|
+
const m = opts.match?.toLowerCase();
|
|
167
|
+
return rows.map((r) => {
|
|
168
|
+
const c = { suite: r[0], classname: r[1], name: String(r[2]), file: r[3] };
|
|
169
|
+
return {
|
|
170
|
+
...c,
|
|
171
|
+
label: (0, import_junit.testLabel)(c),
|
|
172
|
+
result: r[4],
|
|
173
|
+
durationMs: r[5] ?? null,
|
|
174
|
+
message: r[6] ?? null,
|
|
175
|
+
ranAt: Number(r[7]),
|
|
176
|
+
reportPath: String(r[8])
|
|
177
|
+
};
|
|
178
|
+
}).filter((t) => !opts.result || t.result === opts.result).filter((t) => !m || [t.file, t.classname, t.suite].some((v) => v?.toLowerCase().includes(m))).sort((a, b) => order[a.result] - order[b.result] || a.label.localeCompare(b.label)).slice(0, opts.limit ?? 500);
|
|
179
|
+
}
|
|
180
|
+
function testResultsAt(projectRoot, at) {
|
|
181
|
+
const db = (0, import_database.getDb)();
|
|
182
|
+
const reports = db.exec(
|
|
183
|
+
"SELECT id, path, ran_at FROM test_reports WHERE project_root = ? AND reported_at <= ? ORDER BY ran_at, id",
|
|
184
|
+
[projectRoot, at]
|
|
185
|
+
)[0]?.values ?? [];
|
|
186
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
187
|
+
for (const [id, reportPath, ranAt] of reports) {
|
|
188
|
+
let rows = db.exec(
|
|
189
|
+
"SELECT test_key, suite, classname, name, file, result, duration_ms, message FROM test_report_cases WHERE report_id = ?",
|
|
190
|
+
[id]
|
|
191
|
+
)[0]?.values ?? [];
|
|
192
|
+
if (rows.length === 0) {
|
|
193
|
+
rows = db.exec(
|
|
194
|
+
"SELECT test_key, suite, classname, name, file, result, duration_ms, message FROM test_results WHERE project_root = ? AND report_id = ?",
|
|
195
|
+
[projectRoot, id]
|
|
196
|
+
)[0]?.values ?? [];
|
|
197
|
+
}
|
|
198
|
+
for (const r of rows) {
|
|
199
|
+
const c = { suite: r[1], classname: r[2], name: String(r[3]), file: r[4] };
|
|
200
|
+
byKey.set(String(r[0]), {
|
|
201
|
+
...c,
|
|
202
|
+
label: (0, import_junit.testLabel)(c),
|
|
203
|
+
result: r[5],
|
|
204
|
+
durationMs: r[6] ?? null,
|
|
205
|
+
message: r[7] ?? null,
|
|
206
|
+
ranAt: Number(ranAt),
|
|
207
|
+
reportPath: String(reportPath)
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return [...byKey.values()];
|
|
212
|
+
}
|
|
213
|
+
function listTestReports(projectRoot, limit = 20) {
|
|
214
|
+
return ((0, import_database.getDb)().exec(`SELECT ${REPORT_COLS} FROM test_reports WHERE project_root = ? ORDER BY ran_at DESC, id DESC LIMIT ?`, [projectRoot, limit])[0]?.values ?? []).map(reportRow);
|
|
215
|
+
}
|
|
216
|
+
function testsSummary(projectRoot) {
|
|
217
|
+
const rows = (0, import_database.getDb)().exec("SELECT result, COUNT(*) FROM test_results WHERE project_root = ? GROUP BY result", [projectRoot])[0]?.values ?? [];
|
|
218
|
+
const n = (r) => Number(rows.find((x) => x[0] === r)?.[1] ?? 0);
|
|
219
|
+
const tests = rows.reduce((a, r) => a + Number(r[1]), 0);
|
|
220
|
+
const failing = n("failed") + n("error");
|
|
221
|
+
const words = tests === 0 ? "No test results yet: an agent hands over a JUnit report with report_tests." : `${tests} test${tests === 1 ? "" : "s"}, ${failing ? `${failing} failing` : "none failing"}${n("skipped") ? `, ${n("skipped")} skipped` : ""}`;
|
|
222
|
+
return { tests, passed: n("passed"), failing, skipped: n("skipped"), words };
|
|
223
|
+
}
|
|
224
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
225
|
+
0 && (module.exports = {
|
|
226
|
+
MAX_REPORT_BYTES,
|
|
227
|
+
TestReportError,
|
|
228
|
+
ingestTestReport,
|
|
229
|
+
listTestReports,
|
|
230
|
+
listTestResults,
|
|
231
|
+
setReportListener,
|
|
232
|
+
testResultsAt,
|
|
233
|
+
testsSummary
|
|
234
|
+
});
|
|
@@ -0,0 +1,204 @@
|
|
|
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 tree_watcher_exports = {};
|
|
29
|
+
__export(tree_watcher_exports, {
|
|
30
|
+
usesNativeTreeWatcher: () => usesNativeTreeWatcher,
|
|
31
|
+
watchTree: () => watchTree
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(tree_watcher_exports);
|
|
34
|
+
var import_node_events = require("node:events");
|
|
35
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
36
|
+
var import_node_path = __toESM(require("node:path"));
|
|
37
|
+
var import_chokidar = __toESM(require("chokidar"));
|
|
38
|
+
function usesNativeTreeWatcher(platform = process.platform) {
|
|
39
|
+
if (process.env.CODETRELLIS_TREE_WATCHER === "chokidar") return false;
|
|
40
|
+
return platform === "darwin";
|
|
41
|
+
}
|
|
42
|
+
function watchTree(root, opts = {}) {
|
|
43
|
+
if (!usesNativeTreeWatcher()) {
|
|
44
|
+
return import_chokidar.default.watch(root, { ignoreInitial: true, persistent: true, ...opts });
|
|
45
|
+
}
|
|
46
|
+
return new NativeTreeWatcher(root, opts);
|
|
47
|
+
}
|
|
48
|
+
const COALESCE_MS = 50;
|
|
49
|
+
class NativeTreeWatcher extends import_node_events.EventEmitter {
|
|
50
|
+
constructor(root, opts) {
|
|
51
|
+
super();
|
|
52
|
+
this.root = root;
|
|
53
|
+
this.opts = opts;
|
|
54
|
+
try {
|
|
55
|
+
this.fsw = import_node_fs.default.watch(root, { recursive: true, persistent: true }, (_type, name) => {
|
|
56
|
+
if (this.closed) return;
|
|
57
|
+
if (!name) {
|
|
58
|
+
void this.rescan();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.report(import_node_path.default.join(root, name.toString()));
|
|
62
|
+
});
|
|
63
|
+
this.fsw.on("error", (err) => this.emit("error", err));
|
|
64
|
+
} catch (err) {
|
|
65
|
+
setImmediate(() => this.emit("error", err));
|
|
66
|
+
}
|
|
67
|
+
void this.walk(root, true).then(() => {
|
|
68
|
+
if (!this.closed) this.emit("ready");
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
root;
|
|
72
|
+
opts;
|
|
73
|
+
seen = /* @__PURE__ */ new Map();
|
|
74
|
+
timers = /* @__PURE__ */ new Map();
|
|
75
|
+
fsw = null;
|
|
76
|
+
closed = false;
|
|
77
|
+
skip(p) {
|
|
78
|
+
if (p !== this.root && this.opts.ignored?.(p)) return true;
|
|
79
|
+
if (this.opts.depth === void 0) return false;
|
|
80
|
+
const rel = import_node_path.default.relative(this.root, p);
|
|
81
|
+
if (!rel || rel.startsWith("..")) return !!rel;
|
|
82
|
+
return rel.split(import_node_path.default.sep).length - 1 > this.opts.depth;
|
|
83
|
+
}
|
|
84
|
+
/** Record what is under `dir`; `quiet` for the first walk (ignoreInitial), else report what is new. */
|
|
85
|
+
async walk(dir, quiet) {
|
|
86
|
+
if (this.closed) return;
|
|
87
|
+
let entries;
|
|
88
|
+
try {
|
|
89
|
+
entries = await import_node_fs.default.promises.readdir(dir, { withFileTypes: true });
|
|
90
|
+
} catch {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
for (const e of entries) {
|
|
94
|
+
const p = import_node_path.default.join(dir, e.name);
|
|
95
|
+
if (this.skip(p)) continue;
|
|
96
|
+
if (e.isDirectory()) {
|
|
97
|
+
const isNew = !this.seen.has(p);
|
|
98
|
+
this.seen.set(p, { dir: true });
|
|
99
|
+
if (isNew && !quiet) this.fire("addDir", p);
|
|
100
|
+
await this.walk(p, quiet);
|
|
101
|
+
} else {
|
|
102
|
+
if (this.seen.has(p)) continue;
|
|
103
|
+
const st = this.stat(p);
|
|
104
|
+
if (!st) continue;
|
|
105
|
+
this.seen.set(p, { dir: false, size: st.size, mtimeMs: st.mtimeMs });
|
|
106
|
+
if (!quiet) this.fire("add", p);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
stat(p) {
|
|
111
|
+
try {
|
|
112
|
+
return import_node_fs.default.lstatSync(p);
|
|
113
|
+
} catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
report(p) {
|
|
118
|
+
if (p === this.root || this.skip(p)) return;
|
|
119
|
+
const wait = this.opts.awaitWriteFinish?.stabilityThreshold ?? COALESCE_MS;
|
|
120
|
+
const prev = this.timers.get(p);
|
|
121
|
+
if (prev) clearTimeout(prev);
|
|
122
|
+
this.timers.set(p, setTimeout(() => {
|
|
123
|
+
this.timers.delete(p);
|
|
124
|
+
void this.settle(p);
|
|
125
|
+
}, wait));
|
|
126
|
+
}
|
|
127
|
+
/** Look at `p` and say what changed there. */
|
|
128
|
+
async settle(p) {
|
|
129
|
+
if (this.closed) return;
|
|
130
|
+
const st = this.stat(p);
|
|
131
|
+
const was = this.seen.get(p);
|
|
132
|
+
if (!st) {
|
|
133
|
+
if (!was) return;
|
|
134
|
+
if (was.dir) this.forgetDir(p);
|
|
135
|
+
else {
|
|
136
|
+
this.seen.delete(p);
|
|
137
|
+
this.fire("unlink", p);
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (st.isDirectory()) {
|
|
142
|
+
if (was && !was.dir) {
|
|
143
|
+
this.seen.delete(p);
|
|
144
|
+
this.fire("unlink", p);
|
|
145
|
+
}
|
|
146
|
+
if (!was || !was.dir) {
|
|
147
|
+
this.seen.set(p, { dir: true });
|
|
148
|
+
this.fire("addDir", p);
|
|
149
|
+
}
|
|
150
|
+
await this.walk(p, false);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (was?.dir) this.forgetDir(p);
|
|
154
|
+
const now = { dir: false, size: st.size, mtimeMs: st.mtimeMs };
|
|
155
|
+
this.seen.set(p, now);
|
|
156
|
+
if (!was || was.dir) this.fire("add", p);
|
|
157
|
+
else if (was.size !== now.size || was.mtimeMs !== now.mtimeMs) this.fire("change", p);
|
|
158
|
+
}
|
|
159
|
+
forgetDir(dir) {
|
|
160
|
+
const prefix = dir + import_node_path.default.sep;
|
|
161
|
+
for (const [p, s] of [...this.seen]) {
|
|
162
|
+
if (!p.startsWith(prefix)) continue;
|
|
163
|
+
this.seen.delete(p);
|
|
164
|
+
this.fire(s.dir ? "unlinkDir" : "unlink", p);
|
|
165
|
+
}
|
|
166
|
+
this.seen.delete(dir);
|
|
167
|
+
this.fire("unlinkDir", dir);
|
|
168
|
+
}
|
|
169
|
+
/** A flood dropped the names: compare everything recorded with what is there. */
|
|
170
|
+
async rescan() {
|
|
171
|
+
for (const p of [...this.seen.keys()]) {
|
|
172
|
+
if (!import_node_fs.default.existsSync(p)) await this.settle(p);
|
|
173
|
+
}
|
|
174
|
+
await this.walk(this.root, false);
|
|
175
|
+
}
|
|
176
|
+
fire(event, p) {
|
|
177
|
+
if (this.closed) return;
|
|
178
|
+
this.emit(event, p);
|
|
179
|
+
this.emit("all", event, p);
|
|
180
|
+
}
|
|
181
|
+
getWatched() {
|
|
182
|
+
const out = { [this.root]: [] };
|
|
183
|
+
for (const [p, s] of this.seen) {
|
|
184
|
+
if (s.dir) out[p] ??= [];
|
|
185
|
+
const parent = import_node_path.default.dirname(p);
|
|
186
|
+
(out[parent] ??= []).push(import_node_path.default.basename(p));
|
|
187
|
+
}
|
|
188
|
+
for (const k of Object.keys(out)) out[k].sort();
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
async close() {
|
|
192
|
+
this.closed = true;
|
|
193
|
+
this.fsw?.close();
|
|
194
|
+
this.fsw = null;
|
|
195
|
+
for (const t of this.timers.values()) clearTimeout(t);
|
|
196
|
+
this.timers.clear();
|
|
197
|
+
this.removeAllListeners();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
201
|
+
0 && (module.exports = {
|
|
202
|
+
usesNativeTreeWatcher,
|
|
203
|
+
watchTree
|
|
204
|
+
});
|
|
@@ -0,0 +1,204 @@
|
|
|
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 trellis_service_exports = {};
|
|
19
|
+
__export(trellis_service_exports, {
|
|
20
|
+
captureCurrentTrellis: () => captureCurrentTrellis,
|
|
21
|
+
computeTrellisDiff: () => computeTrellisDiff,
|
|
22
|
+
getSnapshot: () => getSnapshot,
|
|
23
|
+
listSnapshots: () => listSnapshots,
|
|
24
|
+
readLiveGraph: () => readLiveGraph
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(trellis_service_exports);
|
|
27
|
+
var import_database = require("./database");
|
|
28
|
+
var import_persistence = require("./persistence");
|
|
29
|
+
var import_git_checkout = require("./git-checkout");
|
|
30
|
+
function readLiveGraph() {
|
|
31
|
+
const db = (0, import_database.getDb)();
|
|
32
|
+
let edges = [];
|
|
33
|
+
try {
|
|
34
|
+
edges = (0, import_database.getDependencyEdges)();
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
const counts = /* @__PURE__ */ new Map();
|
|
38
|
+
const countRows = db.exec(
|
|
39
|
+
`SELECT f.relative_path, COUNT(s.id) FROM files f
|
|
40
|
+
LEFT JOIN symbols s ON s.file_id = f.id AND s.parent_symbol_id IS NULL
|
|
41
|
+
GROUP BY f.id`
|
|
42
|
+
);
|
|
43
|
+
for (const r of countRows[0]?.values ?? []) counts.set(r[0], Number(r[1]) || 0);
|
|
44
|
+
const filesResult = db.exec(`SELECT relative_path, content_hash, language FROM files`);
|
|
45
|
+
const files = (filesResult[0]?.values || []).map((r) => ({
|
|
46
|
+
path: r[0],
|
|
47
|
+
contentHash: r[1],
|
|
48
|
+
language: r[2],
|
|
49
|
+
symbolCount: counts.get(r[0]) ?? 0
|
|
50
|
+
}));
|
|
51
|
+
return {
|
|
52
|
+
files,
|
|
53
|
+
edges: edges.map((e) => ({ source: e.sourceRelative, target: e.targetRelative, specifiers: e.specifiers }))
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function captureCurrentTrellis(projectPath, planUid, name) {
|
|
57
|
+
const db = (0, import_database.getDb)();
|
|
58
|
+
const { files, edges: edgesData } = readLiveGraph();
|
|
59
|
+
const gitBranch = (0, import_git_checkout.currentBranch)(projectPath);
|
|
60
|
+
const snapshotName = name || `Snapshot at ${(/* @__PURE__ */ new Date()).toLocaleString()}`;
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
db.run(
|
|
63
|
+
`INSERT INTO trellis_snapshots (name, snapshot_type, plan_uid, git_branch, files_json, edges_json, created_at)
|
|
64
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
65
|
+
[
|
|
66
|
+
snapshotName,
|
|
67
|
+
planUid ? "current" : "checkpoint",
|
|
68
|
+
planUid || null,
|
|
69
|
+
gitBranch,
|
|
70
|
+
JSON.stringify(files),
|
|
71
|
+
JSON.stringify(edgesData),
|
|
72
|
+
now
|
|
73
|
+
]
|
|
74
|
+
);
|
|
75
|
+
const idResult = db.exec(`SELECT last_insert_rowid()`);
|
|
76
|
+
const id = idResult[0]?.values[0]?.[0] || 0;
|
|
77
|
+
(0, import_persistence.markDirty)();
|
|
78
|
+
console.log(`[Trellis] Captured snapshot #${id}: "${snapshotName}" (${files.length} files, ${edgesData.length} edges)`);
|
|
79
|
+
return {
|
|
80
|
+
id,
|
|
81
|
+
name: snapshotName,
|
|
82
|
+
snapshotType: planUid ? "current" : "checkpoint",
|
|
83
|
+
planUid: planUid || null,
|
|
84
|
+
gitBranch,
|
|
85
|
+
filesJson: JSON.stringify(files),
|
|
86
|
+
edgesJson: JSON.stringify(edgesData),
|
|
87
|
+
createdAt: now
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function getSnapshot(id) {
|
|
91
|
+
const result = (0, import_database.getDb)().exec(
|
|
92
|
+
`SELECT t.id, t.name, t.snapshot_type, t.plan_uid, t.git_branch,
|
|
93
|
+
COALESCE(o.files_json, t.files_json), COALESCE(o.edges_json, t.edges_json), t.created_at
|
|
94
|
+
FROM trellis_snapshots t LEFT JOIN trellis_snapshots o ON o.id = t.same_as
|
|
95
|
+
WHERE t.id = ?`,
|
|
96
|
+
[id]
|
|
97
|
+
);
|
|
98
|
+
if (!result[0]?.values[0]) return null;
|
|
99
|
+
const r = result[0].values[0];
|
|
100
|
+
return {
|
|
101
|
+
id: r[0],
|
|
102
|
+
name: r[1],
|
|
103
|
+
snapshotType: r[2],
|
|
104
|
+
planUid: r[3],
|
|
105
|
+
gitBranch: r[4],
|
|
106
|
+
filesJson: r[5],
|
|
107
|
+
edgesJson: r[6],
|
|
108
|
+
createdAt: r[7],
|
|
109
|
+
data: {
|
|
110
|
+
files: JSON.parse(r[5]),
|
|
111
|
+
edges: JSON.parse(r[6])
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function listSnapshots(planUid) {
|
|
116
|
+
let query = `SELECT id, name, snapshot_type, plan_uid, git_branch, files_json, edges_json, created_at FROM trellis_snapshots
|
|
117
|
+
WHERE snapshot_type != 'frame'`;
|
|
118
|
+
const params = [];
|
|
119
|
+
if (planUid) {
|
|
120
|
+
query += ` AND plan_uid = ?`;
|
|
121
|
+
params.push(planUid);
|
|
122
|
+
}
|
|
123
|
+
query += ` ORDER BY created_at DESC`;
|
|
124
|
+
const result = (0, import_database.getDb)().exec(query, params);
|
|
125
|
+
if (!result[0]) return [];
|
|
126
|
+
return result[0].values.map((r) => ({
|
|
127
|
+
id: r[0],
|
|
128
|
+
name: r[1],
|
|
129
|
+
snapshotType: r[2],
|
|
130
|
+
planUid: r[3],
|
|
131
|
+
gitBranch: r[4],
|
|
132
|
+
createdAt: r[7],
|
|
133
|
+
fileCount: JSON.parse(r[5]).length,
|
|
134
|
+
edgeCount: JSON.parse(r[6]).length
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
function computeTrellisDiff(snapshotId) {
|
|
138
|
+
const snapshot = getSnapshot(snapshotId);
|
|
139
|
+
if (!snapshot) return null;
|
|
140
|
+
const snapshotFiles = new Map(snapshot.data.files.map((f) => [f.path, f.contentHash]));
|
|
141
|
+
const snapshotEdges = new Set(snapshot.data.edges.map((e) => `${e.source}->${e.target}`));
|
|
142
|
+
let liveEdges = [];
|
|
143
|
+
try {
|
|
144
|
+
liveEdges = (0, import_database.getDependencyEdges)();
|
|
145
|
+
} catch {
|
|
146
|
+
}
|
|
147
|
+
const liveFiles = /* @__PURE__ */ new Map();
|
|
148
|
+
const filesResult = (0, import_database.getDb)().exec(`SELECT relative_path, content_hash FROM files`);
|
|
149
|
+
if (filesResult[0]) {
|
|
150
|
+
for (const r of filesResult[0].values) {
|
|
151
|
+
liveFiles.set(r[0], r[1]);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const liveEdgeSet = new Set(liveEdges.map((e) => `${e.sourceRelative}->${e.targetRelative}`));
|
|
155
|
+
const addedFiles = [];
|
|
156
|
+
const removedFiles = [];
|
|
157
|
+
const modifiedFiles = [];
|
|
158
|
+
for (const [path, hash] of liveFiles) {
|
|
159
|
+
const snapshotHash = snapshotFiles.get(path);
|
|
160
|
+
if (!snapshotHash) {
|
|
161
|
+
addedFiles.push(path);
|
|
162
|
+
} else if (snapshotHash !== hash) {
|
|
163
|
+
modifiedFiles.push(path);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
for (const path of snapshotFiles.keys()) {
|
|
167
|
+
if (!liveFiles.has(path)) {
|
|
168
|
+
removedFiles.push(path);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const addedEdgesArr = [];
|
|
172
|
+
const removedEdgesArr = [];
|
|
173
|
+
for (const edge of liveEdgeSet) {
|
|
174
|
+
if (!snapshotEdges.has(edge)) {
|
|
175
|
+
const [source, target] = edge.split("->");
|
|
176
|
+
addedEdgesArr.push({ source, target });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
for (const edge of snapshotEdges) {
|
|
180
|
+
if (!liveEdgeSet.has(edge)) {
|
|
181
|
+
const [source, target] = edge.split("->");
|
|
182
|
+
removedEdgesArr.push({ source, target });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const totalFiles = snapshotFiles.size;
|
|
186
|
+
const changedFiles = addedFiles.length + modifiedFiles.length;
|
|
187
|
+
const progress = totalFiles > 0 ? Math.round(changedFiles / Math.max(totalFiles, changedFiles) * 100) : 0;
|
|
188
|
+
return {
|
|
189
|
+
addedFiles,
|
|
190
|
+
removedFiles,
|
|
191
|
+
modifiedFiles,
|
|
192
|
+
addedEdges: addedEdgesArr,
|
|
193
|
+
removedEdges: removedEdgesArr,
|
|
194
|
+
progress
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
198
|
+
0 && (module.exports = {
|
|
199
|
+
captureCurrentTrellis,
|
|
200
|
+
computeTrellisDiff,
|
|
201
|
+
getSnapshot,
|
|
202
|
+
listSnapshots,
|
|
203
|
+
readLiveGraph
|
|
204
|
+
});
|