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,252 @@
|
|
|
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 drift_tools_exports = {};
|
|
29
|
+
__export(drift_tools_exports, {
|
|
30
|
+
register: () => register
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(drift_tools_exports);
|
|
33
|
+
var import_zod = require("zod");
|
|
34
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
35
|
+
var import_helpers = require("../helpers");
|
|
36
|
+
function register(server, deps) {
|
|
37
|
+
const missingPlan = (uid) => deps.planService.getPlan(uid) ? null : { content: [{ type: "text", text: `Plan ${uid} not found.` }], isError: true };
|
|
38
|
+
server.registerTool(
|
|
39
|
+
"get_deviations",
|
|
40
|
+
{
|
|
41
|
+
description: "Get all deviations between a plan and the actual codebase state. Shows where reality diverges from the plan.",
|
|
42
|
+
inputSchema: { plan_uid: import_zod.z.string() }
|
|
43
|
+
},
|
|
44
|
+
async ({ plan_uid }) => {
|
|
45
|
+
const refused = missingPlan(plan_uid);
|
|
46
|
+
if (refused) return refused;
|
|
47
|
+
const devs = deps.getDeviations(plan_uid);
|
|
48
|
+
return { content: [{ type: "text", text: JSON.stringify(devs, null, 2) }] };
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
server.registerTool(
|
|
52
|
+
"reconcile",
|
|
53
|
+
{
|
|
54
|
+
description: "Resolve deviations from a plan. Accept (update plan to match), revert (flag for review), or ignore.",
|
|
55
|
+
inputSchema: {
|
|
56
|
+
plan_uid: import_zod.z.string(),
|
|
57
|
+
deviations: import_zod.z.array(import_zod.z.object({
|
|
58
|
+
id: import_zod.z.number(),
|
|
59
|
+
action: import_zod.z.enum(["accepted", "reverted", "ignored"])
|
|
60
|
+
}))
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
async ({ plan_uid, deviations }, extra) => {
|
|
64
|
+
const refused = missingPlan(plan_uid);
|
|
65
|
+
if (refused) return refused;
|
|
66
|
+
const id = (0, import_helpers.authorFromExtra)(deps, extra);
|
|
67
|
+
try {
|
|
68
|
+
const n = deps.reconcileDeviations(plan_uid, deviations, { actor: id.author, actorType: id.authorType });
|
|
69
|
+
deps.broadcast("deviations-resolved", { planUid: plan_uid, ids: deviations.map((d) => d.id) });
|
|
70
|
+
deps.saveNow(() => deps.exportDatabase());
|
|
71
|
+
return { content: [{ type: "text", text: `Resolved ${n} deviation${n === 1 ? "" : "s"} on plan ${plan_uid}, in your name.` }] };
|
|
72
|
+
} catch (err) {
|
|
73
|
+
if (err instanceof deps.DeviationError) return { content: [{ type: "text", text: err.message }], isError: true };
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
server.registerTool(
|
|
79
|
+
"detect_deviations",
|
|
80
|
+
{
|
|
81
|
+
description: "Run deviation detection for a plan \u2014 compares plan expectations against actual codebase state. Also detects unexpected files (changed since the baseline snapshot but not in any plan item's fileSpecs).",
|
|
82
|
+
inputSchema: { plan_uid: import_zod.z.string() }
|
|
83
|
+
},
|
|
84
|
+
async ({ plan_uid }) => {
|
|
85
|
+
const plan = deps.planService.getPlan(plan_uid);
|
|
86
|
+
if (!plan) return missingPlan(plan_uid);
|
|
87
|
+
const projectPath = plan.projectPath;
|
|
88
|
+
const snapshots = deps.listSnapshots(plan_uid);
|
|
89
|
+
let changedFiles;
|
|
90
|
+
if (snapshots.length > 0) {
|
|
91
|
+
const rawDiff = deps.computeTrellisDiff(snapshots[0].id);
|
|
92
|
+
if (rawDiff) {
|
|
93
|
+
const allChanged = [...rawDiff.addedFiles, ...rawDiff.modifiedFiles];
|
|
94
|
+
changedFiles = allChanged.filter((f) => {
|
|
95
|
+
const abs = f.startsWith("/") ? f : `${projectPath}/${f}`;
|
|
96
|
+
return import_node_fs.default.existsSync(abs);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const devs = deps.detectDeviations(plan_uid, changedFiles);
|
|
101
|
+
return { content: [{ type: "text", text: JSON.stringify({ detected: devs.length, deviations: devs }, null, 2) }] };
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
server.registerTool(
|
|
105
|
+
"list_proposed_changes",
|
|
106
|
+
{
|
|
107
|
+
description: `Granular CRUD feed projected from a plan's Actions: every affected file, symbol_spec, new_connection, and removed_connection becomes one ProposedChange row with operation (add/modify/remove/move), kind (file/symbol/connection), target, and a drift status (planned / in_progress / satisfied / missing / unexpected). Use this instead of walking item fields by hand to ask "what's left in this plan?".`,
|
|
108
|
+
inputSchema: { plan_uid: import_zod.z.string() }
|
|
109
|
+
},
|
|
110
|
+
async ({ plan_uid }) => {
|
|
111
|
+
const changes = deps.planChangesService.listProposedChanges(plan_uid);
|
|
112
|
+
return { content: [{ type: "text", text: JSON.stringify(changes, null, 2) }] };
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
server.registerTool(
|
|
116
|
+
"get_changes_summary",
|
|
117
|
+
{
|
|
118
|
+
description: `Aggregate counts for a plan's proposed changes \u2014 total + breakdown by drift status, kind, and operation. Use this to get a one-line "12/18 satisfied" picture without pulling every change row.`,
|
|
119
|
+
inputSchema: { plan_uid: import_zod.z.string() }
|
|
120
|
+
},
|
|
121
|
+
async ({ plan_uid }) => {
|
|
122
|
+
const summary = deps.planChangesService.summarizeChanges(plan_uid);
|
|
123
|
+
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
server.registerTool(
|
|
127
|
+
"get_change_status",
|
|
128
|
+
{
|
|
129
|
+
description: "Fetch a single ProposedChange (by id from list_proposed_changes) with its current drift status freshly computed against the live database.",
|
|
130
|
+
inputSchema: {
|
|
131
|
+
plan_uid: import_zod.z.string(),
|
|
132
|
+
change_id: import_zod.z.string()
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
async ({ plan_uid, change_id }) => {
|
|
136
|
+
const change = deps.planChangesService.getChange(plan_uid, change_id);
|
|
137
|
+
if (!change) return { content: [{ type: "text", text: `Change ${change_id} not found in plan ${plan_uid}` }], isError: true };
|
|
138
|
+
return { content: [{ type: "text", text: JSON.stringify(change, null, 2) }] };
|
|
139
|
+
}
|
|
140
|
+
);
|
|
141
|
+
server.registerTool(
|
|
142
|
+
"get_drift_report",
|
|
143
|
+
{
|
|
144
|
+
description: "Check if you are still following the plan. Compares the baseline snapshot (captured at plan approval) against the current live state. Returns what has changed, what is on track, and what has drifted. Also surfaces comment activity since `since_ms` (or since the baseline snapshot when omitted) so a returning agent can see what humans / other agents have said while it was away.",
|
|
145
|
+
inputSchema: {
|
|
146
|
+
plan_uid: import_zod.z.string(),
|
|
147
|
+
since_ms: import_zod.z.number().int().optional().describe('Epoch ms cutoff for "comment activity since". Defaults to the baseline snapshot timestamp.')
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
async ({ plan_uid, since_ms }) => {
|
|
151
|
+
const plan = deps.planService.getPlan(plan_uid);
|
|
152
|
+
const projectPath = plan?.projectPath ?? process.cwd();
|
|
153
|
+
const changesSummary = deps.planChangesService.summarizeChanges(plan_uid);
|
|
154
|
+
const proposedChanges = deps.planChangesService.listProposedChanges(plan_uid);
|
|
155
|
+
const onTrack = proposedChanges.filter((c) => c.driftStatus === "satisfied").map((c) => c.target);
|
|
156
|
+
const inProgress = proposedChanges.filter((c) => c.driftStatus === "in_progress").map((c) => c.target);
|
|
157
|
+
const missingChanges = proposedChanges.filter((c) => c.driftStatus === "missing").map((c) => c.target);
|
|
158
|
+
const planned = proposedChanges.filter((c) => c.driftStatus === "planned").map((c) => c.target);
|
|
159
|
+
const snapshots = deps.listSnapshots(plan_uid);
|
|
160
|
+
let snapshotDiff = null;
|
|
161
|
+
if (snapshots.length > 0) {
|
|
162
|
+
const rawDiff = deps.computeTrellisDiff(snapshots[0].id);
|
|
163
|
+
if (rawDiff) {
|
|
164
|
+
const freshAdded = rawDiff.addedFiles.filter((f) => {
|
|
165
|
+
const abs = f.startsWith("/") ? f : `${projectPath}/${f}`;
|
|
166
|
+
return import_node_fs.default.existsSync(abs);
|
|
167
|
+
});
|
|
168
|
+
const freshModified = rawDiff.modifiedFiles.filter((f) => {
|
|
169
|
+
const abs = f.startsWith("/") ? f : `${projectPath}/${f}`;
|
|
170
|
+
return import_node_fs.default.existsSync(abs);
|
|
171
|
+
});
|
|
172
|
+
snapshotDiff = {
|
|
173
|
+
addedFiles: freshAdded,
|
|
174
|
+
modifiedFiles: freshModified,
|
|
175
|
+
removedFiles: rawDiff.removedFiles,
|
|
176
|
+
addedEdges: rawDiff.addedEdges.length,
|
|
177
|
+
removedEdges: rawDiff.removedEdges.length
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const plannedPaths = new Set(proposedChanges.filter((c) => c.kind === "file").map((c) => c.target));
|
|
182
|
+
const unexpectedFiles = [];
|
|
183
|
+
if (snapshotDiff) {
|
|
184
|
+
for (const file of [...snapshotDiff.addedFiles, ...snapshotDiff.modifiedFiles]) {
|
|
185
|
+
const isPlanned = [...plannedPaths].some(
|
|
186
|
+
(p) => file === p || file.endsWith("/" + p) || p.endsWith("/" + file)
|
|
187
|
+
);
|
|
188
|
+
if (!isPlanned) unexpectedFiles.push(file);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const items = deps.planItemService.listItemSummaries(plan_uid);
|
|
192
|
+
const actions = items.filter((i) => i.kind === "action");
|
|
193
|
+
const completedTasks = actions.filter((i) => i.status === "done").length;
|
|
194
|
+
const totalTasks = actions.length;
|
|
195
|
+
const since = since_ms ?? (snapshots.length > 0 ? snapshots[0].createdAt : Date.now() - 36e5);
|
|
196
|
+
const recentComments = deps.commentService.listCommentsForPlanSince(plan_uid, since);
|
|
197
|
+
const blockers = recentComments.filter((c) => c.kind === "blocker");
|
|
198
|
+
const questions = recentComments.filter((c) => c.kind === "question");
|
|
199
|
+
const progressUpdates = recentComments.filter((c) => c.kind === "progress");
|
|
200
|
+
return { content: [{ type: "text", text: JSON.stringify({
|
|
201
|
+
planTitle: plan?.title,
|
|
202
|
+
taskProgress: `${completedTasks}/${totalTasks}`,
|
|
203
|
+
// Plan-aware classification (from plan-changes-service — always fresh)
|
|
204
|
+
planAlignment: {
|
|
205
|
+
satisfied: onTrack.length,
|
|
206
|
+
inProgress: inProgress.length,
|
|
207
|
+
missing: missingChanges.length,
|
|
208
|
+
planned: planned.length,
|
|
209
|
+
unexpected: unexpectedFiles.length,
|
|
210
|
+
satisfiedTargets: onTrack,
|
|
211
|
+
missingTargets: missingChanges,
|
|
212
|
+
unexpectedFiles
|
|
213
|
+
},
|
|
214
|
+
changesSummary,
|
|
215
|
+
// Snapshot diff (filesystem-verified, no phantoms)
|
|
216
|
+
snapshotDiff,
|
|
217
|
+
hasBaseline: snapshots.length > 0,
|
|
218
|
+
commentActivitySince: since,
|
|
219
|
+
commentSummary: {
|
|
220
|
+
total: recentComments.length,
|
|
221
|
+
blockers: blockers.length,
|
|
222
|
+
questions: questions.length,
|
|
223
|
+
progressUpdates: progressUpdates.length
|
|
224
|
+
},
|
|
225
|
+
recentBlockers: blockers,
|
|
226
|
+
recentQuestions: questions
|
|
227
|
+
}, null, 2) }] };
|
|
228
|
+
}
|
|
229
|
+
);
|
|
230
|
+
server.registerTool(
|
|
231
|
+
"capture_checkpoint",
|
|
232
|
+
{
|
|
233
|
+
description: "Create a named checkpoint of the current codebase state. Useful for marking progress during long plans.",
|
|
234
|
+
inputSchema: {
|
|
235
|
+
plan_uid: import_zod.z.string(),
|
|
236
|
+
name: import_zod.z.string().describe('Name for this checkpoint, e.g. "After task 3"'),
|
|
237
|
+
project_path: import_zod.z.string()
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
async ({ plan_uid, name, project_path }) => {
|
|
241
|
+
const refused = missingPlan(plan_uid);
|
|
242
|
+
if (refused) return refused;
|
|
243
|
+
const snapshot = deps.captureCurrentTrellis(project_path, plan_uid, name);
|
|
244
|
+
deps.saveNow(() => deps.exportDatabase());
|
|
245
|
+
return { content: [{ type: "text", text: `Checkpoint "${name}" captured (snapshot #${snapshot.id}, ${snapshot.filesJson ? JSON.parse(snapshot.filesJson).length : 0} files)` }] };
|
|
246
|
+
}
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
250
|
+
0 && (module.exports = {
|
|
251
|
+
register
|
|
252
|
+
});
|
|
@@ -0,0 +1,316 @@
|
|
|
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_tools_exports = {};
|
|
19
|
+
__export(git_tools_exports, {
|
|
20
|
+
register: () => register
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(git_tools_exports);
|
|
23
|
+
var import_zod = require("zod");
|
|
24
|
+
var import_git_commit_service = require("../../services/git-commit-service");
|
|
25
|
+
var import_git_activity_service = require("../../services/git-activity-service");
|
|
26
|
+
var import_plan_history_service = require("../../services/plan-history-service");
|
|
27
|
+
var import_plan_conflict_service = require("../../services/plan-conflict-service");
|
|
28
|
+
var import_line_history = require("../../services/line-history");
|
|
29
|
+
var import_git_refs = require("../../services/git-refs");
|
|
30
|
+
var import_commit_attribution = require("../../services/commit-attribution");
|
|
31
|
+
function register(server, deps) {
|
|
32
|
+
server.registerTool(
|
|
33
|
+
"line_history",
|
|
34
|
+
{
|
|
35
|
+
description: "Who wrote a line (or lines) of a file and why: the commit, its git author and time, and what CodeTrellis knows of who made it and how it knows (from the commit message, seen when it landed in a recorded session, or by timing in this checkout), with the session, task and plan where known. Lines not yet committed say so. Read only; with no line, every run of lines from one commit.",
|
|
36
|
+
inputSchema: {
|
|
37
|
+
path: import_zod.z.string().describe("The file, relative to the project."),
|
|
38
|
+
line: import_zod.z.number().int().positive().optional().describe("The line (1-based). Omit for the whole file."),
|
|
39
|
+
end_line: import_zod.z.number().int().positive().optional().describe("The last line of a range, with line."),
|
|
40
|
+
at: import_zod.z.string().optional().describe("Which side: live (default), commit:<ref>, or workstream:<id> from list_workstreams."),
|
|
41
|
+
project_path: import_zod.z.string().optional().describe("An opened project. Defaults to the active project.")
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
async ({ path: rel, line, end_line, at, project_path }) => {
|
|
45
|
+
const projectRoot = project_path ?? deps.getActiveProjectPath();
|
|
46
|
+
if (!projectRoot) return { isError: true, content: [{ type: "text", text: "No project is open." }] };
|
|
47
|
+
if (!(0, import_commit_attribution.isProjectRelativePath)(rel)) return { isError: true, content: [{ type: "text", text: "path must be relative to the project." }] };
|
|
48
|
+
try {
|
|
49
|
+
const h = (0, import_line_history.lineHistory)(projectRoot, at ?? "live", rel, (0, import_git_refs.worktreesForCompare)(projectRoot), (0, import_commit_attribution.recordedKnowledge)(projectRoot));
|
|
50
|
+
if (line && line > h.lineCount) {
|
|
51
|
+
const has = h.lineCount === 0 ? "has no lines" : `has ${h.lineCount} line${h.lineCount === 1 ? "" : "s"}`;
|
|
52
|
+
return { isError: true, content: [{ type: "text", text: `${h.path} ${has} at ${at ?? "live"}; line ${line} is past its end.` }] };
|
|
53
|
+
}
|
|
54
|
+
const from = line ?? 1;
|
|
55
|
+
const to = line ? Math.max(end_line ?? line, line) : h.lineCount;
|
|
56
|
+
const said = h.hunks.filter((x) => x.end >= from && x.start <= to).map((x) => (0, import_line_history.lineWords)(h, Math.max(x.start, from)));
|
|
57
|
+
const words = line ? said.join("\n") : `${h.path}: ${h.hunks.length} run${h.hunks.length === 1 ? "" : "s"} of lines.
|
|
58
|
+
${said.join("\n")}`;
|
|
59
|
+
return {
|
|
60
|
+
_meta: { summary: said[0] ?? `${h.path} has no lines.` },
|
|
61
|
+
content: [{ type: "text", text: `${words}
|
|
62
|
+
|
|
63
|
+
$ ${h.command}` }]
|
|
64
|
+
};
|
|
65
|
+
} catch (err) {
|
|
66
|
+
if (err instanceof import_line_history.LineHistoryError) return { isError: true, content: [{ type: "text", text: err.message }] };
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
server.registerTool(
|
|
72
|
+
"commit_manifest_changes",
|
|
73
|
+
{
|
|
74
|
+
description: 'Create a git commit in the project for the given paths, with a CDev-formatted message. Stages the supplied paths, composes a "[cdev] <subject>" commit message, and runs git commit. When agent attribution is supplied, appends a Co-Authored-By trailer and an agent/model metadata line so the commit history shows that an agent acted on the user\'s behalf. The git user identity (from `git config`) is always the commit author \u2014 accountability rests with the human. The Co-Authored-By possessive ("<human>\'s <agent>") reads `settings.identity.displayName ?? .email` \u2014 not git config directly \u2014 so if the user has edited their CodeTrellis identity the trailer reflects that. Use this when you (the agent) have completed work the user has authorised you to commit, or when the user has explicitly asked you to commit their pending manifest changes.',
|
|
75
|
+
inputSchema: {
|
|
76
|
+
project_root: import_zod.z.string().describe(
|
|
77
|
+
"Absolute path to the project root (must contain a .git directory)."
|
|
78
|
+
),
|
|
79
|
+
subject: import_zod.z.string().describe(
|
|
80
|
+
'Imperative-mood subject line. Will be prefixed with "[cdev] " automatically. Keep under 72 characters.'
|
|
81
|
+
),
|
|
82
|
+
paths: import_zod.z.array(import_zod.z.string()).describe(
|
|
83
|
+
"File paths to stage and commit, relative to project_root. The commit fails if this is empty or the paths produce no staged changes."
|
|
84
|
+
),
|
|
85
|
+
body: import_zod.z.array(import_zod.z.string()).optional().describe(
|
|
86
|
+
"Optional commit message body paragraphs. Each entry becomes its own paragraph."
|
|
87
|
+
),
|
|
88
|
+
agent: import_zod.z.object({
|
|
89
|
+
agent_type: import_zod.z.string().describe('Runtime identifier \u2014 e.g., "claude-code", "cursor", "codex".'),
|
|
90
|
+
model: import_zod.z.string().nullable().optional().describe('Specific model \u2014 e.g., "opus-4". Optional.')
|
|
91
|
+
}).optional().describe(
|
|
92
|
+
"When set, attributes the commit to an agent acting on the user's behalf. Adds Co-Authored-By trailer + agent/model metadata line. Omit for direct human commits."
|
|
93
|
+
),
|
|
94
|
+
signed: import_zod.z.boolean().optional().describe(
|
|
95
|
+
"Sign the commit with the user's configured signing key (git commit -S). Requires the user to have signing set up."
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
async ({ project_root, subject, paths, body, agent, signed }) => {
|
|
100
|
+
let agentAttribution;
|
|
101
|
+
if (agent) {
|
|
102
|
+
const settings = deps.getSettings();
|
|
103
|
+
const humanIdentity = settings.identity.displayName || settings.identity.email || null;
|
|
104
|
+
agentAttribution = {
|
|
105
|
+
agentType: agent.agent_type,
|
|
106
|
+
model: agent.model ?? null,
|
|
107
|
+
humanIdentity
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const result = (0, import_git_commit_service.commitManifestChanges)({
|
|
111
|
+
projectRoot: project_root,
|
|
112
|
+
subject,
|
|
113
|
+
body,
|
|
114
|
+
paths,
|
|
115
|
+
agent: agentAttribution,
|
|
116
|
+
signed
|
|
117
|
+
});
|
|
118
|
+
deps.broadcast("git-commit-created", {
|
|
119
|
+
projectRoot: project_root,
|
|
120
|
+
sha: result.sha,
|
|
121
|
+
subject,
|
|
122
|
+
agentAttributed: !!agent
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
content: [
|
|
126
|
+
{
|
|
127
|
+
type: "text",
|
|
128
|
+
text: JSON.stringify({ sha: result.sha, message: result.message }, null, 2)
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
server.registerTool(
|
|
135
|
+
"get_team_activity",
|
|
136
|
+
{
|
|
137
|
+
description: 'Get the team activity feed for a project \u2014 a "what happened recently" view drawn entirely from the git history of the .codetrellis/ manifest directory. Shows who created, updated, or deleted plans, items, channel events, system docs, and config. Each entry is attributed and timestamped. Complementary to the DB-driven plan_events (which tracks in-session mutations).',
|
|
138
|
+
inputSchema: {
|
|
139
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
140
|
+
since: import_zod.z.string().optional().describe("ISO date \u2014 only include commits after this point. Default: last 7 days."),
|
|
141
|
+
limit: import_zod.z.number().optional().describe("Max entries to return (default 50).")
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
async ({ project_path, since, limit }) => {
|
|
145
|
+
const sinceVal = since ?? new Date(Date.now() - 7 * 24 * 60 * 60 * 1e3).toISOString();
|
|
146
|
+
const entries = (0, import_git_activity_service.getTeamActivity)({ projectRoot: project_path, since: sinceVal, limit });
|
|
147
|
+
return {
|
|
148
|
+
content: [{
|
|
149
|
+
type: "text",
|
|
150
|
+
text: JSON.stringify({ total: entries.length, entries }, null, 2)
|
|
151
|
+
}]
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
server.registerTool(
|
|
156
|
+
"get_plan_history",
|
|
157
|
+
{
|
|
158
|
+
description: "List commits that touched a specific plan's manifest directory. Returns commit metadata (hash, timestamp, author, subject) in reverse-chronological order. Use the commit hashes with get_plan_at_commit to reconstruct the plan's state at any point in history.",
|
|
159
|
+
inputSchema: {
|
|
160
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
161
|
+
plan_slug: import_zod.z.string().describe("Slug of the plan directory under .codetrellis/plans/."),
|
|
162
|
+
limit: import_zod.z.number().optional().describe("Max commits to return (default 30)."),
|
|
163
|
+
since: import_zod.z.string().optional().describe("ISO date \u2014 only include commits after this point.")
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
async ({ project_path, plan_slug, limit, since }) => {
|
|
167
|
+
const commits = (0, import_git_activity_service.getPlanCommitHistory)(project_path, plan_slug, { limit, since });
|
|
168
|
+
return {
|
|
169
|
+
content: [{
|
|
170
|
+
type: "text",
|
|
171
|
+
text: JSON.stringify({ total: commits.length, commits }, null, 2)
|
|
172
|
+
}]
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
);
|
|
176
|
+
server.registerTool(
|
|
177
|
+
"get_plan_at_commit",
|
|
178
|
+
{
|
|
179
|
+
description: 'Reconstruct the full state of a plan at a specific git commit. Returns the plan metadata and all items as they existed at that point in time. Use this with get_plan_history to implement a "time machine" for plans \u2014 view any historical snapshot.',
|
|
180
|
+
inputSchema: {
|
|
181
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
182
|
+
plan_slug: import_zod.z.string().describe("Slug of the plan directory under .codetrellis/plans/."),
|
|
183
|
+
commit_hash: import_zod.z.string().describe("Git commit hash to read the plan state from.")
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
async ({ project_path, plan_slug, commit_hash }) => {
|
|
187
|
+
const state = (0, import_plan_history_service.getPlanAtCommit)(project_path, plan_slug, commit_hash);
|
|
188
|
+
if (!state) {
|
|
189
|
+
return { content: [{ type: "text", text: `Could not read plan "${plan_slug}" at commit ${commit_hash}. The plan or commit may not exist.` }], isError: true };
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
content: [{
|
|
193
|
+
type: "text",
|
|
194
|
+
text: JSON.stringify(state, null, 2)
|
|
195
|
+
}]
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
server.registerTool(
|
|
200
|
+
"diff_plan_between_commits",
|
|
201
|
+
{
|
|
202
|
+
description: "Compare a plan's state between two commits. Shows what items were added, removed, and which fields changed. Useful for understanding what happened between two points in time.",
|
|
203
|
+
inputSchema: {
|
|
204
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
205
|
+
plan_slug: import_zod.z.string().describe("Slug of the plan directory."),
|
|
206
|
+
base_commit: import_zod.z.string().describe('Earlier commit hash (the "before").'),
|
|
207
|
+
head_commit: import_zod.z.string().describe('Later commit hash (the "after"). Use "HEAD" for current.')
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
async ({ project_path, plan_slug, base_commit, head_commit }) => {
|
|
211
|
+
const diff = (0, import_plan_history_service.diffPlanBetweenCommits)(project_path, plan_slug, base_commit, head_commit);
|
|
212
|
+
return {
|
|
213
|
+
content: [{
|
|
214
|
+
type: "text",
|
|
215
|
+
text: JSON.stringify(diff, null, 2)
|
|
216
|
+
}]
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
);
|
|
220
|
+
server.registerTool(
|
|
221
|
+
"search_plan_history",
|
|
222
|
+
{
|
|
223
|
+
description: `Search a plan's git history for commits where specific text was added or removed. "Why did we choose this approach?" \u2014 find the commit where a decision was recorded and view the plan's state at that moment. Uses git log -G for content-level search.`,
|
|
224
|
+
inputSchema: {
|
|
225
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
226
|
+
plan_slug: import_zod.z.string().describe("Slug of the plan directory."),
|
|
227
|
+
query: import_zod.z.string().describe("Text to search for in plan file content (case-insensitive)."),
|
|
228
|
+
since: import_zod.z.string().optional().describe("ISO date \u2014 only include commits after this point."),
|
|
229
|
+
until: import_zod.z.string().optional().describe("ISO date \u2014 only include commits before this point."),
|
|
230
|
+
limit: import_zod.z.number().optional().describe("Max results (default 20).")
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
async ({ project_path, plan_slug, query, since, until, limit }) => {
|
|
234
|
+
const results = (0, import_git_activity_service.searchPlanHistory)(project_path, plan_slug, query, { since, until, limit });
|
|
235
|
+
return {
|
|
236
|
+
content: [{
|
|
237
|
+
type: "text",
|
|
238
|
+
text: JSON.stringify({ total: results.length, results }, null, 2)
|
|
239
|
+
}]
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
server.registerTool(
|
|
244
|
+
"detect_conflicts",
|
|
245
|
+
{
|
|
246
|
+
description: "Detect merge conflicts in .codetrellis/ manifest files. Returns a summary of all conflicted files with field-level details where possible (structured fields like status, assignee, visibility can be auto-resolved; free-text fields need manual resolution). Only returns results when git is in a merge state.",
|
|
247
|
+
inputSchema: {
|
|
248
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root.")
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
async ({ project_path }) => {
|
|
252
|
+
const summary = (0, import_plan_conflict_service.detectManifestConflicts)(project_path);
|
|
253
|
+
return {
|
|
254
|
+
content: [{
|
|
255
|
+
type: "text",
|
|
256
|
+
text: JSON.stringify(summary, null, 2)
|
|
257
|
+
}]
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
server.registerTool(
|
|
262
|
+
"resolve_conflict",
|
|
263
|
+
{
|
|
264
|
+
description: 'Resolve a merge conflict in a specific .codetrellis/ file. Two modes: "by_side" picks the entire ours or theirs version; "by_field" allows field-level resolution where each conflicting field can independently use ours, theirs, or a custom value. The resolved file is written and staged.',
|
|
265
|
+
inputSchema: {
|
|
266
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
267
|
+
file_path: import_zod.z.string().describe("Path to the conflicted file (relative to project root)."),
|
|
268
|
+
mode: import_zod.z.enum(["by_side", "by_field"]).describe('"by_side" to pick ours/theirs entirely, "by_field" for per-field resolution.'),
|
|
269
|
+
side: import_zod.z.enum(["ours", "theirs"]).optional().describe("Required for by_side mode. Which side to pick."),
|
|
270
|
+
resolutions: import_zod.z.array(import_zod.z.object({
|
|
271
|
+
field: import_zod.z.string().describe("Field name to resolve."),
|
|
272
|
+
pick: import_zod.z.enum(["ours", "theirs", "custom"]).describe("Which side to pick for this field."),
|
|
273
|
+
custom_value: import_zod.z.unknown().optional().describe('Custom value when pick is "custom".')
|
|
274
|
+
})).optional().describe("Required for by_field mode. Per-field resolutions.")
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
async ({ project_path, file_path, mode, side, resolutions }) => {
|
|
278
|
+
if (mode === "by_side") {
|
|
279
|
+
if (!side) {
|
|
280
|
+
return { content: [{ type: "text", text: "Side is required for by_side mode." }], isError: true };
|
|
281
|
+
}
|
|
282
|
+
const result2 = (0, import_plan_conflict_service.resolveFileConflictBySide)(project_path, file_path, side);
|
|
283
|
+
return {
|
|
284
|
+
content: [{
|
|
285
|
+
type: "text",
|
|
286
|
+
text: result2.resolved ? `Resolved ${file_path} using "${side}" version.` : `Failed to resolve: ${result2.error}`
|
|
287
|
+
}],
|
|
288
|
+
isError: !result2.resolved
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
if (!resolutions || resolutions.length === 0) {
|
|
292
|
+
return { content: [{ type: "text", text: "Resolutions are required for by_field mode." }], isError: true };
|
|
293
|
+
}
|
|
294
|
+
const result = (0, import_plan_conflict_service.resolveFileConflict)(
|
|
295
|
+
project_path,
|
|
296
|
+
file_path,
|
|
297
|
+
resolutions.map((r) => ({
|
|
298
|
+
field: r.field,
|
|
299
|
+
pick: r.pick,
|
|
300
|
+
customValue: r.custom_value
|
|
301
|
+
}))
|
|
302
|
+
);
|
|
303
|
+
return {
|
|
304
|
+
content: [{
|
|
305
|
+
type: "text",
|
|
306
|
+
text: result.resolved ? `Resolved ${file_path} with ${resolutions.length} field-level resolutions.` : `Failed to resolve: ${result.error}`
|
|
307
|
+
}],
|
|
308
|
+
isError: !result.resolved
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
314
|
+
0 && (module.exports = {
|
|
315
|
+
register
|
|
316
|
+
});
|