@12ui/design 0.2.89 → 0.2.91

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.
@@ -1,5 +1,8 @@
1
1
  export declare const isCodexSkillEnabled: (skillDirectory: string) => Promise<boolean>;
2
+ /** Turns an installed skill's `enabled = false` entry back on. Returns whether it wrote the file. */
2
3
  export declare const enableCodexSkill: (skillDirectory: string) => Promise<boolean>;
4
+ /** The files among `skillFiles` that this home's config.toml leaves on. */
5
+ export declare const enabledCodexSkillFiles: (codexHome: string, skillFiles: readonly string[]) => Promise<string[]>;
3
6
  /**
4
7
  * The marker on every `[[skills.config]]` block `skill install` adds to switch
5
8
  * off another plugin's copy of the 12ui-design skill. Uninstall removes exactly
@@ -7,19 +10,40 @@ export declare const enableCodexSkill: (skillDirectory: string) => Promise<boole
7
10
  */
8
11
  export declare const DISABLE_BLOCK_MARKER = "# 12ui skill install: the 12ui plugin carries this skill; this copy is off.";
9
12
  /**
10
- * Adds one marked `enabled = false` block per SKILL.md that has no block yet,
11
- * so Codex lists a single 12ui-design skill. Returns the files it switched off.
13
+ * Switches off each SKILL.md that this home still lists as on, so Codex lists
14
+ * a single 12ui-design skill, in whichever shape the file keeps its skills
15
+ * list. Returns the files it switched off; a file it cannot switch off validly
16
+ * is left on and the config is not touched for it (see `enabledCodexSkillFiles`).
12
17
  *
13
- * Every byte already in the file stays where it is: each block is appended as
14
- * a blank line plus its own lines, in the file's line ending. A file that does
15
- * not end in a line break gets the block without a final one, so the removal
16
- * below gives back the exact bytes.
18
+ * Every byte already in the file stays where it is: with no skills list, or
19
+ * `[[skills.config]]` tables, a marked block is appended as a blank line plus
20
+ * its own lines, in the file's line ending; an edit inside an inline list is
21
+ * recorded by a comment line appended the same way. A file that does not end
22
+ * in a line break gets the addition without a final one, so the removal below
23
+ * gives back the exact bytes.
17
24
  */
18
25
  export declare const disableCodexSkillFiles: (codexHome: string, skillFiles: readonly string[]) => Promise<string[]>;
19
26
  /**
20
- * Removes the blocks `disableCodexSkillFiles` added, and nothing else: each
21
- * marked block, the blank line written before it and, for a file that had no
22
- * final line break, the line break written before that.
27
+ * Removes what `disableCodexSkillFiles` added, and nothing else, newest first:
28
+ * each marked block, and each recorded inline edit with its record line, along
29
+ * with the blank line written before them and, for a file that had no final
30
+ * line break, the line break written before that. When the result would not
31
+ * be valid TOML the file is left untouched and 0 is returned.
23
32
  */
24
33
  export declare const removeMarkedCodexSkillBlocks: (codexHome: string) => Promise<number>;
34
+ /** Whether this home's config.toml still carries an edit `disableCodexSkillFiles` made. */
35
+ export declare const codexSkillEditsRemain: (codexHome: string) => Promise<boolean>;
36
+ /** What `repairCodexConfig` found: a file Codex can read, one it repaired, or one it left alone. */
37
+ export type CodexConfigRepair = 'readable' | 'repaired' | 'unreadable';
38
+ /**
39
+ * Repairs the one unreadable config.toml this CLI wrote: 0.2.90 appended a
40
+ * marked `[[skills.config]]` block to homes whose skills list is an inline or
41
+ * dotted array, which TOML forbids, so Codex refused to start. Each marked
42
+ * block is taken out and its entry goes into the existing array the way
43
+ * `disableCodexSkillFiles` puts it there now (with its record line, so
44
+ * uninstall reverses it), and the file is written only when the result parses
45
+ * to exactly that document. A file that does not parse for any other reason
46
+ * is not touched.
47
+ */
48
+ export declare const repairCodexConfig: (codexHome: string) => Promise<CodexConfigRepair>;
25
49
  //# sourceMappingURL=codex-skill-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-skill-config.d.ts","sourceRoot":"","sources":["../src/codex-skill-config.ts"],"names":[],"mappings":"AAmEA,eAAO,MAAM,mBAAmB,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,OAAO,CASjF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,OAAO,CAqB9E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gFAAgF,CAAC;AAelH;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,EACjB,YAAY,SAAS,MAAM,EAAE,KAC5B,OAAO,CAAC,MAAM,EAAE,CAelB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,CAuBpF,CAAC"}
1
+ {"version":3,"file":"codex-skill-config.d.ts","sourceRoot":"","sources":["../src/codex-skill-config.ts"],"names":[],"mappings":"AAiIA,eAAO,MAAM,mBAAmB,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,OAAO,CAEjF,CAAC;AAEF,qGAAqG;AACrG,eAAO,MAAM,gBAAgB,GAAU,gBAAgB,MAAM,KAAG,OAAO,CAAC,OAAO,CAS9E,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,GAAU,WAAW,MAAM,EAAE,YAAY,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,EAAE,CAG/G,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gFAAgF,CAAC;AA6ClH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,EACjB,YAAY,SAAS,MAAM,EAAE,KAC5B,OAAO,CAAC,MAAM,EAAE,CAalB,CAAC;AAqCF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,MAAM,CA0BpF,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,qBAAqB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,OAAO,CAG9E,CAAC;AAEF,oGAAoG;AACpG,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;AAEvE;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,iBAAiB,CAiCpF,CAAC"}
@@ -1,165 +1,332 @@
1
1
  import { readFile, writeFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
+ import { isDeepStrictEqual } from 'node:util';
4
+ import { isTomlTable, parseToml } from './codex-toml.js';
5
+ /**
6
+ * Codex lists skills in `skills.config`, an array of `{ path, enabled }`
7
+ * entries. It writes that array in several shapes: `[[skills.config]]`
8
+ * tables, an inline `skills = { config = [...] }`, a dotted
9
+ * `skills.config = [...]` or `config = [...]` under `[skills]`, with bare or
10
+ * quoted keys. Every edit here is made on the text, so the user's bytes stay
11
+ * where they are, and is written only when the edited text parses to exactly
12
+ * the intended document: an edit that cannot be made validly is not made.
13
+ */
3
14
  const CONFIG_HEADER = /^\s*\[\[skills\.config\]\]\s*$/;
4
- const PATH_ENTRY = /^\s*path\s*=\s*("(?:\\.|[^"])*")\s*$/;
5
- const ENABLED_ENTRY = /^(\s*enabled\s*=\s*)(true|false)(\s*)$/;
6
15
  /** The file's own line ending: CRLF when it uses CRLF, otherwise LF. */
7
16
  const lineEnding = (source) => (source.includes('\r\n') ? '\r\n' : '\n');
8
17
  const configPathForSkill = (skillDirectory) => (path.join(path.dirname(path.dirname(skillDirectory)), 'config.toml'));
9
- const skillConfigBlocks = (lines) => {
10
- const starts = lines.flatMap((line, index) => (CONFIG_HEADER.test(line) ? [index] : []));
11
- return starts.map((start, index) => ({
12
- start,
13
- end: starts[index + 1] ?? lines.length,
14
- }));
15
- };
16
- const parseTomlString = (value) => {
17
- try {
18
- const parsed = JSON.parse(value);
19
- return typeof parsed === 'string' ? parsed : null;
20
- }
21
- catch {
18
+ /** The `skills.config` entries: [] when there are none, null when `skills` has some other shape. */
19
+ const skillEntries = (doc) => {
20
+ const skills = doc.skills;
21
+ if (skills === undefined)
22
+ return [];
23
+ if (!isTomlTable(skills))
24
+ return null;
25
+ if (skills.config === undefined)
26
+ return [];
27
+ return Array.isArray(skills.config) ? skills.config.filter(isTomlTable) : null;
28
+ };
29
+ const entryFor = (doc, file) => (skillEntries(doc)?.find((entry) => (typeof entry.path === 'string' && path.resolve(entry.path) === path.resolve(file))));
30
+ /** A table shaped like the parser's own (null prototype), so documents compare strictly. */
31
+ const table = (fields = {}) => Object.assign(Object.create(null), fields);
32
+ /** The entry list a new entry goes into, created the way TOML would create it. */
33
+ const entryList = (doc) => {
34
+ doc.skills ??= table();
35
+ const skills = doc.skills;
36
+ skills.config ??= [];
37
+ return skills.config;
38
+ };
39
+ /**
40
+ * The first candidate text that parses to `source`'s document with `change`
41
+ * applied, or null when none does (including when `source` itself does not
42
+ * parse). Candidates are cheap guesses at where an edit goes; this check is
43
+ * what makes a written edit correct.
44
+ */
45
+ const verifiedEdit = (source, candidates, change) => {
46
+ const expected = parseToml(source);
47
+ if (!expected)
22
48
  return null;
49
+ change(expected);
50
+ for (const candidate of candidates) {
51
+ const actual = parseToml(candidate);
52
+ if (actual && isDeepStrictEqual(actual, expected))
53
+ return candidate;
23
54
  }
55
+ return null;
24
56
  };
25
- const matchingBlock = (lines, skillDirectory) => {
26
- const expected = path.resolve(skillDirectory, 'SKILL.md');
27
- return skillConfigBlocks(lines).find((block) => lines
28
- .slice(block.start + 1, block.end)
29
- .some((line) => {
30
- const match = PATH_ENTRY.exec(line);
31
- const configured = match?.[1] ? parseTomlString(match[1]) : null;
32
- return configured !== null && path.resolve(configured) === expected;
33
- })) ?? null;
34
- };
35
- const readConfigLines = async (skillDirectory) => {
36
- const configPath = configPathForSkill(skillDirectory);
37
- let source;
57
+ /** Every text with one `enabled` value that is not `to` switched to `to`. */
58
+ function* enabledFlips(source, to) {
59
+ const value = /(^|[\s{,])((?:enabled|"enabled"|'enabled')\s*=\s*)(true|false)\b/gm;
60
+ for (const match of source.matchAll(value)) {
61
+ if (match[3] === String(to))
62
+ continue;
63
+ const at = match.index + match[1].length + match[2].length;
64
+ yield `${source.slice(0, at)}${to}${source.slice(at + match[3].length)}`;
65
+ }
66
+ }
67
+ /** The inline entry `skill install` writes into a `config = [...]` array. */
68
+ const inlineEntry = (file) => `{ path = ${JSON.stringify(file)}, enabled = false }`;
69
+ /** Every text with the entry inserted first in one `config = [...]` array. */
70
+ function* inlineInsertions(source, file) {
71
+ const opening = /(?:^|[\s{,.])(?:config|"config"|'config')\s*=\s*\[/gm;
72
+ for (const match of source.matchAll(opening)) {
73
+ const at = match.index + match[0].length;
74
+ const rest = source.slice(at);
75
+ const separator = rest.trimStart().startsWith(']') ? '' : /^\r?\n/.test(rest) ? ',' : ', ';
76
+ yield `${source.slice(0, at)}${inlineEntry(file)}${separator}${rest}`;
77
+ }
78
+ }
79
+ /** Every text with one `[<inline entry>` (and the separator written after it) taken back out. */
80
+ function* inlineRemovals(source, file) {
81
+ const entry = inlineEntry(file);
82
+ for (let at = source.indexOf(`[${entry}`); at !== -1; at = source.indexOf(`[${entry}`, at + 1)) {
83
+ const end = at + 1 + entry.length;
84
+ const separator = source.startsWith(', ', end) ? 2 : source.startsWith(',', end) ? 1 : 0;
85
+ yield `${source.slice(0, at + 1)}${source.slice(end + separator)}`;
86
+ }
87
+ }
88
+ /** Appends lines after a blank line, in the file's line ending, so removal gives back the exact bytes. */
89
+ const appendLines = (source, lines) => {
90
+ const eol = lineEnding(source);
91
+ const chunk = lines.join(eol);
92
+ return source !== '' && !source.endsWith('\n') ? `${source}${eol}${eol}${chunk}` : `${source}${eol}${chunk}${eol}`;
93
+ };
94
+ const readConfigSource = async (configPath) => {
38
95
  try {
39
- source = await readFile(configPath, 'utf8');
96
+ return await readFile(configPath, 'utf8');
40
97
  }
41
98
  catch (error) {
42
99
  if (error.code === 'ENOENT')
43
100
  return null;
44
101
  throw error;
45
102
  }
46
- return {
47
- configPath,
48
- lines: source.split(/\r?\n/),
49
- trailingNewline: source.endsWith('\n'),
50
- eol: lineEnding(source),
51
- };
52
- };
53
- export const isCodexSkillEnabled = async (skillDirectory) => {
54
- const config = await readConfigLines(skillDirectory);
55
- if (!config)
56
- return true;
57
- const block = matchingBlock(config.lines, skillDirectory);
58
- if (!block)
103
+ };
104
+ /** Whether Codex treats the skill as on: no entry, or an entry not set to false. A file that does not parse cannot say, so it counts as on. */
105
+ const skillEnabledIn = (source, file) => {
106
+ if (source === null)
59
107
  return true;
60
- const enabled = config.lines
61
- .slice(block.start + 1, block.end)
62
- .find((line) => ENABLED_ENTRY.test(line));
63
- return enabled ? ENABLED_ENTRY.exec(enabled)?.[2] !== 'false' : true;
108
+ const doc = parseToml(source);
109
+ return !doc || entryFor(doc, file)?.enabled !== false;
64
110
  };
111
+ export const isCodexSkillEnabled = async (skillDirectory) => (skillEnabledIn(await readConfigSource(configPathForSkill(skillDirectory)), path.join(skillDirectory, 'SKILL.md')));
112
+ /** Turns an installed skill's `enabled = false` entry back on. Returns whether it wrote the file. */
65
113
  export const enableCodexSkill = async (skillDirectory) => {
66
- const config = await readConfigLines(skillDirectory);
67
- if (!config)
114
+ const configPath = configPathForSkill(skillDirectory);
115
+ const source = await readConfigSource(configPath);
116
+ const file = path.join(skillDirectory, 'SKILL.md');
117
+ if (source === null || skillEnabledIn(source, file))
68
118
  return false;
69
- const block = matchingBlock(config.lines, skillDirectory);
70
- if (!block)
119
+ const next = verifiedEdit(source, enabledFlips(source, true), (doc) => { entryFor(doc, file).enabled = true; });
120
+ if (next === null)
71
121
  return false;
72
- const enabledIndex = config.lines.findIndex((line, index) => (index > block.start && index < block.end && ENABLED_ENTRY.test(line)));
73
- if (enabledIndex === -1) {
74
- config.lines.splice(block.end, 0, 'enabled = true');
75
- }
76
- else {
77
- const match = ENABLED_ENTRY.exec(config.lines[enabledIndex]);
78
- if (match?.[2] === 'true')
79
- return false;
80
- config.lines[enabledIndex] = `${match?.[1] ?? 'enabled = '}true${match?.[3] ?? ''}`;
81
- }
82
- const serialized = config.lines.join(config.eol);
83
- await writeFile(config.configPath, config.trailingNewline && !serialized.endsWith('\n') ? `${serialized}${config.eol}` : serialized);
122
+ await writeFile(configPath, next);
84
123
  return true;
85
124
  };
125
+ /** The files among `skillFiles` that this home's config.toml leaves on. */
126
+ export const enabledCodexSkillFiles = async (codexHome, skillFiles) => {
127
+ const source = await readConfigSource(path.join(codexHome, 'config.toml'));
128
+ return skillFiles.filter((file) => skillEnabledIn(source, file));
129
+ };
86
130
  /**
87
131
  * The marker on every `[[skills.config]]` block `skill install` adds to switch
88
132
  * off another plugin's copy of the 12ui-design skill. Uninstall removes exactly
89
133
  * the blocks that carry it.
90
134
  */
91
135
  export const DISABLE_BLOCK_MARKER = '# 12ui skill install: the 12ui plugin carries this skill; this copy is off.';
92
- /** The file's lines, each with its own line ending (the last may have none). */
93
- const splitKeepingEndings = (source) => source.match(/[^\n]*\n|[^\n]+$/g) ?? [];
94
- const withoutEnding = (line) => line.replace(/\r?\n$/, '');
95
- const readConfigSource = async (configPath) => {
136
+ /**
137
+ * The comment line recording an edit made inside the user's own skills list:
138
+ * `added` (an inline entry put first in a `config = [...]` array) or `flipped`
139
+ * (an existing entry's `enabled = true` set to false). Uninstall reverses
140
+ * exactly that edit.
141
+ */
142
+ const RECORD = /^# 12ui skill install: the 12ui plugin carries this skill; this copy is off \((added|flipped)\): (".*")$/;
143
+ const record = (kind, file) => (`# 12ui skill install: the 12ui plugin carries this skill; this copy is off (${kind}): ${JSON.stringify(file)}`);
144
+ const readRecord = (line) => {
145
+ const match = RECORD.exec(line.replace(/\r?\n$/, ''));
146
+ if (!match)
147
+ return null;
96
148
  try {
97
- return await readFile(configPath, 'utf8');
149
+ const file = JSON.parse(match[2]);
150
+ return typeof file === 'string' ? { kind: match[1], file } : null;
98
151
  }
99
- catch (error) {
100
- if (error.code === 'ENOENT')
101
- return null;
102
- throw error;
152
+ catch {
153
+ return null;
154
+ }
155
+ };
156
+ /** One file switched off in `source`: the new text, 'off' when it already is, null when no valid edit exists. */
157
+ const disableIn = (source, file) => {
158
+ const doc = parseToml(source);
159
+ if (!doc || skillEntries(doc) === null)
160
+ return null;
161
+ const existing = entryFor(doc, file);
162
+ if (existing?.enabled === false)
163
+ return 'off';
164
+ if (existing) {
165
+ return verifiedEdit(source, [...enabledFlips(source, false)].map((text) => appendLines(text, [record('flipped', file)])), (expected) => { entryFor(expected, file).enabled = false; });
103
166
  }
167
+ const block = appendLines(source, [DISABLE_BLOCK_MARKER, '[[skills.config]]', `path = ${JSON.stringify(file)}`, 'enabled = false']);
168
+ return verifiedEdit(source, [block], (expected) => { entryList(expected).push(table({ path: file, enabled: false })); })
169
+ ?? verifiedEdit(source, [...inlineInsertions(source, file)].map((text) => appendLines(text, [record('added', file)])), (expected) => { entryList(expected).unshift(table({ path: file, enabled: false })); });
104
170
  };
105
171
  /**
106
- * Adds one marked `enabled = false` block per SKILL.md that has no block yet,
107
- * so Codex lists a single 12ui-design skill. Returns the files it switched off.
172
+ * Switches off each SKILL.md that this home still lists as on, so Codex lists
173
+ * a single 12ui-design skill, in whichever shape the file keeps its skills
174
+ * list. Returns the files it switched off; a file it cannot switch off validly
175
+ * is left on and the config is not touched for it (see `enabledCodexSkillFiles`).
108
176
  *
109
- * Every byte already in the file stays where it is: each block is appended as
110
- * a blank line plus its own lines, in the file's line ending. A file that does
111
- * not end in a line break gets the block without a final one, so the removal
112
- * below gives back the exact bytes.
177
+ * Every byte already in the file stays where it is: with no skills list, or
178
+ * `[[skills.config]]` tables, a marked block is appended as a blank line plus
179
+ * its own lines, in the file's line ending; an edit inside an inline list is
180
+ * recorded by a comment line appended the same way. A file that does not end
181
+ * in a line break gets the addition without a final one, so the removal below
182
+ * gives back the exact bytes.
113
183
  */
114
184
  export const disableCodexSkillFiles = async (codexHome, skillFiles) => {
115
185
  const configPath = path.join(codexHome, 'config.toml');
116
186
  const source = await readConfigSource(configPath) ?? '';
117
- const lines = source.split(/\r?\n/);
118
- const added = skillFiles.filter((file) => !matchingBlock(lines, path.dirname(file)));
119
- if (added.length === 0)
120
- return [];
121
- const eol = lineEnding(source);
122
- const open = source !== '' && !source.endsWith('\n');
123
187
  let next = source;
124
- for (const file of added) {
125
- const block = [DISABLE_BLOCK_MARKER, '[[skills.config]]', `path = ${JSON.stringify(file)}`, 'enabled = false'].join(eol);
126
- next = open ? `${next}${eol}${eol}${block}` : `${next}${eol}${block}${eol}`;
188
+ const disabled = [];
189
+ for (const file of skillFiles) {
190
+ const edited = disableIn(next, file);
191
+ if (edited === null || edited === 'off')
192
+ continue;
193
+ next = edited;
194
+ disabled.push(file);
127
195
  }
128
- await writeFile(configPath, next);
129
- return added;
196
+ if (disabled.length > 0)
197
+ await writeFile(configPath, next);
198
+ return disabled;
199
+ };
200
+ /** The file's lines, each with its own line ending (the last may have none). */
201
+ const splitKeepingEndings = (source) => source.match(/[^\n]*\n|[^\n]+$/g) ?? [];
202
+ const withoutEnding = (line) => line.replace(/\r?\n$/, '');
203
+ const isBlockMarker = (lines, index) => (withoutEnding(lines[index]) === DISABLE_BLOCK_MARKER && CONFIG_HEADER.test(withoutEnding(lines[index + 1] ?? '')));
204
+ /** Takes out lines [marker, end) plus the blank line and line break `appendLines` wrote before them. */
205
+ const removeAppended = (lines, marker, end) => {
206
+ const start = marker > 0 && withoutEnding(lines[marker - 1]) === '' ? marker - 1 : marker;
207
+ const lastLine = lines[end - 1];
208
+ const kept = [...lines.slice(0, start), ...lines.slice(end)];
209
+ if (!lastLine.endsWith('\n') && start > 0 && start === kept.length) {
210
+ kept[start - 1] = withoutEnding(kept[start - 1]);
211
+ }
212
+ return kept;
213
+ };
214
+ /** The text with one recorded inline edit reversed, or null when it cannot be reversed validly. */
215
+ const reverseRecorded = (source, kind, file) => {
216
+ const doc = parseToml(source);
217
+ if (!doc)
218
+ return null;
219
+ const entry = entryFor(doc, file);
220
+ // The user already undid or rewrote the edit: only the record goes.
221
+ if (!entry || (kind === 'added' && !source.includes(`[${inlineEntry(file)}`))
222
+ || (kind === 'flipped' && entry.enabled !== false))
223
+ return source;
224
+ return kind === 'added'
225
+ ? verifiedEdit(source, inlineRemovals(source, file), (expected) => {
226
+ const list = expected.skills.config;
227
+ list.splice(list.indexOf(entryFor(expected, file)), 1);
228
+ })
229
+ : verifiedEdit(source, enabledFlips(source, true), (expected) => { entryFor(expected, file).enabled = true; });
130
230
  };
131
231
  /**
132
- * Removes the blocks `disableCodexSkillFiles` added, and nothing else: each
133
- * marked block, the blank line written before it and, for a file that had no
134
- * final line break, the line break written before that.
232
+ * Removes what `disableCodexSkillFiles` added, and nothing else, newest first:
233
+ * each marked block, and each recorded inline edit with its record line, along
234
+ * with the blank line written before them and, for a file that had no final
235
+ * line break, the line break written before that. When the result would not
236
+ * be valid TOML the file is left untouched and 0 is returned.
135
237
  */
136
238
  export const removeMarkedCodexSkillBlocks = async (codexHome) => {
137
239
  const configPath = path.join(codexHome, 'config.toml');
138
240
  const source = await readConfigSource(configPath);
139
241
  if (source === null)
140
242
  return 0;
141
- let lines = splitKeepingEndings(source);
243
+ let text = source;
142
244
  let removed = 0;
143
245
  for (;;) {
246
+ const lines = splitKeepingEndings(text);
144
247
  let marker = lines.length - 1;
145
- while (marker >= 0 && !(withoutEnding(lines[marker]) === DISABLE_BLOCK_MARKER
146
- && CONFIG_HEADER.test(withoutEnding(lines[marker + 1] ?? ''))))
248
+ while (marker >= 0 && !isBlockMarker(lines, marker) && !readRecord(lines[marker]))
147
249
  marker -= 1;
148
250
  if (marker === -1)
149
251
  break;
150
- let end = marker + 2;
151
- while (end < lines.length && withoutEnding(lines[end]).trim() !== '' && !lines[end].startsWith('['))
152
- end += 1;
153
- const start = marker > 0 && withoutEnding(lines[marker - 1]) === '' ? marker - 1 : marker;
154
- const lastLine = lines[end - 1];
155
- lines = [...lines.slice(0, start), ...lines.slice(end)];
156
- if (!lastLine.endsWith('\n') && start > 0 && start === lines.length) {
157
- lines[start - 1] = withoutEnding(lines[start - 1]);
252
+ const recorded = readRecord(lines[marker]);
253
+ if (recorded) {
254
+ const reversed = reverseRecorded(removeAppended(lines, marker, marker + 1).join(''), recorded.kind, recorded.file);
255
+ if (reversed === null)
256
+ return 0;
257
+ text = reversed;
258
+ }
259
+ else {
260
+ let end = marker + 2;
261
+ while (end < lines.length && withoutEnding(lines[end]).trim() !== '' && !lines[end].startsWith('['))
262
+ end += 1;
263
+ text = removeAppended(lines, marker, end).join('');
158
264
  }
159
265
  removed += 1;
160
266
  }
161
- if (removed > 0)
162
- await writeFile(configPath, lines.join(''));
267
+ if (removed === 0 || parseToml(text) === null)
268
+ return 0;
269
+ await writeFile(configPath, text);
163
270
  return removed;
164
271
  };
272
+ /** Whether this home's config.toml still carries an edit `disableCodexSkillFiles` made. */
273
+ export const codexSkillEditsRemain = async (codexHome) => {
274
+ const lines = splitKeepingEndings(await readConfigSource(path.join(codexHome, 'config.toml')) ?? '');
275
+ return lines.some((line, index) => isBlockMarker(lines, index) || readRecord(line) !== null);
276
+ };
277
+ /**
278
+ * Repairs the one unreadable config.toml this CLI wrote: 0.2.90 appended a
279
+ * marked `[[skills.config]]` block to homes whose skills list is an inline or
280
+ * dotted array, which TOML forbids, so Codex refused to start. Each marked
281
+ * block is taken out and its entry goes into the existing array the way
282
+ * `disableCodexSkillFiles` puts it there now (with its record line, so
283
+ * uninstall reverses it), and the file is written only when the result parses
284
+ * to exactly that document. A file that does not parse for any other reason
285
+ * is not touched.
286
+ */
287
+ export const repairCodexConfig = async (codexHome) => {
288
+ const configPath = path.join(codexHome, 'config.toml');
289
+ const source = await readConfigSource(configPath);
290
+ if (source === null || parseToml(source) !== null)
291
+ return 'readable';
292
+ let text = source;
293
+ const files = [];
294
+ for (;;) {
295
+ const lines = splitKeepingEndings(text);
296
+ let marker = lines.length - 1;
297
+ while (marker >= 0 && !isBlockMarker(lines, marker))
298
+ marker -= 1;
299
+ if (marker === -1)
300
+ break;
301
+ let end = marker + 2;
302
+ while (end < lines.length && withoutEnding(lines[end]).trim() !== '' && !lines[end].startsWith('['))
303
+ end += 1;
304
+ const [entry] = skillEntries(parseToml(lines.slice(marker + 1, end).join('')) ?? {}) ?? [];
305
+ if (typeof entry?.path !== 'string' || entry.enabled !== false)
306
+ return 'unreadable';
307
+ files.unshift(entry.path);
308
+ text = removeAppended(lines, marker, end).join('');
309
+ }
310
+ const stripped = parseToml(text);
311
+ if (files.length === 0 || !stripped || !Array.isArray(stripped.skills?.config))
312
+ return 'unreadable';
313
+ const intended = stripped;
314
+ for (const file of files) {
315
+ const edited = disableIn(text, file);
316
+ if (edited === null)
317
+ return 'unreadable';
318
+ if (edited !== 'off')
319
+ text = edited;
320
+ const existing = entryFor(intended, file);
321
+ if (existing)
322
+ existing.enabled = false;
323
+ else
324
+ entryList(intended).unshift(table({ path: file, enabled: false }));
325
+ }
326
+ const repaired = parseToml(text);
327
+ if (!repaired || !isDeepStrictEqual(repaired, intended))
328
+ return 'unreadable';
329
+ await writeFile(configPath, text);
330
+ return 'repaired';
331
+ };
165
332
  //# sourceMappingURL=codex-skill-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-skill-config.js","sourceRoot":"","sources":["../src/codex-skill-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-skill-config.js","sourceRoot":"","sources":["../src/codex-skill-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type TomlTable = Record<string, unknown>;
2
+ /** Whether a parsed value is a table (not an array, a date or a scalar). */
3
+ export declare const isTomlTable: (value: unknown) => value is TomlTable;
4
+ /** The parsed document, or null when the text is not valid TOML. */
5
+ export declare const parseToml: (source: string) => TomlTable | null;
6
+ /**
7
+ * A `[table]` or `[[array.of.tables]]` header line read as key segments, with
8
+ * bare and quoted keys alike (`[plugins."x"]`, `["plugins"."x"]` and
9
+ * `['plugins'."x"]` are one table), or null for any other line.
10
+ */
11
+ export declare const tomlHeader: (line: string) => {
12
+ array: boolean;
13
+ keys: string[];
14
+ } | null;
15
+ //# sourceMappingURL=codex-toml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-toml.d.ts","sourceRoot":"","sources":["../src/codex-toml.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,4EAA4E;AAC5E,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAErD,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,KAAG,SAAS,GAAG,IAMtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAiB9E,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { parse } from 'smol-toml';
2
+ /** Whether a parsed value is a table (not an array, a date or a scalar). */
3
+ export const isTomlTable = (value) => (typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date));
4
+ /** The parsed document, or null when the text is not valid TOML. */
5
+ export const parseToml = (source) => {
6
+ try {
7
+ return parse(source);
8
+ }
9
+ catch {
10
+ return null;
11
+ }
12
+ };
13
+ /**
14
+ * A `[table]` or `[[array.of.tables]]` header line read as key segments, with
15
+ * bare and quoted keys alike (`[plugins."x"]`, `["plugins"."x"]` and
16
+ * `['plugins'."x"]` are one table), or null for any other line.
17
+ */
18
+ export const tomlHeader = (line) => {
19
+ const header = /^\s*\[(\[?)\s*(.+?)\s*\](\]?)\s*(?:#.*)?$/.exec(line);
20
+ if (!header || header[1].length !== header[3].length)
21
+ return null;
22
+ const keys = [];
23
+ const key = /\s*(?:"((?:[^"\\]|\\.)*)"|'([^']*)'|([A-Za-z0-9_-]+))\s*(\.|$)/y;
24
+ const body = header[2];
25
+ while (key.lastIndex < body.length) {
26
+ const match = key.exec(body);
27
+ if (!match)
28
+ return null;
29
+ if (match[1] !== undefined) {
30
+ try {
31
+ keys.push(JSON.parse(`"${match[1]}"`));
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ else {
38
+ keys.push(match[2] ?? match[3]);
39
+ }
40
+ if (match[4] === '')
41
+ break;
42
+ }
43
+ return keys.length > 0 ? { array: header[1] === '[', keys } : null;
44
+ };
45
+ //# sourceMappingURL=codex-toml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-toml.js","sourceRoot":"","sources":["../src/codex-toml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAIlC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsB,EAAE,CAAC,CACjE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,CACjG,CAAC;AAEF,oEAAoE;AACpE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAoB,EAAE;IAC5D,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,MAAM,CAAc,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAA6C,EAAE;IACpF,MAAM,MAAM,GAAG,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACpE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,iEAAiE,CAAC;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IACxB,OAAO,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAW,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;QAClF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,MAAM;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC,CAAC"}