@12ui/design 0.2.90 → 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.
- package/README.md +3 -3
- package/SKILL.md +1 -1
- package/dist/agent-plugin-step.d.ts +3 -1
- package/dist/agent-plugin-step.d.ts.map +1 -1
- package/dist/agent-plugin-step.js +35 -6
- package/dist/agent-plugin-step.js.map +1 -1
- package/dist/cli-skill-command.d.ts.map +1 -1
- package/dist/cli-skill-command.js +3 -0
- package/dist/cli-skill-command.js.map +1 -1
- package/dist/codex-plugin-installer.d.ts +7 -1
- package/dist/codex-plugin-installer.d.ts.map +1 -1
- package/dist/codex-plugin-installer.js +39 -63
- package/dist/codex-plugin-installer.js.map +1 -1
- package/dist/codex-skill-config.d.ts +33 -9
- package/dist/codex-skill-config.d.ts.map +1 -1
- package/dist/codex-skill-config.js +271 -104
- package/dist/codex-skill-config.js.map +1 -1
- package/dist/codex-toml.d.ts +15 -0
- package/dist/codex-toml.d.ts.map +1 -0
- package/dist/codex-toml.js +45 -0
- package/dist/codex-toml.js.map +1 -0
- package/dist/legacy-codex-cleanup.d.ts +4 -0
- package/dist/legacy-codex-cleanup.d.ts.map +1 -1
- package/dist/legacy-codex-cleanup.js +53 -32
- package/dist/legacy-codex-cleanup.js.map +1 -1
- package/open-design.json +2 -2
- package/package.json +3 -2
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
61
|
-
|
|
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
|
|
67
|
-
|
|
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
|
|
70
|
-
if (
|
|
119
|
+
const next = verifiedEdit(source, enabledFlips(source, true), (doc) => { entryFor(doc, file).enabled = true; });
|
|
120
|
+
if (next === null)
|
|
71
121
|
return false;
|
|
72
|
-
|
|
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
|
-
/**
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
149
|
+
const file = JSON.parse(match[2]);
|
|
150
|
+
return typeof file === 'string' ? { kind: match[1], file } : null;
|
|
98
151
|
}
|
|
99
|
-
catch
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
*
|
|
107
|
-
*
|
|
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:
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
|
133
|
-
* marked block,
|
|
134
|
-
*
|
|
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
|
|
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 && !(
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
162
|
-
|
|
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"}
|
|
@@ -3,10 +3,14 @@ export type LegacyCodexCleanupResult = {
|
|
|
3
3
|
preserved: string[];
|
|
4
4
|
recovery: string[];
|
|
5
5
|
workspaceData: string;
|
|
6
|
+
/** Present when a config.toml was left untouched because the cleaned file would not be valid TOML. */
|
|
7
|
+
skipped?: string[];
|
|
6
8
|
};
|
|
7
9
|
export type RetiredCodexSkillConfigCleanupResult = {
|
|
8
10
|
removed: string[];
|
|
9
11
|
preserved: string[];
|
|
12
|
+
/** Present when a config.toml was left untouched because the cleaned file would not be valid TOML. */
|
|
13
|
+
skipped?: string[];
|
|
10
14
|
};
|
|
11
15
|
/**
|
|
12
16
|
* Remove exact Codex config registrations for renamed skills only after their
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-codex-cleanup.d.ts","sourceRoot":"","sources":["../src/legacy-codex-cleanup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"legacy-codex-cleanup.d.ts","sourceRoot":"","sources":["../src/legacy-codex-cleanup.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AA8JF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,GAAU,MAAM;IAC1D,yBAAyB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,KAAG,OAAO,CAAC,oCAAoC,CA8B/C,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAU,OAAM;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,KAAG,OAAO,CAAC,wBAAwB,CA0DxC,CAAC"}
|