@intentic/claude-plugin 1.331.0 → 1.333.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.
@@ -873,7 +873,18 @@ var require_ignore = __commonJS({
873
873
 
874
874
  // src/session-start.ts
875
875
  import { appendFileSync as appendFileSync2 } from "node:fs";
876
- import { join as join7 } from "node:path";
876
+ import { join as join6 } from "node:path";
877
+
878
+ // ../../_tools/base/src/errors.ts
879
+ var errorMessage = (error) => error instanceof Error ? error.message : String(error);
880
+ var errnoCode = (error) => {
881
+ const code = typeof error === `object` && error !== null ? error.code : void 0;
882
+ return typeof code === `string` ? code : void 0;
883
+ };
884
+ var isMissing = (error) => {
885
+ const code = errnoCode(error);
886
+ return code === `ENOENT` || code === `ENOTDIR`;
887
+ };
877
888
 
878
889
  // ../agent-context/src/field-notes.ts
879
890
  import { createHash } from "node:crypto";
@@ -978,8 +989,8 @@ var fieldNotes = ({ file: path, budget, onUnreadable, title = FIELD_NOTES_NOTE_T
978
989
  };
979
990
 
980
991
  // ../agent-context/src/workspace-map.ts
981
- import { readdirSync as readdirSync2, readFileSync as readFileSync2, statSync as statSync2 } from "node:fs";
982
- import { basename, dirname, join as join2, relative, sep } from "node:path";
992
+ import { readdirSync, readFileSync as readFileSync2, statSync as statSync2 } from "node:fs";
993
+ import { basename, dirname, join, relative, sep } from "node:path";
983
994
 
984
995
  // ../../_shared/workspace-ignore/src/index.ts
985
996
  var import_ignore = __toESM(require_ignore(), 1);
@@ -993,6 +1004,98 @@ var HOSTED_TIERS = [
993
1004
  var FREE_TIER = HOSTED_TIERS[0];
994
1005
  var PAID_TIERS = HOSTED_TIERS.filter((tier) => tier.priceUsd > 0);
995
1006
 
1007
+ // ../../_tools/constants/src/one-liner.ts
1008
+ var SETUP_CODE_PATTERN = /^[A-Za-z0-9]{6,64}$/;
1009
+ var SYNC_LEAF_PATTERN = /^[a-z0-9][a-z0-9-]{0,80}$/;
1010
+ var FIX_CODE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9-]{0,63}$/;
1011
+ var SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{1,62}$/;
1012
+ var IMAGE_HASH_PATTERN = /^[a-f0-9]{8,64}$/;
1013
+ var SHORT_CODE_PATTERN = /^[0-9A-Za-z]{4}-?[0-9A-Za-z]{4}$/;
1014
+ var HOSTNAME_PATTERN = /^(?=.{4,253}$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)+$/;
1015
+ var DEFAULT_SYNC_ROOT = "~/intentic";
1016
+ var isOneLinerHost = (host2) => HOSTNAME_PATTERN.test(host2) && !/^\d+$/.test(host2.slice(host2.lastIndexOf(".") + 1));
1017
+ var arg = (name, pattern, normalize) => ({
1018
+ name,
1019
+ test: (value) => pattern.test(value),
1020
+ ...normalize === void 0 ? {} : { normalize }
1021
+ });
1022
+ var slug = arg(`sandbox name`, SLUG_PATTERN);
1023
+ var host = { name: `sandbox address`, test: isOneLinerHost, normalize: (value) => value.toLowerCase() };
1024
+ var shortCode = arg(`code`, SHORT_CODE_PATTERN);
1025
+ var RECREATE = { sh: `recreate.sh`, ps1: `recreate.ps1` };
1026
+ var coded = (sh, ps1) => ({
1027
+ files: { sh, ps1 },
1028
+ required: [host, shortCode],
1029
+ optional: [],
1030
+ sh: ([address = ``, code = ``]) => ({ args: [address, code] }),
1031
+ ps1: ([address = ``, code = ``]) => [
1032
+ { name: `Sandbox`, value: address },
1033
+ { name: `Code`, value: code }
1034
+ ]
1035
+ });
1036
+ var VERBS = {
1037
+ setup: {
1038
+ files: { sh: `connect.sh`, ps1: `connect.ps1` },
1039
+ required: [arg(`setup code`, SETUP_CODE_PATTERN)],
1040
+ optional: [arg(`sync folder`, SYNC_LEAF_PATTERN)],
1041
+ sh: ([code = ``, leaf]) => ({ args: [code], env: leaf === void 0 ? [] : [[`SYNC_DIR`, `${DEFAULT_SYNC_ROOT}/${leaf}`]] }),
1042
+ ps1: ([code = ``, leaf]) => [
1043
+ { name: `SetupCode`, value: code },
1044
+ ...leaf === void 0 ? [] : [{ name: `SyncDir`, value: `${DEFAULT_SYNC_ROOT}/${leaf}` }]
1045
+ ]
1046
+ },
1047
+ fix: {
1048
+ files: { sh: `fix.sh`, ps1: `fix.ps1` },
1049
+ required: [arg(`fix code`, FIX_CODE_PATTERN)],
1050
+ optional: [],
1051
+ sh: ([code = ``]) => ({ args: [code] }),
1052
+ ps1: ([code = ``]) => [{ name: `Code`, value: code }]
1053
+ },
1054
+ update: {
1055
+ files: RECREATE,
1056
+ required: [slug],
1057
+ optional: [],
1058
+ sh: ([name = ``]) => ({ args: [name] }),
1059
+ ps1: ([name = ``]) => [{ name: `Slug`, value: name }]
1060
+ },
1061
+ rollback: {
1062
+ files: RECREATE,
1063
+ required: [slug],
1064
+ optional: [],
1065
+ sh: ([name = ``]) => ({ args: [name, `--rollback`] }),
1066
+ ps1: ([name = ``]) => [{ name: `Slug`, value: name }, { name: `Rollback` }]
1067
+ },
1068
+ restart: {
1069
+ files: RECREATE,
1070
+ required: [slug],
1071
+ optional: [],
1072
+ sh: ([name = ``]) => ({ args: [name, `--restart`] }),
1073
+ ps1: ([name = ``]) => [{ name: `Slug`, value: name }, { name: `Restart` }]
1074
+ },
1075
+ rebuild: {
1076
+ files: RECREATE,
1077
+ required: [slug, arg(`image hash`, IMAGE_HASH_PATTERN)],
1078
+ optional: [],
1079
+ sh: ([name = ``, hash = ``]) => ({ args: [name, hash] }),
1080
+ ps1: ([name = ``, hash = ``]) => [
1081
+ { name: `Slug`, value: name },
1082
+ { name: `Hash`, value: hash }
1083
+ ]
1084
+ },
1085
+ // Recoverable for 7 days; with no name the script lists the sandboxes on the device and asks which.
1086
+ remove: {
1087
+ files: { sh: `cleanup.sh`, ps1: `cleanup.ps1` },
1088
+ required: [],
1089
+ optional: [slug],
1090
+ sh: ([name]) => ({ args: name === void 0 ? [] : [name, `--yes`] }),
1091
+ ps1: ([name]) => name === void 0 ? [] : [{ name: `Slug`, value: name }, { name: `Yes` }]
1092
+ },
1093
+ device: coded(`device.sh`, `device.ps1`),
1094
+ sync: coded(`sync.sh`, `sync.ps1`),
1095
+ server: coded(`connect-host.sh`, `connect-host.ps1`)
1096
+ };
1097
+ var ONE_LINER_VERBS = Object.keys(VERBS);
1098
+
996
1099
  // ../../_tools/constants/src/index.ts
997
1100
  var REFERENCE_DIR = "refs";
998
1101
  var PUBLIC_DIR = "public";
@@ -1035,96 +1138,6 @@ var firstSegment = (relPath) => {
1035
1138
  var isReferencePath = (relPath) => firstSegment(relPath) === REFERENCE_DIR;
1036
1139
  var isPublicPath = (relPath) => firstSegment(relPath) === PUBLIC_DIR;
1037
1140
 
1038
- // ../agent-context/src/workspace-activity.ts
1039
- import { execFileSync } from "node:child_process";
1040
- import { existsSync, readdirSync } from "node:fs";
1041
- import { join } from "node:path";
1042
- var RECENT_DAYS = 21;
1043
- var RECENT_COMMITS = 400;
1044
- var GIT_TIMEOUT_MS = 3e3;
1045
- var QUIET_DIRS = /* @__PURE__ */ new Set(["generated", "dist", "locales", "baselines", "fixtures", "__snapshots__"]);
1046
- var QUIET_FILE = /\.(md|lock|snap)$|(^|[-.])lock\.(json|ya?ml)$/;
1047
- var SHELF_MIN_DIRS = 4;
1048
- var changedFiles = (repoDir) => {
1049
- try {
1050
- const out = execFileSync(
1051
- "git",
1052
- ["-C", repoDir, "log", `--since=${RECENT_DAYS}.days`, "-n", String(RECENT_COMMITS), "--no-merges", "--relative", "--name-only", "--format=%x1e"],
1053
- { encoding: "utf8", timeout: GIT_TIMEOUT_MS, stdio: ["ignore", "pipe", "ignore"], maxBuffer: 64 * 1024 * 1024 }
1054
- );
1055
- return out.split("").slice(1).map((commit) => commit.split("\n").filter((line) => line !== ""));
1056
- } catch {
1057
- return [];
1058
- }
1059
- };
1060
- var isRepo = (dir) => existsSync(join(dir, ".git"));
1061
- var isQuiet = (path) => {
1062
- const segments = path.split("/");
1063
- return QUIET_FILE.test(segments.at(-1) ?? "") || segments.slice(0, -1).some((segment) => segment.startsWith(".") || IGNORED_DIRS.has(segment) || QUIET_DIRS.has(segment));
1064
- };
1065
- var workspaceActivityOf = ({ projectRoot, areas }) => {
1066
- const repos = [
1067
- ...isRepo(projectRoot) ? [{ dir: projectRoot, prefix: "" }] : [],
1068
- ...areas.filter((area) => isRepo(join(projectRoot, area))).map((area) => ({ dir: join(projectRoot, area), prefix: `${area}/` }))
1069
- ];
1070
- const commits = repos.flatMap(({ dir, prefix }) => changedFiles(dir).map((files) => files.map((file) => `${prefix}${file}`)));
1071
- const shelves = /* @__PURE__ */ new Map();
1072
- const isShelf = (folder) => {
1073
- const known = shelves.get(folder);
1074
- if (known !== void 0) {
1075
- return known;
1076
- }
1077
- let shelf = false;
1078
- try {
1079
- const entries = readdirSync(join(projectRoot, folder), { withFileTypes: true });
1080
- const dirs = entries.filter((entry) => entry.isDirectory() && !entry.name.startsWith(".")).length;
1081
- const files = entries.filter((entry) => entry.isFile()).length;
1082
- shelf = dirs >= SHELF_MIN_DIRS && files < dirs;
1083
- } catch {
1084
- }
1085
- shelves.set(folder, shelf);
1086
- return shelf;
1087
- };
1088
- const featureOf = (path) => {
1089
- const dirs = path.split("/").slice(0, -1);
1090
- if (dirs.length === 0) {
1091
- return void 0;
1092
- }
1093
- const src = dirs.indexOf("src");
1094
- const start = src >= 0 ? src + 2 : 3;
1095
- let depth = Math.min(start, dirs.length);
1096
- if (depth < dirs.length && isShelf(dirs.slice(0, depth).join("/"))) {
1097
- depth += 1;
1098
- }
1099
- return dirs.slice(0, depth).join("/");
1100
- };
1101
- const byFolder = /* @__PURE__ */ new Map();
1102
- const byFeature = /* @__PURE__ */ new Map();
1103
- for (const files of commits) {
1104
- const kept = files.filter((file) => !isQuiet(file));
1105
- const folders = new Set(kept.flatMap((file) => file.split("/").slice(0, -1).map((_, at, dirs) => dirs.slice(0, at + 1).join("/"))));
1106
- for (const folder of folders) {
1107
- byFolder.set(folder, (byFolder.get(folder) ?? 0) + 1);
1108
- }
1109
- for (const feature of new Set(kept.map(featureOf).filter((folder) => folder !== void 0))) {
1110
- byFeature.set(feature, (byFeature.get(feature) ?? 0) + 1);
1111
- }
1112
- }
1113
- const hot = [...byFeature.entries()].map(([folder, count]) => ({ folder, commits: count })).toSorted((left, right) => right.commits - left.commits || left.folder.localeCompare(right.folder));
1114
- return { commits: commits.length, byFolder, hot };
1115
- };
1116
- var groupedFolders = (folders) => {
1117
- const groups = /* @__PURE__ */ new Map();
1118
- for (const folder of folders) {
1119
- const cut = folder.lastIndexOf("/");
1120
- const parent = cut === -1 ? "" : folder.slice(0, cut);
1121
- groups.set(parent, [...groups.get(parent) ?? [], cut === -1 ? folder : folder.slice(cut + 1)]);
1122
- }
1123
- return [...groups.entries()].flatMap(
1124
- ([parent, names]) => parent === "" ? names : [`${parent}/${names.length === 1 ? names[0] ?? "" : `{${names.join(",")}}`}`]
1125
- );
1126
- };
1127
-
1128
1141
  // ../agent-context/src/workspace-map.ts
1129
1142
  var WORKSPACE_MAP_NOTE_HEADER = "## Map of this project";
1130
1143
  var MAX_NOTE_CHARS = 2800;
@@ -1141,11 +1154,11 @@ var isBrowsable = (name, relPath) => !name.startsWith(".") && !IGNORED_DIRS.has(
1141
1154
  var childDirs = (dir, root) => {
1142
1155
  let entries;
1143
1156
  try {
1144
- entries = readdirSync2(dir, { withFileTypes: true });
1157
+ entries = readdirSync(dir, { withFileTypes: true });
1145
1158
  } catch {
1146
1159
  return [];
1147
1160
  }
1148
- return entries.filter((entry) => entry.isDirectory() && isBrowsable(entry.name, posix(relative(root, join2(dir, entry.name))))).map((entry) => entry.name).toSorted();
1161
+ return entries.filter((entry) => entry.isDirectory() && isBrowsable(entry.name, posix(relative(root, join(dir, entry.name))))).map((entry) => entry.name).toSorted();
1149
1162
  };
1150
1163
  var readIfPresent = (path) => {
1151
1164
  try {
@@ -1154,9 +1167,9 @@ var readIfPresent = (path) => {
1154
1167
  return void 0;
1155
1168
  }
1156
1169
  };
1157
- var hasManifest = (dir) => MANIFESTS.some((name) => readIfPresent(join2(dir, name)) !== void 0);
1170
+ var hasManifest = (dir) => MANIFESTS.some((name) => readIfPresent(join(dir, name)) !== void 0);
1158
1171
  var describeManifest = (dir, name) => {
1159
- const source = readIfPresent(join2(dir, name));
1172
+ const source = readIfPresent(join(dir, name));
1160
1173
  if (source === void 0) {
1161
1174
  return void 0;
1162
1175
  }
@@ -1178,7 +1191,7 @@ var describeManifest = (dir, name) => {
1178
1191
  return found === void 0 || found === "" ? void 0 : found;
1179
1192
  };
1180
1193
  var describeReadme = (dir) => {
1181
- const source = readIfPresent(join2(dir, "README.md")) ?? readIfPresent(join2(dir, "readme.md"));
1194
+ const source = readIfPresent(join(dir, "README.md")) ?? readIfPresent(join(dir, "readme.md"));
1182
1195
  if (source === void 0) {
1183
1196
  return void 0;
1184
1197
  }
@@ -1233,7 +1246,7 @@ var measure = (dir, root) => {
1233
1246
  }
1234
1247
  let entries;
1235
1248
  try {
1236
- entries = readdirSync2(current, { withFileTypes: true });
1249
+ entries = readdirSync(current, { withFileTypes: true });
1237
1250
  } catch {
1238
1251
  return;
1239
1252
  }
@@ -1242,7 +1255,7 @@ var measure = (dir, root) => {
1242
1255
  return;
1243
1256
  }
1244
1257
  visited += 1;
1245
- const child = join2(current, entry.name);
1258
+ const child = join(current, entry.name);
1246
1259
  if (entry.isDirectory()) {
1247
1260
  if (isBrowsable(entry.name, posix(relative(root, child)))) {
1248
1261
  walk(child, depth + 1);
@@ -1270,7 +1283,7 @@ var projectRootOf = (root, cwd) => {
1270
1283
  let current = cwd;
1271
1284
  for (; ; ) {
1272
1285
  try {
1273
- statSync2(join2(current, ".git"));
1286
+ statSync2(join(current, ".git"));
1274
1287
  return current;
1275
1288
  } catch {
1276
1289
  }
@@ -1289,13 +1302,13 @@ var packagesIn = (dir, root) => {
1289
1302
  return [];
1290
1303
  }
1291
1304
  const children = childDirs(dir, root);
1292
- const bearing = children.filter((child) => hasManifest(join2(dir, child)));
1293
- return children.length >= CONTAINER_MIN_CHILDREN && bearing.length >= CONTAINER_MIN_CHILDREN ? bearing.map((child) => ({ name: child, dir: join2(dir, child) })) : [];
1305
+ const bearing = children.filter((child) => hasManifest(join(dir, child)));
1306
+ return children.length >= CONTAINER_MIN_CHILDREN && bearing.length >= CONTAINER_MIN_CHILDREN ? bearing.map((child) => ({ name: child, dir: join(dir, child) })) : [];
1294
1307
  };
1295
1308
  var areaDirsOf = (projectRoot, root) => {
1296
1309
  const names = childDirs(projectRoot, root);
1297
1310
  const areas = names.map((name) => {
1298
- const dir = join2(projectRoot, name);
1311
+ const dir = join(projectRoot, name);
1299
1312
  return { name, dir, packages: packagesIn(dir, root) };
1300
1313
  });
1301
1314
  const shelf = areas.length <= 2 ? areas.find((area) => area.packages.length > 0) : void 0;
@@ -1395,41 +1408,11 @@ var render = (map, exactPaths) => {
1395
1408
  const total = map.omitted + dropped;
1396
1409
  return [...head, ...lines, ...total > 0 ? [` \u2026 and ${total} more`] : [], ...tail].join("\n");
1397
1410
  };
1398
- var COMPACT_AREAS = 6;
1399
- var COMPACT_HOT = 6;
1400
- var COMPACT_ACTIVE_SHARE = 0.03;
1401
- var COMPACT_HOT_MIN = 2;
1402
- var renderCompact = (map, exactPaths, activity) => {
1403
- const project = map.project === "" ? "the workspace" : `\`${map.project}\``;
1404
- const leaves = map.areas.flatMap((area) => area.children.length > 1 ? area.children : [area]);
1405
- const busy = (area) => activity.byFolder.get(area.name) ?? 0;
1406
- const ranked = activity.commits > 0 ? leaves.toSorted((left, right) => busy(right) - busy(left) || right.files - left.files || left.name.localeCompare(right.name)) : leaves.toSorted((left, right) => right.files - left.files || left.name.localeCompare(right.name));
1407
- const active = (area, at) => at < COMPACT_AREAS && (activity.commits === 0 || busy(area) >= Math.max(1, activity.commits * COMPACT_ACTIVE_SHARE));
1408
- const listed = ranked.filter((area, at) => area.here || active(area, at));
1409
- const rest = leaves.filter((area) => !listed.includes(area)).map((area) => area.name);
1410
- const unlisted = map.omitted + map.areas.reduce((sum, area) => sum + area.childrenOmitted, 0);
1411
- const width = Math.min(Math.max(...listed.map((area) => area.name.length)) + 2, 34);
1412
- const hot = groupedFolders(
1413
- activity.hot.filter((entry) => entry.commits >= COMPACT_HOT_MIN).slice(0, COMPACT_HOT).map((entry) => entry.folder)
1414
- );
1415
- const where = map.cwd === map.project ? `You are at the top of ${project}.` : `You are here: \`${map.cwd}\`, in ${project}.`;
1416
- return [
1417
- WORKSPACE_MAP_NOTE_HEADER,
1418
- "",
1419
- `${where} This is its layout, so do not \`ls\` or \`tree\` the root to orient yourself; use ${exactPaths} for exact paths.`,
1420
- "",
1421
- ...listed.map((area) => `${area.name.padEnd(width)}${area.purpose}${area.here ? " \u2190 you are here" : ""}`.trimEnd()),
1422
- ...rest.length > 0 || unlisted > 0 ? [`Also: ${groupedFolders(rest).join(", ")}${unlisted > 0 ? `${rest.length > 0 ? ", " : ""}and ${unlisted} smaller` : ""}`] : [],
1423
- ...map.siblings.length > 0 ? [`Also under the workspace root: ${map.siblings.map((name) => `${name}/`).join(", ")}`] : [],
1424
- ...hot.length > 0 ? ["", `Recent work (last 3 weeks) landed in: ${hot.join(" \xB7 ")}`] : []
1425
- ].join("\n");
1426
- };
1427
1411
  var TTL_MS = 6e4;
1428
1412
  var cache = /* @__PURE__ */ new Map();
1429
1413
  var workspaceMapNote = (input) => {
1430
1414
  const exactPaths = input.exactPaths ?? "`iq files` or Read";
1431
- const form = input.form ?? "full";
1432
- const key = `${input.root}\0${input.cwd}\0${exactPaths}\0${form}`;
1415
+ const key = `${input.root}\0${input.cwd}\0${exactPaths}`;
1433
1416
  const hit = cache.get(key);
1434
1417
  if (hit !== void 0 && Date.now() - hit.at < TTL_MS) {
1435
1418
  return hit.note;
@@ -1437,11 +1420,7 @@ var workspaceMapNote = (input) => {
1437
1420
  let note;
1438
1421
  try {
1439
1422
  const map = workspaceMapOf(input);
1440
- note = map === void 0 ? void 0 : form === "compact" ? renderCompact(
1441
- map,
1442
- exactPaths,
1443
- workspaceActivityOf({ projectRoot: join2(input.root, map.project), areas: map.areas.map((area) => area.name) })
1444
- ) : render(map, exactPaths);
1423
+ note = map === void 0 ? void 0 : render(map, exactPaths);
1445
1424
  } catch {
1446
1425
  note = void 0;
1447
1426
  }
@@ -1451,20 +1430,16 @@ var workspaceMapNote = (input) => {
1451
1430
 
1452
1431
  // src/features.ts
1453
1432
  import { mkdirSync as mkdirSync2, readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "node:fs";
1454
- import { join as join4 } from "node:path";
1433
+ import { join as join3 } from "node:path";
1455
1434
 
1456
1435
  // src/runtime.ts
1457
1436
  import { spawn } from "node:child_process";
1458
1437
  import { accessSync, closeSync, constants, mkdirSync, openSync, readFileSync as readFileSync3, statSync as statSync3, writeFileSync } from "node:fs";
1459
- import { delimiter, dirname as dirname2, join as join3 } from "node:path";
1438
+ import { delimiter, dirname as dirname2, join as join2 } from "node:path";
1460
1439
  var pluginRoot = (env = process.env) => env["CLAUDE_PLUGIN_ROOT"] ?? dirname2(import.meta.dirname);
1461
- var isMissing = (error) => {
1462
- const code = typeof error === "object" && error !== null ? error.code : void 0;
1463
- return code === "ENOENT" || code === "ENOTDIR";
1464
- };
1465
1440
  var pluginFile = (parts, env = process.env) => {
1466
1441
  try {
1467
- return readFileSync3(join3(pluginRoot(env), ...parts), "utf8");
1442
+ return readFileSync3(join2(pluginRoot(env), ...parts), "utf8");
1468
1443
  } catch (error) {
1469
1444
  if (isMissing(error)) {
1470
1445
  return void 0;
@@ -1477,7 +1452,7 @@ var onPath = (name, env = process.env) => {
1477
1452
  for (const dir of (env["PATH"] ?? "").split(delimiter)) {
1478
1453
  for (const extension of extensions) {
1479
1454
  try {
1480
- accessSync(join3(dir, `${name}${extension}`), constants.X_OK);
1455
+ accessSync(join2(dir, `${name}${extension}`), constants.X_OK);
1481
1456
  return true;
1482
1457
  } catch {
1483
1458
  }
@@ -1509,7 +1484,7 @@ var claimIfDue = (stamp, everyMs, now = Date.now()) => {
1509
1484
  `);
1510
1485
  return true;
1511
1486
  } catch (error) {
1512
- process.stderr.write(`intentic: ${stamp} cannot be written (${error instanceof Error ? error.message : String(error)}), so what it paces is skipped
1487
+ process.stderr.write(`intentic: ${stamp} cannot be written (${errorMessage(error)}), so what it paces is skipped
1513
1488
  `);
1514
1489
  return false;
1515
1490
  }
@@ -1600,7 +1575,7 @@ var readOptions = (env = process.env) => {
1600
1575
  });
1601
1576
  return Object.fromEntries(entries);
1602
1577
  };
1603
- var optionsFile = (data) => join4(data, "options.json");
1578
+ var optionsFile = (data) => join3(data, "options.json");
1604
1579
  var saveOptions = (data, options) => {
1605
1580
  mkdirSync2(data, { recursive: true });
1606
1581
  writeFileSync2(optionsFile(data), `${JSON.stringify(options)}
@@ -1609,7 +1584,7 @@ var saveOptions = (data, options) => {
1609
1584
 
1610
1585
  // src/hook-io.ts
1611
1586
  import { homedir } from "node:os";
1612
- import { join as join5 } from "node:path";
1587
+ import { join as join4 } from "node:path";
1613
1588
  var readStdin = async () => {
1614
1589
  const chunks = [];
1615
1590
  for await (const chunk of process.stdin) {
@@ -1640,17 +1615,17 @@ var runHook = async (handle) => {
1640
1615
  `);
1641
1616
  }
1642
1617
  } catch (error) {
1643
- process.stderr.write(`intentic: ${error instanceof Error ? error.message : String(error)}
1618
+ process.stderr.write(`intentic: ${errorMessage(error)}
1644
1619
  `);
1645
1620
  }
1646
1621
  };
1647
- var dataDir = (env = process.env) => env["CLAUDE_PLUGIN_DATA"] ?? join5(env["CLAUDE_CONFIG_DIR"] ?? join5(homedir(), ".claude"), "plugins", "data", "intentic-intentic");
1622
+ var dataDir = (env = process.env) => env["CLAUDE_PLUGIN_DATA"] ?? join4(env["CLAUDE_CONFIG_DIR"] ?? join4(homedir(), ".claude"), "plugins", "data", "intentic-intentic");
1648
1623
  var projectDir = (input, env = process.env) => env["CLAUDE_PROJECT_DIR"] ?? input.cwd ?? process.cwd();
1649
- var fieldNotesFile = (project) => join5(project, ".claude", "intentic", "field-notes.toon");
1624
+ var fieldNotesFile = (project) => join4(project, ".claude", "intentic", "field-notes.toon");
1650
1625
 
1651
1626
  // src/sessions.ts
1652
1627
  import { appendFileSync, mkdirSync as mkdirSync3, readFileSync as readFileSync5 } from "node:fs";
1653
- import { dirname as dirname3, join as join6 } from "node:path";
1628
+ import { dirname as dirname3, join as join5 } from "node:path";
1654
1629
 
1655
1630
  // ../agent-context/src/experiments.ts
1656
1631
  import { createHash as createHash2 } from "node:crypto";
@@ -1680,7 +1655,7 @@ var armsOf = (options, session) => {
1680
1655
  };
1681
1656
  var sends = (options, arms, mechanism) => MECHANISM_ON[mechanism](options) && arms[mechanism] !== false;
1682
1657
  var measuredArms = (arms, offered) => Object.fromEntries(Object.entries(arms).filter(([mechanism]) => offered[mechanism] === true));
1683
- var sessionsFile = (data) => join6(data, "sessions.jsonl");
1658
+ var sessionsFile = (data) => join5(data, "sessions.jsonl");
1684
1659
  var recordSession = (data, row) => {
1685
1660
  const file = sessionsFile(data);
1686
1661
  mkdirSync3(dirname3(file), { recursive: true });
@@ -1697,7 +1672,7 @@ var compose = (options, input, project, arms, data, env) => {
1697
1672
  const context = [];
1698
1673
  const notices = [];
1699
1674
  const notice = (id, text) => {
1700
- if (claimIfDue(join7(data, "notices", `${id}.stamp`), NOTICE_EVERY_MS)) {
1675
+ if (claimIfDue(join6(data, "notices", `${id}.stamp`), NOTICE_EVERY_MS)) {
1701
1676
  notices.push(text);
1702
1677
  }
1703
1678
  };
@@ -1737,7 +1712,7 @@ var compose = (options, input, project, arms, data, env) => {
1737
1712
  ${nudge.trim()}`);
1738
1713
  sent.iq = true;
1739
1714
  }
1740
- startDetached("iq", ["sessions", "ingest"], { cwd: project, log: join7(data, "iq", `${projectSlug(project)}.ingest.log`), env });
1715
+ startDetached("iq", ["sessions", "ingest"], { cwd: project, log: join6(data, "iq", `${projectSlug(project)}.ingest.log`), env });
1741
1716
  } else {
1742
1717
  notice("iq-missing", "intentic: iq search is on but the `iq` CLI is not installed (`npm i -g @intentic/iq`), so nothing was taught.");
1743
1718
  }
@@ -1758,7 +1733,7 @@ var record = (what, write) => {
1758
1733
  try {
1759
1734
  write();
1760
1735
  } catch (error) {
1761
- process.stderr.write(`intentic: ${what} not recorded: ${error instanceof Error ? error.message : String(error)}
1736
+ process.stderr.write(`intentic: ${what} not recorded: ${errorMessage(error)}
1762
1737
  `);
1763
1738
  }
1764
1739
  };