@aipper/aiws 0.0.42 → 0.0.44
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/package.json +2 -2
- package/dist/codex-prompts.d.ts +0 -17
- package/dist/codex-prompts.js +0 -49
- package/dist/codex-prompts.js.map +0 -1
- package/dist/codex-skills.d.ts +0 -17
- package/dist/codex-skills.js +0 -75
- package/dist/codex-skills.js.map +0 -1
- package/dist/commands/codex-install-prompts.d.ts +0 -4
- package/dist/commands/codex-install-prompts.js +0 -68
- package/dist/commands/codex-install-prompts.js.map +0 -1
- package/dist/commands/codex-install-skills.d.ts +0 -4
- package/dist/commands/codex-install-skills.js +0 -74
- package/dist/commands/codex-install-skills.js.map +0 -1
- package/dist/commands/codex-status-prompts.d.ts +0 -4
- package/dist/commands/codex-status-prompts.js +0 -44
- package/dist/commands/codex-status-prompts.js.map +0 -1
- package/dist/commands/codex-status-skills.d.ts +0 -4
- package/dist/commands/codex-status-skills.js +0 -54
- package/dist/commands/codex-status-skills.js.map +0 -1
- package/dist/commands/codex-uninstall-prompts.d.ts +0 -4
- package/dist/commands/codex-uninstall-prompts.js +0 -51
- package/dist/commands/codex-uninstall-prompts.js.map +0 -1
- package/dist/commands/codex-uninstall-skills.d.ts +0 -4
- package/dist/commands/codex-uninstall-skills.js +0 -59
- package/dist/commands/codex-uninstall-skills.js.map +0 -1
- package/dist/hooks/deploy-claude.d.ts +0 -13
- package/dist/hooks/deploy-claude.js +0 -67
- package/dist/hooks/deploy-claude.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aipper/aiws",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.44",
|
|
4
4
|
"description": "AI Workspace CLI (init/update/validate) for Claude Code / OpenCode / Codex.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"aiws": "./bin/aiws.js"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"@aipper/aiws-spec": "0.0.
|
|
10
|
+
"@aipper/aiws-spec": "0.0.44"
|
|
11
11
|
},
|
|
12
12
|
"files": [
|
|
13
13
|
"bin",
|
package/dist/codex-prompts.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export declare function resolveCodexPromptsDir(dirOption?: string): string;
|
|
2
|
-
export declare function codexBackupStamp(): string;
|
|
3
|
-
export declare function codexBackupPathFor(promptsDir: string, filename: string, stamp?: string): string;
|
|
4
|
-
export interface TemplateCodexPrompt {
|
|
5
|
-
rel: string;
|
|
6
|
-
filename: string;
|
|
7
|
-
name: string;
|
|
8
|
-
blockId: string;
|
|
9
|
-
srcAbs: string;
|
|
10
|
-
templateText: string;
|
|
11
|
-
innerText: string;
|
|
12
|
-
}
|
|
13
|
-
export interface TemplateRef {
|
|
14
|
-
templateId: string;
|
|
15
|
-
templateDir: string;
|
|
16
|
-
}
|
|
17
|
-
export declare function listTemplateCodexPrompts(tpl: TemplateRef): Promise<TemplateCodexPrompt[]>;
|
package/dist/codex-prompts.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import os from "node:os";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { listFilesRecursive, readText } from "./fs.js";
|
|
4
|
-
import { normalizeNewlines } from "./hash.js";
|
|
5
|
-
import { extractTemplateBlock } from "./managed-blocks.js";
|
|
6
|
-
import { UserError } from "./errors.js";
|
|
7
|
-
export function resolveCodexPromptsDir(dirOption) {
|
|
8
|
-
if (dirOption)
|
|
9
|
-
return path.resolve(dirOption);
|
|
10
|
-
const envHome = String(process.env.CODEX_HOME || "").trim();
|
|
11
|
-
if (envHome)
|
|
12
|
-
return path.join(path.resolve(envHome), "prompts");
|
|
13
|
-
return path.join(os.homedir(), ".codex", "prompts");
|
|
14
|
-
}
|
|
15
|
-
function timestamp() {
|
|
16
|
-
const d = new Date();
|
|
17
|
-
return d.toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z").replace("T", "-");
|
|
18
|
-
}
|
|
19
|
-
export function codexBackupStamp() {
|
|
20
|
-
return timestamp();
|
|
21
|
-
}
|
|
22
|
-
export function codexBackupPathFor(promptsDir, filename, stamp) {
|
|
23
|
-
return path.join(promptsDir, ".aiws", "backups", "codex-prompts", stamp || timestamp(), filename);
|
|
24
|
-
}
|
|
25
|
-
export async function listTemplateCodexPrompts(tpl) {
|
|
26
|
-
const relFiles = await listFilesRecursive(tpl.templateDir, ".codex/prompts");
|
|
27
|
-
const promptFiles = relFiles
|
|
28
|
-
.filter((rel) => rel.startsWith(".codex/prompts/"))
|
|
29
|
-
.filter((rel) => rel.split("/").length === 3)
|
|
30
|
-
.filter((rel) => rel.toLowerCase().endsWith(".md"));
|
|
31
|
-
if (promptFiles.length === 0) {
|
|
32
|
-
throw new UserError(`Template has no Codex prompt files: ${tpl.templateId}`, {
|
|
33
|
-
details: `Missing under: ${path.join(tpl.templateDir, ".codex", "prompts")}`,
|
|
34
|
-
exitCode: 1,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
const out = [];
|
|
38
|
-
for (const rel of promptFiles) {
|
|
39
|
-
const filename = path.posix.basename(rel);
|
|
40
|
-
const name = filename.replace(/\.md$/i, "");
|
|
41
|
-
const blockId = `codex:${name}`;
|
|
42
|
-
const srcAbs = path.join(tpl.templateDir, ...rel.split("/"));
|
|
43
|
-
const templateText = normalizeNewlines(await readText(srcAbs));
|
|
44
|
-
const { innerText } = extractTemplateBlock(templateText, blockId);
|
|
45
|
-
out.push({ rel, filename, name, blockId, srcAbs, templateText, innerText });
|
|
46
|
-
}
|
|
47
|
-
return out;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=codex-prompts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-prompts.js","sourceRoot":"","sources":["../src/codex-prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/codex-skills.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export declare function resolveCodexSkillsDir(dirOption?: string): string;
|
|
2
|
-
export declare function codexSkillsBackupStamp(): string;
|
|
3
|
-
export declare function codexSkillsBackupPathFor(skillsDir: string, skillName: string, stamp?: string): string;
|
|
4
|
-
export interface TemplateCodexSkill {
|
|
5
|
-
rel: string;
|
|
6
|
-
skillName: string;
|
|
7
|
-
blockId: string;
|
|
8
|
-
srcAbs: string;
|
|
9
|
-
templateText: string;
|
|
10
|
-
managedText: string;
|
|
11
|
-
innerText: string;
|
|
12
|
-
}
|
|
13
|
-
export interface TemplateRef {
|
|
14
|
-
templateId: string;
|
|
15
|
-
templateDir: string;
|
|
16
|
-
}
|
|
17
|
-
export declare function listTemplateCodexSkills(tpl: TemplateRef): Promise<TemplateCodexSkill[]>;
|
package/dist/codex-skills.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import os from "node:os";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { listFilesRecursive, readText } from "./fs.js";
|
|
4
|
-
import { normalizeNewlines } from "./hash.js";
|
|
5
|
-
import { UserError } from "./errors.js";
|
|
6
|
-
export function resolveCodexSkillsDir(dirOption) {
|
|
7
|
-
if (dirOption)
|
|
8
|
-
return path.resolve(dirOption);
|
|
9
|
-
const envHome = String(process.env.CODEX_HOME || "").trim();
|
|
10
|
-
if (envHome)
|
|
11
|
-
return path.join(path.resolve(envHome), ".agents", "skills");
|
|
12
|
-
return path.join(os.homedir(), ".agents", "skills");
|
|
13
|
-
}
|
|
14
|
-
function timestamp() {
|
|
15
|
-
const d = new Date();
|
|
16
|
-
return d.toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z").replace("T", "-");
|
|
17
|
-
}
|
|
18
|
-
export function codexSkillsBackupStamp() {
|
|
19
|
-
return timestamp();
|
|
20
|
-
}
|
|
21
|
-
export function codexSkillsBackupPathFor(skillsDir, skillName, stamp) {
|
|
22
|
-
return path.join(skillsDir, ".aiws", "backups", "codex-skills", stamp || timestamp(), skillName, "SKILL.md");
|
|
23
|
-
}
|
|
24
|
-
function splitYamlFrontMatter(text) {
|
|
25
|
-
const t = normalizeNewlines(text);
|
|
26
|
-
const lines = t.split("\n");
|
|
27
|
-
if ((lines[0] ?? "") !== "---") {
|
|
28
|
-
throw new UserError("Invalid SKILL.md: missing YAML front matter at top", { exitCode: 1 });
|
|
29
|
-
}
|
|
30
|
-
let end = -1;
|
|
31
|
-
for (let i = 1; i < lines.length; i++) {
|
|
32
|
-
if ((lines[i] ?? "") === "---") {
|
|
33
|
-
end = i;
|
|
34
|
-
break;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (end === -1) {
|
|
38
|
-
throw new UserError("Invalid SKILL.md: YAML front matter not closed", { exitCode: 1 });
|
|
39
|
-
}
|
|
40
|
-
const frontMatter = `${lines.slice(0, end + 1).join("\n")}\n`;
|
|
41
|
-
const body = lines.slice(end + 1).join("\n");
|
|
42
|
-
return { frontMatter, body };
|
|
43
|
-
}
|
|
44
|
-
export async function listTemplateCodexSkills(tpl) {
|
|
45
|
-
const relFiles = await listFilesRecursive(tpl.templateDir, ".agents/skills");
|
|
46
|
-
const skillFiles = relFiles
|
|
47
|
-
.filter((rel) => rel.startsWith(".agents/skills/"))
|
|
48
|
-
.filter((rel) => rel.split("/").length === 4)
|
|
49
|
-
.filter((rel) => rel.toLowerCase().endsWith("/skill.md"));
|
|
50
|
-
if (skillFiles.length === 0) {
|
|
51
|
-
throw new UserError(`Template has no Codex skills: ${tpl.templateId}`, {
|
|
52
|
-
details: `Missing under: ${path.join(tpl.templateDir, ".agents", "skills")}`,
|
|
53
|
-
exitCode: 1,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
const out = [];
|
|
57
|
-
for (const rel of skillFiles) {
|
|
58
|
-
const parts = rel.split("/");
|
|
59
|
-
const skillName = parts[2] ?? "";
|
|
60
|
-
if (!skillName)
|
|
61
|
-
continue;
|
|
62
|
-
const blockId = `codex-skill:${skillName}`;
|
|
63
|
-
const srcAbs = path.join(tpl.templateDir, ...rel.split("/"));
|
|
64
|
-
const templateText = normalizeNewlines(await readText(srcAbs));
|
|
65
|
-
const { frontMatter, body } = splitYamlFrontMatter(templateText);
|
|
66
|
-
const innerTextRaw = normalizeNewlines(body);
|
|
67
|
-
const innerText = innerTextRaw.endsWith("\n") ? innerTextRaw : `${innerTextRaw}\n`;
|
|
68
|
-
const begin = `<!-- AIWS_MANAGED_BEGIN:${blockId} -->`;
|
|
69
|
-
const end = `<!-- AIWS_MANAGED_END:${blockId} -->`;
|
|
70
|
-
const managedText = `${frontMatter}\n${begin}\n${innerText}${end}\n`;
|
|
71
|
-
out.push({ rel, skillName, blockId, srcAbs, templateText, managedText, innerText });
|
|
72
|
-
}
|
|
73
|
-
return out;
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=codex-skills.js.map
|
package/dist/codex-skills.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-skills.js","sourceRoot":"","sources":["../src/codex-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { loadTemplate } from "../spec.js";
|
|
3
|
-
import { UserError } from "../errors.js";
|
|
4
|
-
import { copyFile, ensureDir, pathExists, readText, writeText } from "../fs.js";
|
|
5
|
-
import { normalizeNewlines } from "../hash.js";
|
|
6
|
-
import { findManagedBlock, upsertManagedBlock } from "../managed-blocks.js";
|
|
7
|
-
import { codexBackupPathFor, codexBackupStamp, listTemplateCodexPrompts, resolveCodexPromptsDir } from "../codex-prompts.js";
|
|
8
|
-
/**
|
|
9
|
-
* @param {{ templateId: string, promptsDir?: string, force?: boolean, dryRun?: boolean }} options
|
|
10
|
-
*/
|
|
11
|
-
export async function codexInstallPromptsCommand(options) {
|
|
12
|
-
const templateId = String(options.templateId || "workspace");
|
|
13
|
-
const tpl = await loadTemplate(templateId);
|
|
14
|
-
const promptsDir = resolveCodexPromptsDir(options.promptsDir);
|
|
15
|
-
const dryRun = options.dryRun === true;
|
|
16
|
-
if (!dryRun)
|
|
17
|
-
await ensureDir(promptsDir);
|
|
18
|
-
const promptFiles = await listTemplateCodexPrompts(tpl);
|
|
19
|
-
/** @type {string[]} */
|
|
20
|
-
const created = [];
|
|
21
|
-
/** @type {string[]} */
|
|
22
|
-
const updated = [];
|
|
23
|
-
/** @type {string[]} */
|
|
24
|
-
const overwritten = [];
|
|
25
|
-
let backupStamp = "";
|
|
26
|
-
for (const pf of promptFiles) {
|
|
27
|
-
const { filename, blockId, templateText, innerText } = pf;
|
|
28
|
-
const destAbs = path.join(promptsDir, filename);
|
|
29
|
-
if (!(await pathExists(destAbs))) {
|
|
30
|
-
if (!dryRun)
|
|
31
|
-
await writeText(destAbs, templateText);
|
|
32
|
-
created.push(filename);
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
const currentText = normalizeNewlines(await readText(destAbs));
|
|
36
|
-
const existingBlock = findManagedBlock(currentText, blockId);
|
|
37
|
-
if (!existingBlock) {
|
|
38
|
-
if (!options.force) {
|
|
39
|
-
throw new UserError("Codex prompt file exists and is not AIWS-managed; refusing to overwrite.", {
|
|
40
|
-
details: `File: ${destAbs}\nHint: re-run with --force to overwrite (a backup will be created).`,
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
if (!backupStamp)
|
|
44
|
-
backupStamp = codexBackupStamp();
|
|
45
|
-
const backup = codexBackupPathFor(promptsDir, filename, backupStamp);
|
|
46
|
-
if (!dryRun) {
|
|
47
|
-
await copyFile(destAbs, backup);
|
|
48
|
-
await writeText(destAbs, templateText);
|
|
49
|
-
}
|
|
50
|
-
overwritten.push(filename);
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
const res = upsertManagedBlock(currentText, blockId, innerText, { insertIfMissing: false });
|
|
54
|
-
if (res.changed) {
|
|
55
|
-
if (!dryRun)
|
|
56
|
-
await writeText(destAbs, res.nextText);
|
|
57
|
-
updated.push(filename);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
console.log(`${dryRun ? "✓ (dry-run)" : "✓"} aiws codex install-prompts: ${promptsDir}`);
|
|
61
|
-
if (created.length > 0)
|
|
62
|
-
console.log(`created: ${created.join(", ")}`);
|
|
63
|
-
if (updated.length > 0)
|
|
64
|
-
console.log(`updated: ${updated.join(", ")}`);
|
|
65
|
-
if (overwritten.length > 0)
|
|
66
|
-
console.log(`overwritten: ${overwritten.join(", ")}`);
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=codex-install-prompts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-install-prompts.js","sourceRoot":"","sources":["../../src/commands/codex-install-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { loadTemplate } from "../spec.js";
|
|
4
|
-
import { UserError } from "../errors.js";
|
|
5
|
-
import { copyFile, ensureDir, pathExists, readText, writeText } from "../fs.js";
|
|
6
|
-
import { normalizeNewlines } from "../hash.js";
|
|
7
|
-
import { findManagedBlock, upsertManagedBlock } from "../managed-blocks.js";
|
|
8
|
-
import { codexSkillsBackupPathFor, codexSkillsBackupStamp, listTemplateCodexSkills, resolveCodexSkillsDir } from "../codex-skills.js";
|
|
9
|
-
/**
|
|
10
|
-
* @param {{ templateId: string, skillsDir?: string, force?: boolean, dryRun?: boolean }} options
|
|
11
|
-
*/
|
|
12
|
-
export async function codexInstallSkillsCommand(options) {
|
|
13
|
-
const templateId = String(options.templateId || "workspace");
|
|
14
|
-
const tpl = await loadTemplate(templateId);
|
|
15
|
-
const skillsDir = resolveCodexSkillsDir(options.skillsDir);
|
|
16
|
-
const dryRun = options.dryRun === true;
|
|
17
|
-
if (!dryRun)
|
|
18
|
-
await ensureDir(skillsDir);
|
|
19
|
-
const skillsDirIsSymlink = await fs
|
|
20
|
-
.lstat(skillsDir)
|
|
21
|
-
.then((st) => st.isSymbolicLink())
|
|
22
|
-
.catch(() => false);
|
|
23
|
-
const skillsDirReal = skillsDirIsSymlink ? await fs.realpath(skillsDir).catch(() => skillsDir) : skillsDir;
|
|
24
|
-
const skillFiles = await listTemplateCodexSkills(tpl);
|
|
25
|
-
/** @type {string[]} */
|
|
26
|
-
const created = [];
|
|
27
|
-
/** @type {string[]} */
|
|
28
|
-
const updated = [];
|
|
29
|
-
/** @type {string[]} */
|
|
30
|
-
const overwritten = [];
|
|
31
|
-
let backupStamp = "";
|
|
32
|
-
for (const sf of skillFiles) {
|
|
33
|
-
const destAbs = path.join(skillsDir, sf.skillName, "SKILL.md");
|
|
34
|
-
if (!(await pathExists(destAbs))) {
|
|
35
|
-
if (!dryRun)
|
|
36
|
-
await writeText(destAbs, sf.managedText);
|
|
37
|
-
created.push(sf.skillName);
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
const currentText = normalizeNewlines(await readText(destAbs));
|
|
41
|
-
const existingBlock = findManagedBlock(currentText, sf.blockId);
|
|
42
|
-
if (!existingBlock) {
|
|
43
|
-
if (!options.force) {
|
|
44
|
-
throw new UserError("Codex skill exists and is not AIWS-managed; refusing to overwrite.", {
|
|
45
|
-
details: `File: ${destAbs}\nHint: re-run with --force to overwrite (a backup will be created).`,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
if (!backupStamp)
|
|
49
|
-
backupStamp = codexSkillsBackupStamp();
|
|
50
|
-
const backup = codexSkillsBackupPathFor(skillsDir, sf.skillName, backupStamp);
|
|
51
|
-
if (!dryRun) {
|
|
52
|
-
await copyFile(destAbs, backup);
|
|
53
|
-
await writeText(destAbs, sf.managedText);
|
|
54
|
-
}
|
|
55
|
-
overwritten.push(sf.skillName);
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
const res = upsertManagedBlock(currentText, sf.blockId, sf.innerText, { insertIfMissing: false });
|
|
59
|
-
if (res.changed) {
|
|
60
|
-
if (!dryRun)
|
|
61
|
-
await writeText(destAbs, res.nextText);
|
|
62
|
-
updated.push(sf.skillName);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
const header = skillsDirIsSymlink && skillsDirReal !== skillsDir ? `${skillsDir} -> ${skillsDirReal}` : skillsDir;
|
|
66
|
-
console.log(`${dryRun ? "✓ (dry-run)" : "✓"} aiws codex install-skills: ${header}`);
|
|
67
|
-
if (created.length > 0)
|
|
68
|
-
console.log(`created: ${created.join(", ")}`);
|
|
69
|
-
if (updated.length > 0)
|
|
70
|
-
console.log(`updated: ${updated.join(", ")}`);
|
|
71
|
-
if (overwritten.length > 0)
|
|
72
|
-
console.log(`overwritten: ${overwritten.join(", ")}`);
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=codex-install-skills.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-install-skills.js","sourceRoot":"","sources":["../../src/commands/codex-install-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { loadTemplate } from "../spec.js";
|
|
3
|
-
import { normalizeNewlines } from "../hash.js";
|
|
4
|
-
import { findManagedBlock } from "../managed-blocks.js";
|
|
5
|
-
import { pathExists, readText } from "../fs.js";
|
|
6
|
-
import { listTemplateCodexPrompts, resolveCodexPromptsDir } from "../codex-prompts.js";
|
|
7
|
-
/**
|
|
8
|
-
* @param {{ templateId: string, promptsDir?: string }} options
|
|
9
|
-
*/
|
|
10
|
-
export async function codexStatusPromptsCommand(options) {
|
|
11
|
-
const templateId = String(options.templateId || "workspace");
|
|
12
|
-
const tpl = await loadTemplate(templateId);
|
|
13
|
-
const promptsDir = resolveCodexPromptsDir(options.promptsDir);
|
|
14
|
-
const promptFiles = await listTemplateCodexPrompts(tpl);
|
|
15
|
-
/** @type {Array<{ filename: string, status: "ok" | "missing" | "unmanaged" | "outdated" }>} */
|
|
16
|
-
const rows = [];
|
|
17
|
-
for (const pf of promptFiles) {
|
|
18
|
-
const destAbs = path.join(promptsDir, pf.filename);
|
|
19
|
-
if (!(await pathExists(destAbs))) {
|
|
20
|
-
rows.push({ filename: pf.filename, status: "missing" });
|
|
21
|
-
continue;
|
|
22
|
-
}
|
|
23
|
-
const currentText = normalizeNewlines(await readText(destAbs));
|
|
24
|
-
const block = findManagedBlock(currentText, pf.blockId);
|
|
25
|
-
if (!block) {
|
|
26
|
-
rows.push({ filename: pf.filename, status: "unmanaged" });
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
rows.push({ filename: pf.filename, status: block.innerText === pf.innerText ? "ok" : "outdated" });
|
|
30
|
-
}
|
|
31
|
-
const counts = rows.reduce((acc, r) => {
|
|
32
|
-
acc[r.status] = (acc[r.status] || 0) + 1;
|
|
33
|
-
return acc;
|
|
34
|
-
}, { ok: 0, missing: 0, unmanaged: 0, outdated: 0 });
|
|
35
|
-
console.log(`✓ aiws codex status: ${promptsDir}`);
|
|
36
|
-
console.log(`ok=${counts.ok} missing=${counts.missing} unmanaged=${counts.unmanaged} outdated=${counts.outdated}`);
|
|
37
|
-
for (const r of rows) {
|
|
38
|
-
console.log(`${r.status}\t${r.filename}`);
|
|
39
|
-
}
|
|
40
|
-
if (counts.missing > 0 || counts.outdated > 0) {
|
|
41
|
-
console.log("Next: aiws codex install-prompts");
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=codex-status-prompts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-status-prompts.js","sourceRoot":"","sources":["../../src/commands/codex-status-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { loadTemplate } from "../spec.js";
|
|
4
|
-
import { normalizeNewlines } from "../hash.js";
|
|
5
|
-
import { findManagedBlock } from "../managed-blocks.js";
|
|
6
|
-
import { pathExists, readText } from "../fs.js";
|
|
7
|
-
import { listTemplateCodexSkills, resolveCodexSkillsDir } from "../codex-skills.js";
|
|
8
|
-
/**
|
|
9
|
-
* @param {{ templateId: string, skillsDir?: string }} options
|
|
10
|
-
*/
|
|
11
|
-
export async function codexStatusSkillsCommand(options) {
|
|
12
|
-
const templateId = String(options.templateId || "workspace");
|
|
13
|
-
const tpl = await loadTemplate(templateId);
|
|
14
|
-
const skillsDir = resolveCodexSkillsDir(options.skillsDir);
|
|
15
|
-
const skillsDirIsSymlink = await fs
|
|
16
|
-
.lstat(skillsDir)
|
|
17
|
-
.then((st) => st.isSymbolicLink())
|
|
18
|
-
.catch(() => false);
|
|
19
|
-
const skillsDirReal = skillsDirIsSymlink ? await fs.realpath(skillsDir).catch(() => skillsDir) : skillsDir;
|
|
20
|
-
const skillFiles = await listTemplateCodexSkills(tpl);
|
|
21
|
-
/** @type {Array<{ name: string, status: "ok" | "missing" | "unmanaged" | "outdated" }>} */
|
|
22
|
-
const rows = [];
|
|
23
|
-
for (const sf of skillFiles) {
|
|
24
|
-
const destAbs = path.join(skillsDir, sf.skillName, "SKILL.md");
|
|
25
|
-
if (!(await pathExists(destAbs))) {
|
|
26
|
-
rows.push({ name: sf.skillName, status: "missing" });
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
const currentText = normalizeNewlines(await readText(destAbs));
|
|
30
|
-
const block = findManagedBlock(currentText, sf.blockId);
|
|
31
|
-
if (!block) {
|
|
32
|
-
rows.push({ name: sf.skillName, status: "unmanaged" });
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
rows.push({ name: sf.skillName, status: block.innerText === sf.innerText ? "ok" : "outdated" });
|
|
36
|
-
}
|
|
37
|
-
const counts = rows.reduce((acc, r) => {
|
|
38
|
-
acc[r.status] = (acc[r.status] || 0) + 1;
|
|
39
|
-
return acc;
|
|
40
|
-
}, { ok: 0, missing: 0, unmanaged: 0, outdated: 0 });
|
|
41
|
-
const header = skillsDirIsSymlink && skillsDirReal !== skillsDir ? `${skillsDir} -> ${skillsDirReal}` : skillsDir;
|
|
42
|
-
console.log(`✓ aiws codex status-skills: ${header}`);
|
|
43
|
-
console.log(`ok=${counts.ok} missing=${counts.missing} unmanaged=${counts.unmanaged} outdated=${counts.outdated}`);
|
|
44
|
-
for (const r of rows) {
|
|
45
|
-
console.log(`${r.status}\t${r.name}`);
|
|
46
|
-
}
|
|
47
|
-
if (counts.ok === 0 && counts.missing === rows.length && skillsDirIsSymlink) {
|
|
48
|
-
console.log("Note: skills dir is a symlink; if you installed to a different dir, pass --dir (or set CODEX_HOME).");
|
|
49
|
-
}
|
|
50
|
-
if (counts.missing > 0 || counts.outdated > 0) {
|
|
51
|
-
console.log("Next: aiws codex install-skills");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=codex-status-skills.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-status-skills.js","sourceRoot":"","sources":["../../src/commands/codex-status-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import { loadTemplate } from "../spec.js";
|
|
4
|
-
import { normalizeNewlines } from "../hash.js";
|
|
5
|
-
import { findManagedBlock } from "../managed-blocks.js";
|
|
6
|
-
import { copyFile, pathExists, readText } from "../fs.js";
|
|
7
|
-
import { codexBackupPathFor, codexBackupStamp, listTemplateCodexPrompts, resolveCodexPromptsDir } from "../codex-prompts.js";
|
|
8
|
-
/**
|
|
9
|
-
* @param {{ templateId: string, promptsDir?: string }} options
|
|
10
|
-
*/
|
|
11
|
-
export async function codexUninstallPromptsCommand(options) {
|
|
12
|
-
const templateId = String(options.templateId || "workspace");
|
|
13
|
-
const tpl = await loadTemplate(templateId);
|
|
14
|
-
const promptsDir = resolveCodexPromptsDir(options.promptsDir);
|
|
15
|
-
const promptFiles = await listTemplateCodexPrompts(tpl);
|
|
16
|
-
const backupStamp = codexBackupStamp();
|
|
17
|
-
const backupDir = path.join(promptsDir, ".aiws", "backups", "codex-prompts", backupStamp);
|
|
18
|
-
/** @type {string[]} */
|
|
19
|
-
const removed = [];
|
|
20
|
-
/** @type {string[]} */
|
|
21
|
-
const skippedUnmanaged = [];
|
|
22
|
-
/** @type {string[]} */
|
|
23
|
-
const missing = [];
|
|
24
|
-
for (const pf of promptFiles) {
|
|
25
|
-
const destAbs = path.join(promptsDir, pf.filename);
|
|
26
|
-
if (!(await pathExists(destAbs))) {
|
|
27
|
-
missing.push(pf.filename);
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
const currentText = normalizeNewlines(await readText(destAbs));
|
|
31
|
-
const block = findManagedBlock(currentText, pf.blockId);
|
|
32
|
-
if (!block) {
|
|
33
|
-
skippedUnmanaged.push(pf.filename);
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
const backup = codexBackupPathFor(promptsDir, pf.filename, backupStamp);
|
|
37
|
-
await copyFile(destAbs, backup);
|
|
38
|
-
await fs.unlink(destAbs);
|
|
39
|
-
removed.push(pf.filename);
|
|
40
|
-
}
|
|
41
|
-
console.log(`✓ aiws codex uninstall-prompts: ${promptsDir}`);
|
|
42
|
-
if (removed.length > 0)
|
|
43
|
-
console.log(`removed: ${removed.join(", ")}`);
|
|
44
|
-
if (removed.length > 0)
|
|
45
|
-
console.log(`backup: ${backupDir}`);
|
|
46
|
-
if (skippedUnmanaged.length > 0)
|
|
47
|
-
console.log(`skipped (unmanaged): ${skippedUnmanaged.join(", ")}`);
|
|
48
|
-
if (missing.length > 0)
|
|
49
|
-
console.log(`missing: ${missing.join(", ")}`);
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=codex-uninstall-prompts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-uninstall-prompts.js","sourceRoot":"","sources":["../../src/commands/codex-uninstall-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import { loadTemplate } from "../spec.js";
|
|
4
|
-
import { normalizeNewlines } from "../hash.js";
|
|
5
|
-
import { findManagedBlock } from "../managed-blocks.js";
|
|
6
|
-
import { copyFile, pathExists, readText } from "../fs.js";
|
|
7
|
-
import { codexSkillsBackupPathFor, codexSkillsBackupStamp, listTemplateCodexSkills, resolveCodexSkillsDir } from "../codex-skills.js";
|
|
8
|
-
/**
|
|
9
|
-
* @param {{ templateId: string, skillsDir?: string }} options
|
|
10
|
-
*/
|
|
11
|
-
export async function codexUninstallSkillsCommand(options) {
|
|
12
|
-
const templateId = String(options.templateId || "workspace");
|
|
13
|
-
const tpl = await loadTemplate(templateId);
|
|
14
|
-
const skillsDir = resolveCodexSkillsDir(options.skillsDir);
|
|
15
|
-
const skillFiles = await listTemplateCodexSkills(tpl);
|
|
16
|
-
const backupStamp = codexSkillsBackupStamp();
|
|
17
|
-
const backupDir = path.join(skillsDir, ".aiws", "backups", "codex-skills", backupStamp);
|
|
18
|
-
/** @type {string[]} */
|
|
19
|
-
const removed = [];
|
|
20
|
-
/** @type {string[]} */
|
|
21
|
-
const skippedUnmanaged = [];
|
|
22
|
-
/** @type {string[]} */
|
|
23
|
-
const missing = [];
|
|
24
|
-
for (const sf of skillFiles) {
|
|
25
|
-
const destDir = path.join(skillsDir, sf.skillName);
|
|
26
|
-
const destAbs = path.join(destDir, "SKILL.md");
|
|
27
|
-
if (!(await pathExists(destAbs))) {
|
|
28
|
-
missing.push(sf.skillName);
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
const currentText = normalizeNewlines(await readText(destAbs));
|
|
32
|
-
const block = findManagedBlock(currentText, sf.blockId);
|
|
33
|
-
if (!block) {
|
|
34
|
-
skippedUnmanaged.push(sf.skillName);
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
const backup = codexSkillsBackupPathFor(skillsDir, sf.skillName, backupStamp);
|
|
38
|
-
await copyFile(destAbs, backup);
|
|
39
|
-
await fs.unlink(destAbs);
|
|
40
|
-
// Only remove the directory if it's empty after removing SKILL.md.
|
|
41
|
-
try {
|
|
42
|
-
await fs.rmdir(destDir);
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// ignore
|
|
46
|
-
}
|
|
47
|
-
removed.push(sf.skillName);
|
|
48
|
-
}
|
|
49
|
-
console.log(`✓ aiws codex uninstall-skills: ${skillsDir}`);
|
|
50
|
-
if (removed.length > 0)
|
|
51
|
-
console.log(`removed: ${removed.join(", ")}`);
|
|
52
|
-
if (removed.length > 0)
|
|
53
|
-
console.log(`backup: ${backupDir}`);
|
|
54
|
-
if (skippedUnmanaged.length > 0)
|
|
55
|
-
console.log(`skipped (unmanaged): ${skippedUnmanaged.join(", ")}`);
|
|
56
|
-
if (missing.length > 0)
|
|
57
|
-
console.log(`missing: ${missing.join(", ")}`);
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=codex-uninstall-skills.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codex-uninstall-skills.js","sourceRoot":"","sources":["../../src/commands/codex-uninstall-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
interface DeployOptions {
|
|
2
|
-
/** When true, overwrite existing hook scripts even if already deployed. */
|
|
3
|
-
force?: boolean;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Deploy aiws Claude Code session hooks to ~/.claude/settings.json.
|
|
7
|
-
*
|
|
8
|
-
* In init mode (`force=false`): only adds missing hooks, keeps existing ones.
|
|
9
|
-
* In update mode (`force=true`): overwrites hook scripts and ensures all hooks
|
|
10
|
-
* are registered in settings.json (updates existing entries if present).
|
|
11
|
-
*/
|
|
12
|
-
export declare function deployClaudeHooks(options?: DeployOptions): Promise<void>;
|
|
13
|
-
export {};
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
|
-
const HOOK_DEFINITIONS = [
|
|
5
|
-
{ name: "session-start", event: "SessionStart", id: "aiws-session-start" },
|
|
6
|
-
{ name: "workflow-state", event: "UserPromptSubmit", id: "aiws-workflow-state" },
|
|
7
|
-
{ name: "subagent-context", event: "PreToolUse", id: "aiws-subagent-context" },
|
|
8
|
-
];
|
|
9
|
-
/**
|
|
10
|
-
* Deploy aiws Claude Code session hooks to ~/.claude/settings.json.
|
|
11
|
-
*
|
|
12
|
-
* In init mode (`force=false`): only adds missing hooks, keeps existing ones.
|
|
13
|
-
* In update mode (`force=true`): overwrites hook scripts and ensures all hooks
|
|
14
|
-
* are registered in settings.json (updates existing entries if present).
|
|
15
|
-
*/
|
|
16
|
-
export async function deployClaudeHooks(options = {}) {
|
|
17
|
-
const { force = false } = options;
|
|
18
|
-
const settingsPath = path.join(os.homedir(), ".claude", "settings.json");
|
|
19
|
-
const hooksDir = path.join(os.homedir(), ".claude", "hooks", "aiws");
|
|
20
|
-
try {
|
|
21
|
-
await fs.mkdir(hooksDir, { recursive: true });
|
|
22
|
-
for (const hook of HOOK_DEFINITIONS) {
|
|
23
|
-
const src = path.join(__dirname, "..", "hooks", "claude", `${hook.name}.js`);
|
|
24
|
-
const dest = path.join(hooksDir, `${hook.name}.js`);
|
|
25
|
-
try {
|
|
26
|
-
await fs.copyFile(src, dest);
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
console.warn(`[aiws] warn: could not copy hook ${hook.name}.js to ${dest}`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
let settings = {};
|
|
33
|
-
try {
|
|
34
|
-
const raw = await fs.readFile(settingsPath, "utf-8");
|
|
35
|
-
settings = JSON.parse(raw);
|
|
36
|
-
}
|
|
37
|
-
catch { }
|
|
38
|
-
const existingHooks = Array.isArray(settings.hooks) ? settings.hooks : [];
|
|
39
|
-
const existingById = new Map();
|
|
40
|
-
for (const h of existingHooks) {
|
|
41
|
-
if (h.id)
|
|
42
|
-
existingById.set(h.id, h);
|
|
43
|
-
}
|
|
44
|
-
for (const hook of HOOK_DEFINITIONS) {
|
|
45
|
-
const entry = {
|
|
46
|
-
id: hook.id,
|
|
47
|
-
matcher: hook.event,
|
|
48
|
-
hooks: [{ type: "command", command: `node ${path.join(hooksDir, `${hook.name}.js`)}` }],
|
|
49
|
-
};
|
|
50
|
-
if (existingById.has(hook.id)) {
|
|
51
|
-
if (force) {
|
|
52
|
-
const existing = existingById.get(hook.id);
|
|
53
|
-
existing.hooks = entry.hooks;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
existingById.set(hook.id, entry);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
settings.hooks = [...existingById.values()];
|
|
61
|
-
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + "\n", "utf-8");
|
|
62
|
-
}
|
|
63
|
-
catch (err) {
|
|
64
|
-
console.warn(`[aiws] warn: Claude Code hook deployment failed: ${err.message}`);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=deploy-claude.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-claude.js","sourceRoot":"","sources":["../../src/hooks/deploy-claude.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,MAAM,gBAAgB,GAAG;IACvB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,oBAAoB,EAAE;IAC1E,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,EAAE,qBAAqB,EAAE;IAChF,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,uBAAuB,EAAE;CAC/E,CAAC;AAOF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAyB,EAAE;IACjE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,IAAI,UAAU,IAAI,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,GAAQ,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,MAAM,aAAa,GAAU,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAe,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,EAAE;gBAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,IAAI,CAAC,KAAK;gBACnB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;aACxF,CAAC;YAEF,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC9B,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAA4B,CAAC;oBACtE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC/B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,oDAAoD,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
|