ghostrail 0.0.0 → 0.2.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 +49 -3
- package/dist/agent/claude-code.d.ts +10 -0
- package/dist/agent/claude-code.d.ts.map +1 -1
- package/dist/agent/claude-code.js +20 -0
- package/dist/agent/claude-code.js.map +1 -1
- package/dist/agent/result.d.ts.map +1 -1
- package/dist/agent/result.js +13 -2
- package/dist/agent/result.js.map +1 -1
- package/dist/backend/container.d.ts +18 -0
- package/dist/backend/container.d.ts.map +1 -1
- package/dist/backend/container.js +33 -10
- package/dist/backend/container.js.map +1 -1
- package/dist/backend/git-credentials.d.ts +18 -0
- package/dist/backend/git-credentials.d.ts.map +1 -0
- package/dist/backend/git-credentials.js +30 -0
- package/dist/backend/git-credentials.js.map +1 -0
- package/dist/backend/local-worktree.d.ts.map +1 -1
- package/dist/backend/local-worktree.js +21 -0
- package/dist/backend/local-worktree.js.map +1 -1
- package/dist/backend/types.d.ts +12 -1
- package/dist/backend/types.d.ts.map +1 -1
- package/dist/claude-profile/classify.d.ts +41 -0
- package/dist/claude-profile/classify.d.ts.map +1 -0
- package/dist/claude-profile/classify.js +103 -0
- package/dist/claude-profile/classify.js.map +1 -0
- package/dist/claude-profile/index.d.ts +3 -0
- package/dist/claude-profile/index.d.ts.map +1 -0
- package/dist/claude-profile/index.js +3 -0
- package/dist/claude-profile/index.js.map +1 -0
- package/dist/claude-profile/setup.d.ts +33 -0
- package/dist/claude-profile/setup.d.ts.map +1 -0
- package/dist/claude-profile/setup.js +81 -0
- package/dist/claude-profile/setup.js.map +1 -0
- package/dist/cli/commands.d.ts +67 -2
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +420 -17
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +13 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +20 -2
- package/dist/commands/help.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +61 -9
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +51 -3
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +4 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/factory/build.d.ts +24 -0
- package/dist/factory/build.d.ts.map +1 -1
- package/dist/factory/build.js +80 -11
- package/dist/factory/build.js.map +1 -1
- package/dist/loop/concurrency.d.ts +13 -0
- package/dist/loop/concurrency.d.ts.map +1 -0
- package/dist/loop/concurrency.js +27 -0
- package/dist/loop/concurrency.js.map +1 -0
- package/dist/loop/engine.d.ts.map +1 -1
- package/dist/loop/engine.js +19 -14
- package/dist/loop/engine.js.map +1 -1
- package/dist/loop/index.d.ts +2 -0
- package/dist/loop/index.d.ts.map +1 -1
- package/dist/loop/index.js +2 -0
- package/dist/loop/index.js.map +1 -1
- package/dist/loop/ports.d.ts +37 -1
- package/dist/loop/ports.d.ts.map +1 -1
- package/dist/loop/watch.d.ts +25 -0
- package/dist/loop/watch.d.ts.map +1 -0
- package/dist/loop/watch.js +45 -0
- package/dist/loop/watch.js.map +1 -0
- package/dist/publish/gh.d.ts +20 -1
- package/dist/publish/gh.d.ts.map +1 -1
- package/dist/publish/gh.js +37 -3
- package/dist/publish/gh.js.map +1 -1
- package/dist/publish/githost.d.ts +12 -0
- package/dist/publish/githost.d.ts.map +1 -1
- package/dist/publish/githost.js +14 -0
- package/dist/publish/githost.js.map +1 -1
- package/dist/publish/github-publisher.d.ts +1 -1
- package/dist/publish/github-publisher.d.ts.map +1 -1
- package/dist/publish/github-publisher.js +6 -5
- package/dist/publish/github-publisher.js.map +1 -1
- package/dist/respond/respond.d.ts +10 -1
- package/dist/respond/respond.d.ts.map +1 -1
- package/dist/respond/respond.js +37 -3
- package/dist/respond/respond.js.map +1 -1
- package/dist/secrets/env-file.d.ts +23 -0
- package/dist/secrets/env-file.d.ts.map +1 -0
- package/dist/secrets/env-file.js +70 -0
- package/dist/secrets/env-file.js.map +1 -0
- package/dist/secrets/index.d.ts +4 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +4 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/load.d.ts +24 -0
- package/dist/secrets/load.d.ts.map +1 -0
- package/dist/secrets/load.js +43 -0
- package/dist/secrets/load.js.map +1 -0
- package/dist/skill/install.d.ts +56 -0
- package/dist/skill/install.d.ts.map +1 -0
- package/dist/skill/install.js +93 -0
- package/dist/skill/install.js.map +1 -0
- package/dist/source/linear.d.ts +51 -8
- package/dist/source/linear.d.ts.map +1 -1
- package/dist/source/linear.js +213 -23
- package/dist/source/linear.js.map +1 -1
- package/dist/triage/apply.d.ts +28 -0
- package/dist/triage/apply.d.ts.map +1 -0
- package/dist/triage/apply.js +68 -0
- package/dist/triage/apply.js.map +1 -0
- package/dist/triage/engine.d.ts +31 -0
- package/dist/triage/engine.d.ts.map +1 -0
- package/dist/triage/engine.js +122 -0
- package/dist/triage/engine.js.map +1 -0
- package/dist/triage/index.d.ts +4 -0
- package/dist/triage/index.d.ts.map +1 -0
- package/dist/triage/index.js +4 -0
- package/dist/triage/index.js.map +1 -0
- package/dist/triage/plan.d.ts +37 -0
- package/dist/triage/plan.d.ts.map +1 -0
- package/dist/triage/plan.js +75 -0
- package/dist/triage/plan.js.map +1 -0
- package/dist/vendor/skilltend/apply.d.ts +25 -0
- package/dist/vendor/skilltend/apply.d.ts.map +1 -0
- package/dist/vendor/skilltend/apply.js +85 -0
- package/dist/vendor/skilltend/apply.js.map +1 -0
- package/dist/vendor/skilltend/detect.d.ts +35 -0
- package/dist/vendor/skilltend/detect.d.ts.map +1 -0
- package/dist/vendor/skilltend/detect.js +187 -0
- package/dist/vendor/skilltend/detect.js.map +1 -0
- package/dist/vendor/skilltend/frontmatter.d.ts +5 -0
- package/dist/vendor/skilltend/frontmatter.d.ts.map +1 -0
- package/dist/vendor/skilltend/frontmatter.js +59 -0
- package/dist/vendor/skilltend/frontmatter.js.map +1 -0
- package/dist/vendor/skilltend/fsFacade.d.ts +24 -0
- package/dist/vendor/skilltend/fsFacade.d.ts.map +1 -0
- package/dist/vendor/skilltend/fsFacade.js +68 -0
- package/dist/vendor/skilltend/fsFacade.js.map +1 -0
- package/dist/vendor/skilltend/paths.d.ts +28 -0
- package/dist/vendor/skilltend/paths.d.ts.map +1 -0
- package/dist/vendor/skilltend/paths.js +24 -0
- package/dist/vendor/skilltend/paths.js.map +1 -0
- package/dist/vendor/skilltend/plan.d.ts +46 -0
- package/dist/vendor/skilltend/plan.d.ts.map +1 -0
- package/dist/vendor/skilltend/plan.js +79 -0
- package/dist/vendor/skilltend/plan.js.map +1 -0
- package/dist/vendor/skilltend/registry.d.ts +56 -0
- package/dist/vendor/skilltend/registry.d.ts.map +1 -0
- package/dist/vendor/skilltend/registry.js +129 -0
- package/dist/vendor/skilltend/registry.js.map +1 -0
- package/docker/factory.Dockerfile +39 -0
- package/package.json +4 -3
- package/skill/ghostrail/SKILL.md +145 -0
- package/templates/{fix-bugs-local → code-local}/README.md +3 -3
- package/templates/code-local/ghostrail.toml +44 -0
- package/templates/code-local/prompts/resolve-issue.md +31 -0
- package/templates/code-local/prompts/respond.md +27 -0
- package/templates/code-local/prompts/triage.md +51 -0
- package/templates/content-loop/ghostrail.toml +5 -2
- package/templates/content-loop/prompts/respond.md +25 -0
- package/templates/fix-bugs-local/ghostrail.toml +0 -37
- package/templates/fix-bugs-local/prompts/fix-bug.md +0 -27
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure classification + composition for the ghostrail Claude profile: split a
|
|
3
|
+
* CLAUDE.md into sections, judge which belong in a headless factory run, flag
|
|
4
|
+
* interactive-only settings, and compose the factory CLAUDE.md + settings.
|
|
5
|
+
*/
|
|
6
|
+
/** Substrings (case-insensitive) that mark a CLAUDE.md section as interactive-only. */
|
|
7
|
+
const INTERACTIVE_SIGNALS = [
|
|
8
|
+
"statusline",
|
|
9
|
+
"status line",
|
|
10
|
+
"keybinding",
|
|
11
|
+
"keyboard shortcut",
|
|
12
|
+
"slash command",
|
|
13
|
+
"/config",
|
|
14
|
+
"/fast",
|
|
15
|
+
" theme",
|
|
16
|
+
"type `!`",
|
|
17
|
+
"type !",
|
|
18
|
+
"interactive session",
|
|
19
|
+
"vs code",
|
|
20
|
+
"vscode",
|
|
21
|
+
"jetbrains",
|
|
22
|
+
"ide extension",
|
|
23
|
+
];
|
|
24
|
+
/** settings.json keys that are interactive-only and are not carried into the profile. */
|
|
25
|
+
const INTERACTIVE_SETTINGS_KEYS = new Set([
|
|
26
|
+
"statusLine",
|
|
27
|
+
"theme",
|
|
28
|
+
"keybindings",
|
|
29
|
+
"spinnerTipsEnabled",
|
|
30
|
+
"autoUpdates",
|
|
31
|
+
"editorMode",
|
|
32
|
+
"verbose",
|
|
33
|
+
"preferredNotifChannel",
|
|
34
|
+
"messageIdleNotifThresholdMs",
|
|
35
|
+
]);
|
|
36
|
+
/**
|
|
37
|
+
* Split a CLAUDE.md into sections at top-level (`#`/`##`) headings. Text before
|
|
38
|
+
* the first heading becomes a `(preamble)` section. Each section's `body`
|
|
39
|
+
* includes its heading line.
|
|
40
|
+
*/
|
|
41
|
+
export function splitSections(content) {
|
|
42
|
+
const sections = [];
|
|
43
|
+
let heading;
|
|
44
|
+
let lines = [];
|
|
45
|
+
const flush = () => {
|
|
46
|
+
if (heading !== undefined) {
|
|
47
|
+
sections.push({ heading, body: lines.join("\n") });
|
|
48
|
+
}
|
|
49
|
+
else if (lines.join("\n").trim().length > 0) {
|
|
50
|
+
sections.push({ heading: "(preamble)", body: lines.join("\n") });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
for (const line of content.split("\n")) {
|
|
54
|
+
if (/^#{1,2}\s/.test(line)) {
|
|
55
|
+
flush();
|
|
56
|
+
heading = line.replace(/^#{1,2}\s+/, "").trim();
|
|
57
|
+
lines = [line];
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
lines.push(line);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
flush();
|
|
64
|
+
return sections;
|
|
65
|
+
}
|
|
66
|
+
/** Judge each section keep/drop; a section is dropped if it names an interactive-only concern. */
|
|
67
|
+
export function classifyClaudeMdSections(sections) {
|
|
68
|
+
return sections.map((section) => {
|
|
69
|
+
const hay = `${section.heading}\n${section.body}`.toLowerCase();
|
|
70
|
+
const signal = INTERACTIVE_SIGNALS.find((s) => hay.includes(s));
|
|
71
|
+
return signal === undefined
|
|
72
|
+
? { ...section, verdict: "keep" }
|
|
73
|
+
: { ...section, verdict: "drop", reason: `mentions "${signal.trim()}" (interactive-only)` };
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** Report which top-level settings keys are carried into the factory profile. */
|
|
77
|
+
export function classifySettingsKeys(settings) {
|
|
78
|
+
return Object.keys(settings).map((key) => INTERACTIVE_SETTINGS_KEYS.has(key)
|
|
79
|
+
? { key, carried: false, reason: "interactive-only" }
|
|
80
|
+
: { key, carried: true });
|
|
81
|
+
}
|
|
82
|
+
const FACTORY_HEADER = `# Ghostrail factory profile
|
|
83
|
+
|
|
84
|
+
This CLAUDE.md is composed by ghostrail for headless factory runs. It is not your
|
|
85
|
+
interactive CLAUDE.md: it carries a curated subset of your global rules plus the
|
|
86
|
+
target repo's own project CLAUDE.md at run time. Regenerate it with
|
|
87
|
+
\`ghostrail claude-setup --write\`.`;
|
|
88
|
+
/**
|
|
89
|
+
* Compose the factory CLAUDE.md: a fixed header followed by the bodies of the
|
|
90
|
+
* kept sections, collapsing blank runs.
|
|
91
|
+
*/
|
|
92
|
+
export function composeFactoryClaudeMd(sections, header = FACTORY_HEADER) {
|
|
93
|
+
const kept = sections.filter((s) => s.verdict === "keep").map((s) => s.body.trim());
|
|
94
|
+
return `${[header, ...kept]
|
|
95
|
+
.join("\n\n")
|
|
96
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
97
|
+
.trim()}\n`;
|
|
98
|
+
}
|
|
99
|
+
/** The minimal, headless-safe factory settings.json (hooks land via the declarative block later). */
|
|
100
|
+
export function composeFactorySettings() {
|
|
101
|
+
return { hooks: {} };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/claude-profile/classify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { type ClaudeMdSection, classifyClaudeMdSections, classifySettingsKeys, composeFactoryClaudeMd, composeFactorySettings, type Section, type SettingsKeyReport, splitSections, type Verdict, } from "./classify.js";
|
|
2
|
+
export { buildProposal, type SetupProposal, type SkillReport, writeProfile } from "./setup.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/claude-profile/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,OAAO,EACZ,KAAK,iBAAiB,EACtB,aAAa,EACb,KAAK,OAAO,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/claude-profile/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EAGtB,aAAa,GAEd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAwC,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type ClaudeMdSection, type SettingsKeyReport } from "./classify.js";
|
|
2
|
+
export interface SkillReport {
|
|
3
|
+
name: string;
|
|
4
|
+
pin: boolean;
|
|
5
|
+
}
|
|
6
|
+
/** A proposal for the factory Claude profile, derived from an existing ~/.claude. */
|
|
7
|
+
export interface SetupProposal {
|
|
8
|
+
sourceHome: string;
|
|
9
|
+
profileDir: string;
|
|
10
|
+
claudeMd: {
|
|
11
|
+
present: boolean;
|
|
12
|
+
sections: ClaudeMdSection[];
|
|
13
|
+
};
|
|
14
|
+
settings: {
|
|
15
|
+
present: boolean;
|
|
16
|
+
keys: SettingsKeyReport[];
|
|
17
|
+
};
|
|
18
|
+
skills: SkillReport[];
|
|
19
|
+
/** Skills requested via --pin that are not installed in the source ~/.claude/skills. */
|
|
20
|
+
missingPins: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Inspect the source `~/.claude` and propose a factory profile: which CLAUDE.md
|
|
24
|
+
* sections to keep vs drop (interactive-only), which settings carry over, and
|
|
25
|
+
* which installed skills to pin. Pure inspection; writes nothing.
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildProposal(sourceHome: string, profileDir: string, pin: readonly string[]): Promise<SetupProposal>;
|
|
28
|
+
/**
|
|
29
|
+
* Write the profile the proposal describes: the composed factory CLAUDE.md (kept
|
|
30
|
+
* sections only), a minimal settings.json, and a copy of each pinned skill.
|
|
31
|
+
*/
|
|
32
|
+
export declare function writeProfile(proposal: SetupProposal): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/claude-profile/setup.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAMvB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAED,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAC5D,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAC;IAC1D,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,wFAAwF;IACxF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAqBD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,OAAO,CAAC,aAAa,CAAC,CAgCxB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBzE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { cp, mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { classifyClaudeMdSections, classifySettingsKeys, composeFactoryClaudeMd, composeFactorySettings, splitSections, } from "./classify.js";
|
|
4
|
+
async function readIfPresent(path) {
|
|
5
|
+
try {
|
|
6
|
+
return await readFile(path, "utf8");
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
async function listDirs(path) {
|
|
13
|
+
try {
|
|
14
|
+
return (await readdir(path, { withFileTypes: true }))
|
|
15
|
+
.filter((entry) => entry.isDirectory())
|
|
16
|
+
.map((entry) => entry.name)
|
|
17
|
+
.sort();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Inspect the source `~/.claude` and propose a factory profile: which CLAUDE.md
|
|
25
|
+
* sections to keep vs drop (interactive-only), which settings carry over, and
|
|
26
|
+
* which installed skills to pin. Pure inspection; writes nothing.
|
|
27
|
+
*/
|
|
28
|
+
export async function buildProposal(sourceHome, profileDir, pin) {
|
|
29
|
+
const claudeDir = join(sourceHome, ".claude");
|
|
30
|
+
const mdRaw = await readIfPresent(join(claudeDir, "CLAUDE.md"));
|
|
31
|
+
const sections = mdRaw === undefined ? [] : classifyClaudeMdSections(splitSections(mdRaw));
|
|
32
|
+
const settingsRaw = await readIfPresent(join(claudeDir, "settings.json"));
|
|
33
|
+
let settingsKeys = [];
|
|
34
|
+
if (settingsRaw !== undefined) {
|
|
35
|
+
try {
|
|
36
|
+
const parsed = JSON.parse(settingsRaw);
|
|
37
|
+
if (parsed !== null && typeof parsed === "object") {
|
|
38
|
+
settingsKeys = classifySettingsKeys(parsed);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// malformed settings: report nothing
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const installed = await listDirs(join(claudeDir, "skills"));
|
|
46
|
+
const pinSet = new Set(pin);
|
|
47
|
+
const skills = installed.map((name) => ({ name, pin: pinSet.has(name) }));
|
|
48
|
+
const missingPins = pin.filter((name) => !installed.includes(name));
|
|
49
|
+
return {
|
|
50
|
+
sourceHome,
|
|
51
|
+
profileDir,
|
|
52
|
+
claudeMd: { present: mdRaw !== undefined, sections },
|
|
53
|
+
settings: { present: settingsRaw !== undefined, keys: settingsKeys },
|
|
54
|
+
skills,
|
|
55
|
+
missingPins,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Write the profile the proposal describes: the composed factory CLAUDE.md (kept
|
|
60
|
+
* sections only), a minimal settings.json, and a copy of each pinned skill.
|
|
61
|
+
*/
|
|
62
|
+
export async function writeProfile(proposal) {
|
|
63
|
+
const claudeDir = join(proposal.profileDir, ".claude");
|
|
64
|
+
await mkdir(claudeDir, { recursive: true });
|
|
65
|
+
await writeFile(join(claudeDir, "CLAUDE.md"), composeFactoryClaudeMd(proposal.claudeMd.sections), "utf8");
|
|
66
|
+
await writeFile(join(claudeDir, "settings.json"), `${JSON.stringify(composeFactorySettings(), null, 2)}\n`, "utf8");
|
|
67
|
+
const skillsDir = join(claudeDir, "skills");
|
|
68
|
+
await mkdir(skillsDir, { recursive: true });
|
|
69
|
+
for (const skill of proposal.skills) {
|
|
70
|
+
if (!skill.pin)
|
|
71
|
+
continue;
|
|
72
|
+
const source = join(proposal.sourceHome, ".claude", "skills", skill.name);
|
|
73
|
+
try {
|
|
74
|
+
await cp(source, join(skillsDir, skill.name), { recursive: true, force: true });
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// a pinned-but-uncopyable skill is reported via missingPins; skip
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/claude-profile/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/commands.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Scope } from "../vendor/skilltend/paths.js";
|
|
1
2
|
export interface CommandStreams {
|
|
2
3
|
out: (text: string) => void;
|
|
3
4
|
err: (text: string) => void;
|
|
@@ -17,6 +18,20 @@ interface CommandEnv {
|
|
|
17
18
|
}
|
|
18
19
|
/** `ghostrail run`: drain eligible work once. */
|
|
19
20
|
export declare function cmdRun(argv: readonly string[], streams: CommandStreams, env?: CommandEnv, cwd?: string): Promise<number>;
|
|
21
|
+
interface WatchFlags {
|
|
22
|
+
intervalMs: number;
|
|
23
|
+
intervalLabel: string;
|
|
24
|
+
maxTicks?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse `ghostrail watch` options: `--interval`/`-i <duration>` (default `60s`)
|
|
28
|
+
* and an optional `--max-ticks <n>`. Returns undefined for a malformed interval.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseWatchFlags(argv: readonly string[]): WatchFlags | undefined;
|
|
31
|
+
/** `ghostrail watch`: run ticks on an interval until interrupted (no cron needed). */
|
|
32
|
+
export declare function cmdWatch(argv: readonly string[], streams: CommandStreams, env?: CommandEnv, cwd?: string): Promise<number>;
|
|
33
|
+
/** `ghostrail triage`: decompose large issues in the triage queue into sub-issues. */
|
|
34
|
+
export declare function cmdTriage(argv: readonly string[], streams: CommandStreams, env?: CommandEnv, cwd?: string): Promise<number>;
|
|
20
35
|
/** `ghostrail respond`: fold new human PR comments back into their branches. */
|
|
21
36
|
export declare function cmdRespond(argv: readonly string[], streams: CommandStreams, env?: CommandEnv, cwd?: string): Promise<number>;
|
|
22
37
|
interface BoardFlags {
|
|
@@ -32,8 +47,58 @@ export declare function cmdBoard(argv: readonly string[], streams: CommandStream
|
|
|
32
47
|
/** `ghostrail artifacts`: list the shared artifacts available in the global store. */
|
|
33
48
|
export declare function cmdArtifacts(argv: readonly string[], streams: CommandStreams, env?: CommandEnv): Promise<number>;
|
|
34
49
|
/** The quickstart templates bundled with the package. */
|
|
35
|
-
export declare const TEMPLATES: readonly ["
|
|
36
|
-
/**
|
|
50
|
+
export declare const TEMPLATES: readonly ["code-local", "content-loop"];
|
|
51
|
+
/**
|
|
52
|
+
* `ghostrail init <template> [--repo <path>] [--force]`: scaffold `ghostrail.toml`
|
|
53
|
+
* and `prompts/` from a quickstart template. Safe for a fresh OR an existing repo:
|
|
54
|
+
* existing files are left untouched (skipped) unless `--force` is given.
|
|
55
|
+
*/
|
|
37
56
|
export declare function cmdInit(argv: readonly string[], streams: CommandStreams, cwd?: string): Promise<number>;
|
|
57
|
+
interface SkillFlags {
|
|
58
|
+
scope: Scope;
|
|
59
|
+
agents: string[];
|
|
60
|
+
link: boolean;
|
|
61
|
+
force: boolean;
|
|
62
|
+
check: boolean;
|
|
63
|
+
uninstall: boolean;
|
|
64
|
+
yes: boolean;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parse `ghostrail skill` options. Default scope is `global` (the user's own
|
|
68
|
+
* agent config), because the skill drives ghostrail wherever you are; `--project`
|
|
69
|
+
* commits it alongside a repo so collaborators share it.
|
|
70
|
+
*/
|
|
71
|
+
export declare function parseSkillFlags(argv: readonly string[]): SkillFlags;
|
|
72
|
+
/**
|
|
73
|
+
* `ghostrail skill [uninstall] [--project] [--agent a,b] [--link] [--check] [--force] [--yes]`:
|
|
74
|
+
* install or update the `/ghostrail` agent skill for the coding agents configured
|
|
75
|
+
* on this machine. Idempotent — re-running when nothing changed is a no-op.
|
|
76
|
+
*/
|
|
77
|
+
export declare function cmdSkill(argv: readonly string[], streams: CommandStreams, env?: CommandEnv, cwd?: string): Promise<number>;
|
|
78
|
+
/**
|
|
79
|
+
* `ghostrail install`: put the CLI permanently on PATH, then install the skill.
|
|
80
|
+
* The two steps are independent — a failed global install still leaves you with a
|
|
81
|
+
* working skill, but the command exits non-zero so the failure is visible.
|
|
82
|
+
*
|
|
83
|
+
* Pins to the running version rather than `latest`, so `npx ghostrail@x.y.z
|
|
84
|
+
* install` gives you exactly x.y.z.
|
|
85
|
+
*/
|
|
86
|
+
export declare function cmdInstall(argv: readonly string[], streams: CommandStreams, env?: CommandEnv, cwd?: string): Promise<number>;
|
|
87
|
+
/**
|
|
88
|
+
* `ghostrail self-update`: upgrade the CLI to the latest published version, then
|
|
89
|
+
* install that version's skill.
|
|
90
|
+
*
|
|
91
|
+
* The skill step is delegated to the NEWLY installed binary on purpose. This
|
|
92
|
+
* process still holds the old bundled SKILL.md, so doing it in-process would
|
|
93
|
+
* upgrade the CLI and then write the previous skill back over it.
|
|
94
|
+
*/
|
|
95
|
+
export declare function cmdSelfUpdate(argv: readonly string[], streams: CommandStreams): Promise<number>;
|
|
96
|
+
/**
|
|
97
|
+
* `ghostrail claude-setup`: inspect the user's ~/.claude and propose the factory
|
|
98
|
+
* Claude profile (which CLAUDE.md sections to keep vs drop, which settings are
|
|
99
|
+
* interactive-only, which skills to pin). Prints the proposal; `--write` composes
|
|
100
|
+
* the profile.
|
|
101
|
+
*/
|
|
102
|
+
export declare function cmdClaudeSetup(argv: readonly string[], streams: CommandStreams, env?: CommandEnv): Promise<number>;
|
|
38
103
|
export {};
|
|
39
104
|
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAG1D,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,YAAY,CAc/F;AAED,UAAU,UAAU;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AA2HD,iDAAiD;AACjD,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,SAAS,CAoB/E;AAED,sFAAsF;AACtF,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAED,sFAAsF;AACtF,wBAAsB,SAAS,CAC7B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,gFAAgF;AAChF,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,CAqBzF;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CACtB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,sFAAsF;AACtF,wBAAsB,YAAY,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,yDAAyD;AACzD,eAAO,MAAM,SAAS,yCAA0C,CAAC;AAiCjE;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAsDjB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA8BnE;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAoDjB;AASD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CAcjB;AAgCD;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,cAAc,EACvB,GAAG,GAAE,UAAwB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAoDjB"}
|