@intentic/claude-plugin 1.331.0 → 1.332.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/.claude-plugin/plugin.json +1 -1
- package/dist/fileq.mjs +1206 -721
- package/dist/notes-evidence.mjs +76 -16
- package/dist/post-bash.mjs +103 -45
- package/dist/prompt-submit.mjs +6 -1
- package/dist/session-start.mjs +134 -159
- package/dist/stats.mjs +114 -65
- package/package.json +5 -4
package/dist/session-start.mjs
CHANGED
|
@@ -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
|
|
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
|
|
982
|
-
import { basename, dirname, join
|
|
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 =
|
|
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,
|
|
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(
|
|
1170
|
+
var hasManifest = (dir) => MANIFESTS.some((name) => readIfPresent(join(dir, name)) !== void 0);
|
|
1158
1171
|
var describeManifest = (dir, name) => {
|
|
1159
|
-
const source = readIfPresent(
|
|
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(
|
|
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 =
|
|
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 =
|
|
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(
|
|
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(
|
|
1293
|
-
return children.length >= CONTAINER_MIN_CHILDREN && bearing.length >= CONTAINER_MIN_CHILDREN ? bearing.map((child) => ({ name: child, dir:
|
|
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 =
|
|
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
|
|
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 :
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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 (${
|
|
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) =>
|
|
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
|
|
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: ${
|
|
1618
|
+
process.stderr.write(`intentic: ${errorMessage(error)}
|
|
1644
1619
|
`);
|
|
1645
1620
|
}
|
|
1646
1621
|
};
|
|
1647
|
-
var dataDir = (env = process.env) => env["CLAUDE_PLUGIN_DATA"] ??
|
|
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) =>
|
|
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
|
|
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) =>
|
|
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(
|
|
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:
|
|
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: ${
|
|
1736
|
+
process.stderr.write(`intentic: ${what} not recorded: ${errorMessage(error)}
|
|
1762
1737
|
`);
|
|
1763
1738
|
}
|
|
1764
1739
|
};
|