@tryglen/cli 0.34.0 → 0.36.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/README.md +19 -19
- package/dist/_utils/agent-adapter.d.ts +2 -0
- package/dist/_utils/agent-adapter.js +3 -1
- package/dist/_utils/agent-adapter.js.map +1 -1
- package/dist/_utils/detect-transcript-format.d.ts +1 -1
- package/dist/_utils/detect-transcript-format.js.map +1 -1
- package/dist/_utils/install-receipt.d.ts +9 -1
- package/dist/_utils/install-receipt.js +19 -1
- package/dist/_utils/install-receipt.js.map +1 -1
- package/dist/_utils/jcode-bundle.d.ts +3 -0
- package/dist/_utils/jcode-bundle.js +23 -0
- package/dist/_utils/jcode-bundle.js.map +1 -0
- package/dist/_utils/jcode-event.d.ts +3 -0
- package/dist/_utils/jcode-event.js +82 -0
- package/dist/_utils/jcode-event.js.map +1 -0
- package/dist/_utils/jcode-hook-lines.d.ts +5 -0
- package/dist/_utils/jcode-hook-lines.js +11 -0
- package/dist/_utils/jcode-hook-lines.js.map +1 -0
- package/dist/_utils/jcode-hooks-toml.d.ts +8 -0
- package/dist/_utils/jcode-hooks-toml.js +156 -0
- package/dist/_utils/jcode-hooks-toml.js.map +1 -0
- package/dist/_utils/jcode-paths.d.ts +7 -0
- package/dist/_utils/jcode-paths.js +13 -0
- package/dist/_utils/jcode-paths.js.map +1 -0
- package/dist/_utils/jcode-setup.d.ts +27 -0
- package/dist/_utils/jcode-setup.js +158 -0
- package/dist/_utils/jcode-setup.js.map +1 -0
- package/dist/_utils/jcode-skills-sync.d.ts +8 -0
- package/dist/_utils/jcode-skills-sync.js +79 -0
- package/dist/_utils/jcode-skills-sync.js.map +1 -0
- package/dist/_utils/managed-block.d.ts +4 -0
- package/dist/_utils/managed-block.js +42 -0
- package/dist/_utils/managed-block.js.map +1 -0
- package/dist/_utils/parse-harbor-atif.js +2 -1
- package/dist/_utils/parse-harbor-atif.js.map +1 -1
- package/dist/_utils/parse-jcode-session.d.ts +14 -0
- package/dist/_utils/parse-jcode-session.js +128 -0
- package/dist/_utils/parse-jcode-session.js.map +1 -0
- package/dist/_utils/plugin-status.d.ts +1 -1
- package/dist/_utils/plugin-status.js +28 -0
- package/dist/_utils/plugin-status.js.map +1 -1
- package/dist/_utils/transcript-turns.d.ts +1 -1
- package/dist/bin.js +9 -6
- package/dist/bin.js.map +1 -1
- package/dist/commands/doctor.js +19 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/ingest.js +28 -18
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +55 -10
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/session-start.js +18 -8
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/uninstall.js +4 -0
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +19 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/jcode/plugin.json +8 -0
- package/dist/jcode/preferred-tools.md +3 -0
- package/dist/jcode/prompt-overlay.md +15 -0
- package/dist/jcode/skills/code-search/SKILL.md +19 -0
- package/dist/jcode/skills/controls/SKILL.md +45 -0
- package/dist/jcode/skills/create-artifact/SKILL.md +11 -0
- package/dist/jcode/skills/create-skill/SKILL.md +41 -0
- package/dist/jcode/skills/feedback/SKILL.md +59 -0
- package/dist/jcode/skills/forget/SKILL.md +41 -0
- package/dist/jcode/skills/import-transcripts/SKILL.md +27 -0
- package/dist/jcode/skills/invite/SKILL.md +28 -0
- package/dist/jcode/skills/search/SKILL.md +35 -0
- package/dist/jcode/skills/session-takeover/SKILL.md +67 -0
- package/dist/jcode/skills/setup/SKILL.md +62 -0
- package/dist/jcode/skills/use-artifact/SKILL.md +11 -0
- package/dist/jcode/skills/use-skill/SKILL.md +10 -0
- package/package.json +5 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcode-paths.js","sourceRoot":"","sources":["../../src/_utils/jcode-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,oFAAoF;AACpF,6EAA6E;AAC7E,4EAA4E;AAC5E,MAAM,SAAS,GAAG,GAAW,EAAE,CAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAEtD,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3E,MAAM,sBAAsB,GAAG,GAAW,EAAE,CAC1C,IAAI,CAAC,SAAS,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACzC,MAAM,uBAAuB,GAAG,GAAW,EAAE,CAC3C,IAAI,CAAC,SAAS,EAAE,EAAE,oBAAoB,CAAC,CAAC;AAC1C,MAAM,cAAc,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;AACjE,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,UAAU,CAAC,CAAC;AAErE,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type CliError } from "./cli-error.js";
|
|
2
|
+
import { type Result } from "./result.js";
|
|
3
|
+
type FileSnapshot = {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly existed: boolean;
|
|
6
|
+
readonly before: string | null;
|
|
7
|
+
readonly installedHash: string;
|
|
8
|
+
};
|
|
9
|
+
type JcodeFilesSnapshot = {
|
|
10
|
+
readonly configToml: FileSnapshot;
|
|
11
|
+
readonly promptOverlay: FileSnapshot;
|
|
12
|
+
readonly preferredTools: FileSnapshot;
|
|
13
|
+
readonly skillDirs: readonly string[];
|
|
14
|
+
};
|
|
15
|
+
type Written = "written" | "unchanged";
|
|
16
|
+
type JcodeInstallOutcome = {
|
|
17
|
+
readonly hooks: Written;
|
|
18
|
+
readonly promptOverlay: Written;
|
|
19
|
+
readonly preferredTools: Written;
|
|
20
|
+
readonly skills: {
|
|
21
|
+
readonly copied: string[];
|
|
22
|
+
readonly skipped: string[];
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
declare const installJcode: () => Promise<Result<JcodeInstallOutcome, CliError>>;
|
|
26
|
+
declare const uninstallJcode: (snapshot?: JcodeFilesSnapshot) => Promise<Result<void, string[]>>;
|
|
27
|
+
export { installJcode, uninstallJcode };
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { causeOf, cliErr } from "./cli-error.js";
|
|
5
|
+
import { installReceipt } from "./install-receipt.js";
|
|
6
|
+
import { jcodeBundleDir, jcodeBundleVersion } from "./jcode-bundle.js";
|
|
7
|
+
import { GLEN_JCODE_HOOK_LINES } from "./jcode-hook-lines.js";
|
|
8
|
+
import { removeHookLines, upsertHookLines } from "./jcode-hooks-toml.js";
|
|
9
|
+
import { jcodeConfigTomlPath, jcodePreferredToolsPath, jcodePromptOverlayPath, jcodeSkillsDir, } from "./jcode-paths.js";
|
|
10
|
+
import { removeJcodeSkills, syncJcodeSkills } from "./jcode-skills-sync.js";
|
|
11
|
+
import { stripManagedBlock, upsertManagedBlock } from "./managed-block.js";
|
|
12
|
+
import { err, fromPromise, ok } from "./result.js";
|
|
13
|
+
const sha256 = (text) => createHash("sha256").update(text).digest("hex");
|
|
14
|
+
const readOptional = async (path) => {
|
|
15
|
+
const r = await fromPromise(readFile(path, "utf8"));
|
|
16
|
+
return r.ok ? r.value : null;
|
|
17
|
+
};
|
|
18
|
+
const atomicWrite = async (path, content) => {
|
|
19
|
+
const mk = await fromPromise(mkdir(dirname(path), { recursive: true }));
|
|
20
|
+
if (!mk.ok)
|
|
21
|
+
return mk;
|
|
22
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
23
|
+
const w = await fromPromise(writeFile(tmp, content));
|
|
24
|
+
if (!w.ok)
|
|
25
|
+
return w;
|
|
26
|
+
return fromPromise(rename(tmp, path));
|
|
27
|
+
};
|
|
28
|
+
const writeFailure = (path, cause) => cliErr({
|
|
29
|
+
what: `could not write ${path}`,
|
|
30
|
+
why: causeOf(cause),
|
|
31
|
+
path,
|
|
32
|
+
remedy: "check ownership of ~/.jcode (e.g. `sudo chown -R $USER ~/.jcode`), then re-run `glen install --agent jcode`",
|
|
33
|
+
});
|
|
34
|
+
// Write `next` only when it differs from `before`; returns the snapshot for
|
|
35
|
+
// the receipt plus whether anything changed.
|
|
36
|
+
const converge = async (path, before, next) => {
|
|
37
|
+
const snapshot = {
|
|
38
|
+
path,
|
|
39
|
+
existed: before !== null,
|
|
40
|
+
before,
|
|
41
|
+
installedHash: sha256(next),
|
|
42
|
+
};
|
|
43
|
+
if (before === next)
|
|
44
|
+
return ok({ snapshot, status: "unchanged" });
|
|
45
|
+
const w = await atomicWrite(path, next);
|
|
46
|
+
return w.ok
|
|
47
|
+
? ok({ snapshot, status: "written" })
|
|
48
|
+
: err(writeFailure(path, w.error));
|
|
49
|
+
};
|
|
50
|
+
const installJcode = async () => {
|
|
51
|
+
const bundle = jcodeBundleDir();
|
|
52
|
+
const overlayBody = await readOptional(join(bundle, "prompt-overlay.md"));
|
|
53
|
+
const preferredBody = await readOptional(join(bundle, "preferred-tools.md"));
|
|
54
|
+
if (overlayBody === null || preferredBody === null)
|
|
55
|
+
return err(cliErr({
|
|
56
|
+
what: "the bundled jcode plugin is missing from this glen install",
|
|
57
|
+
path: bundle,
|
|
58
|
+
remedy: "reinstall the CLI: `npm install -g @tryglen/cli@latest`, then re-run `glen install --agent jcode`",
|
|
59
|
+
}));
|
|
60
|
+
// 1. Hooks — refuse rather than guess when the user's TOML doesn't parse.
|
|
61
|
+
const configPath = jcodeConfigTomlPath();
|
|
62
|
+
const configBefore = await readOptional(configPath);
|
|
63
|
+
const edited = upsertHookLines(configBefore ?? "", GLEN_JCODE_HOOK_LINES);
|
|
64
|
+
if (!edited.ok)
|
|
65
|
+
return err(cliErr({
|
|
66
|
+
what: "~/.jcode/config.toml could not be updated with glen's hooks",
|
|
67
|
+
why: edited.error,
|
|
68
|
+
path: configPath,
|
|
69
|
+
remedy: "fix the TOML (or move the file aside), then re-run `glen install --agent jcode`",
|
|
70
|
+
}));
|
|
71
|
+
const hooks = await converge(configPath, configBefore, edited.value);
|
|
72
|
+
if (!hooks.ok)
|
|
73
|
+
return hooks;
|
|
74
|
+
// 2. Prompt layers — managed blocks, user text outside them untouched.
|
|
75
|
+
const overlayPath = jcodePromptOverlayPath();
|
|
76
|
+
const overlayBefore = await readOptional(overlayPath);
|
|
77
|
+
const overlay = await converge(overlayPath, overlayBefore, upsertManagedBlock(overlayBefore ?? "", overlayBody));
|
|
78
|
+
if (!overlay.ok)
|
|
79
|
+
return overlay;
|
|
80
|
+
const preferredPath = jcodePreferredToolsPath();
|
|
81
|
+
const preferredBefore = await readOptional(preferredPath);
|
|
82
|
+
const preferred = await converge(preferredPath, preferredBefore, upsertManagedBlock(preferredBefore ?? "", preferredBody));
|
|
83
|
+
if (!preferred.ok)
|
|
84
|
+
return preferred;
|
|
85
|
+
// 3. Skills — owned dirs only.
|
|
86
|
+
const skills = await syncJcodeSkills(join(bundle, "skills"), jcodeSkillsDir(), jcodeBundleVersion() ?? "0.0.0");
|
|
87
|
+
if (!skills.ok)
|
|
88
|
+
return err(cliErr({
|
|
89
|
+
what: "could not install the glen skills into ~/.jcode/skills",
|
|
90
|
+
why: skills.error,
|
|
91
|
+
path: jcodeSkillsDir(),
|
|
92
|
+
remedy: "check ownership of ~/.jcode/skills, then re-run `glen install --agent jcode`",
|
|
93
|
+
}));
|
|
94
|
+
const receipt = await installReceipt.recordJcodeFiles({
|
|
95
|
+
configToml: hooks.value.snapshot,
|
|
96
|
+
promptOverlay: overlay.value.snapshot,
|
|
97
|
+
preferredTools: preferred.value.snapshot,
|
|
98
|
+
skillDirs: skills.value.copied.map((name) => join(jcodeSkillsDir(), name)),
|
|
99
|
+
});
|
|
100
|
+
if (!receipt.ok)
|
|
101
|
+
return err(cliErr({
|
|
102
|
+
what: "jcode files were written, but the uninstall receipt could not be saved",
|
|
103
|
+
path: installReceipt.path(),
|
|
104
|
+
remedy: "check ownership of ~/.glen, then re-run `glen install --agent jcode`",
|
|
105
|
+
}));
|
|
106
|
+
return ok({
|
|
107
|
+
hooks: hooks.value.status,
|
|
108
|
+
promptOverlay: overlay.value.status,
|
|
109
|
+
preferredTools: preferred.value.status,
|
|
110
|
+
skills: skills.value,
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
// Remove a managed block; delete the file when glen created it and nothing
|
|
114
|
+
// else is left.
|
|
115
|
+
const restoreManaged = async (path, createdByGlen) => {
|
|
116
|
+
const before = await readOptional(path);
|
|
117
|
+
if (before === null)
|
|
118
|
+
return null;
|
|
119
|
+
const next = stripManagedBlock(before);
|
|
120
|
+
if (next === before)
|
|
121
|
+
return null;
|
|
122
|
+
if (createdByGlen && next.trim() === "") {
|
|
123
|
+
const gone = await fromPromise(unlink(path));
|
|
124
|
+
return gone.ok ? null : `could not remove ${path}: ${causeOf(gone.error)}`;
|
|
125
|
+
}
|
|
126
|
+
const w = await atomicWrite(path, next);
|
|
127
|
+
return w.ok ? null : `could not write ${path}: ${causeOf(w.error)}`;
|
|
128
|
+
};
|
|
129
|
+
const uninstallJcode = async (snapshot) => {
|
|
130
|
+
const residuals = [];
|
|
131
|
+
const configPath = snapshot?.configToml.path ?? jcodeConfigTomlPath();
|
|
132
|
+
const configBefore = await readOptional(configPath);
|
|
133
|
+
if (configBefore !== null) {
|
|
134
|
+
const stripped = removeHookLines(configBefore, GLEN_JCODE_HOOK_LINES);
|
|
135
|
+
if (!stripped.ok)
|
|
136
|
+
residuals.push(`${configPath}: ${stripped.error} — remove glen's two hook lines by hand`);
|
|
137
|
+
else if (stripped.value !== configBefore) {
|
|
138
|
+
const onlyHeader = stripped.value.trim() === "[hooks]" || stripped.value.trim() === "";
|
|
139
|
+
const done = snapshot?.configToml.existed === false && onlyHeader
|
|
140
|
+
? await fromPromise(unlink(configPath))
|
|
141
|
+
: await atomicWrite(configPath, stripped.value);
|
|
142
|
+
if (!done.ok)
|
|
143
|
+
residuals.push(`could not restore ${configPath}: ${causeOf(done.error)}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const overlayResidual = await restoreManaged(snapshot?.promptOverlay.path ?? jcodePromptOverlayPath(), snapshot?.promptOverlay.existed === false);
|
|
147
|
+
if (overlayResidual)
|
|
148
|
+
residuals.push(overlayResidual);
|
|
149
|
+
const preferredResidual = await restoreManaged(snapshot?.preferredTools.path ?? jcodePreferredToolsPath(), snapshot?.preferredTools.existed === false);
|
|
150
|
+
if (preferredResidual)
|
|
151
|
+
residuals.push(preferredResidual);
|
|
152
|
+
const skills = await removeJcodeSkills(jcodeSkillsDir());
|
|
153
|
+
if (!skills.ok)
|
|
154
|
+
residuals.push(skills.error);
|
|
155
|
+
return residuals.length > 0 ? err(residuals) : ok(undefined);
|
|
156
|
+
};
|
|
157
|
+
export { installJcode, uninstallJcode };
|
|
158
|
+
//# sourceMappingURL=jcode-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcode-setup.js","sourceRoot":"","sources":["../../src/_utils/jcode-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAiB,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAe,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AA2BhE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CACtC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAElD,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAA0B,EAAE;IAClE,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,KAAK,EACvB,IAAY,EACZ,OAAe,EACiB,EAAE;IAClC,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IACpB,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAc,EAAY,EAAE,CAC9D,MAAM,CAAC;IACL,IAAI,EAAE,mBAAmB,IAAI,EAAE;IAC/B,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;IACnB,IAAI;IACJ,MAAM,EACJ,6GAA6G;CAChH,CAAC,CAAC;AAEL,4EAA4E;AAC5E,6CAA6C;AAC7C,MAAM,QAAQ,GAAG,KAAK,EACpB,IAAY,EACZ,MAAqB,EACrB,IAAY,EAC4D,EAAE;IAC1E,MAAM,QAAQ,GAAG;QACf,IAAI;QACJ,OAAO,EAAE,MAAM,KAAK,IAAI;QACxB,MAAM;QACN,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC;KAC5B,CAAC;IACF,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC,EAAE;QACT,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,IAExB,EAAE;IACF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC7E,IAAI,WAAW,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI;QAChD,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,4DAA4D;YAClE,IAAI,EAAE,MAAM;YACZ,MAAM,EACJ,mGAAmG;SACtG,CAAC,CACH,CAAC;IAEJ,0EAA0E;IAC1E,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,IAAI,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,EAAE;QACZ,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,6DAA6D;YACnE,GAAG,EAAE,MAAM,CAAC,KAAK;YACjB,IAAI,EAAE,UAAU;YAChB,MAAM,EACJ,iFAAiF;SACpF,CAAC,CACH,CAAC;IACJ,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAE5B,uEAAuE;IACvE,MAAM,WAAW,GAAG,sBAAsB,EAAE,CAAC;IAC7C,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,WAAW,EACX,aAAa,EACb,kBAAkB,CAAC,aAAa,IAAI,EAAE,EAAE,WAAW,CAAC,CACrD,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,MAAM,aAAa,GAAG,uBAAuB,EAAE,CAAC;IAChD,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,aAAa,EACb,eAAe,EACf,kBAAkB,CAAC,eAAe,IAAI,EAAE,EAAE,aAAa,CAAC,CACzD,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAEpC,+BAA+B;IAC/B,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EACtB,cAAc,EAAE,EAChB,kBAAkB,EAAE,IAAI,OAAO,CAChC,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE;QACZ,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,wDAAwD;YAC9D,GAAG,EAAE,MAAM,CAAC,KAAK;YACjB,IAAI,EAAE,cAAc,EAAE;YACtB,MAAM,EACJ,8EAA8E;SACjF,CAAC,CACH,CAAC;IAEJ,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC;QACpD,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ;QAChC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ;QACrC,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ;QACxC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC;KAC3E,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,wEAAwE;YAC9E,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE;YAC3B,MAAM,EACJ,sEAAsE;SACzE,CAAC,CACH,CAAC;IAEJ,OAAO,EAAE,CAAC;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;QACzB,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QACnC,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;QACtC,MAAM,EAAE,MAAM,CAAC,KAAK;KACrB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,2EAA2E;AAC3E,gBAAgB;AAChB,MAAM,cAAc,GAAG,KAAK,EAC1B,IAAY,EACZ,aAAsB,EACE,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7E,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AACtE,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAC1B,QAA6B,EACI,EAAE;IACnC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,MAAM,UAAU,GAAG,QAAQ,EAAE,UAAU,CAAC,IAAI,IAAI,mBAAmB,EAAE,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,eAAe,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,CAAC,EAAE;YACd,SAAS,CAAC,IAAI,CACZ,GAAG,UAAU,KAAK,QAAQ,CAAC,KAAK,yCAAyC,CAC1E,CAAC;aACC,IAAI,QAAQ,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;YACzC,MAAM,UAAU,GACd,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;YACtE,MAAM,IAAI,GACR,QAAQ,EAAE,UAAU,CAAC,OAAO,KAAK,KAAK,IAAI,UAAU;gBAClD,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACvC,CAAC,CAAC,MAAM,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,EAAE;gBACV,SAAS,CAAC,IAAI,CACZ,qBAAqB,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAC1D,CAAC;QACN,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,cAAc,CAC1C,QAAQ,EAAE,aAAa,CAAC,IAAI,IAAI,sBAAsB,EAAE,EACxD,QAAQ,EAAE,aAAa,CAAC,OAAO,KAAK,KAAK,CAC1C,CAAC;IACF,IAAI,eAAe;QAAE,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACrD,MAAM,iBAAiB,GAAG,MAAM,cAAc,CAC5C,QAAQ,EAAE,cAAc,CAAC,IAAI,IAAI,uBAAuB,EAAE,EAC1D,QAAQ,EAAE,cAAc,CAAC,OAAO,KAAK,KAAK,CAC3C,CAAC;IACF,IAAI,iBAAiB;QAAE,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,cAAc,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE7C,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Result } from "./result.js";
|
|
2
|
+
declare const syncJcodeSkills: (sourceDir: string, targetDir: string, version: string) => Promise<Result<{
|
|
3
|
+
copied: string[];
|
|
4
|
+
skipped: string[];
|
|
5
|
+
}, string>>;
|
|
6
|
+
declare const removeJcodeSkills: (targetDir: string) => Promise<Result<string[], string>>;
|
|
7
|
+
declare const installedJcodeSkillsVersion: (targetDir: string) => Promise<string | null>;
|
|
8
|
+
export { syncJcodeSkills, removeJcodeSkills, installedJcodeSkillsVersion };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { cp, mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { err, fromPromise, ok } from "./result.js";
|
|
4
|
+
// glen's skills live next to the USER's own skills in ~/.jcode/skills. A
|
|
5
|
+
// `.glen-owned` marker in each directory glen copied is the only thing that
|
|
6
|
+
// lets converge/uninstall touch it — a same-named user directory without the
|
|
7
|
+
// marker is left alone (and reported), never overwritten.
|
|
8
|
+
const OWNED_MARKER = ".glen-owned";
|
|
9
|
+
const isOwned = async (dir) => (await fromPromise(readFile(join(dir, OWNED_MARKER), "utf8"))).ok;
|
|
10
|
+
const skillDirsOf = async (dir) => {
|
|
11
|
+
const entries = await fromPromise(readdir(dir, { withFileTypes: true }));
|
|
12
|
+
if (!entries.ok)
|
|
13
|
+
return [];
|
|
14
|
+
return entries.value
|
|
15
|
+
.filter((entry) => entry.isDirectory())
|
|
16
|
+
.map((entry) => entry.name)
|
|
17
|
+
.sort();
|
|
18
|
+
};
|
|
19
|
+
const syncJcodeSkills = async (sourceDir, targetDir, version) => {
|
|
20
|
+
const names = await skillDirsOf(sourceDir);
|
|
21
|
+
if (names.length === 0)
|
|
22
|
+
return err(`no skills found in ${sourceDir}`);
|
|
23
|
+
const made = await fromPromise(mkdir(targetDir, { recursive: true }));
|
|
24
|
+
if (!made.ok)
|
|
25
|
+
return err(`could not create ${targetDir}`);
|
|
26
|
+
const copied = [];
|
|
27
|
+
const skipped = [];
|
|
28
|
+
for (const name of names) {
|
|
29
|
+
const target = join(targetDir, name);
|
|
30
|
+
const exists = (await fromPromise(readdir(target))).ok;
|
|
31
|
+
if (exists && !(await isOwned(target))) {
|
|
32
|
+
skipped.push(name);
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const replaced = await fromPromise(rm(target, { recursive: true, force: true }));
|
|
36
|
+
if (!replaced.ok)
|
|
37
|
+
return err(`could not replace ${target}`);
|
|
38
|
+
const copiedDir = await fromPromise(cp(join(sourceDir, name), target, { recursive: true }));
|
|
39
|
+
if (!copiedDir.ok)
|
|
40
|
+
return err(`could not copy skill ${name} to ${target}`);
|
|
41
|
+
const marked = await fromPromise(writeFile(join(target, OWNED_MARKER), `${JSON.stringify({ version })}\n`));
|
|
42
|
+
if (!marked.ok)
|
|
43
|
+
return err(`could not mark ${target} as glen-owned`);
|
|
44
|
+
copied.push(name);
|
|
45
|
+
}
|
|
46
|
+
return ok({ copied, skipped });
|
|
47
|
+
};
|
|
48
|
+
const removeJcodeSkills = async (targetDir) => {
|
|
49
|
+
const removed = [];
|
|
50
|
+
for (const name of await skillDirsOf(targetDir)) {
|
|
51
|
+
const dir = join(targetDir, name);
|
|
52
|
+
if (!(await isOwned(dir)))
|
|
53
|
+
continue;
|
|
54
|
+
const gone = await fromPromise(rm(dir, { recursive: true, force: true }));
|
|
55
|
+
if (!gone.ok)
|
|
56
|
+
return err(`could not remove ${dir}`);
|
|
57
|
+
removed.push(name);
|
|
58
|
+
}
|
|
59
|
+
return ok(removed);
|
|
60
|
+
};
|
|
61
|
+
// Version stamped on the first owned dir found — all owned dirs are written
|
|
62
|
+
// in one sync, so one is representative. null = nothing owned installed.
|
|
63
|
+
const installedJcodeSkillsVersion = async (targetDir) => {
|
|
64
|
+
for (const name of await skillDirsOf(targetDir)) {
|
|
65
|
+
const raw = await fromPromise(readFile(join(targetDir, name, OWNED_MARKER), "utf8"));
|
|
66
|
+
if (!raw.ok)
|
|
67
|
+
continue;
|
|
68
|
+
try {
|
|
69
|
+
const parsed = JSON.parse(raw.value);
|
|
70
|
+
return typeof parsed.version === "string" ? parsed.version : null;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
};
|
|
78
|
+
export { syncJcodeSkills, removeJcodeSkills, installedJcodeSkillsVersion };
|
|
79
|
+
//# sourceMappingURL=jcode-skills-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jcode-skills-sync.js","sourceRoot":"","sources":["../../src/_utils/jcode-skills-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// A marker-delimited region glen owns inside a file the USER also edits
|
|
2
|
+
// (jcode's ~/.jcode/prompt-overlay.md and preferred-tools.md). Everything
|
|
3
|
+
// outside the markers is preserved byte-for-byte; upsert replaces the region
|
|
4
|
+
// in place or appends one; strip removes it and the blank line it added.
|
|
5
|
+
const BEGIN = "<!-- glen:begin (managed by `glen install`; edits inside this block are overwritten) -->";
|
|
6
|
+
const END = "<!-- glen:end -->";
|
|
7
|
+
const blockFor = (body) => `${BEGIN}\n${body.trim()}\n${END}\n`;
|
|
8
|
+
const spanOf = (text) => {
|
|
9
|
+
const start = text.indexOf(BEGIN);
|
|
10
|
+
if (start === -1)
|
|
11
|
+
return null;
|
|
12
|
+
const endMarker = text.indexOf(END, start);
|
|
13
|
+
if (endMarker === -1)
|
|
14
|
+
return null;
|
|
15
|
+
return { start, end: endMarker + END.length };
|
|
16
|
+
};
|
|
17
|
+
const upsertManagedBlock = (text, body) => {
|
|
18
|
+
const span = spanOf(text);
|
|
19
|
+
if (span) {
|
|
20
|
+
const rest = text.slice(span.end).replace(/^\n/, "");
|
|
21
|
+
return `${text.slice(0, span.start)}${blockFor(body)}${rest}`;
|
|
22
|
+
}
|
|
23
|
+
const base = text.trimEnd();
|
|
24
|
+
return base.length === 0 ? blockFor(body) : `${base}\n\n${blockFor(body)}`;
|
|
25
|
+
};
|
|
26
|
+
const stripManagedBlock = (text) => {
|
|
27
|
+
const span = spanOf(text);
|
|
28
|
+
if (!span)
|
|
29
|
+
return text;
|
|
30
|
+
const before = text.slice(0, span.start).replace(/\n+$/, "");
|
|
31
|
+
const rest = text.slice(span.end).replace(/^\n+/, "");
|
|
32
|
+
if (!before && !rest)
|
|
33
|
+
return "";
|
|
34
|
+
if (!before)
|
|
35
|
+
return rest;
|
|
36
|
+
if (!rest)
|
|
37
|
+
return `${before}\n`;
|
|
38
|
+
return `${before}\n\n${rest}`;
|
|
39
|
+
};
|
|
40
|
+
const hasManagedBlock = (text) => spanOf(text) !== null;
|
|
41
|
+
export { upsertManagedBlock, stripManagedBlock, hasManagedBlock };
|
|
42
|
+
//# sourceMappingURL=managed-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-block.js","sourceRoot":"","sources":["../../src/_utils/managed-block.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0EAA0E;AAC1E,6EAA6E;AAC7E,yEAAyE;AACzE,MAAM,KAAK,GACT,0FAA0F,CAAC;AAC7F,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAEhC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;AAEhF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAyC,EAAE;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,IAAY,EAAU,EAAE;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAU,EAAE;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,MAAM,IAAI,CAAC;IAChC,OAAO,GAAG,MAAM,OAAO,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-harbor-atif.js","sourceRoot":"","sources":["../../src/_utils/parse-harbor-atif.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"parse-harbor-atif.js","sourceRoot":"","sources":["../../src/_utils/parse-harbor-atif.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type JcodeTurn = {
|
|
2
|
+
readonly prompt: string;
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly turnId: string;
|
|
5
|
+
};
|
|
6
|
+
declare const readJcodeTurn: (sessionId: string, opts?: {
|
|
7
|
+
retries?: number;
|
|
8
|
+
delayMs?: number;
|
|
9
|
+
}) => Promise<JcodeTurn | null>;
|
|
10
|
+
declare const readJcodeUserPrompt: (sessionId: string) => Promise<{
|
|
11
|
+
prompt: string;
|
|
12
|
+
turnId: string;
|
|
13
|
+
} | null>;
|
|
14
|
+
export { readJcodeTurn, readJcodeUserPrompt };
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { jcodeSessionsDir } from "./jcode-paths.js";
|
|
4
|
+
import { fromPromise } from "./result.js";
|
|
5
|
+
const isEntry = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
6
|
+
const parseJson = (raw) => {
|
|
7
|
+
try {
|
|
8
|
+
const parsed = JSON.parse(raw);
|
|
9
|
+
return isEntry(parsed) ? parsed : null;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const messagesOf = (entry) => Array.isArray(entry?.messages) ? entry.messages.filter(isEntry) : [];
|
|
16
|
+
// Text blocks only — thinking blocks (`thinking`) and tool blocks are not the
|
|
17
|
+
// answer the user read.
|
|
18
|
+
const textOf = (content) => {
|
|
19
|
+
if (typeof content === "string")
|
|
20
|
+
return content;
|
|
21
|
+
if (!Array.isArray(content))
|
|
22
|
+
return "";
|
|
23
|
+
return content
|
|
24
|
+
.map((block) => typeof block === "string"
|
|
25
|
+
? block
|
|
26
|
+
: isEntry(block) && typeof block.text === "string"
|
|
27
|
+
? block.text
|
|
28
|
+
: "")
|
|
29
|
+
.filter(Boolean)
|
|
30
|
+
.join("\n")
|
|
31
|
+
.trim();
|
|
32
|
+
};
|
|
33
|
+
// Non-system/background rows in file order — the messages a turn is built from.
|
|
34
|
+
const visibleOf = (messages) => messages.filter((m) => m.display_role === undefined || m.display_role === null);
|
|
35
|
+
const idOf = (message, index) => typeof message.id === "string" && message.id ? message.id : `${index}`;
|
|
36
|
+
const turnOf = (messages) => {
|
|
37
|
+
const visible = visibleOf(messages);
|
|
38
|
+
const lastAssistant = visible
|
|
39
|
+
.map((m, i) => ({ m, i }))
|
|
40
|
+
.reverse()
|
|
41
|
+
.find(({ m }) => m.role === "assistant");
|
|
42
|
+
if (!lastAssistant)
|
|
43
|
+
return null;
|
|
44
|
+
const lastUser = visible
|
|
45
|
+
.slice(0, lastAssistant.i)
|
|
46
|
+
.map((m, i) => ({ m, i }))
|
|
47
|
+
.reverse()
|
|
48
|
+
.find(({ m }) => m.role === "user");
|
|
49
|
+
if (!lastUser)
|
|
50
|
+
return null;
|
|
51
|
+
const prompt = textOf(lastUser.m.content);
|
|
52
|
+
const text = textOf(lastAssistant.m.content);
|
|
53
|
+
if (!prompt || !text)
|
|
54
|
+
return null;
|
|
55
|
+
return { prompt, text, turnId: idOf(lastUser.m, lastUser.i) };
|
|
56
|
+
};
|
|
57
|
+
// The last user prompt, regardless of whether the assistant reply has landed
|
|
58
|
+
// yet. jcode fires turn_end BEFORE it flushes the assistant message to the
|
|
59
|
+
// session snapshot (measured ~5-7s later), so at hook time the file already
|
|
60
|
+
// has the prompt but not the answer. This lets the caller pair the real
|
|
61
|
+
// prompt with the answer jcode passes in the hook env (LAST_ASSISTANT_TEXT),
|
|
62
|
+
// so a turn is never dropped while waiting for the flush.
|
|
63
|
+
const lastUserPromptOf = (messages) => {
|
|
64
|
+
const visible = visibleOf(messages);
|
|
65
|
+
const lastUser = visible
|
|
66
|
+
.map((m, i) => ({ m, i }))
|
|
67
|
+
.reverse()
|
|
68
|
+
.find(({ m }) => m.role === "user");
|
|
69
|
+
if (!lastUser)
|
|
70
|
+
return null;
|
|
71
|
+
const prompt = textOf(lastUser.m.content);
|
|
72
|
+
if (!prompt)
|
|
73
|
+
return null;
|
|
74
|
+
return { prompt, turnId: idOf(lastUser.m, lastUser.i) };
|
|
75
|
+
};
|
|
76
|
+
const loadMessages = async (sessionId) => {
|
|
77
|
+
const dir = jcodeSessionsDir();
|
|
78
|
+
const snapshot = await fromPromise(readFile(join(dir, `${sessionId}.json`), "utf8"));
|
|
79
|
+
const journal = await fromPromise(readFile(join(dir, `${sessionId}.journal.jsonl`), "utf8"));
|
|
80
|
+
if (!snapshot.ok && !journal.ok)
|
|
81
|
+
return null;
|
|
82
|
+
const all = [
|
|
83
|
+
...(snapshot.ok ? messagesOf(parseJson(snapshot.value)) : []),
|
|
84
|
+
...(journal.ok
|
|
85
|
+
? journal.value
|
|
86
|
+
.split("\n")
|
|
87
|
+
.filter(Boolean)
|
|
88
|
+
.map(parseJson)
|
|
89
|
+
.flatMap(messagesOf)
|
|
90
|
+
: []),
|
|
91
|
+
];
|
|
92
|
+
// Journal entries may repeat snapshot rows — last write wins, order kept.
|
|
93
|
+
const byId = new Map();
|
|
94
|
+
for (const m of all)
|
|
95
|
+
byId.set(typeof m.id === "string" ? m.id : `${byId.size}`, m);
|
|
96
|
+
return [...byId.values()];
|
|
97
|
+
};
|
|
98
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
99
|
+
// The hook is detached, so a short wait costs nothing: turn_end can fire a
|
|
100
|
+
// beat before the answer reaches the journal.
|
|
101
|
+
const readJcodeTurn = async (sessionId, opts = {}) => {
|
|
102
|
+
if (!/^[A-Za-z0-9._-]+$/.test(sessionId))
|
|
103
|
+
return null;
|
|
104
|
+
const retries = opts.retries ?? 4;
|
|
105
|
+
const delayMs = opts.delayMs ?? 500;
|
|
106
|
+
const attempt = async (remaining) => {
|
|
107
|
+
const messages = await loadMessages(sessionId);
|
|
108
|
+
const turn = messages ? turnOf(messages) : null;
|
|
109
|
+
if (turn)
|
|
110
|
+
return turn;
|
|
111
|
+
if (remaining <= 0)
|
|
112
|
+
return null;
|
|
113
|
+
await sleep(delayMs);
|
|
114
|
+
return attempt(remaining - 1);
|
|
115
|
+
};
|
|
116
|
+
return attempt(retries);
|
|
117
|
+
};
|
|
118
|
+
// Race-proof companion to readJcodeTurn: the current turn's user prompt from
|
|
119
|
+
// the session file, without waiting for the assistant flush. Returns null
|
|
120
|
+
// only when the file is unreadable or has no user message.
|
|
121
|
+
const readJcodeUserPrompt = async (sessionId) => {
|
|
122
|
+
if (!/^[A-Za-z0-9._-]+$/.test(sessionId))
|
|
123
|
+
return null;
|
|
124
|
+
const messages = await loadMessages(sessionId);
|
|
125
|
+
return messages ? lastUserPromptOf(messages) : null;
|
|
126
|
+
};
|
|
127
|
+
export { readJcodeTurn, readJcodeUserPrompt };
|
|
128
|
+
//# sourceMappingURL=parse-jcode-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-jcode-session.js","sourceRoot":"","sources":["../../src/_utils/parse-jcode-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
type PluginStatus = "installed" | "not-installed" | "unknown";
|
|
2
|
-
declare const glenPluginStatus: (agentBin: "claude" | "codex" | "pi") => PluginStatus;
|
|
2
|
+
declare const glenPluginStatus: (agentBin: "claude" | "codex" | "pi" | "jcode") => PluginStatus;
|
|
3
3
|
export { glenPluginStatus };
|
|
4
4
|
export type { PluginStatus };
|
|
@@ -2,6 +2,9 @@ import { readFileSync } from "node:fs";
|
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { findBin } from "./find-bin.js";
|
|
5
|
+
import { GLEN_JCODE_HOOK_LINES } from "./jcode-hook-lines.js";
|
|
6
|
+
import { hasHookLines, readHooksTable } from "./jcode-hooks-toml.js";
|
|
7
|
+
import { jcodeConfigTomlPath } from "./jcode-paths.js";
|
|
5
8
|
import { runBin } from "./run-bin.js";
|
|
6
9
|
// A line whose first token is the glen plugin: claude lists `❯ glen@glen`
|
|
7
10
|
// entries (selection marker before the name), codex lists plugin names
|
|
@@ -48,11 +51,36 @@ const piPluginStatus = () => {
|
|
|
48
51
|
return "unknown";
|
|
49
52
|
}
|
|
50
53
|
};
|
|
54
|
+
// jcode has no plugin CLI — the two glen hook lines in ~/.jcode/config.toml
|
|
55
|
+
// ARE the install. Missing file → not-installed; unparseable → unknown (the
|
|
56
|
+
// installer refuses to touch it and says why).
|
|
57
|
+
const jcodePluginStatus = () => {
|
|
58
|
+
const raw = (() => {
|
|
59
|
+
try {
|
|
60
|
+
return readFileSync(jcodeConfigTomlPath(), "utf8");
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
return e.code === "ENOENT" ? "" : null;
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
66
|
+
if (raw === null)
|
|
67
|
+
return "unknown";
|
|
68
|
+
if (raw === "")
|
|
69
|
+
return "not-installed";
|
|
70
|
+
const table = readHooksTable(raw);
|
|
71
|
+
if (!table.ok)
|
|
72
|
+
return "unknown";
|
|
73
|
+
return hasHookLines(table.value, GLEN_JCODE_HOOK_LINES)
|
|
74
|
+
? "installed"
|
|
75
|
+
: "not-installed";
|
|
76
|
+
};
|
|
51
77
|
// Detects whether the glen plugin is installed for an agent — by parsing
|
|
52
78
|
// `<agent> plugin list` output (claude/codex), or by reading pi's settings
|
|
53
79
|
// file (pi has no plugin-list CLI). "unknown" (agent missing or check failed)
|
|
54
80
|
// lets callers fall back to attempting an install.
|
|
55
81
|
const glenPluginStatus = (agentBin) => {
|
|
82
|
+
if (agentBin === "jcode")
|
|
83
|
+
return jcodePluginStatus();
|
|
56
84
|
if (agentBin === "pi")
|
|
57
85
|
return piPluginStatus();
|
|
58
86
|
const bin = findBin(agentBin);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-status.js","sourceRoot":"","sources":["../../src/_utils/plugin-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAItC,0EAA0E;AAC1E,uEAAuE;AACvE,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,yBAAyB;AACzB,MAAM,gBAAgB,GAAG,gCAAgC,CAAC;AAE1D,+EAA+E;AAC/E,MAAM,cAAc,GAAG,GAAW,EAAE,CAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB;IACjC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAEnD,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,qEAAqE;AACrE,MAAM,cAAc,GAAG,GAAiB,EAAE;IACxC,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAQ,CAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,eAAe,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACzC,MAAM,MAAM,GACV,OAAO,KAAK,KAAK,QAAQ;gBACvB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAC3C,CAAC,CAAE,KAA8B,CAAC,MAAM;oBACxC,CAAC,CAAC,SAAS,CAAC;YAClB,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,yEAAyE;AACzE,2EAA2E;AAC3E,8EAA8E;AAC9E,mDAAmD;AACnD,MAAM,gBAAgB,GAAG,CACvB,
|
|
1
|
+
{"version":3,"file":"plugin-status.js","sourceRoot":"","sources":["../../src/_utils/plugin-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ type BenchmarkRun = {
|
|
|
28
28
|
};
|
|
29
29
|
type ParsedTranscript = {
|
|
30
30
|
readonly sessionId: string;
|
|
31
|
-
readonly agent: "claude-code" | "codex" | "cursor" | "pi";
|
|
31
|
+
readonly agent: "claude-code" | "codex" | "cursor" | "pi" | "jcode";
|
|
32
32
|
readonly cwd: string | undefined;
|
|
33
33
|
readonly branch: string | undefined;
|
|
34
34
|
readonly model: string | undefined;
|