genskills 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +259 -0
- package/dist/cli/commands/clean.d.ts +3 -0
- package/dist/cli/commands/clean.d.ts.map +1 -0
- package/dist/cli/commands/clean.js +100 -0
- package/dist/cli/commands/clean.js.map +1 -0
- package/dist/cli/commands/disable.d.ts +3 -0
- package/dist/cli/commands/disable.d.ts.map +1 -0
- package/dist/cli/commands/disable.js +44 -0
- package/dist/cli/commands/disable.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +151 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/enable.d.ts +3 -0
- package/dist/cli/commands/enable.d.ts.map +1 -0
- package/dist/cli/commands/enable.js +48 -0
- package/dist/cli/commands/enable.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +94 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +3 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +40 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +60 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +58 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config-loader.d.ts +37 -0
- package/dist/cli/utils/config-loader.d.ts.map +1 -0
- package/dist/cli/utils/config-loader.js +129 -0
- package/dist/cli/utils/config-loader.js.map +1 -0
- package/dist/cli/utils/copy.d.ts +26 -0
- package/dist/cli/utils/copy.d.ts.map +1 -0
- package/dist/cli/utils/copy.js +182 -0
- package/dist/cli/utils/copy.js.map +1 -0
- package/dist/cli/utils/dependency-resolver.d.ts +26 -0
- package/dist/cli/utils/dependency-resolver.d.ts.map +1 -0
- package/dist/cli/utils/dependency-resolver.js +181 -0
- package/dist/cli/utils/dependency-resolver.js.map +1 -0
- package/dist/cli/utils/hooks.d.ts +22 -0
- package/dist/cli/utils/hooks.d.ts.map +1 -0
- package/dist/cli/utils/hooks.js +124 -0
- package/dist/cli/utils/hooks.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +13 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +57 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/cli/utils/manifest.d.ts +29 -0
- package/dist/cli/utils/manifest.d.ts.map +1 -0
- package/dist/cli/utils/manifest.js +110 -0
- package/dist/cli/utils/manifest.js.map +1 -0
- package/dist/cli/utils/paths.d.ts +46 -0
- package/dist/cli/utils/paths.d.ts.map +1 -0
- package/dist/cli/utils/paths.js +150 -0
- package/dist/cli/utils/paths.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/postinstall.d.ts +9 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +58 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +52 -0
- package/plugin.json +60 -0
- package/schemas/genskills-config.schema.json +91 -0
- package/skills/code-quality/code-review/SKILL.md +65 -0
- package/skills/code-quality/lint-fix/SKILL.md +44 -0
- package/skills/code-quality/refactor/SKILL.md +43 -0
- package/skills/code-quality/security-audit/SKILL.md +71 -0
- package/skills/code-quality/test-generator/SKILL.md +51 -0
- package/skills/code-quality/type-check/SKILL.md +41 -0
- package/skills/development/debug/SKILL.md +53 -0
- package/skills/development/migrate/SKILL.md +50 -0
- package/skills/development/perf-optimize/SKILL.md +64 -0
- package/skills/development/scaffold/SKILL.md +52 -0
- package/skills/documentation/api-docs/SKILL.md +51 -0
- package/skills/documentation/doc-gen/SKILL.md +49 -0
- package/skills/documentation/readme-gen/SKILL.md +68 -0
- package/skills/project-management/changelog-gen/SKILL.md +61 -0
- package/skills/project-management/release-notes/SKILL.md +62 -0
- package/skills/project-management/task-tracker/SKILL.md +42 -0
- package/skills/workflow/branch-manager/SKILL.md +50 -0
- package/skills/workflow/ci-fix/SKILL.md +44 -0
- package/skills/workflow/deploy/SKILL.md +53 -0
- package/skills/workflow/git-commit/SKILL.md +58 -0
- package/skills/workflow/pr-create/SKILL.md +53 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.installSkills = installSkills;
|
|
37
|
+
exports.removeSkill = removeSkill;
|
|
38
|
+
exports.copyDirRecursive = copyDirRecursive;
|
|
39
|
+
exports.getInstalledSkills = getInstalledSkills;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const paths_1 = require("./paths");
|
|
43
|
+
const config_loader_1 = require("./config-loader");
|
|
44
|
+
const manifest_1 = require("./manifest");
|
|
45
|
+
/**
|
|
46
|
+
* Install all enabled skills into the project.
|
|
47
|
+
*/
|
|
48
|
+
function installSkills(projectRoot, options = {}) {
|
|
49
|
+
const config = (0, config_loader_1.loadConfig)(projectRoot);
|
|
50
|
+
const skillsDir = (0, paths_1.getSkillsDir)(projectRoot);
|
|
51
|
+
const manifest = (0, manifest_1.readManifest)(projectRoot);
|
|
52
|
+
const result = {
|
|
53
|
+
installed: [],
|
|
54
|
+
updated: [],
|
|
55
|
+
skipped: [],
|
|
56
|
+
errors: [],
|
|
57
|
+
};
|
|
58
|
+
// Ensure skills directory exists
|
|
59
|
+
fs.mkdirSync(skillsDir, { recursive: true });
|
|
60
|
+
const categories = (0, paths_1.getCategories)();
|
|
61
|
+
for (const category of categories) {
|
|
62
|
+
const skills = (0, paths_1.getSkillsInCategory)(category);
|
|
63
|
+
for (const skillName of skills) {
|
|
64
|
+
// If a specific skill was requested, skip others
|
|
65
|
+
if (options.specific && options.specific !== skillName)
|
|
66
|
+
continue;
|
|
67
|
+
// Check if skill is enabled
|
|
68
|
+
if (!options.force && !(0, config_loader_1.isSkillEnabled)(config, category, skillName)) {
|
|
69
|
+
result.skipped.push(skillName);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const status = installSingleSkill(projectRoot, category, skillName, config, manifest, options.force);
|
|
74
|
+
if (status === "installed")
|
|
75
|
+
result.installed.push(skillName);
|
|
76
|
+
else if (status === "updated")
|
|
77
|
+
result.updated.push(skillName);
|
|
78
|
+
else
|
|
79
|
+
result.skipped.push(skillName);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
83
|
+
result.errors.push(`${skillName}: ${msg}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Update manifest
|
|
88
|
+
manifest.packageVersion = (0, manifest_1.getPackageVersion)();
|
|
89
|
+
manifest.installedAt = new Date().toISOString();
|
|
90
|
+
(0, manifest_1.writeManifest)(projectRoot, manifest);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Install a single skill.
|
|
95
|
+
*/
|
|
96
|
+
function installSingleSkill(projectRoot, category, skillName, config, manifest, force) {
|
|
97
|
+
const sourcePath = (0, paths_1.getSkillSourcePath)(category, skillName);
|
|
98
|
+
const targetDir = path.join((0, paths_1.getSkillsDir)(projectRoot), (0, paths_1.namespacedSkillDir)(skillName));
|
|
99
|
+
const manifestKey = (0, paths_1.namespacedSkillDir)(skillName);
|
|
100
|
+
// Compute source checksum
|
|
101
|
+
const sourceChecksum = (0, manifest_1.computeChecksum)(sourcePath);
|
|
102
|
+
// Check if already installed with same checksum
|
|
103
|
+
const existing = manifest.skills[manifestKey];
|
|
104
|
+
if (existing && existing.checksum === sourceChecksum && !force) {
|
|
105
|
+
return "skipped";
|
|
106
|
+
}
|
|
107
|
+
const isUpdate = existing !== undefined;
|
|
108
|
+
// Backup existing if updating
|
|
109
|
+
if (isUpdate && fs.existsSync(targetDir)) {
|
|
110
|
+
backupSkill(projectRoot, skillName, targetDir);
|
|
111
|
+
}
|
|
112
|
+
// Copy skill directory
|
|
113
|
+
copyDirRecursive(sourcePath, targetDir);
|
|
114
|
+
// Write per-skill config
|
|
115
|
+
const settings = (0, config_loader_1.getSkillSettings)(config, skillName);
|
|
116
|
+
if (Object.keys(settings).length > 0) {
|
|
117
|
+
fs.writeFileSync(path.join(targetDir, "_config.json"), JSON.stringify(settings, null, 2), "utf-8");
|
|
118
|
+
}
|
|
119
|
+
// Update manifest entry
|
|
120
|
+
manifest.skills[manifestKey] = {
|
|
121
|
+
version: (0, manifest_1.getPackageVersion)(),
|
|
122
|
+
category,
|
|
123
|
+
checksum: sourceChecksum,
|
|
124
|
+
installedAt: new Date().toISOString(),
|
|
125
|
+
source: "genskills",
|
|
126
|
+
};
|
|
127
|
+
return isUpdate ? "updated" : "installed";
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Remove a skill from the project.
|
|
131
|
+
*/
|
|
132
|
+
function removeSkill(projectRoot, skillName) {
|
|
133
|
+
const targetDir = path.join((0, paths_1.getSkillsDir)(projectRoot), (0, paths_1.namespacedSkillDir)(skillName));
|
|
134
|
+
const manifest = (0, manifest_1.readManifest)(projectRoot);
|
|
135
|
+
const manifestKey = (0, paths_1.namespacedSkillDir)(skillName);
|
|
136
|
+
if (!fs.existsSync(targetDir))
|
|
137
|
+
return false;
|
|
138
|
+
fs.rmSync(targetDir, { recursive: true, force: true });
|
|
139
|
+
delete manifest.skills[manifestKey];
|
|
140
|
+
(0, manifest_1.writeManifest)(projectRoot, manifest);
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Backup a skill directory before overwriting.
|
|
145
|
+
*/
|
|
146
|
+
function backupSkill(projectRoot, skillName, sourceDir) {
|
|
147
|
+
const backupDir = (0, paths_1.getBackupDir)(projectRoot);
|
|
148
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
149
|
+
const backupPath = path.join(backupDir, `${skillName}-${timestamp}`);
|
|
150
|
+
fs.mkdirSync(backupPath, { recursive: true });
|
|
151
|
+
copyDirRecursive(sourceDir, backupPath);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Recursively copy a directory.
|
|
155
|
+
*/
|
|
156
|
+
function copyDirRecursive(src, dest) {
|
|
157
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
158
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
159
|
+
for (const entry of entries) {
|
|
160
|
+
const srcPath = path.join(src, entry.name);
|
|
161
|
+
const destPath = path.join(dest, entry.name);
|
|
162
|
+
if (entry.isDirectory()) {
|
|
163
|
+
copyDirRecursive(srcPath, destPath);
|
|
164
|
+
}
|
|
165
|
+
else if (entry.isFile()) {
|
|
166
|
+
fs.copyFileSync(srcPath, destPath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get all installed genskills skill names.
|
|
172
|
+
*/
|
|
173
|
+
function getInstalledSkills(projectRoot) {
|
|
174
|
+
const skillsDir = (0, paths_1.getSkillsDir)(projectRoot);
|
|
175
|
+
if (!fs.existsSync(skillsDir))
|
|
176
|
+
return [];
|
|
177
|
+
return fs
|
|
178
|
+
.readdirSync(skillsDir, { withFileTypes: true })
|
|
179
|
+
.filter((d) => d.isDirectory() && d.name.startsWith("genskills--"))
|
|
180
|
+
.map((d) => d.name.replace("genskills--", ""));
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/cli/utils/copy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface MissingDep {
|
|
2
|
+
skill: string;
|
|
3
|
+
dependency: string;
|
|
4
|
+
}
|
|
5
|
+
export interface DependencyResult {
|
|
6
|
+
resolved: string[];
|
|
7
|
+
missing: MissingDep[];
|
|
8
|
+
autoEnabled: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse genskills-depends from a SKILL.md frontmatter.
|
|
12
|
+
*/
|
|
13
|
+
export declare function parseSkillDependencies(skillMdPath: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Build the full dependency graph for all skills.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildDependencyGraph(): Map<string, string[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve dependencies: auto-enable missing deps, detect cycles, find missing.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveDependencies(projectRoot: string): DependencyResult;
|
|
22
|
+
/**
|
|
23
|
+
* Detect circular dependencies in the graph.
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectCycles(graph: Map<string, string[]>): string[][];
|
|
26
|
+
//# sourceMappingURL=dependency-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/dependency-resolver.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAmCpE;AASD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAc5D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAwCzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAgCrE"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseSkillDependencies = parseSkillDependencies;
|
|
37
|
+
exports.buildDependencyGraph = buildDependencyGraph;
|
|
38
|
+
exports.resolveDependencies = resolveDependencies;
|
|
39
|
+
exports.detectCycles = detectCycles;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const paths_1 = require("./paths");
|
|
43
|
+
const config_loader_1 = require("./config-loader");
|
|
44
|
+
/**
|
|
45
|
+
* Parse genskills-depends from a SKILL.md frontmatter.
|
|
46
|
+
*/
|
|
47
|
+
function parseSkillDependencies(skillMdPath) {
|
|
48
|
+
if (!fs.existsSync(skillMdPath))
|
|
49
|
+
return [];
|
|
50
|
+
const content = fs.readFileSync(skillMdPath, "utf-8");
|
|
51
|
+
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
52
|
+
if (!frontmatterMatch)
|
|
53
|
+
return [];
|
|
54
|
+
const frontmatter = frontmatterMatch[1];
|
|
55
|
+
const deps = [];
|
|
56
|
+
// Parse genskills-depends: [skill1, skill2] or multiline
|
|
57
|
+
const inlineMatch = frontmatter.match(/genskills-depends:\s*\[([^\]]*)\]/);
|
|
58
|
+
if (inlineMatch) {
|
|
59
|
+
const items = inlineMatch[1].split(",").map((s) => s.trim().replace(/['"]/g, ""));
|
|
60
|
+
for (const item of items) {
|
|
61
|
+
if (item)
|
|
62
|
+
deps.push(normalizeDepName(item));
|
|
63
|
+
}
|
|
64
|
+
return deps;
|
|
65
|
+
}
|
|
66
|
+
// Multiline YAML list
|
|
67
|
+
const multiMatch = frontmatter.match(/genskills-depends:\s*\n((?:\s+-\s+.+\n?)*)/);
|
|
68
|
+
if (multiMatch) {
|
|
69
|
+
const lines = multiMatch[1].split("\n");
|
|
70
|
+
for (const line of lines) {
|
|
71
|
+
const m = line.match(/^\s+-\s+(.+)/);
|
|
72
|
+
if (m)
|
|
73
|
+
deps.push(normalizeDepName(m[1].trim().replace(/['"]/g, "")));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return deps;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Strip genskills: prefix from dependency name.
|
|
80
|
+
*/
|
|
81
|
+
function normalizeDepName(name) {
|
|
82
|
+
return name.replace(/^genskills:/, "");
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build the full dependency graph for all skills.
|
|
86
|
+
*/
|
|
87
|
+
function buildDependencyGraph() {
|
|
88
|
+
const graph = new Map();
|
|
89
|
+
const categories = (0, paths_1.getCategories)();
|
|
90
|
+
for (const category of categories) {
|
|
91
|
+
const skills = (0, paths_1.getSkillsInCategory)(category);
|
|
92
|
+
for (const skill of skills) {
|
|
93
|
+
const skillMd = path.join((0, paths_1.getSkillSourcePath)(category, skill), "SKILL.md");
|
|
94
|
+
const deps = parseSkillDependencies(skillMd);
|
|
95
|
+
graph.set(skill, deps);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return graph;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Resolve dependencies: auto-enable missing deps, detect cycles, find missing.
|
|
102
|
+
*/
|
|
103
|
+
function resolveDependencies(projectRoot) {
|
|
104
|
+
const config = (0, config_loader_1.loadConfig)(projectRoot);
|
|
105
|
+
const graph = buildDependencyGraph();
|
|
106
|
+
const allSkills = new Set(graph.keys());
|
|
107
|
+
const resolved = [];
|
|
108
|
+
const missing = [];
|
|
109
|
+
const autoEnabled = [];
|
|
110
|
+
// For each enabled skill, check its deps
|
|
111
|
+
for (const [skill, deps] of graph) {
|
|
112
|
+
// Find the category for this skill
|
|
113
|
+
const category = findCategoryForSkill(skill);
|
|
114
|
+
if (!category)
|
|
115
|
+
continue;
|
|
116
|
+
const enabled = (0, config_loader_1.isSkillEnabled)(config, category, skill);
|
|
117
|
+
if (!enabled)
|
|
118
|
+
continue;
|
|
119
|
+
resolved.push(skill);
|
|
120
|
+
for (const dep of deps) {
|
|
121
|
+
if (!allSkills.has(dep)) {
|
|
122
|
+
missing.push({ skill, dependency: dep });
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const depCategory = findCategoryForSkill(dep);
|
|
126
|
+
if (!depCategory) {
|
|
127
|
+
missing.push({ skill, dependency: dep });
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const depEnabled = (0, config_loader_1.isSkillEnabled)(config, depCategory, dep);
|
|
131
|
+
if (!depEnabled) {
|
|
132
|
+
autoEnabled.push(dep);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return { resolved, missing, autoEnabled };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Detect circular dependencies in the graph.
|
|
140
|
+
*/
|
|
141
|
+
function detectCycles(graph) {
|
|
142
|
+
const cycles = [];
|
|
143
|
+
const visited = new Set();
|
|
144
|
+
const inStack = new Set();
|
|
145
|
+
function dfs(node, path) {
|
|
146
|
+
if (inStack.has(node)) {
|
|
147
|
+
const cycleStart = path.indexOf(node);
|
|
148
|
+
cycles.push(path.slice(cycleStart).concat(node));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (visited.has(node))
|
|
152
|
+
return;
|
|
153
|
+
visited.add(node);
|
|
154
|
+
inStack.add(node);
|
|
155
|
+
path.push(node);
|
|
156
|
+
const deps = graph.get(node) || [];
|
|
157
|
+
for (const dep of deps) {
|
|
158
|
+
dfs(dep, [...path]);
|
|
159
|
+
}
|
|
160
|
+
inStack.delete(node);
|
|
161
|
+
}
|
|
162
|
+
for (const node of graph.keys()) {
|
|
163
|
+
if (!visited.has(node)) {
|
|
164
|
+
dfs(node, []);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return cycles;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Find which category a skill belongs to.
|
|
171
|
+
*/
|
|
172
|
+
function findCategoryForSkill(skillName) {
|
|
173
|
+
const categories = (0, paths_1.getCategories)();
|
|
174
|
+
for (const category of categories) {
|
|
175
|
+
const skills = (0, paths_1.getSkillsInCategory)(category);
|
|
176
|
+
if (skills.includes(skillName))
|
|
177
|
+
return category;
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../../src/cli/utils/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
interface HookDefinition {
|
|
2
|
+
event: string;
|
|
3
|
+
matcher?: string;
|
|
4
|
+
command: string;
|
|
5
|
+
skillName: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Parse hooks from a SKILL.md frontmatter.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseSkillHooks(skillMdPath: string, skillName: string): HookDefinition[];
|
|
11
|
+
/**
|
|
12
|
+
* Collect all hooks from all enabled skills.
|
|
13
|
+
*/
|
|
14
|
+
export declare function collectAllHooks(projectRoot: string): HookDefinition[];
|
|
15
|
+
/**
|
|
16
|
+
* Register hooks into .claude/settings.local.json.
|
|
17
|
+
* Note: Claude Code handles hooks in SKILL.md frontmatter natively,
|
|
18
|
+
* so this is mainly for custom hooks that need project-level registration.
|
|
19
|
+
*/
|
|
20
|
+
export declare function registerHooks(projectRoot: string): number;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/hooks.ts"],"names":[],"mappings":"AAWA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,cAAc,EAAE,CAuClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE,CAiBrE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAyBzD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseSkillHooks = parseSkillHooks;
|
|
37
|
+
exports.collectAllHooks = collectAllHooks;
|
|
38
|
+
exports.registerHooks = registerHooks;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const paths_1 = require("./paths");
|
|
42
|
+
const config_loader_1 = require("./config-loader");
|
|
43
|
+
const logger_1 = require("./logger");
|
|
44
|
+
/**
|
|
45
|
+
* Parse hooks from a SKILL.md frontmatter.
|
|
46
|
+
*/
|
|
47
|
+
function parseSkillHooks(skillMdPath, skillName) {
|
|
48
|
+
if (!fs.existsSync(skillMdPath))
|
|
49
|
+
return [];
|
|
50
|
+
const content = fs.readFileSync(skillMdPath, "utf-8");
|
|
51
|
+
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
52
|
+
if (!frontmatterMatch)
|
|
53
|
+
return [];
|
|
54
|
+
const frontmatter = frontmatterMatch[1];
|
|
55
|
+
const hooks = [];
|
|
56
|
+
// Simple YAML parsing for hooks section
|
|
57
|
+
// Looking for patterns like:
|
|
58
|
+
// hooks:
|
|
59
|
+
// PreToolUse:
|
|
60
|
+
// - matcher: "Bash"
|
|
61
|
+
// hooks:
|
|
62
|
+
// - type: command
|
|
63
|
+
// command: "..."
|
|
64
|
+
const hooksMatch = frontmatter.match(/hooks:\s*\n((?:\s+.+\n?)*)/);
|
|
65
|
+
if (!hooksMatch)
|
|
66
|
+
return [];
|
|
67
|
+
// For now, we extract hooks defined in the Claude Code native format
|
|
68
|
+
// The skill frontmatter hooks are handled natively by Claude Code
|
|
69
|
+
// We just need to detect them for the doctor command
|
|
70
|
+
const commandMatches = frontmatter.matchAll(/command:\s*["']?([^"'\n]+)["']?/g);
|
|
71
|
+
for (const match of commandMatches) {
|
|
72
|
+
hooks.push({
|
|
73
|
+
event: "PreToolUse",
|
|
74
|
+
command: match[1].trim(),
|
|
75
|
+
skillName,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return hooks;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Collect all hooks from all enabled skills.
|
|
82
|
+
*/
|
|
83
|
+
function collectAllHooks(projectRoot) {
|
|
84
|
+
const config = (0, config_loader_1.loadConfig)(projectRoot);
|
|
85
|
+
const allHooks = [];
|
|
86
|
+
const categories = (0, paths_1.getCategories)();
|
|
87
|
+
for (const category of categories) {
|
|
88
|
+
const skills = (0, paths_1.getSkillsInCategory)(category);
|
|
89
|
+
for (const skill of skills) {
|
|
90
|
+
if (!(0, config_loader_1.isSkillEnabled)(config, category, skill))
|
|
91
|
+
continue;
|
|
92
|
+
const skillMd = path.join((0, paths_1.getSkillSourcePath)(category, skill), "SKILL.md");
|
|
93
|
+
const hooks = parseSkillHooks(skillMd, skill);
|
|
94
|
+
allHooks.push(...hooks);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return allHooks;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Register hooks into .claude/settings.local.json.
|
|
101
|
+
* Note: Claude Code handles hooks in SKILL.md frontmatter natively,
|
|
102
|
+
* so this is mainly for custom hooks that need project-level registration.
|
|
103
|
+
*/
|
|
104
|
+
function registerHooks(projectRoot) {
|
|
105
|
+
const hooks = collectAllHooks(projectRoot);
|
|
106
|
+
if (hooks.length === 0) {
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
const settingsPath = path.join(projectRoot, ".claude", "settings.local.json");
|
|
110
|
+
let settings = {};
|
|
111
|
+
if (fs.existsSync(settingsPath)) {
|
|
112
|
+
try {
|
|
113
|
+
settings = JSON.parse(fs.readFileSync(settingsPath, "utf-8"));
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// Start fresh if corrupted
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Don't overwrite existing hooks — Claude Code handles skill frontmatter hooks natively
|
|
120
|
+
// This function is mainly for reporting purposes
|
|
121
|
+
logger_1.logger.dim(`Found ${hooks.length} hook(s) across installed skills (managed by Claude Code)`);
|
|
122
|
+
return hooks.length;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/cli/utils/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const logger: {
|
|
2
|
+
info(msg: string): void;
|
|
3
|
+
success(msg: string): void;
|
|
4
|
+
warn(msg: string): void;
|
|
5
|
+
error(msg: string): void;
|
|
6
|
+
step(msg: string): void;
|
|
7
|
+
dim(msg: string): void;
|
|
8
|
+
header(msg: string): void;
|
|
9
|
+
table(rows: [string, string][]): void;
|
|
10
|
+
list(items: string[], indent?: number): void;
|
|
11
|
+
br(): void;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,MAAM;cACP,MAAM;iBAIH,MAAM;cAIT,MAAM;eAIL,MAAM;cAIP,MAAM;aAIP,MAAM;gBAIH,MAAM;gBAIN,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;gBAOlB,MAAM,EAAE;;CAUrB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.logger = void 0;
|
|
4
|
+
const COLORS = {
|
|
5
|
+
reset: "\x1b[0m",
|
|
6
|
+
bold: "\x1b[1m",
|
|
7
|
+
dim: "\x1b[2m",
|
|
8
|
+
red: "\x1b[31m",
|
|
9
|
+
green: "\x1b[32m",
|
|
10
|
+
yellow: "\x1b[33m",
|
|
11
|
+
blue: "\x1b[34m",
|
|
12
|
+
magenta: "\x1b[35m",
|
|
13
|
+
cyan: "\x1b[36m",
|
|
14
|
+
gray: "\x1b[90m",
|
|
15
|
+
};
|
|
16
|
+
function c(color, text) {
|
|
17
|
+
return `${COLORS[color]}${text}${COLORS.reset}`;
|
|
18
|
+
}
|
|
19
|
+
exports.logger = {
|
|
20
|
+
info(msg) {
|
|
21
|
+
console.log(`${c("cyan", "ℹ")} ${msg}`);
|
|
22
|
+
},
|
|
23
|
+
success(msg) {
|
|
24
|
+
console.log(`${c("green", "✔")} ${msg}`);
|
|
25
|
+
},
|
|
26
|
+
warn(msg) {
|
|
27
|
+
console.log(`${c("yellow", "⚠")} ${msg}`);
|
|
28
|
+
},
|
|
29
|
+
error(msg) {
|
|
30
|
+
console.error(`${c("red", "✖")} ${msg}`);
|
|
31
|
+
},
|
|
32
|
+
step(msg) {
|
|
33
|
+
console.log(`${c("blue", "→")} ${msg}`);
|
|
34
|
+
},
|
|
35
|
+
dim(msg) {
|
|
36
|
+
console.log(`${c("gray", msg)}`);
|
|
37
|
+
},
|
|
38
|
+
header(msg) {
|
|
39
|
+
console.log(`\n${c("bold", c("magenta", msg))}`);
|
|
40
|
+
},
|
|
41
|
+
table(rows) {
|
|
42
|
+
const maxKey = Math.max(...rows.map(([k]) => k.length));
|
|
43
|
+
for (const [key, value] of rows) {
|
|
44
|
+
console.log(` ${c("cyan", key.padEnd(maxKey))} ${value}`);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
list(items, indent = 2) {
|
|
48
|
+
const pad = " ".repeat(indent);
|
|
49
|
+
for (const item of items) {
|
|
50
|
+
console.log(`${pad}${c("dim", "•")} ${item}`);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
br() {
|
|
54
|
+
console.log();
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":";;;AAAA,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF,SAAS,CAAC,CAAC,KAA0B,EAAE,IAAY;IACjD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC;AAEY,QAAA,MAAM,GAAG;IACpB,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAW;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAwB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAe,EAAE,MAAM,GAAG,CAAC;QAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,EAAE;QACA,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;CACF,CAAC"}
|