@nanonets/graft 0.21.1 → 0.22.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 +549 -315
- package/dist/app/review-process.d.ts.map +1 -1
- package/dist/app/review-process.js +6 -5
- package/dist/app/review-process.js.map +1 -1
- package/dist/app/sources.js +2 -2
- package/dist/app/sources.js.map +1 -1
- package/dist/ask/ask.d.ts +12 -6
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +28 -38
- package/dist/ask/ask.js.map +1 -1
- package/dist/bin/graft.d.ts +3 -0
- package/dist/bin/graft.d.ts.map +1 -0
- package/dist/bin/graft.js +8 -0
- package/dist/bin/graft.js.map +1 -0
- package/dist/bin/trail.d.ts +3 -0
- package/dist/bin/trail.d.ts.map +1 -0
- package/dist/bin/trail.js +6 -0
- package/dist/bin/trail.js.map +1 -0
- package/dist/blast/blast-cli.d.ts.map +1 -1
- package/dist/blast/blast-cli.js +2 -1
- package/dist/blast/blast-cli.js.map +1 -1
- package/dist/blast/render.d.ts.map +1 -1
- package/dist/blast/render.js +3 -2
- package/dist/blast/render.js.map +1 -1
- package/dist/brand.d.ts +97 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +254 -0
- package/dist/brand.js.map +1 -0
- package/dist/check/local-check.d.ts +104 -0
- package/dist/check/local-check.d.ts.map +1 -0
- package/dist/check/local-check.js +830 -0
- package/dist/check/local-check.js.map +1 -0
- package/dist/check/types.d.ts +31 -0
- package/dist/check/types.d.ts.map +1 -0
- package/dist/check/types.js +2 -0
- package/dist/check/types.js.map +1 -0
- package/dist/claude/format.d.ts +44 -1
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +113 -19
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hook-layers.d.ts +8 -0
- package/dist/claude/hook-layers.d.ts.map +1 -0
- package/dist/claude/hook-layers.js +72 -0
- package/dist/claude/hook-layers.js.map +1 -0
- package/dist/claude/hooks.d.ts +34 -0
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +220 -12
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.d.ts +12 -1
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +48 -19
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/session-metrics.d.ts +1 -1
- package/dist/claude/session-metrics.d.ts.map +1 -1
- package/dist/claude/session-metrics.js +11 -8
- package/dist/claude/session-metrics.js.map +1 -1
- package/dist/claude/settings-merge.d.ts +1 -0
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +21 -18
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/shim-template.d.ts +17 -2
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +116 -22
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts +10 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +132 -1
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/state.d.ts +8 -0
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/statusline.d.ts.map +1 -1
- package/dist/claude/statusline.js +4 -1
- package/dist/claude/statusline.js.map +1 -1
- package/dist/claude/tally.js +1 -1
- package/dist/claude/tally.js.map +1 -1
- package/dist/cli-epilogue.d.ts +0 -6
- package/dist/cli-epilogue.d.ts.map +1 -1
- package/dist/cli-epilogue.js +5 -4
- package/dist/cli-epilogue.js.map +1 -1
- package/dist/cli-meta.d.ts +8 -0
- package/dist/cli-meta.d.ts.map +1 -1
- package/dist/cli-meta.js +28 -8
- package/dist/cli-meta.js.map +1 -1
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +11 -7
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts +0 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1039 -559
- package/dist/cli.js.map +1 -1
- package/dist/cloud/diff.d.ts +18 -0
- package/dist/cloud/diff.d.ts.map +1 -0
- package/dist/cloud/diff.js +58 -0
- package/dist/cloud/diff.js.map +1 -0
- package/dist/cloud/nudge.d.ts +66 -0
- package/dist/cloud/nudge.d.ts.map +1 -0
- package/dist/cloud/nudge.js +269 -0
- package/dist/cloud/nudge.js.map +1 -0
- package/dist/cloud/workspace-sync.d.ts +58 -0
- package/dist/cloud/workspace-sync.d.ts.map +1 -0
- package/dist/cloud/workspace-sync.js +268 -0
- package/dist/cloud/workspace-sync.js.map +1 -0
- package/dist/cloud/workspace.d.ts +159 -0
- package/dist/cloud/workspace.d.ts.map +1 -0
- package/dist/cloud/workspace.js +134 -0
- package/dist/cloud/workspace.js.map +1 -0
- package/dist/context/check.d.ts +1 -1
- package/dist/context/check.d.ts.map +1 -1
- package/dist/context/check.js +9 -8
- package/dist/context/check.js.map +1 -1
- package/dist/context/node-file.js +1 -1
- package/dist/context/node-file.js.map +1 -1
- package/dist/context/savings.d.ts.map +1 -1
- package/dist/context/savings.js +10 -7
- package/dist/context/savings.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +3 -1
- package/dist/engine.js.map +1 -1
- package/dist/graph/build.d.ts +30 -0
- package/dist/graph/build.d.ts.map +1 -1
- package/dist/graph/build.js +65 -19
- package/dist/graph/build.js.map +1 -1
- package/dist/graph/cards.d.ts.map +1 -1
- package/dist/graph/cards.js +4 -2
- package/dist/graph/cards.js.map +1 -1
- package/dist/graph/check.d.ts.map +1 -1
- package/dist/graph/check.js +17 -18
- package/dist/graph/check.js.map +1 -1
- package/dist/graph/container.d.ts.map +1 -1
- package/dist/graph/container.js +7 -2
- package/dist/graph/container.js.map +1 -1
- package/dist/graph/extract-cache.d.ts +4 -0
- package/dist/graph/extract-cache.d.ts.map +1 -1
- package/dist/graph/extract-cache.js.map +1 -1
- package/dist/graph/extract.d.ts +2 -0
- package/dist/graph/extract.d.ts.map +1 -1
- package/dist/graph/extract.js +5 -32
- package/dist/graph/extract.js.map +1 -1
- package/dist/graph/generic.d.ts +7 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +48 -8
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/native.d.ts +38 -0
- package/dist/graph/native.d.ts.map +1 -0
- package/dist/graph/native.js +169 -0
- package/dist/graph/native.js.map +1 -0
- package/dist/graph/refresh.d.ts.map +1 -1
- package/dist/graph/refresh.js +3 -2
- package/dist/graph/refresh.js.map +1 -1
- package/dist/graph/traverse-cli.d.ts.map +1 -1
- package/dist/graph/traverse-cli.js +4 -3
- package/dist/graph/traverse-cli.js.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +13 -1
- package/dist/graph/workspace-cli.js.map +1 -1
- package/dist/graph/workspace.d.ts.map +1 -1
- package/dist/graph/workspace.js +6 -5
- package/dist/graph/workspace.js.map +1 -1
- package/dist/hosts/antigravity.d.ts +10 -3
- package/dist/hosts/antigravity.d.ts.map +1 -1
- package/dist/hosts/antigravity.js +27 -10
- package/dist/hosts/antigravity.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +27 -4
- package/dist/hosts/claude-global.d.ts.map +1 -1
- package/dist/hosts/claude-global.js +90 -9
- package/dist/hosts/claude-global.js.map +1 -1
- package/dist/hosts/codex-hooks.d.ts.map +1 -1
- package/dist/hosts/codex-hooks.js +1 -2
- package/dist/hosts/codex-hooks.js.map +1 -1
- package/dist/hosts/config-write.d.ts.map +1 -1
- package/dist/hosts/config-write.js +2 -1
- package/dist/hosts/config-write.js.map +1 -1
- package/dist/hosts/cursor-hooks.d.ts +5 -2
- package/dist/hosts/cursor-hooks.d.ts.map +1 -1
- package/dist/hosts/cursor-hooks.js +14 -9
- package/dist/hosts/cursor-hooks.js.map +1 -1
- package/dist/hosts/init.d.ts +3 -0
- package/dist/hosts/init.d.ts.map +1 -1
- package/dist/hosts/init.js +32 -10
- package/dist/hosts/init.js.map +1 -1
- package/dist/hosts/instructions.d.ts +9 -4
- package/dist/hosts/instructions.d.ts.map +1 -1
- package/dist/hosts/instructions.js +19 -16
- package/dist/hosts/instructions.js.map +1 -1
- package/dist/hosts/mcp-config.d.ts +19 -4
- package/dist/hosts/mcp-config.d.ts.map +1 -1
- package/dist/hosts/mcp-config.js +81 -30
- package/dist/hosts/mcp-config.js.map +1 -1
- package/dist/hosts/plan.d.ts.map +1 -1
- package/dist/hosts/plan.js +11 -9
- package/dist/hosts/plan.js.map +1 -1
- package/dist/hosts/registry.d.ts +25 -2
- package/dist/hosts/registry.d.ts.map +1 -1
- package/dist/hosts/registry.js +53 -0
- package/dist/hosts/registry.js.map +1 -1
- package/dist/hosts/retract.d.ts.map +1 -1
- package/dist/hosts/retract.js +73 -33
- package/dist/hosts/retract.js.map +1 -1
- package/dist/hosts/sections.d.ts +17 -1
- package/dist/hosts/sections.d.ts.map +1 -1
- package/dist/hosts/sections.js +52 -2
- package/dist/hosts/sections.js.map +1 -1
- package/dist/mcp/instructions.d.ts +1 -25
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +6 -4
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +7 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-names.d.ts +10 -3
- package/dist/mcp/tool-names.d.ts.map +1 -1
- package/dist/mcp/tool-names.js +13 -5
- package/dist/mcp/tool-names.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +6 -5
- package/dist/mcp/tools.js.map +1 -1
- package/dist/notes/ask-notes.d.ts +8 -0
- package/dist/notes/ask-notes.d.ts.map +1 -0
- package/dist/notes/ask-notes.js +18 -0
- package/dist/notes/ask-notes.js.map +1 -0
- package/dist/notes/branches.d.ts +85 -0
- package/dist/notes/branches.d.ts.map +1 -0
- package/dist/notes/branches.js +238 -0
- package/dist/notes/branches.js.map +1 -0
- package/dist/notes/cold-start.d.ts +127 -0
- package/dist/notes/cold-start.d.ts.map +1 -0
- package/dist/notes/cold-start.js +476 -0
- package/dist/notes/cold-start.js.map +1 -0
- package/dist/notes/git-facts.d.ts +17 -0
- package/dist/notes/git-facts.d.ts.map +1 -0
- package/dist/notes/git-facts.js +117 -0
- package/dist/notes/git-facts.js.map +1 -0
- package/dist/notes/home.d.ts +87 -0
- package/dist/notes/home.d.ts.map +1 -0
- package/dist/notes/home.js +423 -0
- package/dist/notes/home.js.map +1 -0
- package/dist/notes/notes.d.ts +178 -0
- package/dist/notes/notes.d.ts.map +1 -0
- package/dist/notes/notes.js +498 -0
- package/dist/notes/notes.js.map +1 -0
- package/dist/notes/repo-trail.d.ts +16 -0
- package/dist/notes/repo-trail.d.ts.map +1 -0
- package/dist/notes/repo-trail.js +74 -0
- package/dist/notes/repo-trail.js.map +1 -0
- package/dist/notes/session-cost.d.ts +21 -0
- package/dist/notes/session-cost.d.ts.map +1 -0
- package/dist/notes/session-cost.js +162 -0
- package/dist/notes/session-cost.js.map +1 -0
- package/dist/search/grep-cli.d.ts.map +1 -1
- package/dist/search/grep-cli.js +4 -3
- package/dist/search/grep-cli.js.map +1 -1
- package/dist/skills/skills.d.ts +118 -0
- package/dist/skills/skills.d.ts.map +1 -0
- package/dist/skills/skills.js +370 -0
- package/dist/skills/skills.js.map +1 -0
- package/dist/telemetry/contract.d.ts +2 -14
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +39 -24
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/gate.d.ts.map +1 -1
- package/dist/telemetry/gate.js +2 -1
- package/dist/telemetry/gate.js.map +1 -1
- package/dist/telemetry/notice.d.ts +1 -1
- package/dist/telemetry/notice.d.ts.map +1 -1
- package/dist/telemetry/notice.js +6 -5
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/telemetry/track.d.ts.map +1 -1
- package/dist/telemetry/track.js +5 -0
- package/dist/telemetry/track.js.map +1 -1
- package/dist/upkeep-run.d.ts +7 -0
- package/dist/upkeep-run.d.ts.map +1 -1
- package/dist/upkeep-run.js +52 -12
- package/dist/upkeep-run.js.map +1 -1
- package/dist/upkeep.d.ts +9 -19
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +38 -59
- package/dist/upkeep.js.map +1 -1
- package/dist/util/browser.d.ts +3 -0
- package/dist/util/browser.d.ts.map +1 -0
- package/dist/util/browser.js +14 -0
- package/dist/util/browser.js.map +1 -0
- package/dist/util/front-matter.d.ts +19 -0
- package/dist/util/front-matter.d.ts.map +1 -0
- package/dist/util/front-matter.js +21 -0
- package/dist/util/front-matter.js.map +1 -0
- package/dist/util/state.d.ts +1 -18
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +4 -2
- package/dist/util/state.js.map +1 -1
- package/dist/viz/assemble.js +1 -1
- package/dist/viz/assemble.js.map +1 -1
- package/dist/viz/serve.d.ts.map +1 -1
- package/dist/viz/serve.js +4 -3
- package/dist/viz/serve.js.map +1 -1
- package/package.json +7 -7
- package/scripts/pack-trail.mjs +53 -0
- package/scripts/postinstall.mjs +17 -2
- package/scripts/run-tests.mjs +4 -1
- package/dist/brain/attach.d.ts +0 -44
- package/dist/brain/attach.d.ts.map +0 -1
- package/dist/brain/attach.js +0 -63
- package/dist/brain/attach.js.map +0 -1
- package/dist/brain/claude-md.d.ts +0 -61
- package/dist/brain/claude-md.d.ts.map +0 -1
- package/dist/brain/claude-md.js +0 -171
- package/dist/brain/claude-md.js.map +0 -1
- package/dist/brain/connect.d.ts +0 -59
- package/dist/brain/connect.d.ts.map +0 -1
- package/dist/brain/connect.js +0 -80
- package/dist/brain/connect.js.map +0 -1
- package/dist/brain/context-files.d.ts +0 -79
- package/dist/brain/context-files.d.ts.map +0 -1
- package/dist/brain/context-files.js +0 -245
- package/dist/brain/context-files.js.map +0 -1
- package/dist/brain/link.d.ts +0 -106
- package/dist/brain/link.d.ts.map +0 -1
- package/dist/brain/link.js +0 -167
- package/dist/brain/link.js.map +0 -1
- package/dist/brain/pull.d.ts +0 -48
- package/dist/brain/pull.d.ts.map +0 -1
- package/dist/brain/pull.js +0 -257
- package/dist/brain/pull.js.map +0 -1
- package/dist/brain/push.d.ts +0 -155
- package/dist/brain/push.d.ts.map +0 -1
- package/dist/brain/push.js +0 -304
- package/dist/brain/push.js.map +0 -1
- package/dist/brain/signup.d.ts +0 -117
- package/dist/brain/signup.d.ts.map +0 -1
- package/dist/brain/signup.js +0 -276
- package/dist/brain/signup.js.map +0 -1
- package/dist/brain/upload.d.ts +0 -61
- package/dist/brain/upload.d.ts.map +0 -1
- package/dist/brain/upload.js +0 -210
- package/dist/brain/upload.js.map +0 -1
- package/dist/brain/watch.d.ts +0 -209
- package/dist/brain/watch.d.ts.map +0 -1
- package/dist/brain/watch.js +0 -397
- package/dist/brain/watch.js.map +0 -1
- package/dist/brain/wire.d.ts +0 -38
- package/dist/brain/wire.d.ts.map +0 -1
- package/dist/brain/wire.js +0 -133
- package/dist/brain/wire.js.map +0 -1
- package/dist/legacy-args.d.ts +0 -12
- package/dist/legacy-args.d.ts.map +0 -1
- package/dist/legacy-args.js +0 -31
- package/dist/legacy-args.js.map +0 -1
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills: how-tos an agent follows, and the corrections that improve them.
|
|
3
|
+
*
|
|
4
|
+
* A correction is a takeaway, one file each, kept on this machine in
|
|
5
|
+
* `~/.trail/repos/<repo>/skills/<name>/takeaways/`. It's live the moment it's
|
|
6
|
+
* saved: the agent reads a skill's waiting takeaways along with its SKILL.md.
|
|
7
|
+
* `trail skills fold` writes them into SKILL.md and bumps its version, so the
|
|
8
|
+
* skill stays one readable page instead of a pile of corrections.
|
|
9
|
+
*
|
|
10
|
+
* The SKILL.md lives in one of two places. A skill the repo already has, in
|
|
11
|
+
* `.claude/skills/<name>/`, is the team's: takeaways attach to it and fold
|
|
12
|
+
* into it, and the diff goes through review like any change. A skill started
|
|
13
|
+
* by `trail learn` lives next to its takeaways in `~/.trail` until someone
|
|
14
|
+
* chooses to share it: `trail skills publish` moves it into the repo's
|
|
15
|
+
* `.claude/skills/`, where Claude Code loads it for everyone who pulls.
|
|
16
|
+
*
|
|
17
|
+
* Takeaways are never deleted: a folded one keeps its file, with `folded_in`
|
|
18
|
+
* saying which version took it, so why a rule exists stays findable.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
import { matter } from "../util/front-matter.js";
|
|
23
|
+
import { shortDate, slug } from "../notes/notes.js";
|
|
24
|
+
import { ensureRepoHome, repoPlace } from "../notes/home.js";
|
|
25
|
+
/** Trail's and graft's own skills, rewritten by every `init`: never a place for takeaways. */
|
|
26
|
+
const OWN_SKILLS = new Set(["trail", "graft"]);
|
|
27
|
+
/** Where a repo's skills are: the team's in the repo, and this machine's in ~/.trail. */
|
|
28
|
+
export function skillDirs(dir) {
|
|
29
|
+
const place = repoPlace(dir);
|
|
30
|
+
return { repo: join(place.checkout, ".claude", "skills"), home: join(place.dir, "skills") };
|
|
31
|
+
}
|
|
32
|
+
/** A skill name as a folder: `PDF coords` → `pdf-coords`. */
|
|
33
|
+
export function skillName(raw) {
|
|
34
|
+
return slug(raw, 8);
|
|
35
|
+
}
|
|
36
|
+
function yamlScalar(s) {
|
|
37
|
+
return /^[A-Za-z0-9][^:#\n"'{}[\],&*!|>%@`]*$/.test(s) && s.trim() === s ? s : JSON.stringify(s);
|
|
38
|
+
}
|
|
39
|
+
function asDate(v) {
|
|
40
|
+
return v instanceof Date ? v.toISOString().slice(0, 10) : String(v ?? "");
|
|
41
|
+
}
|
|
42
|
+
/* -------------------------------------------------------------------------- */
|
|
43
|
+
/* reading */
|
|
44
|
+
/* -------------------------------------------------------------------------- */
|
|
45
|
+
export function parseTakeaway(text, path, skill) {
|
|
46
|
+
let parsed;
|
|
47
|
+
try {
|
|
48
|
+
parsed = matter(text);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const d = parsed.data;
|
|
54
|
+
const body = parsed.content.trim();
|
|
55
|
+
if (!body)
|
|
56
|
+
return null;
|
|
57
|
+
return {
|
|
58
|
+
path,
|
|
59
|
+
skill: typeof d.skill === "string" ? d.skill : skill,
|
|
60
|
+
taughtBy: typeof d.taught_by === "string" ? d.taught_by : "",
|
|
61
|
+
date: asDate(d.date),
|
|
62
|
+
from: typeof d.from === "string" ? d.from : "correction",
|
|
63
|
+
confirmedBy: Array.isArray(d.confirmed_by) ? d.confirmed_by.map(String) : [],
|
|
64
|
+
foldedIn: typeof d.folded_in === "number" ? d.folded_in : undefined,
|
|
65
|
+
section: typeof d.section === "string" ? d.section : undefined,
|
|
66
|
+
text: body,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function renderTakeaway(t) {
|
|
70
|
+
const fm = ["---", `skill: ${t.skill}`, `taught_by: ${yamlScalar(t.taughtBy)}`, `date: ${t.date}`, `from: ${t.from}`];
|
|
71
|
+
fm.push(`confirmed_by: [${t.confirmedBy.map(yamlScalar).join(", ")}]`);
|
|
72
|
+
if (t.section)
|
|
73
|
+
fm.push(`section: ${yamlScalar(t.section)}`);
|
|
74
|
+
if (t.foldedIn !== undefined)
|
|
75
|
+
fm.push(`folded_in: ${t.foldedIn}`);
|
|
76
|
+
fm.push("---");
|
|
77
|
+
return `${fm.join("\n")}\n${t.text.trim()}\n`;
|
|
78
|
+
}
|
|
79
|
+
function readTakeaways(homeSkills, name) {
|
|
80
|
+
const tdir = join(homeSkills, name, "takeaways");
|
|
81
|
+
let files = [];
|
|
82
|
+
try {
|
|
83
|
+
files = readdirSync(tdir).filter((f) => f.endsWith(".md")).sort();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
const out = [];
|
|
89
|
+
for (const f of files) {
|
|
90
|
+
try {
|
|
91
|
+
const t = parseTakeaway(readFileSync(join(tdir, f), "utf8"), join(tdir, f), name);
|
|
92
|
+
if (t)
|
|
93
|
+
out.push(t);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* unreadable */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return out;
|
|
100
|
+
}
|
|
101
|
+
/** The skill's SKILL.md: the repo's when it has one, else this machine's. */
|
|
102
|
+
function skillFile(dirs, name) {
|
|
103
|
+
const repo = join(dirs.repo, name, "SKILL.md");
|
|
104
|
+
if (existsSync(repo))
|
|
105
|
+
return { file: repo, where: "repo" };
|
|
106
|
+
const home = join(dirs.home, name, "SKILL.md");
|
|
107
|
+
if (existsSync(home))
|
|
108
|
+
return { file: home, where: "home" };
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
function readSkill(dirs, name) {
|
|
112
|
+
if (OWN_SKILLS.has(name))
|
|
113
|
+
return null;
|
|
114
|
+
const at = skillFile(dirs, name);
|
|
115
|
+
if (!at)
|
|
116
|
+
return null;
|
|
117
|
+
let parsed;
|
|
118
|
+
try {
|
|
119
|
+
parsed = matter(readFileSync(at.file, "utf8"));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const d = parsed.data;
|
|
125
|
+
return {
|
|
126
|
+
name,
|
|
127
|
+
description: typeof d.description === "string" ? d.description.trim() : "",
|
|
128
|
+
version: typeof d.version === "number" ? d.version : 1,
|
|
129
|
+
body: parsed.content.trim(),
|
|
130
|
+
where: at.where,
|
|
131
|
+
file: at.file,
|
|
132
|
+
takeaways: readTakeaways(dirs.home, name),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function subdirs(dir) {
|
|
136
|
+
try {
|
|
137
|
+
return readdirSync(dir, { withFileTypes: true })
|
|
138
|
+
.filter((e) => e.isDirectory())
|
|
139
|
+
.map((e) => e.name);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Every skill for the repo `dir` is in: the team's in the repo, then this machine's, by name. */
|
|
146
|
+
export function listSkills(dir) {
|
|
147
|
+
const dirs = skillDirs(dir);
|
|
148
|
+
const names = [...new Set([...subdirs(dirs.repo), ...subdirs(dirs.home)])].sort();
|
|
149
|
+
return names.map((n) => readSkill(dirs, n)).filter((s) => s !== null);
|
|
150
|
+
}
|
|
151
|
+
export function getSkill(dir, name) {
|
|
152
|
+
return readSkill(skillDirs(dir), skillName(name));
|
|
153
|
+
}
|
|
154
|
+
/** Takeaways not yet in SKILL.md. */
|
|
155
|
+
export function waiting(s) {
|
|
156
|
+
return s.takeaways.filter((t) => t.foldedIn === undefined);
|
|
157
|
+
}
|
|
158
|
+
/** Confirmed means someone other than the teacher said it's right. */
|
|
159
|
+
export function isConfirmed(t) {
|
|
160
|
+
return t.confirmedBy.some((c) => c.toLowerCase() !== t.taughtBy.toLowerCase());
|
|
161
|
+
}
|
|
162
|
+
/* -------------------------------------------------------------------------- */
|
|
163
|
+
/* writing */
|
|
164
|
+
/* -------------------------------------------------------------------------- */
|
|
165
|
+
function renderNewSkill(name, description) {
|
|
166
|
+
const fm = ["---", `name: ${name}`, `description: ${yamlScalar(description)}`, "version: 1", "---"];
|
|
167
|
+
return `${fm.join("\n")}\n\n# ${name}\n\n${description}.\n`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* SKILL.md at a new version with a new body. The frontmatter is edited as
|
|
171
|
+
* text, only its `version:` line, so a team's own skill keeps every other key
|
|
172
|
+
* (`allowed-tools`, `license`, …) exactly as they wrote it.
|
|
173
|
+
*/
|
|
174
|
+
function rewriteSkill(file, version, body) {
|
|
175
|
+
const lines = readFileSync(file, "utf8").split(/\r?\n/);
|
|
176
|
+
const close = lines[0] === "---" ? lines.indexOf("---", 1) : -1;
|
|
177
|
+
const fm = close === -1 ? [] : lines.slice(1, close);
|
|
178
|
+
const at = fm.findIndex((l) => l.startsWith("version:"));
|
|
179
|
+
if (at === -1)
|
|
180
|
+
fm.push(`version: ${version}`);
|
|
181
|
+
else
|
|
182
|
+
fm[at] = `version: ${version}`;
|
|
183
|
+
writeFileSync(file, `---\n${fm.join("\n")}\n---\n\n${body.trim()}\n`);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Save one takeaway, on this machine. A skill the repo has gets it as is; a
|
|
187
|
+
* name nobody has used starts a skill in ~/.trail, whose SKILL.md is empty
|
|
188
|
+
* but for its description: the takeaways are its content until the first fold.
|
|
189
|
+
*/
|
|
190
|
+
export function learn(dir, input) {
|
|
191
|
+
const name = skillName(input.skill);
|
|
192
|
+
if (!name)
|
|
193
|
+
throw new Error("a skill needs a name, like pdf-coords");
|
|
194
|
+
if (OWN_SKILLS.has(name))
|
|
195
|
+
throw new Error(`${name} is the code map's own skill, rewritten by every init — pick a name for what you're teaching, like pdf-coords`);
|
|
196
|
+
ensureRepoHome(dir);
|
|
197
|
+
const dirs = skillDirs(dir);
|
|
198
|
+
let created = false;
|
|
199
|
+
if (!skillFile(dirs, name)) {
|
|
200
|
+
created = true;
|
|
201
|
+
mkdirSync(join(dirs.home, name), { recursive: true });
|
|
202
|
+
const description = input.description?.trim() || `What has been learned about ${name.replace(/-/g, " ")} in this repo`;
|
|
203
|
+
writeFileSync(join(dirs.home, name, "SKILL.md"), renderNewSkill(name, description));
|
|
204
|
+
}
|
|
205
|
+
const tdir = join(dirs.home, name, "takeaways");
|
|
206
|
+
mkdirSync(tdir, { recursive: true });
|
|
207
|
+
const base = `${input.date}-${slug(input.author, 1) || "someone"}`;
|
|
208
|
+
let n = 1;
|
|
209
|
+
while (existsSync(join(tdir, `${base}-${n}.md`)))
|
|
210
|
+
n++;
|
|
211
|
+
const file = join(tdir, `${base}-${n}.md`);
|
|
212
|
+
const t = {
|
|
213
|
+
skill: name,
|
|
214
|
+
taughtBy: input.author,
|
|
215
|
+
date: input.date,
|
|
216
|
+
from: "correction",
|
|
217
|
+
confirmedBy: [],
|
|
218
|
+
section: input.section?.trim() || undefined,
|
|
219
|
+
text: input.text,
|
|
220
|
+
};
|
|
221
|
+
writeFileSync(file, renderTakeaway(t));
|
|
222
|
+
return { skill: readSkill(dirs, name), takeaway: { ...t, path: file }, created };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Record that `who` checked these takeaways and they're right. The teacher
|
|
226
|
+
* confirming their own takeaway doesn't count: confirmation is a second pair
|
|
227
|
+
* of eyes. Returns the takeaways that became confirmed.
|
|
228
|
+
*/
|
|
229
|
+
export function confirm(dir, name, who, only) {
|
|
230
|
+
const s = getSkill(dir, name);
|
|
231
|
+
if (!s)
|
|
232
|
+
return [];
|
|
233
|
+
const out = [];
|
|
234
|
+
for (const t of waiting(s)) {
|
|
235
|
+
if (only && !t.path.endsWith(only) && !t.path.endsWith(`${only}.md`))
|
|
236
|
+
continue;
|
|
237
|
+
if (t.taughtBy.toLowerCase() === who.toLowerCase())
|
|
238
|
+
continue;
|
|
239
|
+
if (t.confirmedBy.some((c) => c.toLowerCase() === who.toLowerCase()))
|
|
240
|
+
continue;
|
|
241
|
+
t.confirmedBy.push(who);
|
|
242
|
+
writeFileSync(t.path, renderTakeaway(t));
|
|
243
|
+
out.push(t);
|
|
244
|
+
}
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
/** A takeaway as one line in SKILL.md: its text, then who taught it and when. */
|
|
248
|
+
function foldedLine(t) {
|
|
249
|
+
const text = t.text.replace(/\s*\n\s*/g, " ").trim();
|
|
250
|
+
const who = [t.taughtBy, shortDate(t.date)].filter(Boolean).join(", ");
|
|
251
|
+
return `- ${text}${who ? ` (${who})` : ""}`;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Write a skill's waiting takeaways into its SKILL.md, under the heading each
|
|
255
|
+
* names (made when missing) or under "Takeaways", and bump the version.
|
|
256
|
+
* `confirmed` folds only the ones a second person confirmed. Returns null for
|
|
257
|
+
* an unknown skill; `folded` is empty when nothing was ready.
|
|
258
|
+
*/
|
|
259
|
+
export function fold(dir, name, opts = {}) {
|
|
260
|
+
const s = getSkill(dir, name);
|
|
261
|
+
if (!s)
|
|
262
|
+
return null;
|
|
263
|
+
const ready = waiting(s).filter((t) => !opts.confirmed || isConfirmed(t));
|
|
264
|
+
const still = waiting(s).length - ready.length;
|
|
265
|
+
const base = { skill: s.name, where: s.where, file: s.file, from: s.version, stillWaiting: still };
|
|
266
|
+
if (ready.length === 0)
|
|
267
|
+
return { ...base, to: s.version, folded: [], sections: [] };
|
|
268
|
+
const lines = s.body.split(/\r?\n/);
|
|
269
|
+
const sections = [];
|
|
270
|
+
for (const t of ready) {
|
|
271
|
+
const heading = t.section?.trim() || "Takeaways";
|
|
272
|
+
let at = lines.findIndex((l) => l.trim().toLowerCase() === `## ${heading.toLowerCase()}`);
|
|
273
|
+
if (at === -1) {
|
|
274
|
+
while (lines.length && !lines[lines.length - 1].trim())
|
|
275
|
+
lines.pop();
|
|
276
|
+
lines.push("", `## ${heading}`);
|
|
277
|
+
at = lines.length - 1;
|
|
278
|
+
}
|
|
279
|
+
// After the section's last non-blank line, before the next heading.
|
|
280
|
+
let end = at + 1;
|
|
281
|
+
while (end < lines.length && !lines[end].startsWith("## "))
|
|
282
|
+
end++;
|
|
283
|
+
let insert = end;
|
|
284
|
+
while (insert > at + 1 && !lines[insert - 1].trim())
|
|
285
|
+
insert--;
|
|
286
|
+
lines.splice(insert, 0, foldedLine(t));
|
|
287
|
+
if (!sections.includes(heading))
|
|
288
|
+
sections.push(heading);
|
|
289
|
+
}
|
|
290
|
+
const to = s.version + 1;
|
|
291
|
+
rewriteSkill(s.file, to, lines.join("\n"));
|
|
292
|
+
for (const t of ready) {
|
|
293
|
+
t.foldedIn = to;
|
|
294
|
+
writeFileSync(t.path, renderTakeaway(t));
|
|
295
|
+
}
|
|
296
|
+
return { ...base, to, folded: ready, sections };
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Move a skill kept on this machine into the repo's `.claude/skills/`, where
|
|
300
|
+
* it can be committed and Claude Code loads it for everyone who pulls. Its
|
|
301
|
+
* takeaways stay on this machine, and fold into the repo's copy from now on.
|
|
302
|
+
*/
|
|
303
|
+
export function publish(dir, name) {
|
|
304
|
+
const s = getSkill(dir, name);
|
|
305
|
+
if (!s)
|
|
306
|
+
return { ok: false, reason: "unknown" };
|
|
307
|
+
if (s.where === "repo")
|
|
308
|
+
return { ok: false, reason: "in-repo" };
|
|
309
|
+
const target = join(skillDirs(dir).repo, s.name, "SKILL.md");
|
|
310
|
+
mkdirSync(join(target, ".."), { recursive: true });
|
|
311
|
+
try {
|
|
312
|
+
renameSync(s.file, target);
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// Across filesystems: copy, then remove.
|
|
316
|
+
writeFileSync(target, readFileSync(s.file));
|
|
317
|
+
rmSync(s.file, { force: true });
|
|
318
|
+
}
|
|
319
|
+
return { ok: true, file: target };
|
|
320
|
+
}
|
|
321
|
+
/** `v3 · 2 takeaways waiting to fold (1 confirmed) · last taught by Sam, Oct 7`. */
|
|
322
|
+
export function skillStatus(s) {
|
|
323
|
+
const open = waiting(s);
|
|
324
|
+
const confirmed = open.filter(isConfirmed).length;
|
|
325
|
+
const parts = [`v${s.version}`];
|
|
326
|
+
if (open.length === 0)
|
|
327
|
+
parts.push("up to date");
|
|
328
|
+
else
|
|
329
|
+
parts.push(`${open.length} takeaway${open.length === 1 ? "" : "s"} waiting to fold${confirmed ? ` (${confirmed} confirmed)` : ""}`);
|
|
330
|
+
const last = [...s.takeaways].sort((a, b) => b.date.localeCompare(a.date) || b.path.localeCompare(a.path))[0];
|
|
331
|
+
if (last && open.length)
|
|
332
|
+
parts.push(`last taught by ${last.taughtBy || "someone"}, ${shortDate(last.date)}`);
|
|
333
|
+
parts.push(s.where === "repo" ? "in the repo" : "on this machine");
|
|
334
|
+
return parts.join(" · ");
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* What an agent reads before working in a skill's area: its SKILL.md, then
|
|
338
|
+
* every takeaway not yet folded in, newest first, which win where the two
|
|
339
|
+
* disagree. `trail skills show` prints it.
|
|
340
|
+
*/
|
|
341
|
+
export function skillForAgent(s) {
|
|
342
|
+
const open = waiting(s).sort((a, b) => b.date.localeCompare(a.date) || b.path.localeCompare(a.path));
|
|
343
|
+
const out = [`# ${s.name} (v${s.version}, ${s.where === "repo" ? "the team's" : "kept on this machine"})`, "", s.body.trim()];
|
|
344
|
+
if (open.length) {
|
|
345
|
+
out.push("", `## Corrections since v${s.version} (newest first; these win where they disagree with the above)`);
|
|
346
|
+
for (const t of open)
|
|
347
|
+
out.push(`- ${t.text.replace(/\s*\n\s*/g, " ").trim()} (${[t.taughtBy, shortDate(t.date)].filter(Boolean).join(", ")})`);
|
|
348
|
+
}
|
|
349
|
+
return `${out.join("\n")}\n`;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* The line a session starts with about skills an agent can't see by itself:
|
|
353
|
+
* ones kept only on this machine (Claude Code loads `.claude/skills/`, not
|
|
354
|
+
* ~/.trail), and the team's ones with corrections waiting. Empty when there
|
|
355
|
+
* are none, so the directive is unchanged everywhere else.
|
|
356
|
+
*/
|
|
357
|
+
export function skillsDirective(dir, show) {
|
|
358
|
+
const parts = [];
|
|
359
|
+
for (const s of listSkills(dir)) {
|
|
360
|
+
const open = waiting(s).length;
|
|
361
|
+
if (s.where === "home")
|
|
362
|
+
parts.push(`${s.name} (on this machine${open ? `, ${open} correction${open === 1 ? "" : "s"}` : ""})`);
|
|
363
|
+
else if (open)
|
|
364
|
+
parts.push(`${s.name} (${open} correction${open === 1 ? "" : "s"} newer than its SKILL.md)`);
|
|
365
|
+
}
|
|
366
|
+
if (parts.length === 0)
|
|
367
|
+
return "";
|
|
368
|
+
return `Skills with more than Claude Code loads by itself: ${parts.join(", ")}. Before working in one's area, run \`${show} <name>\`: it prints the skill with every correction, newest first.\n`;
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/skills/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
*/
|
|
27
27
|
export declare const EVENTS: Record<string, ReadonlySet<string>>;
|
|
28
28
|
/** Stamped on every event by `track()`; not listed per event above. */
|
|
29
|
-
export declare const COMMON_KEYS: readonly ["app_version", "os", "arch", "node_major", "ci", "agent_host", "repo_id"];
|
|
29
|
+
export declare const COMMON_KEYS: readonly ["app_version", "os", "arch", "node_major", "ci", "agent_host", "cli_name", "repo_id"];
|
|
30
30
|
/** Which surface issued a query. `hook` is Claude Code's prompt hook, which
|
|
31
31
|
* queries on the user's behalf without them typing a command. */
|
|
32
32
|
export type Surface = 'cli' | 'mcp' | 'hook';
|
|
@@ -42,7 +42,7 @@ export declare const TRACKED_COMMANDS: readonly ["ask", "grep", "callers", "skel
|
|
|
42
42
|
export type TrackedCommand = (typeof TRACKED_COMMANDS)[number];
|
|
43
43
|
export declare function isTrackedCommand(name: string): name is TrackedCommand;
|
|
44
44
|
/**
|
|
45
|
-
* How a
|
|
45
|
+
* How a sign-in handoff ended.
|
|
46
46
|
*
|
|
47
47
|
* Five categories and nothing else, because the alternative — the error string
|
|
48
48
|
* the CLI already prints — carries a repo slug and a URL. `timed_out` and
|
|
@@ -54,18 +54,6 @@ export declare function isTrackedCommand(name: string): name is TrackedCommand;
|
|
|
54
54
|
*/
|
|
55
55
|
export declare const BRAIN_SIGNUP_OUTCOMES: readonly ["linked", "timed_out", "no_tty", "bad_callback", "stopped"];
|
|
56
56
|
export type BrainSignupOutcome = (typeof BRAIN_SIGNUP_OUTCOMES)[number];
|
|
57
|
-
/**
|
|
58
|
-
* How a `graft trail pull` ended. `written`: at least one file changed.
|
|
59
|
-
* `already_present`: everything accepted was already in the files.
|
|
60
|
-
* `nothing_accepted`: Trail had nothing accepted for this repo's agents.
|
|
61
|
-
* `skipped`: accepted changes existed but none could be applied (the local
|
|
62
|
-
* file moved on). `error`: Trail could not be read or a file not written.
|
|
63
|
-
* `dry_run`: `--dry-run`, nothing written.
|
|
64
|
-
*/
|
|
65
|
-
export declare const TRAIL_PULL_OUTCOMES: readonly ["written", "already_present", "nothing_accepted", "skipped", "error", "dry_run"];
|
|
66
|
-
export type TrailPullOutcome = (typeof TRAIL_PULL_OUTCOMES)[number];
|
|
67
|
-
/** The context-file kinds `trail_pulled.kinds` may name; anything else is dropped. */
|
|
68
|
-
export declare const CONTEXT_FILE_KINDS: readonly ["claude_md", "folder_claude_md", "agents_md", "cursor_rule", "skill"];
|
|
69
57
|
/** Where a failing build died. Coarse on purpose: enough to route a bug, not
|
|
70
58
|
* enough to describe anyone's repo. */
|
|
71
59
|
export declare const BUILD_STAGES: readonly ["walk", "extract", "graph", "summarize", "synthesize", "write"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/telemetry/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/telemetry/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAqEtD,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,WAAW,iGASd,CAAC;AAMX;kEACkE;AAClE,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7C;iFACiF;AACjF,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,iFAEnB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,cAAc,CAErE;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,uEAAwE,CAAC;AAC3G,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE;wCACwC;AACxC,eAAO,MAAM,YAAY,2EAA4E,CAAC;AACtG,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,WAAW,6IAGd,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAoBjD;AAMD;4DAC4D;AAC5D,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED;yCACyC;AACzC,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED;4CAC4C;AAC5C,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAK3D"}
|
|
@@ -48,21 +48,46 @@ export const EVENTS = {
|
|
|
48
48
|
/** A build threw. `stage`/`code` are enums; the message never travels. */
|
|
49
49
|
build_failed: new Set(['stage', 'code']),
|
|
50
50
|
/** One query, from any surface. The DAU backbone and the dead-command detector. */
|
|
51
|
-
query: new Set(['command', 'surface', 'hit']),
|
|
52
|
-
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
|
|
56
|
-
brain_signup_opened: new Set(['mode']),
|
|
51
|
+
query: new Set(['command', 'surface', 'hit', 'notes']),
|
|
52
|
+
/** A trail command handing the agent a sign-in link to pass on. Queued the
|
|
53
|
+
* moment the link is printed, so a sign-in somebody walked away from is still
|
|
54
|
+
* counted — the settle below never fires for those. */
|
|
55
|
+
brain_signup_opened: new Set(['mode', 'command', 'wording']),
|
|
57
56
|
/** That handoff reaching an end. `outcome` is a closed set, so the reason a
|
|
58
57
|
* signup failed travels as a category and never as the error's own words. */
|
|
59
58
|
brain_signup_settled: new Set(['outcome', 'mode', 'duration_bucket']),
|
|
60
|
-
/** `
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
|
|
65
|
-
|
|
59
|
+
/** `trail note` saved a session note (into `~/.trail/`). Whether it carries
|
|
60
|
+
* a cost, and how many files it is about, as a bucket. The title, the text
|
|
61
|
+
* and the paths never travel. The supply side of the notes loop; the
|
|
62
|
+
* `notes` property on `query` is the demand side. */
|
|
63
|
+
note_saved: new Set(['has_cost', 'touches_bucket', 'scope']),
|
|
64
|
+
/** `ask` showed learnings from earlier sessions: whether any was a
|
|
65
|
+
* teammate's, and what they took to work out less reading them, as a
|
|
66
|
+
* bucket. The reuse half of the learnings loop; `note_saved` is supply. */
|
|
67
|
+
learning_reused: new Set(['teammate', 'saved_tokens_bucket']),
|
|
68
|
+
/** Once a day per repo, from the session-start hook, for a repo trail runs
|
|
69
|
+
* in: whether `.trail/` is committed there, how many learnings it holds,
|
|
70
|
+
* as a bucket, and whether this machine shares it with a workspace. With
|
|
71
|
+
* `repo_id` and the install id this counts devs and repos touched, and
|
|
72
|
+
* repos with Trail committed. Paths and names never travel. */
|
|
73
|
+
repo_seen: new Set(['trail_committed', 'learnings_bucket', 'workspace']),
|
|
74
|
+
/** At session start, when the learnings committed on HEAD went up since the
|
|
75
|
+
* last session in that clone: how many came in and how many there are, as
|
|
76
|
+
* buckets, and whether it's the clone's first look. Committed learnings
|
|
77
|
+
* are trail's activation. Paths and titles never travel. */
|
|
78
|
+
learnings_committed: new Set(['added_bucket', 'total_bucket', 'first_look']),
|
|
79
|
+
/** `trail init` read the repo's past Claude sessions for learnings: how it
|
|
80
|
+
* went, how many sessions there were, findings Claude offered and trail
|
|
81
|
+
* saved, as buckets, how long it took, and the model. The messages and the
|
|
82
|
+
* findings never travel. */
|
|
83
|
+
cold_start: new Set(['outcome', 'sessions_bucket', 'offered_bucket', 'picked_bucket', 'duration_bucket', 'model']),
|
|
84
|
+
/** `trail learn` saved a correction as a takeaway on a skill (into
|
|
85
|
+
* `~/.trail/`). `new_skill` says whether it started a skill. The text never
|
|
86
|
+
* travels. */
|
|
87
|
+
takeaway_saved: new Set(['new_skill']),
|
|
88
|
+
/** `trail skills fold` wrote waiting takeaways into a skill's SKILL.md;
|
|
89
|
+
* how many, as a bucket. Whether corrections become the skill. */
|
|
90
|
+
skills_folded: new Set(['takeaways_bucket']),
|
|
66
91
|
/** One closed agent session, summarised. `graft_reads` vs `source_reads` is
|
|
67
92
|
* the single number that says whether an agent prefers graft to grep; the two
|
|
68
93
|
* `*_turns` buckets are the follow-up question — of the turns that used graft,
|
|
@@ -80,6 +105,7 @@ export const COMMON_KEYS = [
|
|
|
80
105
|
'node_major',
|
|
81
106
|
'ci',
|
|
82
107
|
'agent_host',
|
|
108
|
+
'cli_name',
|
|
83
109
|
'repo_id',
|
|
84
110
|
];
|
|
85
111
|
/**
|
|
@@ -94,7 +120,7 @@ export function isTrackedCommand(name) {
|
|
|
94
120
|
return TRACKED_COMMANDS.includes(name);
|
|
95
121
|
}
|
|
96
122
|
/**
|
|
97
|
-
* How a
|
|
123
|
+
* How a sign-in handoff ended.
|
|
98
124
|
*
|
|
99
125
|
* Five categories and nothing else, because the alternative — the error string
|
|
100
126
|
* the CLI already prints — carries a repo slug and a URL. `timed_out` and
|
|
@@ -105,17 +131,6 @@ export function isTrackedCommand(name) {
|
|
|
105
131
|
* mind, not a browser that never came back.
|
|
106
132
|
*/
|
|
107
133
|
export const BRAIN_SIGNUP_OUTCOMES = ['linked', 'timed_out', 'no_tty', 'bad_callback', 'stopped'];
|
|
108
|
-
/**
|
|
109
|
-
* How a `graft trail pull` ended. `written`: at least one file changed.
|
|
110
|
-
* `already_present`: everything accepted was already in the files.
|
|
111
|
-
* `nothing_accepted`: Trail had nothing accepted for this repo's agents.
|
|
112
|
-
* `skipped`: accepted changes existed but none could be applied (the local
|
|
113
|
-
* file moved on). `error`: Trail could not be read or a file not written.
|
|
114
|
-
* `dry_run`: `--dry-run`, nothing written.
|
|
115
|
-
*/
|
|
116
|
-
export const TRAIL_PULL_OUTCOMES = ['written', 'already_present', 'nothing_accepted', 'skipped', 'error', 'dry_run'];
|
|
117
|
-
/** The context-file kinds `trail_pulled.kinds` may name; anything else is dropped. */
|
|
118
|
-
export const CONTEXT_FILE_KINDS = ['claude_md', 'folder_claude_md', 'agents_md', 'cursor_rule', 'skill'];
|
|
119
134
|
/** Where a failing build died. Coarse on purpose: enough to route a bug, not
|
|
120
135
|
* enough to describe anyone's repo. */
|
|
121
136
|
export const BUILD_STAGES = ['walk', 'extract', 'graph', 'summarize', 'synthesize', 'write'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/telemetry/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gFAAgF;AAChF,gFAAgF;AAChF,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAwC;IACzD;;;;;;kEAM8D;IAC9D,OAAO,EAAE,IAAI,GAAG,CAAS,CAAC,QAAQ,CAAC,CAAC;IACpC;uEACmE;IACnE,SAAS,EAAE,IAAI,GAAG,EAAU;IAC5B;oDACgD;IAChD,cAAc,EAAE,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtD;2DACuD;IACvD,eAAe,EAAE,IAAI,GAAG,CAAS,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;IACrG,0EAA0E;IAC1E,YAAY,EAAE,IAAI,GAAG,CAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,mFAAmF;IACnF,KAAK,EAAE,IAAI,GAAG,CAAS,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/telemetry/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/telemetry/gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/telemetry/gate.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,cAAc,GAAG,IAAI,GAAG,UAAU,CAAC;AAEtE,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAGxE;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,wIAGd,CAAC;AAEX;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAGlE;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,GAAG,IAAI,CAM/F;AAED,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAExF;AAED;2EAC2E;AAC3E,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAOpD"}
|
package/dist/telemetry/gate.js
CHANGED
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import { posthogKey } from './key.js';
|
|
22
22
|
import { readState } from './identity.js';
|
|
23
|
+
import { cmd } from '../brand.js';
|
|
23
24
|
/** The `DO_NOT_TRACK` convention: set and not `0`/empty means "off". */
|
|
24
25
|
export function doNotTrack(env = process.env) {
|
|
25
26
|
const v = env.DO_NOT_TRACK;
|
|
@@ -74,7 +75,7 @@ export function explainOff(reason) {
|
|
|
74
75
|
case 'no-key': return 'off — this build has no telemetry key (a fork, or a local `npm run build`); nothing can be sent';
|
|
75
76
|
case 'do-not-track': return 'off — DO_NOT_TRACK is set in this environment';
|
|
76
77
|
case 'ci': return 'off — this looks like CI';
|
|
77
|
-
case 'disabled': return
|
|
78
|
+
case 'disabled': return `off — you disabled it (\`${cmd('graft telemetry enable')}\` to turn it back on)`;
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
//# sourceMappingURL=gate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/telemetry/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/telemetry/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIlC,wEAAwE;AACxE,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC;IAC3B,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU;IAC5D,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc;CACrD,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,UAAU,IAAI,CAAC,MAAyB,OAAO,CAAC,GAAG;IACvD,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC/F,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC3E,IAAI,CAAC,UAAU,EAAE;QAAE,OAAO,QAAQ,CAAC;IACnC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,cAAc,CAAC;IAC3C,IAAI,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,UAAU,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC7E,OAAO,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AACvC,CAAC;AAED;2EAC2E;AAC3E,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAQ,OAAO,iGAAiG,CAAC;QAC/H,KAAK,cAAc,CAAC,CAAE,OAAO,+CAA+C,CAAC;QAC7E,KAAK,IAAI,CAAC,CAAY,OAAO,0BAA0B,CAAC;QACxD,KAAK,UAAU,CAAC,CAAM,OAAO,4BAA4B,GAAG,CAAC,wBAAwB,CAAC,wBAAwB,CAAC;IACjH,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const TELEMETRY_DOC_URL = "https://github.com/
|
|
1
|
+
export declare const TELEMETRY_DOC_URL = "https://github.com/trailhq/Trail-Code/blob/main/TELEMETRY.md";
|
|
2
2
|
export declare const NOTICE: string;
|
|
3
3
|
/**
|
|
4
4
|
* The notice text the first time it is due, then null forever after. Marks it as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notice.d.ts","sourceRoot":"","sources":["../../src/telemetry/notice.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notice.d.ts","sourceRoot":"","sources":["../../src/telemetry/notice.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,iBAAiB,iEAAiE,CAAC;AAEhG,eAAO,MAAM,MAAM,QAGP,CAAC;AAEb;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,CASpF;AAED;4EAC4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAoB3E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAkBjD"}
|