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
JavaScript
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
};