UNPKG

trellis

Version:

Agentic State Engine — event-sourced causal graph with branching, decision traces, and realtime sync for AI-native applications

135 lines (130 loc) 3.98 kB
import { init_branch, init_checkpoint, init_decompose, init_diff, init_issue, init_lane, init_merge, init_milestone, init_op_log, init_transcript } from "./chunk-Q4FKTPX4.js"; import { init_test_runner } from "./chunk-LNCBUJNO.js"; import { init_test_manifest } from "./chunk-PBH357QR.js"; import { init_types } from "./chunk-E2CFJKLU.js"; import { init_blob_store } from "./chunk-MFZ22U6M.js"; import { init_ops } from "./chunk-GRWQPKYK.js"; // src/vcs/index.ts init_types(); init_ops(); init_decompose(); init_blob_store(); init_branch(); init_milestone(); init_checkpoint(); init_diff(); init_merge(); init_issue(); init_op_log(); init_lane(); init_test_manifest(); init_test_runner(); // src/vcs/authority.ts import { existsSync } from "node:fs"; import { dirname, resolve } from "node:path"; var GIT_MUTATION_PATTERN = /(^|\s)git(?:\s+-C\s+\S+)?\s+(stash|checkout|switch|merge|rebase|commit|reset|cherry-pick|pull|fetch(?:\s+[-]{1,2}all)?)\b/; var SANCTIONED_GIT_SYNC_PATTERN = /\btrellis\s+git\s+sync\b/; var TRELLIS_DIR_MUTATION_PATTERN = /(^|\s)(rm|mv|cp|sed|tee|truncate)\b[^\n]*[\s/]\.?\.trellis\b/; var TRELLIS_DESTRUCTIVE_PATTERN = /\btrellis\b[^\n|;&]*\b(lane\s+drop|repair|branch\s+(-d|--delete)|db\s+(create|update|delete))\b/; var DESTRUCTIVE_ESCAPE_PATTERN = /(--confirm-destructive\b|TRELLIS_CONFIRM_DESTRUCTIVE=1\b)/; var SANCTIONED_TRELLIS_PATTERN = /\btrellis\s+(lane\s+promote|git\s+sync)\b/; function findTrellisRoot(start) { const home = process.env.HOME || process.env.USERPROFILE || ""; let dir = resolve(start); while (true) { if (existsSync(resolve(dir, ".trellis", "config.json"))) { if (dir === home && resolve(start) !== home) { } else { return dir; } } const parent = dirname(dir); if (parent === dir) return null; dir = parent; } } function commandOf(inv) { if (inv.tool === "bash" || inv.tool === "shell") { return typeof inv.args.command === "string" ? inv.args.command : ""; } if (inv.tool === "git") { const sub = inv.args.subcommand ?? inv.args.git ?? inv.args.command; return typeof sub === "string" && sub ? `git ${sub}` : ""; } if (inv.tool === "trellis") { const sub = inv.args.subcommand ?? inv.args.command; return typeof sub === "string" && sub ? `trellis ${sub}` : ""; } return ""; } function gitTargetDir(command, cwd) { const m = command.match(/^git\s+-C\s+(\S+)/); return m ? resolve(cwd, m[1]) : cwd; } function cwdOf(inv) { return typeof inv.cwd === "string" && inv.cwd ? inv.cwd : process.cwd(); } function canToolRun(inv, ctx = {}) { const command = commandOf(inv); if (!command) return { allow: true }; if (TRELLIS_DIR_MUTATION_PATTERN.test(command)) { return { allow: false, deny: true, reason: "Direct .trellis/ edits are blocked \u2014 the journal is engine-owned.", redirect: "trellis" }; } if (SANCTIONED_TRELLIS_PATTERN.test(command)) { return { allow: true }; } const root = ctx.trellisRoot !== void 0 ? ctx.trellisRoot : findTrellisRoot(gitTargetDir(command, cwdOf(inv))); if (root === null) return { allow: true }; if (GIT_MUTATION_PATTERN.test(command) && !SANCTIONED_GIT_SYNC_PATTERN.test(command)) { return { allow: false, deny: true, reason: "Direct git mutations are blocked in Trellis workspaces \u2014 git is a promote-only mirror (ADR 0014).", redirect: "trellis lane promote" }; } if (TRELLIS_DESTRUCTIVE_PATTERN.test(command) && !DESTRUCTIVE_ESCAPE_PATTERN.test(command)) { return { allow: false, prompt: true, message: `Destructive Trellis command: "${command.trim()}". This shrinks or rewrites durable state.`, confirmLabel: "Confirm destructive" }; } return { allow: true }; } // src/vcs/index.ts init_transcript(); export { GIT_MUTATION_PATTERN, TRELLIS_DIR_MUTATION_PATTERN, TRELLIS_DESTRUCTIVE_PATTERN, findTrellisRoot, canToolRun };