@skillstate/cli 2.0.2 → 2.0.3
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 +56 -9
- package/dist/commands.d.ts +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +18 -14
- package/dist/commands.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +129 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +470 -0
- package/dist/install.js.map +1 -0
- package/dist/jsonc.d.ts +46 -0
- package/dist/jsonc.d.ts.map +1 -0
- package/dist/jsonc.js +255 -0
- package/dist/jsonc.js.map +1 -0
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/@skillstate/cli)
|
|
8
8
|
[](https://www.npmjs.com/package/@skillstate/cli)
|
|
9
|
-
[](https://github.com/vitalykuzyaev/skillstate)
|
|
10
10
|
[](https://github.com/vitalykuzyaev/skillstate/blob/main/LICENSE)
|
|
11
11
|
|
|
12
12
|
</div>
|
|
@@ -26,8 +26,11 @@ JSON or a markdown dashboard.
|
|
|
26
26
|
|
|
27
27
|
## Installation
|
|
28
28
|
|
|
29
|
+
One command installs the CLI **and** wires skillstate into your host
|
|
30
|
+
(OpenCode, Claude Code, or Codex — auto-detected):
|
|
31
|
+
|
|
29
32
|
```bash
|
|
30
|
-
npm i @skillstate/
|
|
33
|
+
npm i -g @skillstate/cli && skillstate init
|
|
31
34
|
```
|
|
32
35
|
|
|
33
36
|
Requires Node.js >= 20. TypeScript types are bundled. Ships the `skillstate`
|
|
@@ -36,14 +39,42 @@ bin.
|
|
|
36
39
|
## Quick start
|
|
37
40
|
|
|
38
41
|
```bash
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
skillstate init # full auto-install into the detected host
|
|
43
|
+
skillstate run # runs the offline stub-LLM against the spec
|
|
44
|
+
skillstate run --resume # continue from the persisted .skillstate.json
|
|
45
|
+
skillstate run --config ./my-config.json
|
|
46
|
+
skillstate report # pretty JSON report
|
|
47
|
+
skillstate report --format md # markdown dashboard
|
|
48
|
+
skillstate uninstall # roll the host install back (manifest-driven)
|
|
45
49
|
```
|
|
46
50
|
|
|
51
|
+
### `skillstate init` — what it does
|
|
52
|
+
|
|
53
|
+
1. Detects the host: `opencode` (`~/.config/opencode/opencode.jsonc` or
|
|
54
|
+
`~/.opencode/bin/opencode`), `claude` (`~/.claude`), `codex` (`~/.codex`).
|
|
55
|
+
Override with `--host <opencode|claude|codex>`.
|
|
56
|
+
2. Creates a per-project runtime dir `./.skillstate/` with the state file
|
|
57
|
+
(`skillstate.json`), an install manifest, and the `skillstate.json` config
|
|
58
|
+
+ spec file for `run`/`report`.
|
|
59
|
+
3. For OpenCode:
|
|
60
|
+
- writes the plugin to `~/.config/opencode/plugins/skillstate.ts` — files
|
|
61
|
+
in `plugins/` are **auto-loaded at startup** by OpenCode 1.17, so no
|
|
62
|
+
`plugin: []` edit is needed;
|
|
63
|
+
- splices a `skillstate` stdio MCP server into the existing `mcp` object of
|
|
64
|
+
`opencode.jsonc` **in place** (comments and unknown keys preserved,
|
|
65
|
+
timestamped `.bak.*` backup written);
|
|
66
|
+
- installs `~/.config/opencode/skills/skillstate/SKILL.md`.
|
|
67
|
+
4. For Claude Code: installs `~/.claude/skills/skillstate/SKILL.md` and writes
|
|
68
|
+
a project `.mcp.json` (`mcpServers.skillstate`).
|
|
69
|
+
5. For Codex: installs `~/.codex/skills/skillstate/SKILL.md` (no JSON MCP
|
|
70
|
+
config to edit).
|
|
71
|
+
|
|
72
|
+
Flags: `--host <name>`, `--state-path <path>`, `--max-history <n>`,
|
|
73
|
+
`--no-mcp`, `--no-skill`, `--dry-run`, `--uninstall`. Init is **idempotent** —
|
|
74
|
+
re-running never duplicates config entries. `skillstate uninstall`
|
|
75
|
+
(`--state-dir <dir>`, `--remove-state`, `--dry-run`) removes exactly what the
|
|
76
|
+
manifest records.
|
|
77
|
+
|
|
47
78
|
Programmatically:
|
|
48
79
|
|
|
49
80
|
```ts
|
|
@@ -64,7 +95,7 @@ Root path `@skillstate/cli` exports the command layer and the dashboard.
|
|
|
64
95
|
|
|
65
96
|
**Commands (`commands.ts`):**
|
|
66
97
|
|
|
67
|
-
- `main(argv, cwd?): Promise<number>` — CLI entry; returns a process exit code.
|
|
98
|
+
- `main(argv, cwd?, home?): Promise<number>` — CLI entry; returns a process exit code.
|
|
68
99
|
- `CLI_USAGE` — the usage string.
|
|
69
100
|
- `parseRunArgs(args): RunFlags` — `--config <path>`, `--config=<path>`, `--resume`.
|
|
70
101
|
- `parseReportArgs(args): ReportFlags` — `--format json|md` (default `json`).
|
|
@@ -75,6 +106,22 @@ Root path `@skillstate/cli` exports the command layer and the dashboard.
|
|
|
75
106
|
- `loadResumeState(cwd, statePath): SkillState | null`.
|
|
76
107
|
- `stubLlmResponse(): string`.
|
|
77
108
|
|
|
109
|
+
**Host install (`install.ts`):**
|
|
110
|
+
|
|
111
|
+
- `autoInstall({ cwd, home, flags }): Promise<number>` — one-shot host install.
|
|
112
|
+
- `uninstall({ cwd, flags }): Promise<number>` — manifest-driven rollback.
|
|
113
|
+
- `detectHost(home): HostId | null` — `opencode | claude | codex` detection.
|
|
114
|
+
- `parseInitArgs(args): InitFlags`, `parseUninstallArgs(args): UninstallFlags`.
|
|
115
|
+
- `buildSkillMd(statePathRel): string`, `buildMcpEntry(stateAbs)`.
|
|
116
|
+
- `addSkillstateMcp(configText, entry)` / `removeSkillstateMcp(configText)` — JSONC surgery.
|
|
117
|
+
- `resolveMcpCommand()`, `defaultHome()`, `HelpRequestedInitError`, `InstallManifest`.
|
|
118
|
+
|
|
119
|
+
**JSONC (`jsonc.ts`):**
|
|
120
|
+
|
|
121
|
+
- `parseJsonc(text)`, `stripJsonc(text)` — tolerant parsing (comments, trailing commas).
|
|
122
|
+
- `scanObject`, `findTopLevelObject`, `skipWsAndComments` — string-aware spans.
|
|
123
|
+
- `insertObjectEntry` / `removeObjectEntry` — comment-preserving key splice.
|
|
124
|
+
|
|
78
125
|
**Dashboard (`dashboard.ts`):**
|
|
79
126
|
|
|
80
127
|
- `generateReport(input: ReportInput): string` — full markdown report.
|
package/dist/commands.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SkillStateConfig } from '@skillstate/core';
|
|
2
2
|
import type { ProceduralSpec, SkillState } from '@skillstate/core';
|
|
3
|
-
export declare const CLI_USAGE
|
|
3
|
+
export declare const CLI_USAGE: string;
|
|
4
4
|
/** Parsed `run` flags. */
|
|
5
5
|
export interface RunFlags {
|
|
6
6
|
configPath?: string;
|
package/dist/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOzD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOzD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAYnE,eAAO,MAAM,SAAS,QACgD,CAAC;AAEvE,0BAA0B;AAC1B,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAMD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjD;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,cAGC;CACF;AAED,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAOD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CA4BrD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAyB3D;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAWhF;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAoBzE;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAOjF;AAED,yEAAyE;AACzE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAoJD;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCxE"}
|
package/dist/commands.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// skillstate CLI — init
|
|
1
|
+
// skillstate CLI — init [--host ...] [--dry-run] [--uninstall] | uninstall | run | report.
|
|
2
2
|
//
|
|
3
3
|
// @non-paper Wave-4 DX layer (additive): thin file orchestration over the
|
|
4
4
|
// paper-exact runtime. `run` uses a deterministic offline stub LLM (empty
|
|
@@ -17,7 +17,9 @@ import { atomicWriteFile } from '@skillstate/core';
|
|
|
17
17
|
import { migrate } from '@skillstate/core';
|
|
18
18
|
import { generateReport } from './dashboard.js';
|
|
19
19
|
import { INTERCODE_CTF_SPEC } from '@skillstate/core/schemas';
|
|
20
|
-
|
|
20
|
+
import { autoInstall, CLI_USAGE_INSTALL, defaultHome, HelpRequestedInitError, parseInitArgs, parseUninstallArgs, uninstall, } from './install.js';
|
|
21
|
+
export const CLI_USAGE = `Usage: skillstate init [flags] | uninstall [flags] | run [--config <path>] [--resume] | report [--format json|md]
|
|
22
|
+
init flags: ${CLI_USAGE_INSTALL.slice('Usage: skillstate '.length)}`;
|
|
21
23
|
function isRecord(value) {
|
|
22
24
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
23
25
|
}
|
|
@@ -166,7 +168,14 @@ export function loadResumeState(cwd, statePath) {
|
|
|
166
168
|
export function stubLlmResponse() {
|
|
167
169
|
return `noop step\n\n\`\`\`json\n${JSON.stringify({ state_patch: {}, action: 'noop' })}\n\`\`\``;
|
|
168
170
|
}
|
|
169
|
-
async function cmdInit(cwd) {
|
|
171
|
+
async function cmdInit(cwd, flags) {
|
|
172
|
+
if (flags.uninstall) {
|
|
173
|
+
return uninstall({ cwd, flags: { removeState: false, dryRun: flags.dryRun } });
|
|
174
|
+
}
|
|
175
|
+
if (flags.dryRun) {
|
|
176
|
+
console.log('[dry-run] would create ./skillstate.json + ./skill-spec.json (if missing)');
|
|
177
|
+
return autoInstall({ cwd, home: defaultHome(), flags });
|
|
178
|
+
}
|
|
170
179
|
const configPath = path.join(cwd, CONFIG_FILE_NAME);
|
|
171
180
|
const defaults = defaultConfig();
|
|
172
181
|
if (fs.existsSync(configPath) === false) {
|
|
@@ -183,7 +192,7 @@ async function cmdInit(cwd) {
|
|
|
183
192
|
fs.writeFileSync(specAbs, `${JSON.stringify(INTERCODE_CTF_SPEC, null, 2)}\n`, 'utf-8');
|
|
184
193
|
console.log(`Created ${defaults.specPath}`);
|
|
185
194
|
}
|
|
186
|
-
return
|
|
195
|
+
return autoInstall({ cwd, home: defaultHome(), flags });
|
|
187
196
|
}
|
|
188
197
|
async function cmdRun(cwd, flags) {
|
|
189
198
|
const config = loadCliConfig(cwd, flags.configPath);
|
|
@@ -308,15 +317,10 @@ export async function main(argv, cwd) {
|
|
|
308
317
|
}
|
|
309
318
|
try {
|
|
310
319
|
if (command === 'init') {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
315
|
-
if (rest.length > 0) {
|
|
316
|
-
console.error(`Unknown flag for init: ${rest[0]}\n${CLI_USAGE}`);
|
|
317
|
-
return 2;
|
|
318
|
-
}
|
|
319
|
-
return await cmdInit(dir);
|
|
320
|
+
return await cmdInit(dir, parseInitArgs(rest));
|
|
321
|
+
}
|
|
322
|
+
if (command === 'uninstall') {
|
|
323
|
+
return await uninstall({ cwd: dir, flags: parseUninstallArgs(rest) });
|
|
320
324
|
}
|
|
321
325
|
if (command === 'run') {
|
|
322
326
|
return await cmdRun(dir, parseRunArgs(rest));
|
|
@@ -328,7 +332,7 @@ export async function main(argv, cwd) {
|
|
|
328
332
|
return 2;
|
|
329
333
|
}
|
|
330
334
|
catch (error) {
|
|
331
|
-
if (error instanceof HelpRequestedError) {
|
|
335
|
+
if (error instanceof HelpRequestedError || error instanceof HelpRequestedInitError) {
|
|
332
336
|
console.log(CLI_USAGE);
|
|
333
337
|
return 0;
|
|
334
338
|
}
|
package/dist/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/** Supported hosts. */
|
|
2
|
+
export type HostId = 'opencode' | 'claude' | 'codex';
|
|
3
|
+
/** Project runtime directory created by init. */
|
|
4
|
+
export declare const STATE_DIR_NAME = ".skillstate";
|
|
5
|
+
/** Install manifest file name inside the state dir. */
|
|
6
|
+
export declare const MANIFEST_FILE_NAME = "install-manifest.json";
|
|
7
|
+
/** Parsed `init` flags. */
|
|
8
|
+
export interface InitFlags {
|
|
9
|
+
/** Forced host (`--host`); auto-detected when omitted. */
|
|
10
|
+
host?: HostId;
|
|
11
|
+
/** State file path (`--state-path`); default `<cwd>/.skillstate/skillstate.json`. */
|
|
12
|
+
statePath?: string;
|
|
13
|
+
/** Non-system messages kept by the plugin (`--max-history`, default 3). */
|
|
14
|
+
maxHistory?: number;
|
|
15
|
+
/** Skip MCP server registration (`--no-mcp`). */
|
|
16
|
+
noMcp: boolean;
|
|
17
|
+
/** Skip SKILL.md installation (`--no-skill`). */
|
|
18
|
+
noSkill: boolean;
|
|
19
|
+
/** Print the plan without touching anything (`--dry-run`). */
|
|
20
|
+
dryRun: boolean;
|
|
21
|
+
/** Accepted alias for the default auto behavior (`--auto`). */
|
|
22
|
+
auto: boolean;
|
|
23
|
+
/** Roll the install back instead of installing (`--uninstall`). */
|
|
24
|
+
uninstall: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Parsed `uninstall` flags. */
|
|
27
|
+
export interface UninstallFlags {
|
|
28
|
+
/** Directory holding the manifest (`--state-dir`; the `.skillstate` dir itself, default `<cwd>/.skillstate`). */
|
|
29
|
+
stateDir?: string;
|
|
30
|
+
/** Also delete the state directory (`--remove-state`). */
|
|
31
|
+
removeState: boolean;
|
|
32
|
+
/** Print the plan without touching anything (`--dry-run`). */
|
|
33
|
+
dryRun: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** What was installed, where — persisted for a precise uninstall. */
|
|
36
|
+
export interface InstallManifest {
|
|
37
|
+
version: 1;
|
|
38
|
+
host: HostId;
|
|
39
|
+
installedAt: string;
|
|
40
|
+
statePath: string;
|
|
41
|
+
maxHistoryMessages: number;
|
|
42
|
+
pluginPath?: string;
|
|
43
|
+
skillPath?: string;
|
|
44
|
+
mcp?: {
|
|
45
|
+
configPath: string;
|
|
46
|
+
format: 'opencode-jsonc' | 'claude-mcp-json';
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Default home (`$HOME`, else `os.homedir()`); the `main` entry uses this. */
|
|
50
|
+
export declare function defaultHome(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Detect the host from marker files under `home` (opencode first):
|
|
53
|
+
* - opencode: `~/.config/opencode/opencode.jsonc|opencode.json` or `~/.opencode/bin/opencode`;
|
|
54
|
+
* - claude: `~/.claude`;
|
|
55
|
+
* - codex: `~/.codex`.
|
|
56
|
+
* Returns null when nothing matches.
|
|
57
|
+
*/
|
|
58
|
+
export declare function detectHost(home: string): HostId | null;
|
|
59
|
+
/**
|
|
60
|
+
* Parse `init` flags: `--host <h>`, `--state-path <path>`, `--max-history <n>`,
|
|
61
|
+
* `--no-mcp`, `--no-skill`, `--dry-run`, `--auto`, `--uninstall` (`=`-forms
|
|
62
|
+
* accepted). Throws an `Error` with the usage line on unknown/invalid flags.
|
|
63
|
+
*/
|
|
64
|
+
export declare function parseInitArgs(args: string[]): InitFlags;
|
|
65
|
+
/**
|
|
66
|
+
* Parse `uninstall` flags: `--state-dir <path>`, `--remove-state`,
|
|
67
|
+
* `--dry-run`. Throws an `Error` with the usage line on unknown flags.
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseUninstallArgs(args: string[]): UninstallFlags;
|
|
70
|
+
/** Thrown by `parseInitArgs`/`parseUninstallArgs` on `--help`/`-h`. */
|
|
71
|
+
export declare class HelpRequestedInitError extends Error {
|
|
72
|
+
constructor();
|
|
73
|
+
}
|
|
74
|
+
/** Usage line for init/uninstall (composed with the CLI usage in commands.ts). */
|
|
75
|
+
export declare const CLI_USAGE_INSTALL = "Usage: skillstate init [--host opencode|claude|codex] [--state-path <path>] [--max-history <n>] [--no-mcp] [--no-skill] [--dry-run] | init --uninstall | uninstall [--state-dir <path>] [--remove-state] [--dry-run]";
|
|
76
|
+
/** Resolve the MCP server command: the `@skillstate/mcp` bin via `node`, or the global `skillstate-mcp` bin. */
|
|
77
|
+
export declare function resolveMcpCommandWith(resolve: (id: string) => string): {
|
|
78
|
+
command: string;
|
|
79
|
+
args: string[];
|
|
80
|
+
};
|
|
81
|
+
/** `resolveMcpCommandWith` bound to this module's require resolver. */
|
|
82
|
+
export declare function resolveMcpCommand(): {
|
|
83
|
+
command: string;
|
|
84
|
+
args: string[];
|
|
85
|
+
};
|
|
86
|
+
/** SKILL.md with a short frontmatter description + the adapter-generated body. */
|
|
87
|
+
export declare function buildSkillMd(statePathRel: string): string;
|
|
88
|
+
/** Skillstate MCP entry shaped like the host's existing local-server entries. */
|
|
89
|
+
export declare function buildMcpEntry(stateAbs: string): Record<string, unknown>;
|
|
90
|
+
/**
|
|
91
|
+
* Splice the `skillstate` server into the `mcp` object of OpenCode config
|
|
92
|
+
* text. Returns the (possibly unchanged) text and whether anything changed.
|
|
93
|
+
*/
|
|
94
|
+
export declare function addSkillstateMcp(configText: string, entry: Record<string, unknown>): {
|
|
95
|
+
text: string;
|
|
96
|
+
changed: boolean;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Splice the `skillstate` server back out of the `mcp` object. Missing
|
|
100
|
+
* `mcp` key / non-object `mcp` / missing `skillstate` are all no-ops.
|
|
101
|
+
*/
|
|
102
|
+
export declare function removeSkillstateMcp(configText: string): {
|
|
103
|
+
text: string;
|
|
104
|
+
changed: boolean;
|
|
105
|
+
};
|
|
106
|
+
/** Options for {@link autoInstall}. */
|
|
107
|
+
export interface InstallOptions {
|
|
108
|
+
cwd: string;
|
|
109
|
+
home: string;
|
|
110
|
+
flags: InitFlags;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Full one-shot install for the detected (or forced) host. Never throws for
|
|
114
|
+
* expected conditions; returns a process exit code (0 ok, 1 no host).
|
|
115
|
+
*/
|
|
116
|
+
export declare function autoInstall(options: InstallOptions): Promise<number>;
|
|
117
|
+
/** Options for {@link uninstall}. */
|
|
118
|
+
export interface UninstallOptions {
|
|
119
|
+
cwd: string;
|
|
120
|
+
flags: UninstallFlags;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Roll back exactly what an install recorded in the manifest: plugin file,
|
|
124
|
+
* SKILL.md, `mcp.skillstate` entry (with a config backup), and optionally
|
|
125
|
+
* the whole state directory. Returns a process exit code (0 ok, 1 no/manifest
|
|
126
|
+
* unreadable).
|
|
127
|
+
*/
|
|
128
|
+
export declare function uninstall(options: UninstallOptions): Promise<number>;
|
|
129
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
// skillstate host auto-install (additive, @non-paper Wave-4 DX).
|
|
2
|
+
//
|
|
3
|
+
// `skillstate init` detects the host (opencode | claude | codex) and installs
|
|
4
|
+
// everything in one shot:
|
|
5
|
+
// - state dir `./.skillstate/` in the project (per-project state + manifest);
|
|
6
|
+
// - OpenCode: plugin into `~/.config/opencode/plugins/` (auto-loaded at
|
|
7
|
+
// startup), `mcp.skillstate` entry spliced into `opencode.jsonc` (with a
|
|
8
|
+
// timestamped backup), `SKILL.md` into `~/.config/opencode/skills/`;
|
|
9
|
+
// - Claude: `SKILL.md` into `~/.claude/skills/` + `.mcp.json` in the project;
|
|
10
|
+
// - Codex: `SKILL.md` into `~/.codex/skills/` (no MCP — TOML config untouched).
|
|
11
|
+
//
|
|
12
|
+
// An install manifest (`<stateDir>/install-manifest.json`) records every path
|
|
13
|
+
// touched so `skillstate uninstall` (or `init --uninstall`) can roll it all
|
|
14
|
+
// back exactly.
|
|
15
|
+
/// <reference types="node" />
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as os from 'node:os';
|
|
18
|
+
import * as path from 'node:path';
|
|
19
|
+
import { createRequire } from 'node:module';
|
|
20
|
+
import { atomicWriteFile } from '@skillstate/core';
|
|
21
|
+
import { INTERCODE_CTF_SPEC } from '@skillstate/core/schemas';
|
|
22
|
+
import { OpenCodeAdapter } from '@skillstate/opencode';
|
|
23
|
+
import { findTopLevelObject, insertObjectEntry, removeObjectEntry } from './jsonc.js';
|
|
24
|
+
import { resolveInCwd } from './commands.js';
|
|
25
|
+
const HOSTS = ['opencode', 'claude', 'codex'];
|
|
26
|
+
/** Project runtime directory created by init. */
|
|
27
|
+
export const STATE_DIR_NAME = '.skillstate';
|
|
28
|
+
/** Install manifest file name inside the state dir. */
|
|
29
|
+
export const MANIFEST_FILE_NAME = 'install-manifest.json';
|
|
30
|
+
/** Short skill description used for the SKILL.md frontmatter. */
|
|
31
|
+
const SKILL_DESCRIPTION = 'State-based execution: persist agent state to a JSON file, keep the prompt O(1), and resume any procedure from disk.';
|
|
32
|
+
function isRecord(value) {
|
|
33
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
34
|
+
}
|
|
35
|
+
/** Default home (`$HOME`, else `os.homedir()`); the `main` entry uses this. */
|
|
36
|
+
export function defaultHome() {
|
|
37
|
+
return process.env['HOME'] ?? os.homedir();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Detect the host from marker files under `home` (opencode first):
|
|
41
|
+
* - opencode: `~/.config/opencode/opencode.jsonc|opencode.json` or `~/.opencode/bin/opencode`;
|
|
42
|
+
* - claude: `~/.claude`;
|
|
43
|
+
* - codex: `~/.codex`.
|
|
44
|
+
* Returns null when nothing matches.
|
|
45
|
+
*/
|
|
46
|
+
export function detectHost(home) {
|
|
47
|
+
const configDir = path.join(home, '.config', 'opencode');
|
|
48
|
+
if (fs.existsSync(path.join(configDir, 'opencode.jsonc')) ||
|
|
49
|
+
fs.existsSync(path.join(configDir, 'opencode.json')) ||
|
|
50
|
+
fs.existsSync(path.join(home, '.opencode', 'bin', 'opencode'))) {
|
|
51
|
+
return 'opencode';
|
|
52
|
+
}
|
|
53
|
+
if (fs.existsSync(path.join(home, '.claude'))) {
|
|
54
|
+
return 'claude';
|
|
55
|
+
}
|
|
56
|
+
if (fs.existsSync(path.join(home, '.codex'))) {
|
|
57
|
+
return 'codex';
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse `init` flags: `--host <h>`, `--state-path <path>`, `--max-history <n>`,
|
|
63
|
+
* `--no-mcp`, `--no-skill`, `--dry-run`, `--auto`, `--uninstall` (`=`-forms
|
|
64
|
+
* accepted). Throws an `Error` with the usage line on unknown/invalid flags.
|
|
65
|
+
*/
|
|
66
|
+
export function parseInitArgs(args) {
|
|
67
|
+
if (wantsHelpInit(args)) {
|
|
68
|
+
throw new HelpRequestedInitError();
|
|
69
|
+
}
|
|
70
|
+
const flags = { noMcp: false, noSkill: false, dryRun: false, auto: false, uninstall: false };
|
|
71
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
72
|
+
const arg = args[i];
|
|
73
|
+
if (arg === '--auto') {
|
|
74
|
+
flags.auto = true;
|
|
75
|
+
}
|
|
76
|
+
else if (arg === '--dry-run') {
|
|
77
|
+
flags.dryRun = true;
|
|
78
|
+
}
|
|
79
|
+
else if (arg === '--no-mcp') {
|
|
80
|
+
flags.noMcp = true;
|
|
81
|
+
}
|
|
82
|
+
else if (arg === '--no-skill') {
|
|
83
|
+
flags.noSkill = true;
|
|
84
|
+
}
|
|
85
|
+
else if (arg === '--uninstall') {
|
|
86
|
+
flags.uninstall = true;
|
|
87
|
+
}
|
|
88
|
+
else if (arg === '--host' || arg.startsWith('--host=')) {
|
|
89
|
+
const value = arg === '--host' ? args[++i] : arg.slice('--host='.length);
|
|
90
|
+
if (value === undefined ||
|
|
91
|
+
(value !== 'opencode' && value !== 'claude' && value !== 'codex')) {
|
|
92
|
+
throw new Error(`Invalid --host (want opencode|claude|codex)\n${CLI_USAGE_INSTALL}`);
|
|
93
|
+
}
|
|
94
|
+
flags.host = value;
|
|
95
|
+
}
|
|
96
|
+
else if (arg === '--state-path' || arg.startsWith('--state-path=')) {
|
|
97
|
+
const value = arg === '--state-path' ? args[++i] : arg.slice('--state-path='.length);
|
|
98
|
+
if (value === undefined || value.length === 0) {
|
|
99
|
+
throw new Error(`Missing value for --state-path\n${CLI_USAGE_INSTALL}`);
|
|
100
|
+
}
|
|
101
|
+
flags.statePath = value;
|
|
102
|
+
}
|
|
103
|
+
else if (arg === '--max-history' || arg.startsWith('--max-history=')) {
|
|
104
|
+
const value = arg === '--max-history' ? args[++i] : arg.slice('--max-history='.length);
|
|
105
|
+
const parsed = typeof value === 'string' ? Number(value) : NaN;
|
|
106
|
+
if (value === undefined || !Number.isInteger(parsed) || parsed < 1) {
|
|
107
|
+
throw new Error(`Invalid --max-history (want a positive integer)\n${CLI_USAGE_INSTALL}`);
|
|
108
|
+
}
|
|
109
|
+
flags.maxHistory = parsed;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
throw new Error(`Unknown flag for init: ${arg}\n${CLI_USAGE_INSTALL}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return flags;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse `uninstall` flags: `--state-dir <path>`, `--remove-state`,
|
|
119
|
+
* `--dry-run`. Throws an `Error` with the usage line on unknown flags.
|
|
120
|
+
*/
|
|
121
|
+
export function parseUninstallArgs(args) {
|
|
122
|
+
if (wantsHelpInit(args)) {
|
|
123
|
+
throw new HelpRequestedInitError();
|
|
124
|
+
}
|
|
125
|
+
const flags = { removeState: false, dryRun: false };
|
|
126
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
127
|
+
const arg = args[i];
|
|
128
|
+
if (arg === '--remove-state') {
|
|
129
|
+
flags.removeState = true;
|
|
130
|
+
}
|
|
131
|
+
else if (arg === '--dry-run') {
|
|
132
|
+
flags.dryRun = true;
|
|
133
|
+
}
|
|
134
|
+
else if (arg === '--state-dir' || arg.startsWith('--state-dir=')) {
|
|
135
|
+
const value = arg === '--state-dir' ? args[++i] : arg.slice('--state-dir='.length);
|
|
136
|
+
if (value === undefined || value.length === 0) {
|
|
137
|
+
throw new Error(`Missing value for --state-dir\n${CLI_USAGE_INSTALL}`);
|
|
138
|
+
}
|
|
139
|
+
flags.stateDir = value;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
throw new Error(`Unknown flag for uninstall: ${arg}\n${CLI_USAGE_INSTALL}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return flags;
|
|
146
|
+
}
|
|
147
|
+
/** Help marker for init/uninstall flags (kept local to avoid a commands.ts cycle). */
|
|
148
|
+
function wantsHelpInit(args) {
|
|
149
|
+
return args.includes('--help') || args.includes('-h');
|
|
150
|
+
}
|
|
151
|
+
/** Thrown by `parseInitArgs`/`parseUninstallArgs` on `--help`/`-h`. */
|
|
152
|
+
export class HelpRequestedInitError extends Error {
|
|
153
|
+
constructor() {
|
|
154
|
+
super('help requested');
|
|
155
|
+
this.name = 'HelpRequestedInitError';
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Usage line for init/uninstall (composed with the CLI usage in commands.ts). */
|
|
159
|
+
export const CLI_USAGE_INSTALL = 'Usage: skillstate init [--host opencode|claude|codex] [--state-path <path>] [--max-history <n>] [--no-mcp] [--no-skill] [--dry-run] | init --uninstall | uninstall [--state-dir <path>] [--remove-state] [--dry-run]';
|
|
160
|
+
/** Resolve the MCP server command: the `@skillstate/mcp` bin via `node`, or the global `skillstate-mcp` bin. */
|
|
161
|
+
export function resolveMcpCommandWith(resolve) {
|
|
162
|
+
try {
|
|
163
|
+
const pkg = resolve('@skillstate/mcp/package.json');
|
|
164
|
+
return { command: 'node', args: [path.join(path.dirname(pkg), 'bin', 'mcp.js')] };
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return { command: 'skillstate-mcp', args: [] };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** `resolveMcpCommandWith` bound to this module's require resolver. */
|
|
171
|
+
export function resolveMcpCommand() {
|
|
172
|
+
return resolveMcpCommandWith((id) => createRequire(import.meta.url).resolve(id));
|
|
173
|
+
}
|
|
174
|
+
function backupPathFor(file) {
|
|
175
|
+
return `${file}.bak.${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
176
|
+
}
|
|
177
|
+
/** Path of the OpenCode host config: existing `.jsonc`, else `.json`, else the canonical `.jsonc`. */
|
|
178
|
+
function resolveOpencodeConfig(home) {
|
|
179
|
+
const dir = path.join(home, '.config', 'opencode');
|
|
180
|
+
const jsonc = path.join(dir, 'opencode.jsonc');
|
|
181
|
+
if (fs.existsSync(jsonc)) {
|
|
182
|
+
return jsonc;
|
|
183
|
+
}
|
|
184
|
+
const json = path.join(dir, 'opencode.json');
|
|
185
|
+
return fs.existsSync(json) ? json : jsonc;
|
|
186
|
+
}
|
|
187
|
+
function skillDirFor(host, home) {
|
|
188
|
+
if (host === 'opencode') {
|
|
189
|
+
return path.join(home, '.config', 'opencode', 'skills', 'skillstate');
|
|
190
|
+
}
|
|
191
|
+
if (host === 'claude') {
|
|
192
|
+
return path.join(home, '.claude', 'skills', 'skillstate');
|
|
193
|
+
}
|
|
194
|
+
return path.join(home, '.codex', 'skills', 'skillstate');
|
|
195
|
+
}
|
|
196
|
+
/** SKILL.md with a short frontmatter description + the adapter-generated body. */
|
|
197
|
+
export function buildSkillMd(statePathRel) {
|
|
198
|
+
const generated = new OpenCodeAdapter().generateSkillMd(INTERCODE_CTF_SPEC, statePathRel);
|
|
199
|
+
const body = generated.slice(generated.indexOf('\n---', 3) + '\n---\n'.length);
|
|
200
|
+
return `---
|
|
201
|
+
name: skillstate
|
|
202
|
+
description: ${JSON.stringify(SKILL_DESCRIPTION)}
|
|
203
|
+
---
|
|
204
|
+
${body}`;
|
|
205
|
+
}
|
|
206
|
+
/** Skillstate MCP entry shaped like the host's existing local-server entries. */
|
|
207
|
+
export function buildMcpEntry(stateAbs) {
|
|
208
|
+
const cmd = resolveMcpCommand();
|
|
209
|
+
return {
|
|
210
|
+
type: 'local',
|
|
211
|
+
command: [cmd.command, ...cmd.args],
|
|
212
|
+
enabled: true,
|
|
213
|
+
environment: { SKILLSTATE_STATE_PATH: stateAbs },
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Splice the `skillstate` server into the `mcp` object of OpenCode config
|
|
218
|
+
* text. Returns the (possibly unchanged) text and whether anything changed.
|
|
219
|
+
*/
|
|
220
|
+
export function addSkillstateMcp(configText, entry) {
|
|
221
|
+
const root = findTopLevelObject(configText);
|
|
222
|
+
if (root === null) {
|
|
223
|
+
return { text: configText, changed: false };
|
|
224
|
+
}
|
|
225
|
+
const mcp = root.entries.find((e) => e.key === 'mcp');
|
|
226
|
+
if (mcp === undefined) {
|
|
227
|
+
return insertObjectEntry(configText, root.braceStart, 'mcp', JSON.stringify({ skillstate: entry }, null, 2));
|
|
228
|
+
}
|
|
229
|
+
if (configText[mcp.valueStart] !== '{') {
|
|
230
|
+
return { text: configText, changed: false };
|
|
231
|
+
}
|
|
232
|
+
return insertObjectEntry(configText, mcp.valueStart, 'skillstate', JSON.stringify(entry, null, 2));
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Splice the `skillstate` server back out of the `mcp` object. Missing
|
|
236
|
+
* `mcp` key / non-object `mcp` / missing `skillstate` are all no-ops.
|
|
237
|
+
*/
|
|
238
|
+
export function removeSkillstateMcp(configText) {
|
|
239
|
+
const root = findTopLevelObject(configText);
|
|
240
|
+
if (root === null) {
|
|
241
|
+
return { text: configText, changed: false };
|
|
242
|
+
}
|
|
243
|
+
const mcp = root.entries.find((e) => e.key === 'mcp');
|
|
244
|
+
if (mcp === undefined || configText[mcp.valueStart] !== '{') {
|
|
245
|
+
return { text: configText, changed: false };
|
|
246
|
+
}
|
|
247
|
+
return removeObjectEntry(configText, mcp.valueStart, 'skillstate');
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Full one-shot install for the detected (or forced) host. Never throws for
|
|
251
|
+
* expected conditions; returns a process exit code (0 ok, 1 no host).
|
|
252
|
+
*/
|
|
253
|
+
export async function autoInstall(options) {
|
|
254
|
+
const { cwd, home, flags } = options;
|
|
255
|
+
const host = flags.host ?? detectHost(home);
|
|
256
|
+
if (host === null) {
|
|
257
|
+
console.error('No supported host detected (~/.config/opencode, ~/.claude, ~/.codex). Install one or pass --host.');
|
|
258
|
+
return 1;
|
|
259
|
+
}
|
|
260
|
+
const dry = flags.dryRun;
|
|
261
|
+
const say = (line) => {
|
|
262
|
+
console.log(dry ? `[dry-run] ${line}` : line);
|
|
263
|
+
};
|
|
264
|
+
const maxHistory = flags.maxHistory ?? 3;
|
|
265
|
+
const stateDir = path.join(cwd, STATE_DIR_NAME);
|
|
266
|
+
const stateAbs = flags.statePath !== undefined ? resolveInCwd(cwd, flags.statePath) : path.join(stateDir, 'skillstate.json');
|
|
267
|
+
const stateCreated = !dry && !fs.existsSync(stateAbs);
|
|
268
|
+
if (!dry) {
|
|
269
|
+
fs.mkdirSync(path.dirname(stateAbs), { recursive: true });
|
|
270
|
+
if (stateCreated) {
|
|
271
|
+
await atomicWriteFile(stateAbs, `${JSON.stringify({ version: 1, state: {} }, null, 2)}\n`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
say(`host: ${host}${flags.host === undefined ? ' (detected)' : ''}`);
|
|
275
|
+
say(`state: ${stateAbs}${stateCreated ? ' (created)' : ''}`);
|
|
276
|
+
const manifest = {
|
|
277
|
+
version: 1,
|
|
278
|
+
host,
|
|
279
|
+
installedAt: new Date().toISOString(),
|
|
280
|
+
statePath: stateAbs,
|
|
281
|
+
maxHistoryMessages: maxHistory,
|
|
282
|
+
};
|
|
283
|
+
if (host === 'opencode') {
|
|
284
|
+
const pluginAbs = path.join(home, '.config', 'opencode', 'plugins', 'skillstate.ts');
|
|
285
|
+
if (!dry) {
|
|
286
|
+
await new OpenCodeAdapter().savePluginCode(pluginAbs, stateAbs, { maxHistoryMessages: maxHistory });
|
|
287
|
+
}
|
|
288
|
+
say(`plugin: ${pluginAbs} (auto-loaded from plugins/)`);
|
|
289
|
+
manifest.pluginPath = pluginAbs;
|
|
290
|
+
}
|
|
291
|
+
if (!flags.noSkill) {
|
|
292
|
+
const skillAbs = path.join(skillDirFor(host, home), 'SKILL.md');
|
|
293
|
+
if (!dry) {
|
|
294
|
+
await atomicWriteFile(skillAbs, buildSkillMd(relativeStatePath(cwd, stateAbs)));
|
|
295
|
+
}
|
|
296
|
+
say(`skill: ${skillAbs}`);
|
|
297
|
+
manifest.skillPath = skillAbs;
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
say('skill: skipped (--no-skill)');
|
|
301
|
+
}
|
|
302
|
+
if (flags.noMcp) {
|
|
303
|
+
say('mcp: skipped (--no-mcp)');
|
|
304
|
+
}
|
|
305
|
+
else if (host === 'opencode') {
|
|
306
|
+
const configPath = resolveOpencodeConfig(home);
|
|
307
|
+
let text;
|
|
308
|
+
try {
|
|
309
|
+
text = fs.readFileSync(configPath, 'utf-8');
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
text = '{\n}\n';
|
|
313
|
+
}
|
|
314
|
+
const result = addSkillstateMcp(text, buildMcpEntry(stateAbs));
|
|
315
|
+
if (result.changed) {
|
|
316
|
+
const backup = backupPathFor(configPath);
|
|
317
|
+
if (!dry) {
|
|
318
|
+
await atomicWriteFile(backup, text);
|
|
319
|
+
await atomicWriteFile(configPath, result.text);
|
|
320
|
+
}
|
|
321
|
+
say(`mcp: ${configPath} (skillstate server added)`);
|
|
322
|
+
say(`mcp backup: ${backup}`);
|
|
323
|
+
manifest.mcp = { configPath, format: 'opencode-jsonc' };
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
say(`mcp: ${configPath} (skillstate already registered)`);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else if (host === 'claude') {
|
|
330
|
+
const mcpJson = path.join(cwd, '.mcp.json');
|
|
331
|
+
let doc = {};
|
|
332
|
+
if (fs.existsSync(mcpJson)) {
|
|
333
|
+
try {
|
|
334
|
+
doc = JSON.parse(fs.readFileSync(mcpJson, 'utf-8'));
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
doc = {};
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (!isRecord(doc.mcpServers) || doc.mcpServers['skillstate'] === undefined) {
|
|
341
|
+
const servers = isRecord(doc.mcpServers) ? doc.mcpServers : {};
|
|
342
|
+
const backup = fs.existsSync(mcpJson) ? backupPathFor(mcpJson) : null;
|
|
343
|
+
if (!dry) {
|
|
344
|
+
if (backup !== null) {
|
|
345
|
+
await atomicWriteFile(backup, fs.readFileSync(mcpJson, 'utf-8'));
|
|
346
|
+
}
|
|
347
|
+
await atomicWriteFile(mcpJson, `${JSON.stringify({ mcpServers: { ...servers, skillstate: buildMcpEntry(stateAbs) } }, null, 2)}\n`);
|
|
348
|
+
}
|
|
349
|
+
say(`mcp: ${mcpJson} (skillstate server added)`);
|
|
350
|
+
manifest.mcp = { configPath: mcpJson, format: 'claude-mcp-json' };
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
say(`mcp: ${mcpJson} (skillstate already registered)`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
say('mcp: skipped (codex has no JSON MCP config; register the server manually if needed)');
|
|
358
|
+
}
|
|
359
|
+
const manifestAbs = path.join(stateDir, MANIFEST_FILE_NAME);
|
|
360
|
+
if (!dry) {
|
|
361
|
+
await atomicWriteFile(manifestAbs, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
362
|
+
}
|
|
363
|
+
say(`manifest: ${manifestAbs}`);
|
|
364
|
+
say(dry ? 'dry run complete — nothing was written.' : 'Done. Next: `skillstate run` in this project, then open your host.');
|
|
365
|
+
return 0;
|
|
366
|
+
}
|
|
367
|
+
/** State path as the SKILL.md should reference it: relative when inside cwd, absolute otherwise. */
|
|
368
|
+
function relativeStatePath(cwd, stateAbs) {
|
|
369
|
+
const rel = path.relative(cwd, stateAbs);
|
|
370
|
+
return rel.startsWith('..') ? stateAbs : `./${rel}`;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Roll back exactly what an install recorded in the manifest: plugin file,
|
|
374
|
+
* SKILL.md, `mcp.skillstate` entry (with a config backup), and optionally
|
|
375
|
+
* the whole state directory. Returns a process exit code (0 ok, 1 no/manifest
|
|
376
|
+
* unreadable).
|
|
377
|
+
*/
|
|
378
|
+
export async function uninstall(options) {
|
|
379
|
+
const { cwd, flags } = options;
|
|
380
|
+
const dry = flags.dryRun;
|
|
381
|
+
const say = (line) => {
|
|
382
|
+
console.log(dry ? `[dry-run] ${line}` : line);
|
|
383
|
+
};
|
|
384
|
+
const stateDir = flags.stateDir !== undefined ? resolveInCwd(cwd, flags.stateDir) : path.join(cwd, STATE_DIR_NAME);
|
|
385
|
+
const manifestAbs = path.join(stateDir, MANIFEST_FILE_NAME);
|
|
386
|
+
let raw;
|
|
387
|
+
try {
|
|
388
|
+
raw = fs.readFileSync(manifestAbs, 'utf-8');
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
console.error(`No install manifest at ${manifestAbs} — nothing to uninstall.`);
|
|
392
|
+
return 1;
|
|
393
|
+
}
|
|
394
|
+
let manifest;
|
|
395
|
+
try {
|
|
396
|
+
manifest = JSON.parse(raw);
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
console.error(`Corrupt install manifest at ${manifestAbs}`);
|
|
400
|
+
return 1;
|
|
401
|
+
}
|
|
402
|
+
if (!isRecord(manifest) ||
|
|
403
|
+
manifest['version'] !== 1 ||
|
|
404
|
+
typeof manifest['host'] !== 'string' ||
|
|
405
|
+
typeof manifest['statePath'] !== 'string') {
|
|
406
|
+
console.error(`Corrupt install manifest at ${manifestAbs}`);
|
|
407
|
+
return 1;
|
|
408
|
+
}
|
|
409
|
+
const m = manifest;
|
|
410
|
+
say(`uninstall (${m.host})`);
|
|
411
|
+
if (m.pluginPath !== undefined && fs.existsSync(m.pluginPath)) {
|
|
412
|
+
if (!dry) {
|
|
413
|
+
fs.rmSync(m.pluginPath);
|
|
414
|
+
}
|
|
415
|
+
say(`removed plugin: ${m.pluginPath}`);
|
|
416
|
+
}
|
|
417
|
+
if (m.skillPath !== undefined && fs.existsSync(m.skillPath)) {
|
|
418
|
+
if (!dry) {
|
|
419
|
+
fs.rmSync(m.skillPath);
|
|
420
|
+
}
|
|
421
|
+
say(`removed skill: ${m.skillPath}`);
|
|
422
|
+
}
|
|
423
|
+
if (m.mcp !== undefined && fs.existsSync(m.mcp.configPath)) {
|
|
424
|
+
const configPath = m.mcp.configPath;
|
|
425
|
+
if (m.mcp.format === 'claude-mcp-json') {
|
|
426
|
+
try {
|
|
427
|
+
const doc = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
428
|
+
if (isRecord(doc.mcpServers) && doc.mcpServers['skillstate'] !== undefined) {
|
|
429
|
+
const { ['skillstate']: _removed, ...rest } = doc.mcpServers;
|
|
430
|
+
const backup = backupPathFor(configPath);
|
|
431
|
+
if (!dry) {
|
|
432
|
+
await atomicWriteFile(backup, fs.readFileSync(configPath, 'utf-8'));
|
|
433
|
+
await atomicWriteFile(configPath, `${JSON.stringify({ mcpServers: rest }, null, 2)}\n`);
|
|
434
|
+
}
|
|
435
|
+
say(`removed mcp entry: ${configPath} (backup: ${backup})`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
console.error(`Skipping mcp: ${configPath} is unreadable`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
const text = fs.readFileSync(configPath, 'utf-8');
|
|
444
|
+
const result = removeSkillstateMcp(text);
|
|
445
|
+
if (result.changed) {
|
|
446
|
+
const backup = backupPathFor(configPath);
|
|
447
|
+
if (!dry) {
|
|
448
|
+
await atomicWriteFile(backup, text);
|
|
449
|
+
await atomicWriteFile(configPath, result.text);
|
|
450
|
+
}
|
|
451
|
+
say(`removed mcp entry: ${configPath} (backup: ${backup})`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (dry) {
|
|
456
|
+
say('dry run complete — nothing was written.');
|
|
457
|
+
return 0;
|
|
458
|
+
}
|
|
459
|
+
if (flags.removeState) {
|
|
460
|
+
fs.rmSync(stateDir, { recursive: true, force: true });
|
|
461
|
+
say(`removed state dir: ${stateDir}`);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
fs.rmSync(manifestAbs, { force: true });
|
|
465
|
+
say(`kept state: ${stateDir} (use --remove-state to delete)`);
|
|
466
|
+
}
|
|
467
|
+
say('Uninstalled.');
|
|
468
|
+
return 0;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/jsonc.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** One `"key": <value>` entry inside a scanned object. */
|
|
2
|
+
export interface JsoncEntry {
|
|
3
|
+
key: string;
|
|
4
|
+
/** Index of the opening quote of the key. */
|
|
5
|
+
entryStart: number;
|
|
6
|
+
/** Index just past the value's trailing comma (when present). */
|
|
7
|
+
entryEnd: number;
|
|
8
|
+
/** Index of the first char of the value. */
|
|
9
|
+
valueStart: number;
|
|
10
|
+
/** Index just past the value's last char. */
|
|
11
|
+
valueEnd: number;
|
|
12
|
+
}
|
|
13
|
+
/** Span of a `{ ... }` object in JSONC text. */
|
|
14
|
+
export interface JsoncObjectSpan {
|
|
15
|
+
braceStart: number;
|
|
16
|
+
braceEnd: number;
|
|
17
|
+
entries: JsoncEntry[];
|
|
18
|
+
}
|
|
19
|
+
/** Result of an in-place entry insertion/removal. */
|
|
20
|
+
export interface JsoncEditResult {
|
|
21
|
+
text: string;
|
|
22
|
+
changed: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** Skip whitespace and line/block comments starting at `i`. */
|
|
25
|
+
export declare function skipWsAndComments(text: string, i: number): number;
|
|
26
|
+
/** Scan the object whose `{` sits at `objStart` into a span with entry positions. */
|
|
27
|
+
export declare function scanObject(text: string, objStart: number): JsoncObjectSpan;
|
|
28
|
+
/** Span of the document's root object, or null when the root is not an object. */
|
|
29
|
+
export declare function findTopLevelObject(text: string): JsoncObjectSpan | null;
|
|
30
|
+
/** Strip line/block comments and trailing commas so `JSON.parse` can read the rest. */
|
|
31
|
+
export declare function stripJsonc(text: string): string;
|
|
32
|
+
/** Parse JSONC text (comments + trailing commas tolerated) via JSON.parse. */
|
|
33
|
+
export declare function parseJsonc(text: string): unknown;
|
|
34
|
+
/**
|
|
35
|
+
* Splice one `"key": <valueJson>` entry into the object at `objStart`,
|
|
36
|
+
* preserving all surrounding text (comments included). Idempotent: when the
|
|
37
|
+
* key already exists the text is returned unchanged.
|
|
38
|
+
*/
|
|
39
|
+
export declare function insertObjectEntry(text: string, objStart: number, key: string, valueJson: string): JsoncEditResult;
|
|
40
|
+
/**
|
|
41
|
+
* Splice the `"key"` entry out of the object at `objStart`, keeping the rest
|
|
42
|
+
* valid (the entry's trailing comma, or the previous entry's comma for a last
|
|
43
|
+
* entry, goes with it). Idempotent: a missing key returns the text unchanged.
|
|
44
|
+
*/
|
|
45
|
+
export declare function removeObjectEntry(text: string, objStart: number, key: string): JsoncEditResult;
|
|
46
|
+
//# sourceMappingURL=jsonc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonc.d.ts","sourceRoot":"","sources":["../src/jsonc.ts"],"names":[],"mappings":"AAUA,0DAA0D;AAC1D,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBjE;AAuDD,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CA6B1E;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAMvE;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkC/C;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AA4BD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB,eAAe,CAoBjB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,eAAe,CAqBjB"}
|
package/dist/jsonc.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
// @non-paper JSONC surgery for host-config edits (additive).
|
|
2
|
+
//
|
|
3
|
+
// OpenCode's `opencode.jsonc` may carry comments and trailing commas, and
|
|
4
|
+
// rewriting the whole document would destroy them. This module scans JSONC
|
|
5
|
+
// text string-aware (quotes, escapes, line and block comments), locates
|
|
6
|
+
// object entries by span, and splices single keys in/out so everything
|
|
7
|
+
// around the edit point is preserved byte-for-byte.
|
|
8
|
+
//
|
|
9
|
+
// Zero dependencies, Node >= 20, ESM.
|
|
10
|
+
function isWs(ch) {
|
|
11
|
+
return ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r';
|
|
12
|
+
}
|
|
13
|
+
/** Skip whitespace and line/block comments starting at `i`. */
|
|
14
|
+
export function skipWsAndComments(text, i) {
|
|
15
|
+
while (i < text.length) {
|
|
16
|
+
const ch = text[i];
|
|
17
|
+
if (isWs(ch)) {
|
|
18
|
+
i += 1;
|
|
19
|
+
}
|
|
20
|
+
else if (ch === '/' && text[i + 1] === '/') {
|
|
21
|
+
i += 2;
|
|
22
|
+
while (i < text.length && text[i] !== '\n') {
|
|
23
|
+
i += 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (ch === '/' && text[i + 1] === '*') {
|
|
27
|
+
i += 2;
|
|
28
|
+
while (i < text.length && !(text[i] === '*' && text[i + 1] === '/')) {
|
|
29
|
+
i += 1;
|
|
30
|
+
}
|
|
31
|
+
i = Math.min(i + 2, text.length);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return i;
|
|
38
|
+
}
|
|
39
|
+
/** Scan a `"string"` literal starting at `i` (must be `"`); returns the index past the closing quote. */
|
|
40
|
+
function scanString(text, i) {
|
|
41
|
+
i += 1;
|
|
42
|
+
while (i < text.length) {
|
|
43
|
+
const ch = text[i];
|
|
44
|
+
if (ch === '\\') {
|
|
45
|
+
i += 2;
|
|
46
|
+
}
|
|
47
|
+
else if (ch === '"') {
|
|
48
|
+
return i + 1;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
i += 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new Error('Unterminated string in JSONC');
|
|
55
|
+
}
|
|
56
|
+
/** Index just past the JSON value starting at `i` (object, array, string, or primitive). */
|
|
57
|
+
function scanValueEnd(text, i) {
|
|
58
|
+
const ch = text[i];
|
|
59
|
+
if (ch === '{' || ch === '[') {
|
|
60
|
+
let depth = 0;
|
|
61
|
+
while (i < text.length) {
|
|
62
|
+
const c = text[i];
|
|
63
|
+
if (c === '"') {
|
|
64
|
+
i = scanString(text, i);
|
|
65
|
+
}
|
|
66
|
+
else if (c === '{' || c === '[') {
|
|
67
|
+
depth += 1;
|
|
68
|
+
i += 1;
|
|
69
|
+
}
|
|
70
|
+
else if (c === '}' || c === ']') {
|
|
71
|
+
depth -= 1;
|
|
72
|
+
i += 1;
|
|
73
|
+
if (depth === 0) {
|
|
74
|
+
return i;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
i += 1;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
throw new Error('Unterminated object/array in JSONC');
|
|
82
|
+
}
|
|
83
|
+
if (ch === '"') {
|
|
84
|
+
return scanString(text, i);
|
|
85
|
+
}
|
|
86
|
+
while (i < text.length) {
|
|
87
|
+
const c = text[i];
|
|
88
|
+
if (c === ',' || c === '}' || c === ']' || isWs(c)) {
|
|
89
|
+
return i;
|
|
90
|
+
}
|
|
91
|
+
i += 1;
|
|
92
|
+
}
|
|
93
|
+
return i;
|
|
94
|
+
}
|
|
95
|
+
/** Scan the object whose `{` sits at `objStart` into a span with entry positions. */
|
|
96
|
+
export function scanObject(text, objStart) {
|
|
97
|
+
let i = skipWsAndComments(text, objStart + 1);
|
|
98
|
+
const entries = [];
|
|
99
|
+
while (i < text.length) {
|
|
100
|
+
if (text[i] === '}') {
|
|
101
|
+
return { braceStart: objStart, braceEnd: i, entries };
|
|
102
|
+
}
|
|
103
|
+
if (text[i] !== '"') {
|
|
104
|
+
throw new Error('Expected object key in JSONC');
|
|
105
|
+
}
|
|
106
|
+
const entryStart = i;
|
|
107
|
+
const keyEnd = scanString(text, i);
|
|
108
|
+
const key = JSON.parse(text.slice(entryStart, keyEnd));
|
|
109
|
+
i = skipWsAndComments(text, keyEnd);
|
|
110
|
+
if (text[i] !== ':') {
|
|
111
|
+
throw new Error('Expected colon after key in JSONC');
|
|
112
|
+
}
|
|
113
|
+
i = skipWsAndComments(text, i + 1);
|
|
114
|
+
const valueStart = i;
|
|
115
|
+
const valueEnd = scanValueEnd(text, i);
|
|
116
|
+
i = skipWsAndComments(text, valueEnd);
|
|
117
|
+
let entryEnd = valueEnd;
|
|
118
|
+
if (text[i] === ',') {
|
|
119
|
+
entryEnd = i + 1;
|
|
120
|
+
i = skipWsAndComments(text, i + 1);
|
|
121
|
+
}
|
|
122
|
+
entries.push({ key, entryStart, entryEnd, valueStart, valueEnd });
|
|
123
|
+
}
|
|
124
|
+
throw new Error('Unterminated object in JSONC');
|
|
125
|
+
}
|
|
126
|
+
/** Span of the document's root object, or null when the root is not an object. */
|
|
127
|
+
export function findTopLevelObject(text) {
|
|
128
|
+
const i = skipWsAndComments(text, 0);
|
|
129
|
+
if (i >= text.length || text[i] !== '{') {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
return scanObject(text, i);
|
|
133
|
+
}
|
|
134
|
+
/** Strip line/block comments and trailing commas so `JSON.parse` can read the rest. */
|
|
135
|
+
export function stripJsonc(text) {
|
|
136
|
+
let out = '';
|
|
137
|
+
let i = 0;
|
|
138
|
+
while (i < text.length) {
|
|
139
|
+
const ch = text[i];
|
|
140
|
+
if (ch === '"') {
|
|
141
|
+
const end = scanString(text, i);
|
|
142
|
+
out += text.slice(i, end);
|
|
143
|
+
i = end;
|
|
144
|
+
}
|
|
145
|
+
else if (ch === '/' && text[i + 1] === '/') {
|
|
146
|
+
i += 2;
|
|
147
|
+
while (i < text.length && text[i] !== '\n') {
|
|
148
|
+
i += 1;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else if (ch === '/' && text[i + 1] === '*') {
|
|
152
|
+
i += 2;
|
|
153
|
+
while (i < text.length && !(text[i] === '*' && text[i + 1] === '/')) {
|
|
154
|
+
i += 1;
|
|
155
|
+
}
|
|
156
|
+
i = Math.min(i + 2, text.length);
|
|
157
|
+
}
|
|
158
|
+
else if (ch === ',') {
|
|
159
|
+
const next = skipWsAndComments(text, i + 1);
|
|
160
|
+
if (next >= text.length || text[next] === '}' || text[next] === ']') {
|
|
161
|
+
i += 1;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
out += ch;
|
|
165
|
+
i += 1;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
out += ch;
|
|
170
|
+
i += 1;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
/** Parse JSONC text (comments + trailing commas tolerated) via JSON.parse. */
|
|
176
|
+
export function parseJsonc(text) {
|
|
177
|
+
return JSON.parse(stripJsonc(text));
|
|
178
|
+
}
|
|
179
|
+
/** Leading whitespace of the line containing `index`. */
|
|
180
|
+
function lineIndentAt(text, index) {
|
|
181
|
+
const lineStart = text.lastIndexOf('\n', index - 1) + 1;
|
|
182
|
+
let indent = '';
|
|
183
|
+
let j = lineStart;
|
|
184
|
+
while (j < text.length && (text[j] === ' ' || text[j] === '\t')) {
|
|
185
|
+
indent += text[j];
|
|
186
|
+
j += 1;
|
|
187
|
+
}
|
|
188
|
+
return indent;
|
|
189
|
+
}
|
|
190
|
+
/** Indent for entries inside `span`: the first entry's indent, or the closing brace's indent + two spaces. */
|
|
191
|
+
function entryIndent(text, span) {
|
|
192
|
+
if (span.entries.length > 0) {
|
|
193
|
+
return lineIndentAt(text, span.entries[0].entryStart);
|
|
194
|
+
}
|
|
195
|
+
return `${lineIndentAt(text, span.braceEnd)} `;
|
|
196
|
+
}
|
|
197
|
+
/** Re-indent a pretty-printed JSON block so its first line stays in place. */
|
|
198
|
+
function reindent(json, indent) {
|
|
199
|
+
const lines = json.split('\n');
|
|
200
|
+
return [lines[0], ...lines.slice(1).map((l) => indent + l)].join('\n');
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Splice one `"key": <valueJson>` entry into the object at `objStart`,
|
|
204
|
+
* preserving all surrounding text (comments included). Idempotent: when the
|
|
205
|
+
* key already exists the text is returned unchanged.
|
|
206
|
+
*/
|
|
207
|
+
export function insertObjectEntry(text, objStart, key, valueJson) {
|
|
208
|
+
const span = scanObject(text, objStart);
|
|
209
|
+
if (span.entries.some((e) => e.key === key)) {
|
|
210
|
+
return { text, changed: false };
|
|
211
|
+
}
|
|
212
|
+
const indent = entryIndent(text, span);
|
|
213
|
+
const body = reindent(`"${key}": ${valueJson}`, indent);
|
|
214
|
+
if (span.entries.length === 0) {
|
|
215
|
+
const closeIndent = lineIndentAt(text, span.braceEnd);
|
|
216
|
+
const inserted = `\n${indent}${body}\n${closeIndent}`;
|
|
217
|
+
return {
|
|
218
|
+
text: text.slice(0, span.braceStart + 1) + inserted + text.slice(span.braceEnd),
|
|
219
|
+
changed: true,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const inserted = `\n${indent}${body},`;
|
|
223
|
+
return {
|
|
224
|
+
text: text.slice(0, span.braceStart + 1) + inserted + text.slice(span.braceStart + 1),
|
|
225
|
+
changed: true,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Splice the `"key"` entry out of the object at `objStart`, keeping the rest
|
|
230
|
+
* valid (the entry's trailing comma, or the previous entry's comma for a last
|
|
231
|
+
* entry, goes with it). Idempotent: a missing key returns the text unchanged.
|
|
232
|
+
*/
|
|
233
|
+
export function removeObjectEntry(text, objStart, key) {
|
|
234
|
+
const span = scanObject(text, objStart);
|
|
235
|
+
const entry = span.entries.find((e) => e.key === key);
|
|
236
|
+
if (entry === undefined) {
|
|
237
|
+
return { text, changed: false };
|
|
238
|
+
}
|
|
239
|
+
let start = entry.entryStart;
|
|
240
|
+
let end = entry.entryEnd;
|
|
241
|
+
if (end === entry.valueEnd) {
|
|
242
|
+
let j = start - 1;
|
|
243
|
+
while (j >= 0 && isWs(text[j])) {
|
|
244
|
+
j -= 1;
|
|
245
|
+
}
|
|
246
|
+
if (j >= 0 && text[j] === ',') {
|
|
247
|
+
start = j;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
text: text.slice(0, start) + text.slice(end),
|
|
252
|
+
changed: true,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=jsonc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonc.js","sourceRoot":"","sources":["../src/jsonc.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillstate/cli",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "skillstate CLI — init | run | report.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,6 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@skillstate/core": "^2.0.0"
|
|
28
|
+
"@skillstate/core": "^2.0.0",
|
|
29
|
+
"@skillstate/mcp": "^2.0.0",
|
|
30
|
+
"@skillstate/opencode": "^2.0.0"
|
|
29
31
|
}
|
|
30
32
|
}
|