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,175 @@
|
|
|
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 governance_tools_exports = {};
|
|
19
|
+
__export(governance_tools_exports, {
|
|
20
|
+
register: () => register
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(governance_tools_exports);
|
|
23
|
+
var import_zod = require("zod");
|
|
24
|
+
var import_helpers = require("../helpers");
|
|
25
|
+
var import_freeze_service = require("../../services/freeze-service");
|
|
26
|
+
var import_record_chain = require("../../services/record-chain");
|
|
27
|
+
var import_evidence = require("../../services/evidence");
|
|
28
|
+
const FLAGGED_NOTE = " Recorded in your name and flagged for a person to review.";
|
|
29
|
+
function register(server, deps) {
|
|
30
|
+
server.registerTool(
|
|
31
|
+
"verify_record",
|
|
32
|
+
{
|
|
33
|
+
description: "Is the record intact? Every agent event CodeTrellis keeps (tool calls, and the decisions people make: criteria, breakpoints, signals, spec proposals, rules) is linked into a hash chain as it is written. This walks it and says whether anything kept was changed, removed or added around it since, naming each by number, kind and agent. Read only.",
|
|
34
|
+
inputSchema: {}
|
|
35
|
+
},
|
|
36
|
+
async () => {
|
|
37
|
+
const r = (0, import_record_chain.verifyRecord)();
|
|
38
|
+
return {
|
|
39
|
+
_meta: { summary: r.ok ? `Record intact: ${r.entries} entries` : `Record changed: ${r.problems.length} problem${r.problems.length === 1 ? "" : "s"}` },
|
|
40
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
41
|
+
ok: r.ok,
|
|
42
|
+
words: r.words,
|
|
43
|
+
entries: r.entries,
|
|
44
|
+
since: r.since,
|
|
45
|
+
trimmed_through: r.trimmedThrough,
|
|
46
|
+
head: r.head,
|
|
47
|
+
problems: r.problems.map((p) => ({ seq: p.seq, event_id: p.eventId, kind: p.kind, at: p.at, type: p.type, agent_type: p.agentType }))
|
|
48
|
+
}, null, 2) }]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
server.registerTool(
|
|
53
|
+
"export_evidence",
|
|
54
|
+
{
|
|
55
|
+
description: "The evidence for a plan, or a window of time in an opened project, as one signed package: the record's entries in the window with how to recompute each link, the replay frames, the stack and the signals at the start and the end, the breakpoints and decisions in words, and (for a plan) the sign-off pack; sealed with this computer's key and the record's head. Give plan_uid, or project_path with from and to (milliseconds). Read only.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
plan_uid: import_zod.z.string().optional().describe("A plan: its project, from when it was made until it finished (or now)."),
|
|
58
|
+
project_path: import_zod.z.string().optional().describe("An opened project, for a window of time. Defaults to the active project."),
|
|
59
|
+
from: import_zod.z.number().int().nonnegative().optional().describe("The window's start, in milliseconds since 1970."),
|
|
60
|
+
to: import_zod.z.number().int().nonnegative().optional().describe("The window's end, in milliseconds since 1970.")
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
async ({ plan_uid, project_path, from, to }) => {
|
|
64
|
+
try {
|
|
65
|
+
const e = (0, import_evidence.sealEvidence)((0, import_evidence.buildEvidence)(plan_uid ? { planUid: plan_uid } : { projectPath: project_path ?? deps.getActiveProjectPath() ?? void 0, from, to }));
|
|
66
|
+
return {
|
|
67
|
+
_meta: { summary: `Evidence: ${e.window.words}` },
|
|
68
|
+
content: [{ type: "text", text: JSON.stringify(e) }]
|
|
69
|
+
};
|
|
70
|
+
} catch (err) {
|
|
71
|
+
if (err instanceof import_evidence.EvidenceError) return { isError: true, content: [{ type: "text", text: err.message }] };
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
server.registerTool(
|
|
77
|
+
"get_freeze_status",
|
|
78
|
+
{
|
|
79
|
+
description: 'Check whether a project is currently under a freeze period. Returns the freeze state, reason, timing, and which plans are exempt. Handles auto-expiry: if the "until" timestamp has passed, the freeze is treated as inactive.',
|
|
80
|
+
inputSchema: {
|
|
81
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root.")
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
async ({ project_path }) => {
|
|
85
|
+
const status = (0, import_freeze_service.getFreezeStatus)(project_path);
|
|
86
|
+
return {
|
|
87
|
+
content: [{
|
|
88
|
+
type: "text",
|
|
89
|
+
text: JSON.stringify(status, null, 2)
|
|
90
|
+
}]
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
server.registerTool(
|
|
95
|
+
"set_freeze",
|
|
96
|
+
{
|
|
97
|
+
description: "Activate or deactivate a freeze period on a project. During a freeze, agents should not start work on non-exempt plans. Use this during release weeks, incident response, or any period where non-critical changes should be blocked. The freeze is stored in .codetrellis/config.json and committed to the manifest.",
|
|
98
|
+
inputSchema: {
|
|
99
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
100
|
+
active: import_zod.z.boolean().describe("True to activate the freeze, false to lift it."),
|
|
101
|
+
reason: import_zod.z.string().optional().describe('Human-readable reason (e.g., "Release v2.3 freeze").'),
|
|
102
|
+
until: import_zod.z.string().nullable().optional().describe("ISO timestamp when the freeze auto-expires. Null = indefinite."),
|
|
103
|
+
allowed_plan_uids: import_zod.z.array(import_zod.z.string()).optional().describe("Plan UIDs exempt from the freeze.")
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
async ({ project_path, active, reason, until, allowed_plan_uids }, extra) => {
|
|
107
|
+
const { author, authorType } = (0, import_helpers.authorFromExtra)(deps, extra);
|
|
108
|
+
const status = (0, import_freeze_service.setFreeze)(project_path, {
|
|
109
|
+
active,
|
|
110
|
+
reason,
|
|
111
|
+
until,
|
|
112
|
+
allowedPlanUids: allowed_plan_uids
|
|
113
|
+
}, { actor: author, actorType: authorType, channel: "mcp" });
|
|
114
|
+
deps.broadcast("freeze-changed", { projectRoot: project_path, status });
|
|
115
|
+
const msg = (active ? `Freeze activated${reason ? `: ${reason}` : ""}${until ? ` (expires ${until})` : " (indefinite)"}. ${(allowed_plan_uids ?? []).length} plan(s) exempt.` : "Freeze lifted.") + FLAGGED_NOTE;
|
|
116
|
+
return {
|
|
117
|
+
content: [{ type: "text", text: msg }]
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
server.registerTool(
|
|
122
|
+
"check_freeze",
|
|
123
|
+
{
|
|
124
|
+
description: "Check whether a specific plan is allowed to be worked on during an active freeze. Returns true if: no freeze is active, the freeze has expired, or the plan is in the exemption list. Agents should call this before claiming items to respect governance.",
|
|
125
|
+
inputSchema: {
|
|
126
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
127
|
+
plan_uid: import_zod.z.string().describe("UID of the plan to check.")
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
async ({ project_path, plan_uid }) => {
|
|
131
|
+
const allowed = (0, import_freeze_service.isPlanAllowedDuringFreeze)(project_path, plan_uid);
|
|
132
|
+
const status = (0, import_freeze_service.getFreezeStatus)(project_path);
|
|
133
|
+
return {
|
|
134
|
+
content: [{
|
|
135
|
+
type: "text",
|
|
136
|
+
text: JSON.stringify({
|
|
137
|
+
planUid: plan_uid,
|
|
138
|
+
allowed,
|
|
139
|
+
freezeActive: status.active,
|
|
140
|
+
reason: status.reason,
|
|
141
|
+
until: status.until
|
|
142
|
+
}, null, 2)
|
|
143
|
+
}]
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
server.registerTool(
|
|
148
|
+
"exempt_plan_from_freeze",
|
|
149
|
+
{
|
|
150
|
+
description: "Add a plan to the freeze exemption list without changing the freeze state. Exempt plans can be worked on during a freeze (e.g., hotfix plans during release freeze).",
|
|
151
|
+
inputSchema: {
|
|
152
|
+
project_path: import_zod.z.string().describe("Absolute path to the project root."),
|
|
153
|
+
plan_uid: import_zod.z.string().describe("UID of the plan to exempt.")
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
async ({ project_path, plan_uid }, extra) => {
|
|
157
|
+
if (!deps.planService.getPlan(plan_uid)) {
|
|
158
|
+
return { content: [{ type: "text", text: `Plan not found: ${plan_uid}` }], isError: true };
|
|
159
|
+
}
|
|
160
|
+
const { author, authorType } = (0, import_helpers.authorFromExtra)(deps, extra);
|
|
161
|
+
const status = (0, import_freeze_service.exemptPlanFromFreeze)(project_path, plan_uid, { actor: author, actorType: authorType, channel: "mcp" });
|
|
162
|
+
deps.broadcast("freeze-changed", { projectRoot: project_path, status });
|
|
163
|
+
return {
|
|
164
|
+
content: [{
|
|
165
|
+
type: "text",
|
|
166
|
+
text: `Plan ${plan_uid} is now exempt from the freeze. ${status.allowedPlanUids.length} plan(s) total exempt.${FLAGGED_NOTE}`
|
|
167
|
+
}]
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
173
|
+
0 && (module.exports = {
|
|
174
|
+
register
|
|
175
|
+
});
|
|
@@ -0,0 +1,181 @@
|
|
|
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 graph_tools_exports = {};
|
|
19
|
+
__export(graph_tools_exports, {
|
|
20
|
+
register: () => register
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(graph_tools_exports);
|
|
23
|
+
var import_zod = require("zod");
|
|
24
|
+
function register(server, deps) {
|
|
25
|
+
server.registerTool(
|
|
26
|
+
"graph_focus",
|
|
27
|
+
{
|
|
28
|
+
description: "Focus the dependency graph on a specific file or directory. Pans and zooms the graph canvas to center the target node. Use this to visually show the user a specific part of the architecture.",
|
|
29
|
+
inputSchema: {
|
|
30
|
+
path: import_zod.z.string().describe('Relative path of the file or directory to focus on (e.g. "src/backend/services/plan-item-service.ts").'),
|
|
31
|
+
highlight: import_zod.z.boolean().optional().describe("Briefly highlight the node with a glow effect. Default true.")
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
async ({ path: targetPath, highlight }) => {
|
|
35
|
+
deps.broadcast("ui-graph-focus", { path: targetPath, highlight: highlight !== false });
|
|
36
|
+
return { content: [{ type: "text", text: `Focused graph on ${targetPath}` }] };
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
server.registerTool(
|
|
40
|
+
"graph_set_mode",
|
|
41
|
+
{
|
|
42
|
+
description: 'Set the graph trellis mode \u2014 changes the overlay displayed on the dependency graph. "live" = current state, "baseline" = snapshot comparison, "planned" = show plan targets, "diff" = show changes.',
|
|
43
|
+
inputSchema: {
|
|
44
|
+
mode: import_zod.z.enum(["live", "baseline", "planned", "diff"]).describe("Trellis overlay mode.")
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
async ({ mode }) => {
|
|
48
|
+
deps.broadcast("ui-graph-mode", { mode: mode === "baseline" ? "current" : mode });
|
|
49
|
+
return { content: [{ type: "text", text: `Set graph mode to ${mode}` }] };
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
server.registerTool(
|
|
53
|
+
"graph_set_scope",
|
|
54
|
+
{
|
|
55
|
+
description: "Set the graph scope filter to show only files under a specific directory or package path. Pass an empty string to clear the scope and show the full graph.",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
scope_path: import_zod.z.string().describe('Directory path to scope to (e.g. "src/backend/services"). Empty string to clear.')
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
async ({ scope_path }) => {
|
|
61
|
+
deps.broadcast("ui-graph-scope", { scopePath: scope_path });
|
|
62
|
+
return { content: [{ type: "text", text: scope_path ? `Scoped graph to ${scope_path}` : "Cleared graph scope" }] };
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
server.registerTool(
|
|
66
|
+
"graph_select",
|
|
67
|
+
{
|
|
68
|
+
description: 'Select one or more nodes on the dependency graph by their file/directory path. Mirrors shift-click multi-select. Selected nodes can then be used with "Plan these" or "Add to task" actions. Pass an empty array to clear the selection.',
|
|
69
|
+
inputSchema: {
|
|
70
|
+
paths: import_zod.z.array(import_zod.z.string()).describe(
|
|
71
|
+
'Array of relative file or directory paths to select (e.g. ["src/backend/server.ts", "src/frontend/App.tsx"]). Empty array to clear.'
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
async ({ paths }) => {
|
|
76
|
+
deps.broadcast("ui-graph-select", { paths });
|
|
77
|
+
const msg = paths.length === 0 ? "Cleared graph selection" : `Selected ${paths.length} node(s) on graph`;
|
|
78
|
+
return { content: [{ type: "text", text: msg }] };
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
server.registerTool(
|
|
82
|
+
"graph_set_layout",
|
|
83
|
+
{
|
|
84
|
+
description: 'Switch the graph layout algorithm. "map" = force-directed (d3-force) layout for organic exploration. "tree" = hierarchical (dagre) layout for structured top-down view.',
|
|
85
|
+
inputSchema: {
|
|
86
|
+
layout: import_zod.z.enum(["map", "tree"]).describe('Layout algorithm: "map" (force-directed) or "tree" (hierarchical dagre).')
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
async ({ layout }) => {
|
|
90
|
+
deps.broadcast("ui-graph-layout", { layout });
|
|
91
|
+
return { content: [{ type: "text", text: `Set graph layout to ${layout}` }] };
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
server.registerTool(
|
|
95
|
+
"graph_set_depth",
|
|
96
|
+
{
|
|
97
|
+
description: 'Set the graph view depth \u2014 controls what level of detail is shown. "package" = show only packages/directories (highest level). "file" = show individual files within packages. "symbol" = show classes, functions, and methods within files (most detailed).',
|
|
98
|
+
inputSchema: {
|
|
99
|
+
depth: import_zod.z.enum(["package", "file", "symbol"]).describe("View depth level.")
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
async ({ depth }) => {
|
|
103
|
+
deps.broadcast("ui-graph-depth", { depth });
|
|
104
|
+
return { content: [{ type: "text", text: `Set graph view depth to ${depth}` }] };
|
|
105
|
+
}
|
|
106
|
+
);
|
|
107
|
+
server.registerTool(
|
|
108
|
+
"graph_toggle_projection",
|
|
109
|
+
{
|
|
110
|
+
description: "Toggle the plan projection overlay on the dependency graph. When enabled, the graph highlights files and symbols that are targeted by the active plan (Planned/Diff trellis modes). When disabled, shows the raw dependency graph.",
|
|
111
|
+
inputSchema: {
|
|
112
|
+
enabled: import_zod.z.boolean().optional().describe("Explicitly set projection on or off. If omitted, toggles the current state.")
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
async ({ enabled }) => {
|
|
116
|
+
deps.broadcast("ui-graph-toggle-projection", { enabled });
|
|
117
|
+
const label = enabled === true ? "enabled" : enabled === false ? "disabled" : "toggled";
|
|
118
|
+
return { content: [{ type: "text", text: `Projection ${label}` }] };
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
server.registerTool(
|
|
122
|
+
"graph_export",
|
|
123
|
+
{
|
|
124
|
+
description: "Export the current graph view as a PNG image. Returns the graph canvas as a base64-encoded image. Useful for saving a visual snapshot of the architecture or sharing with team members.",
|
|
125
|
+
inputSchema: {}
|
|
126
|
+
},
|
|
127
|
+
async () => {
|
|
128
|
+
const nonce = `ge-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
129
|
+
const p = new Promise((resolve, reject) => {
|
|
130
|
+
const timer = setTimeout(() => {
|
|
131
|
+
deps.pendingResponses.delete(nonce);
|
|
132
|
+
reject(new Error("Graph export timed out \u2014 is the CodeTrellis UI open with the graph visible?"));
|
|
133
|
+
}, 1e4);
|
|
134
|
+
deps.pendingResponses.set(nonce, { resolve, reject, timer });
|
|
135
|
+
});
|
|
136
|
+
deps.broadcast("ui-screenshot-request", { nonce, panel: "graph" });
|
|
137
|
+
try {
|
|
138
|
+
const base64 = await p;
|
|
139
|
+
return {
|
|
140
|
+
content: [{
|
|
141
|
+
type: "image",
|
|
142
|
+
data: base64,
|
|
143
|
+
mimeType: "image/png"
|
|
144
|
+
}]
|
|
145
|
+
};
|
|
146
|
+
} catch (err) {
|
|
147
|
+
return { content: [{ type: "text", text: err instanceof Error ? err.message : String(err) }], isError: true };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
server.registerTool(
|
|
152
|
+
"graph_snapshot",
|
|
153
|
+
{
|
|
154
|
+
description: "Return a structured JSON snapshot of the current graph data \u2014 all nodes and edges with their types, paths, and relationships. Use this to programmatically analyse the architecture without needing the visual canvas. Much lighter than a screenshot and gives exact data for reasoning about dependencies.",
|
|
155
|
+
inputSchema: {
|
|
156
|
+
include_metadata: import_zod.z.boolean().optional().describe("Include full metadata for each node (default false \u2014 keeps response compact).")
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
async ({ include_metadata }) => {
|
|
160
|
+
const nonce = `gs-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
161
|
+
const p = new Promise((resolve, reject) => {
|
|
162
|
+
const timer = setTimeout(() => {
|
|
163
|
+
deps.pendingResponses.delete(nonce);
|
|
164
|
+
reject(new Error("Graph snapshot timed out \u2014 is the CodeTrellis UI open?"));
|
|
165
|
+
}, 1e4);
|
|
166
|
+
deps.pendingResponses.set(nonce, { resolve, reject, timer });
|
|
167
|
+
});
|
|
168
|
+
deps.broadcast("ui-graph-snapshot-request", { nonce, includeMetadata: include_metadata === true });
|
|
169
|
+
try {
|
|
170
|
+
const json = await p;
|
|
171
|
+
return { content: [{ type: "text", text: json }] };
|
|
172
|
+
} catch (err) {
|
|
173
|
+
return { content: [{ type: "text", text: err instanceof Error ? err.message : String(err) }], isError: true };
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
179
|
+
0 && (module.exports = {
|
|
180
|
+
register
|
|
181
|
+
});
|
|
@@ -0,0 +1,244 @@
|
|
|
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 intake_tools_exports = {};
|
|
19
|
+
__export(intake_tools_exports, {
|
|
20
|
+
register: () => register
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(intake_tools_exports);
|
|
23
|
+
var import_zod = require("zod");
|
|
24
|
+
var import_helpers = require("../helpers");
|
|
25
|
+
var import_external_intake_service = require("../../services/external-intake-service");
|
|
26
|
+
var import_external_refs_service = require("../../services/external-refs-service");
|
|
27
|
+
var import_trusted_roots = require("../../services/trusted-roots");
|
|
28
|
+
const externalSchema = import_zod.z.object({
|
|
29
|
+
url: import_zod.z.string().describe("Link to the ticket / issue / page."),
|
|
30
|
+
key: import_zod.z.string().nullable().optional().describe("Ticket key, e.g. PROJ-412. Derived from the URL when omitted."),
|
|
31
|
+
title: import_zod.z.string().optional()
|
|
32
|
+
});
|
|
33
|
+
const leafSchema = import_zod.z.object({
|
|
34
|
+
external: externalSchema.nullable().optional(),
|
|
35
|
+
title: import_zod.z.string(),
|
|
36
|
+
body: import_zod.z.string().optional(),
|
|
37
|
+
acceptance: import_zod.z.array(import_zod.z.string()).optional(),
|
|
38
|
+
kind: import_zod.z.enum(["object", "action"]).optional()
|
|
39
|
+
});
|
|
40
|
+
const deepSchema = leafSchema.extend({ children: import_zod.z.array(leafSchema).optional() });
|
|
41
|
+
const midSchema = leafSchema.extend({ children: import_zod.z.array(deepSchema).optional() });
|
|
42
|
+
const rootSchema = leafSchema.extend({ children: import_zod.z.array(midSchema).optional() });
|
|
43
|
+
const noPlan = (uid) => ({ content: [{ type: "text", text: `Plan not found: ${uid}` }], isError: true });
|
|
44
|
+
function register(server, deps) {
|
|
45
|
+
server.registerTool(
|
|
46
|
+
"create_plan_from_external",
|
|
47
|
+
{
|
|
48
|
+
description: `Turn a ticket hierarchy you have already fetched (Jira epic + stories, a Linear project, a set of GitHub issues) into a CodeTrellis plan with nested items, each carrying its ticket key. YOU fetch with your own tracker credentials; CodeTrellis never calls out. Acceptance criteria land as a checklist in each item body. Plan depth is capped at ${import_external_intake_service.MAX_INTAKE_DEPTH} (epic \u2192 story \u2192 task); a fourth level is accepted and levelled into the third rather than dropped. If a plan already carries this epic, the import is REFUSED and the existing plan is named \u2014 updating an imported plan in place is not supported yet, and silently creating a second copy of an epic is worse than saying so.`,
|
|
49
|
+
inputSchema: {
|
|
50
|
+
title: import_zod.z.string().describe("Plan title \u2014 usually the epic summary."),
|
|
51
|
+
description: import_zod.z.string().optional(),
|
|
52
|
+
external: externalSchema.optional().describe("The epic / parent ticket this plan represents."),
|
|
53
|
+
items: import_zod.z.array(rootSchema).describe("The ticket tree, already fetched."),
|
|
54
|
+
project_path: import_zod.z.string().optional().describe(
|
|
55
|
+
"Absolute path to the project this plan belongs to. Defaults to the project currently open."
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
async (args, extra) => {
|
|
60
|
+
const author = (0, import_helpers.authorFromExtra)(deps, extra);
|
|
61
|
+
const epicKey = args.external?.key ?? (args.external?.url ? (0, import_external_intake_service.keyFromUrl)(args.external.url) : null);
|
|
62
|
+
if (epicKey) {
|
|
63
|
+
const existing = (0, import_external_intake_service.findPlanByExternalKey)(epicKey);
|
|
64
|
+
if (existing) {
|
|
65
|
+
return {
|
|
66
|
+
content: [{
|
|
67
|
+
type: "text",
|
|
68
|
+
text: `Plan ${existing} already carries ${epicKey}. Refusing to import a second copy. Open that plan, or delete it first if you want a clean re-import.`
|
|
69
|
+
}],
|
|
70
|
+
isError: true
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const projectPath = args.project_path ?? (0, import_trusted_roots.getActiveProjectRoot)();
|
|
75
|
+
if (!projectPath) {
|
|
76
|
+
return { content: [{ type: "text", text: "No project is open: pass project_path, or open the project first." }], isError: true };
|
|
77
|
+
}
|
|
78
|
+
const plan = deps.planService.createPlan(
|
|
79
|
+
{ title: args.title, description: args.description ?? "", tasks: [] },
|
|
80
|
+
author.author,
|
|
81
|
+
author.authorType,
|
|
82
|
+
projectPath
|
|
83
|
+
);
|
|
84
|
+
if (args.external) {
|
|
85
|
+
(0, import_external_intake_service.setPlanExternalRef)({
|
|
86
|
+
planUid: plan.uid,
|
|
87
|
+
url: args.external.url,
|
|
88
|
+
key: args.external.key ?? void 0,
|
|
89
|
+
title: args.external.title,
|
|
90
|
+
author: author.author,
|
|
91
|
+
authorType: author.authorType
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const flat = (0, import_external_intake_service.flattenIntake)(args.items);
|
|
95
|
+
const uidByIndex = [];
|
|
96
|
+
let created = 0;
|
|
97
|
+
let linked = 0;
|
|
98
|
+
for (let i = 0; i < flat.length; i++) {
|
|
99
|
+
const { node, depth, parentIndex } = flat[i];
|
|
100
|
+
const parentUid = parentIndex === null ? null : uidByIndex[parentIndex];
|
|
101
|
+
const item = deps.planItemService.createItem({
|
|
102
|
+
planUid: plan.uid,
|
|
103
|
+
kind: (0, import_external_intake_service.intakeKind)(node, depth),
|
|
104
|
+
title: node.title,
|
|
105
|
+
body: (0, import_external_intake_service.intakeBody)(node),
|
|
106
|
+
parentUid: parentUid ?? void 0,
|
|
107
|
+
author: author.author,
|
|
108
|
+
authorType: author.authorType
|
|
109
|
+
});
|
|
110
|
+
uidByIndex.push(item?.uid ?? null);
|
|
111
|
+
if (!item) continue;
|
|
112
|
+
created++;
|
|
113
|
+
if (node.external?.url) {
|
|
114
|
+
(0, import_external_refs_service.createExternalRef)({
|
|
115
|
+
itemUid: item.uid,
|
|
116
|
+
url: node.external.url,
|
|
117
|
+
title: node.external.title,
|
|
118
|
+
externalKey: node.external.key ?? (0, import_external_intake_service.keyFromUrl)(node.external.url),
|
|
119
|
+
author: author.author,
|
|
120
|
+
authorType: author.authorType
|
|
121
|
+
});
|
|
122
|
+
linked++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const n = deps.broadcast("plan-created", { plan });
|
|
126
|
+
deps.saveNow(() => deps.exportDatabase());
|
|
127
|
+
return {
|
|
128
|
+
content: [{
|
|
129
|
+
type: "text",
|
|
130
|
+
text: JSON.stringify(
|
|
131
|
+
{
|
|
132
|
+
ok: true,
|
|
133
|
+
plan_uid: plan.uid,
|
|
134
|
+
items_created: created,
|
|
135
|
+
items_with_tickets: linked,
|
|
136
|
+
depth_cap: import_external_intake_service.MAX_INTAKE_DEPTH,
|
|
137
|
+
broadcastTo: n,
|
|
138
|
+
next: "Work the plan as usual. Call get_external_sync_state when you want to write statuses back."
|
|
139
|
+
},
|
|
140
|
+
null,
|
|
141
|
+
2
|
|
142
|
+
)
|
|
143
|
+
}]
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
);
|
|
147
|
+
server.registerTool(
|
|
148
|
+
"set_plan_external_ref",
|
|
149
|
+
{
|
|
150
|
+
description: "Attach (or update) the ticket a plan represents \u2014 an epic, a project, a milestone. Idempotent on the ticket key, so calling it twice updates rather than duplicating. Item-level tickets use add_external_ref instead.",
|
|
151
|
+
inputSchema: {
|
|
152
|
+
plan_uid: import_zod.z.string(),
|
|
153
|
+
url: import_zod.z.string(),
|
|
154
|
+
key: import_zod.z.string().optional(),
|
|
155
|
+
title: import_zod.z.string().optional()
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
async ({ plan_uid, url, key, title }, extra) => {
|
|
159
|
+
if (!deps.planService.getPlan(plan_uid)) return noPlan(plan_uid);
|
|
160
|
+
const author = (0, import_helpers.authorFromExtra)(deps, extra);
|
|
161
|
+
const ref = (0, import_external_intake_service.setPlanExternalRef)({
|
|
162
|
+
planUid: plan_uid,
|
|
163
|
+
url,
|
|
164
|
+
key,
|
|
165
|
+
title,
|
|
166
|
+
author: author.author,
|
|
167
|
+
authorType: author.authorType
|
|
168
|
+
});
|
|
169
|
+
return { content: [{ type: "text", text: JSON.stringify(ref, null, 2) }] };
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
server.registerTool(
|
|
173
|
+
"get_external_sync_state",
|
|
174
|
+
{
|
|
175
|
+
description: "What has changed in this plan since the last write-back: every item carrying a ticket key whose status moved, with the key, the current status and a SUGGESTED transition name. Read this, write the transitions with your own tracker MCP, then call mark_external_synced. Reading does not advance the watermark \u2014 an agent that read the list and then failed to write would otherwise lose those transitions silently. The suggested transition is advisory: every tracker has its own workflow, and you can see the real transition names; we cannot.",
|
|
176
|
+
inputSchema: {
|
|
177
|
+
plan_uid: import_zod.z.string()
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
async ({ plan_uid }) => {
|
|
181
|
+
if (!deps.planService.getPlan(plan_uid)) return noPlan(plan_uid);
|
|
182
|
+
const state = (0, import_external_intake_service.getSyncState)(plan_uid);
|
|
183
|
+
return {
|
|
184
|
+
content: [{
|
|
185
|
+
type: "text",
|
|
186
|
+
text: JSON.stringify(
|
|
187
|
+
{
|
|
188
|
+
plan_uid: state.planUid,
|
|
189
|
+
last_synced_at: state.lastSyncedAt,
|
|
190
|
+
never_synced: state.lastSyncedAt === null,
|
|
191
|
+
plan_tickets: state.planRefs.map((r) => ({ key: r.externalKey, url: r.url, title: r.title })),
|
|
192
|
+
changed: state.changed.map((c) => ({
|
|
193
|
+
item_uid: c.itemUid,
|
|
194
|
+
title: c.title,
|
|
195
|
+
status: c.status,
|
|
196
|
+
external_key: c.externalKey,
|
|
197
|
+
url: c.url,
|
|
198
|
+
suggested_transition: c.suggestedTransition
|
|
199
|
+
}))
|
|
200
|
+
},
|
|
201
|
+
null,
|
|
202
|
+
2
|
|
203
|
+
)
|
|
204
|
+
}]
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
server.registerTool(
|
|
209
|
+
"mark_external_synced",
|
|
210
|
+
{
|
|
211
|
+
description: "Record that you have written this plan's status changes back to the tracker. Advances the watermark, so the next get_external_sync_state returns only what changed after this point. Call it only once the writes actually succeeded.",
|
|
212
|
+
inputSchema: {
|
|
213
|
+
plan_uid: import_zod.z.string(),
|
|
214
|
+
note: import_zod.z.string().optional().describe("What you wrote back, for the audit trail.")
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
async ({ plan_uid, note }, extra) => {
|
|
218
|
+
if (!deps.planService.getPlan(plan_uid)) return noPlan(plan_uid);
|
|
219
|
+
const author = (0, import_helpers.authorFromExtra)(deps, extra);
|
|
220
|
+
const result = (0, import_external_intake_service.markSynced)(plan_uid, author.author, note);
|
|
221
|
+
return {
|
|
222
|
+
content: [{
|
|
223
|
+
type: "text",
|
|
224
|
+
text: JSON.stringify({ ok: true, plan_uid, ...result }, null, 2)
|
|
225
|
+
}]
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
);
|
|
229
|
+
server.registerTool(
|
|
230
|
+
"list_plan_external_refs",
|
|
231
|
+
{
|
|
232
|
+
description: "The tickets attached to a plan itself (as opposed to its items).",
|
|
233
|
+
inputSchema: { plan_uid: import_zod.z.string() }
|
|
234
|
+
},
|
|
235
|
+
async ({ plan_uid }) => {
|
|
236
|
+
if (!deps.planService.getPlan(plan_uid)) return noPlan(plan_uid);
|
|
237
|
+
return { content: [{ type: "text", text: JSON.stringify((0, import_external_intake_service.getPlanExternalRefs)(plan_uid), null, 2) }] };
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
242
|
+
0 && (module.exports = {
|
|
243
|
+
register
|
|
244
|
+
});
|