@tydung26/product-kit 0.1.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 +42 -0
- package/bin/pkit.js +2 -0
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +29 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/commands/config/index.d.ts +3 -0
- package/dist/commands/config/index.d.ts.map +1 -0
- package/dist/commands/config/index.js +34 -0
- package/dist/commands/config/index.js.map +1 -0
- package/dist/commands/doctor/index.d.ts +3 -0
- package/dist/commands/doctor/index.d.ts.map +1 -0
- package/dist/commands/doctor/index.js +94 -0
- package/dist/commands/doctor/index.js.map +1 -0
- package/dist/commands/install/index.d.ts +3 -0
- package/dist/commands/install/index.d.ts.map +1 -0
- package/dist/commands/install/index.js +51 -0
- package/dist/commands/install/index.js.map +1 -0
- package/dist/commands/list/index.d.ts +3 -0
- package/dist/commands/list/index.d.ts.map +1 -0
- package/dist/commands/list/index.js +25 -0
- package/dist/commands/list/index.js.map +1 -0
- package/dist/commands/remove/index.d.ts +3 -0
- package/dist/commands/remove/index.d.ts.map +1 -0
- package/dist/commands/remove/index.js +37 -0
- package/dist/commands/remove/index.js.map +1 -0
- package/dist/commands/update/index.d.ts +3 -0
- package/dist/commands/update/index.d.ts.map +1 -0
- package/dist/commands/update/index.js +30 -0
- package/dist/commands/update/index.js.map +1 -0
- package/dist/domains/config/config-store.d.ts +11 -0
- package/dist/domains/config/config-store.d.ts.map +1 -0
- package/dist/domains/config/config-store.js +49 -0
- package/dist/domains/config/config-store.js.map +1 -0
- package/dist/domains/config/index.d.ts +3 -0
- package/dist/domains/config/index.d.ts.map +1 -0
- package/dist/domains/config/index.js +7 -0
- package/dist/domains/config/index.js.map +1 -0
- package/dist/domains/installation/copy-skill-files.d.ts +12 -0
- package/dist/domains/installation/copy-skill-files.d.ts.map +1 -0
- package/dist/domains/installation/copy-skill-files.js +30 -0
- package/dist/domains/installation/copy-skill-files.js.map +1 -0
- package/dist/domains/installation/index.d.ts +7 -0
- package/dist/domains/installation/index.d.ts.map +1 -0
- package/dist/domains/installation/index.js +116 -0
- package/dist/domains/installation/index.js.map +1 -0
- package/dist/domains/installation/manifest-manager.d.ts +9 -0
- package/dist/domains/installation/manifest-manager.d.ts.map +1 -0
- package/dist/domains/installation/manifest-manager.js +49 -0
- package/dist/domains/installation/manifest-manager.js.map +1 -0
- package/dist/domains/installation/resolve-paths.d.ts +3 -0
- package/dist/domains/installation/resolve-paths.d.ts.map +1 -0
- package/dist/domains/installation/resolve-paths.js +40 -0
- package/dist/domains/installation/resolve-paths.js.map +1 -0
- package/dist/domains/skills/index.d.ts +3 -0
- package/dist/domains/skills/index.d.ts.map +1 -0
- package/dist/domains/skills/index.js +10 -0
- package/dist/domains/skills/index.js.map +1 -0
- package/dist/domains/skills/skill-loader.d.ts +4 -0
- package/dist/domains/skills/skill-loader.d.ts.map +1 -0
- package/dist/domains/skills/skill-loader.js +37 -0
- package/dist/domains/skills/skill-loader.js.map +1 -0
- package/dist/domains/skills/skill-validator.d.ts +3 -0
- package/dist/domains/skills/skill-validator.d.ts.map +1 -0
- package/dist/domains/skills/skill-validator.js +39 -0
- package/dist/domains/skills/skill-validator.js.map +1 -0
- package/dist/domains/ui/prompts.d.ts +15 -0
- package/dist/domains/ui/prompts.d.ts.map +1 -0
- package/dist/domains/ui/prompts.js +79 -0
- package/dist/domains/ui/prompts.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/skill-schema.d.ts +8 -0
- package/dist/schemas/skill-schema.d.ts.map +1 -0
- package/dist/schemas/skill-schema.js +16 -0
- package/dist/schemas/skill-schema.js.map +1 -0
- package/dist/shared/logger.d.ts +8 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +20 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/paths.d.ts +15 -0
- package/dist/shared/paths.d.ts.map +1 -0
- package/dist/shared/paths.js +28 -0
- package/dist/shared/paths.js.map +1 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +50 -0
- package/skills/pkit:brainstorm/SKILL.md +93 -0
- package/skills/pkit:competitive-analysis/SKILL.md +103 -0
- package/skills/pkit:make-prd/SKILL.md +69 -0
- package/skills/pkit:make-prd/templates/prd-template.md +108 -0
- package/skills/pkit:roadmap-planner/SKILL.md +101 -0
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# product-kit
|
|
2
|
+
|
|
3
|
+
PM skills for Claude Code, Antigravity, and OpenCode AI assistants.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g product-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pkit install # Interactive: pick tool + skills
|
|
15
|
+
pkit install --yes # Install all skills to all tools
|
|
16
|
+
pkit list # Show available/installed skills
|
|
17
|
+
pkit update # Update all installed skills
|
|
18
|
+
pkit remove pkit:brainstorm
|
|
19
|
+
pkit config # View configuration
|
|
20
|
+
pkit config set toolPaths.antigravity /custom/path
|
|
21
|
+
pkit doctor # Diagnose installation issues
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Skills
|
|
25
|
+
|
|
26
|
+
| Slash Command | Purpose |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `/pkit:brainstorm` | Ideation → clustered ideas → top picks |
|
|
29
|
+
| `/pkit:competitive-analysis` | Competitor profiles → feature matrix → whitespace |
|
|
30
|
+
| `/pkit:roadmap-planner` | NOW/NEXT/LATER table → risk register → exec narrative |
|
|
31
|
+
| `/pkit:make-prd` | Clarifying questions → full PRD → user stories |
|
|
32
|
+
|
|
33
|
+
## Install Paths
|
|
34
|
+
|
|
35
|
+
| Tool | Global path |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Claude Code + OpenCode | `~/.claude/skills/` |
|
|
38
|
+
| Antigravity | `~/.gemini/antigravity/skills/` |
|
|
39
|
+
|
|
40
|
+
## License
|
|
41
|
+
|
|
42
|
+
MIT
|
package/bin/pkit.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAcA,wBAAgB,SAAS,sBAQxB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createCli = createCli;
|
|
7
|
+
const cac_1 = __importDefault(require("cac"));
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const path_1 = require("path");
|
|
10
|
+
// Read version from package.json at runtime
|
|
11
|
+
function getVersion() {
|
|
12
|
+
try {
|
|
13
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', '..', 'package.json'), 'utf8'));
|
|
14
|
+
return pkg.version;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return '0.0.0';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function createCli() {
|
|
21
|
+
const cli = (0, cac_1.default)('pkit');
|
|
22
|
+
cli.version(getVersion());
|
|
23
|
+
cli.help();
|
|
24
|
+
// Global flags available on all commands
|
|
25
|
+
cli.option('--json', 'Output as JSON (for scripting)');
|
|
26
|
+
cli.option('--verbose', 'Show verbose output');
|
|
27
|
+
return cli;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":";;;;;AAcA,8BAQC;AAtBD,8CAAsB;AACtB,2BAAkC;AAClC,+BAA4B;AAE5B,4CAA4C;AAC5C,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1F,OAAO,GAAG,CAAC,OAAiB,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,SAAS;IACvB,MAAM,GAAG,GAAG,IAAA,aAAG,EAAC,MAAM,CAAC,CAAC;IACxB,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1B,GAAG,CAAC,IAAI,EAAE,CAAC;IACX,yCAAyC;IACzC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,gCAAgC,CAAC,CAAC;IACvD,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,QA2BtC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerConfig = registerConfig;
|
|
4
|
+
const config_1 = require("../../domains/config");
|
|
5
|
+
const logger_1 = require("../../shared/logger");
|
|
6
|
+
function registerConfig(cli) {
|
|
7
|
+
// pkit config → show current config
|
|
8
|
+
cli
|
|
9
|
+
.command('config', 'View or set pkit configuration')
|
|
10
|
+
.action(() => {
|
|
11
|
+
const config = (0, config_1.getConfig)();
|
|
12
|
+
logger_1.log.plain('\npkit configuration\n');
|
|
13
|
+
logger_1.log.plain(` defaultScope ${config.defaultScope}`);
|
|
14
|
+
logger_1.log.plain(` toolPaths.claude ${config.toolPaths.claude}`);
|
|
15
|
+
logger_1.log.plain(` toolPaths.antigravity ${config.toolPaths.antigravity}`);
|
|
16
|
+
logger_1.log.plain(` toolPaths.opencode ${config.toolPaths.opencode}`);
|
|
17
|
+
logger_1.log.plain('\nChange with: pkit config set <key> <value>');
|
|
18
|
+
logger_1.log.plain('Keys: defaultScope, toolPaths.claude, toolPaths.antigravity, toolPaths.opencode');
|
|
19
|
+
});
|
|
20
|
+
// pkit config set <key> <value>
|
|
21
|
+
cli
|
|
22
|
+
.command('config set <key> <value>', 'Set a configuration value')
|
|
23
|
+
.action((key, value) => {
|
|
24
|
+
try {
|
|
25
|
+
(0, config_1.setConfigValue)(key, value);
|
|
26
|
+
logger_1.log.success(`Set ${key} = ${value}`);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
logger_1.log.error(err instanceof Error ? err.message : String(err));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":";;AAIA,wCA2BC;AA9BD,iDAAiE;AACjE,gDAA0C;AAE1C,SAAgB,cAAc,CAAC,GAAQ;IACrC,oCAAoC;IACpC,GAAG;SACA,OAAO,CAAC,QAAQ,EAAE,gCAAgC,CAAC;SACnD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,YAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACpC,YAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3D,YAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,YAAG,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACtE,YAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjE,YAAG,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC1D,YAAG,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEL,gCAAgC;IAChC,GAAG;SACA,OAAO,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;SAChE,MAAM,CAAC,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,IAAA,uBAAc,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3B,YAAG,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAkB/B,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,QAqEtC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerDoctor = registerDoctor;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const config_1 = require("../../domains/config");
|
|
7
|
+
const installation_1 = require("../../domains/installation");
|
|
8
|
+
const skills_1 = require("../../domains/skills");
|
|
9
|
+
const paths_1 = require("../../shared/paths");
|
|
10
|
+
const logger_1 = require("../../shared/logger");
|
|
11
|
+
function check(label, ok, detail, fix) {
|
|
12
|
+
if (ok) {
|
|
13
|
+
logger_1.log.success(`${label}: ${detail}`);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
logger_1.log.error(`${label}: ${detail}${fix ? `\n Fix: ${fix}` : ''}`);
|
|
17
|
+
}
|
|
18
|
+
return ok;
|
|
19
|
+
}
|
|
20
|
+
function registerDoctor(cli) {
|
|
21
|
+
cli
|
|
22
|
+
.command('doctor', 'Diagnose pkit installation issues')
|
|
23
|
+
.action(() => {
|
|
24
|
+
logger_1.log.plain('\npkit doctor\n');
|
|
25
|
+
const config = (0, config_1.getConfig)();
|
|
26
|
+
let issues = 0;
|
|
27
|
+
// 1. Node version
|
|
28
|
+
const nodeVer = process.version.replace('v', '').split('.').map(Number);
|
|
29
|
+
const nodeOk = nodeVer[0] >= 18;
|
|
30
|
+
if (!check('Node version', nodeOk, process.version, 'Upgrade Node to >=18'))
|
|
31
|
+
issues++;
|
|
32
|
+
// 2. Skills bundled in package
|
|
33
|
+
const skillsOk = (0, fs_1.existsSync)(paths_1.PACKAGE_SKILLS_DIR);
|
|
34
|
+
if (!check('Package skills dir', skillsOk, paths_1.PACKAGE_SKILLS_DIR, 'Reinstall product-kit'))
|
|
35
|
+
issues++;
|
|
36
|
+
// 3. Claude skills path exists
|
|
37
|
+
const claudeOk = (0, fs_1.existsSync)(config.toolPaths.claude);
|
|
38
|
+
check('Claude skills dir', claudeOk, config.toolPaths.claude, claudeOk ? undefined : `mkdir -p "${config.toolPaths.claude}"`);
|
|
39
|
+
if (!claudeOk)
|
|
40
|
+
issues++;
|
|
41
|
+
// 4. Antigravity path (warn only — tool may not be installed)
|
|
42
|
+
const agOk = (0, fs_1.existsSync)(config.toolPaths.antigravity);
|
|
43
|
+
if (agOk) {
|
|
44
|
+
logger_1.log.success(`Antigravity skills dir: ${config.toolPaths.antigravity}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
logger_1.log.warn(`Antigravity skills dir not found: ${config.toolPaths.antigravity} (install Antigravity or set toolPaths.antigravity)`);
|
|
48
|
+
}
|
|
49
|
+
// 5. Manifest exists and is valid JSON
|
|
50
|
+
let manifestOk = false;
|
|
51
|
+
if ((0, fs_1.existsSync)(paths_1.MANIFEST_PATH)) {
|
|
52
|
+
try {
|
|
53
|
+
JSON.parse((0, fs_1.readFileSync)(paths_1.MANIFEST_PATH, 'utf8'));
|
|
54
|
+
manifestOk = true;
|
|
55
|
+
}
|
|
56
|
+
catch { /* invalid JSON */ }
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
manifestOk = true; // no manifest = nothing installed yet, that's fine
|
|
60
|
+
}
|
|
61
|
+
if (!check('Manifest file', manifestOk, paths_1.MANIFEST_PATH, `rm "${paths_1.MANIFEST_PATH}" and reinstall`))
|
|
62
|
+
issues++;
|
|
63
|
+
// 6. Verify each installed skill dir still exists and SKILL.md is valid
|
|
64
|
+
const entries = (0, installation_1.getManifestEntries)();
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
const skillFile = (0, path_1.join)(entry.destPath, 'SKILL.md');
|
|
67
|
+
const exists = (0, fs_1.existsSync)(skillFile);
|
|
68
|
+
if (!exists) {
|
|
69
|
+
logger_1.log.error(`Missing: ${entry.name} at ${entry.destPath} — run: pkit install ${entry.name} --force`);
|
|
70
|
+
issues++;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
try {
|
|
74
|
+
const content = (0, fs_1.readFileSync)(skillFile, 'utf8');
|
|
75
|
+
(0, skills_1.validateSkillContent)(content, skillFile);
|
|
76
|
+
logger_1.log.success(`${entry.name}: valid`);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
logger_1.log.error(`${entry.name}: invalid SKILL.md — ${err instanceof Error ? err.message : String(err)}`);
|
|
80
|
+
issues++;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
logger_1.log.plain('');
|
|
85
|
+
if (issues === 0) {
|
|
86
|
+
logger_1.log.success('All checks passed.');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger_1.log.error(`${issues} issue(s) found. See fixes above.`);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/doctor/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAc/B,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,QA2CvC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerInstall = registerInstall;
|
|
4
|
+
const skills_1 = require("../../domains/skills");
|
|
5
|
+
const installation_1 = require("../../domains/installation");
|
|
6
|
+
const prompts_1 = require("../../domains/ui/prompts");
|
|
7
|
+
function registerInstall(cli) {
|
|
8
|
+
cli
|
|
9
|
+
.command('install [...skills]', 'Install PM skills to AI coding tools')
|
|
10
|
+
.option('--tool <tool>', 'Target tool: claude, antigravity, opencode, all')
|
|
11
|
+
.option('--scope <scope>', 'Scope: global or project', { default: 'global' })
|
|
12
|
+
.option('--force', 'Overwrite existing installations')
|
|
13
|
+
.option('-y, --yes', 'Skip interactive prompts (installs all skills to all tools)')
|
|
14
|
+
.action(async (skills, opts) => {
|
|
15
|
+
(0, prompts_1.intro)('pkit — PM skills installer');
|
|
16
|
+
// Resolve tool: use flag, non-interactive default, or prompt
|
|
17
|
+
let tool = opts.tool;
|
|
18
|
+
if (!tool) {
|
|
19
|
+
if (opts.yes) {
|
|
20
|
+
tool = 'all';
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
tool = await (0, prompts_1.promptToolSelection)() ?? undefined;
|
|
24
|
+
if (!tool)
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Resolve skill names: use args, or prompt, or all (with -y)
|
|
29
|
+
let skillNames = skills;
|
|
30
|
+
if (skillNames.length === 0) {
|
|
31
|
+
const available = (0, skills_1.loadAvailableSkills)().map(s => s.name);
|
|
32
|
+
if (opts.yes) {
|
|
33
|
+
skillNames = available;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const selected = await (0, prompts_1.promptSkillSelection)(available);
|
|
37
|
+
if (!selected)
|
|
38
|
+
return;
|
|
39
|
+
skillNames = selected;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
await (0, installation_1.installSkills)(skillNames, {
|
|
43
|
+
tools: tool,
|
|
44
|
+
scope: opts.scope,
|
|
45
|
+
force: opts.force,
|
|
46
|
+
yes: opts.yes,
|
|
47
|
+
});
|
|
48
|
+
(0, prompts_1.outro)('Done! Use /pkit:brainstorm (or other skill names) in your AI tool.');
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":";;AAcA,0CA2CC;AAxDD,iDAA2D;AAC3D,6DAA2D;AAC3D,sDAAmG;AAWnG,SAAgB,eAAe,CAAC,GAAQ;IACtC,GAAG;SACA,OAAO,CAAC,qBAAqB,EAAE,sCAAsC,CAAC;SACtE,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;SAC1E,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;SAC5E,MAAM,CAAC,SAAS,EAAE,kCAAkC,CAAC;SACrD,MAAM,CAAC,WAAW,EAAE,6DAA6D,CAAC;SAClF,MAAM,CAAC,KAAK,EAAE,MAAgB,EAAE,IAAiB,EAAE,EAAE;QACpD,IAAA,eAAK,EAAC,4BAA4B,CAAC,CAAC;QAEpC,6DAA6D;QAC7D,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,MAAM,IAAA,6BAAmB,GAAE,IAAI,SAAS,CAAC;gBAChD,IAAI,CAAC,IAAI;oBAAE,OAAO;YACpB,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,IAAI,UAAU,GAAG,MAAM,CAAC;QACxB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAA,4BAAmB,GAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,UAAU,GAAG,SAAS,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAoB,EAAC,SAAS,CAAC,CAAC;gBACvD,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBACtB,UAAU,GAAG,QAAQ,CAAC;YACxB,CAAC;QACH,CAAC;QAED,MAAM,IAAA,4BAAa,EAAC,UAAU,EAAE;YAC9B,KAAK,EAAE,IAAgB;YACvB,KAAK,EAAE,IAAI,CAAC,KAAqB;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QAEH,IAAA,eAAK,EAAC,oEAAoE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/list/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAK/B,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,QAmBpC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerList = registerList;
|
|
4
|
+
const skills_1 = require("../../domains/skills");
|
|
5
|
+
const installation_1 = require("../../domains/installation");
|
|
6
|
+
const logger_1 = require("../../shared/logger");
|
|
7
|
+
function registerList(cli) {
|
|
8
|
+
cli
|
|
9
|
+
.command('list', 'List available and installed PM skills')
|
|
10
|
+
.action(() => {
|
|
11
|
+
const available = (0, skills_1.loadAvailableSkills)();
|
|
12
|
+
const installed = new Set((0, installation_1.getManifestEntries)().map(e => e.name));
|
|
13
|
+
logger_1.log.plain('\npkit — available skills\n');
|
|
14
|
+
for (const skill of available) {
|
|
15
|
+
const status = installed.has(skill.name) ? '✓ installed' : ' available';
|
|
16
|
+
// Trim description to 60 chars for display
|
|
17
|
+
const desc = skill.meta.description.replace(/\s+/g, ' ').slice(0, 60);
|
|
18
|
+
logger_1.log.plain(` [${status}] ${skill.name.padEnd(28)} ${desc}...`);
|
|
19
|
+
}
|
|
20
|
+
const installedCount = available.filter(s => installed.has(s.name)).length;
|
|
21
|
+
logger_1.log.plain(`\n${installedCount}/${available.length} skills installed`);
|
|
22
|
+
logger_1.log.plain('Install with: pkit install');
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/list/index.ts"],"names":[],"mappings":";;AAKA,oCAmBC;AAvBD,iDAA2D;AAC3D,6DAAgE;AAChE,gDAA0C;AAE1C,SAAgB,YAAY,CAAC,GAAQ;IACnC,GAAG;SACA,OAAO,CAAC,MAAM,EAAE,wCAAwC,CAAC;SACzD,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,SAAS,GAAG,IAAA,4BAAmB,GAAE,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAA,iCAAkB,GAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjE,YAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC;YACzE,2CAA2C;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtE,YAAG,CAAC,KAAK,CAAC,MAAM,MAAM,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,YAAG,CAAC,KAAK,CAAC,KAAK,cAAc,IAAI,SAAS,CAAC,MAAM,mBAAmB,CAAC,CAAC;QACtE,YAAG,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/remove/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAO/B,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,QA4BtC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerRemove = registerRemove;
|
|
4
|
+
const installation_1 = require("../../domains/installation");
|
|
5
|
+
const prompts_1 = require("../../domains/ui/prompts");
|
|
6
|
+
const logger_1 = require("../../shared/logger");
|
|
7
|
+
function registerRemove(cli) {
|
|
8
|
+
cli
|
|
9
|
+
.command('remove [...skills]', 'Remove installed PM skills')
|
|
10
|
+
.option('-y, --yes', 'Skip confirmation prompt')
|
|
11
|
+
.action(async (skills, opts) => {
|
|
12
|
+
(0, prompts_1.intro)('pkit — removing skills');
|
|
13
|
+
// If no skills named, prompt to pick from installed
|
|
14
|
+
let toRemove = skills;
|
|
15
|
+
if (toRemove.length === 0) {
|
|
16
|
+
const installedNames = [...new Set((0, installation_1.getManifestEntries)().map(e => e.name))];
|
|
17
|
+
if (installedNames.length === 0) {
|
|
18
|
+
logger_1.log.warn('No skills installed.');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const selected = await (0, prompts_1.promptSkillSelection)(installedNames);
|
|
22
|
+
if (!selected)
|
|
23
|
+
return;
|
|
24
|
+
toRemove = selected;
|
|
25
|
+
}
|
|
26
|
+
if (!opts.yes) {
|
|
27
|
+
const ok = await (0, prompts_1.promptConfirm)(`Remove ${toRemove.join(', ')}?`);
|
|
28
|
+
if (!ok) {
|
|
29
|
+
logger_1.log.info('Cancelled.');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
await (0, installation_1.removeSkills)(toRemove);
|
|
34
|
+
(0, prompts_1.outro)('Done.');
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/remove/index.ts"],"names":[],"mappings":";;AAOA,wCA4BC;AAlCD,6DAA8E;AAC9E,sDAA6F;AAC7F,gDAA0C;AAI1C,SAAgB,cAAc,CAAC,GAAQ;IACrC,GAAG;SACA,OAAO,CAAC,oBAAoB,EAAE,4BAA4B,CAAC;SAC3D,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,MAAgB,EAAE,IAAgB,EAAE,EAAE;QACnD,IAAA,eAAK,EAAC,wBAAwB,CAAC,CAAC;QAEhC,oDAAoD;QACpD,IAAI,QAAQ,GAAG,MAAM,CAAC;QACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAA,iCAAkB,GAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,YAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAoB,EAAC,cAAc,CAAC,CAAC;YAC5D,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,GAAG,QAAQ,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,MAAM,IAAA,uBAAa,EAAC,UAAU,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,CAAC,EAAE,EAAE,CAAC;gBAAC,YAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;QAC9C,CAAC;QAED,MAAM,IAAA,2BAAY,EAAC,QAAQ,CAAC,CAAC;QAC7B,IAAA,eAAK,EAAC,OAAO,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/update/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAQ/B,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,QA0BtC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerUpdate = registerUpdate;
|
|
4
|
+
const installation_1 = require("../../domains/installation");
|
|
5
|
+
const prompts_1 = require("../../domains/ui/prompts");
|
|
6
|
+
const logger_1 = require("../../shared/logger");
|
|
7
|
+
function registerUpdate(cli) {
|
|
8
|
+
cli
|
|
9
|
+
.command('update [...skills]', 'Update installed PM skills to latest version')
|
|
10
|
+
.option('--tool <tool>', 'Target tool: claude, antigravity, opencode, all')
|
|
11
|
+
.option('--scope <scope>', 'Scope: global or project', { default: 'global' })
|
|
12
|
+
.action(async (skills, opts) => {
|
|
13
|
+
(0, prompts_1.intro)('pkit — updating skills');
|
|
14
|
+
// Default: update all installed skills
|
|
15
|
+
const toUpdate = skills.length
|
|
16
|
+
? skills
|
|
17
|
+
: [...new Set((0, installation_1.getManifestEntries)().map(e => e.name))];
|
|
18
|
+
if (toUpdate.length === 0) {
|
|
19
|
+
logger_1.log.warn('No skills installed. Run: pkit install');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
await (0, installation_1.updateSkills)(toUpdate, {
|
|
23
|
+
tools: opts.tool ?? 'all',
|
|
24
|
+
scope: opts.scope,
|
|
25
|
+
force: true,
|
|
26
|
+
});
|
|
27
|
+
(0, prompts_1.outro)('Skills updated.');
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/update/index.ts"],"names":[],"mappings":";;AAQA,wCA0BC;AAjCD,6DAA8E;AAC9E,sDAAwD;AACxD,gDAA0C;AAK1C,SAAgB,cAAc,CAAC,GAAQ;IACrC,GAAG;SACA,OAAO,CAAC,oBAAoB,EAAE,8CAA8C,CAAC;SAC7E,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;SAC1E,MAAM,CAAC,iBAAiB,EAAE,0BAA0B,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,MAAgB,EAAE,IAAgB,EAAE,EAAE;QACnD,IAAA,eAAK,EAAC,wBAAwB,CAAC,CAAC;QAEhC,uCAAuC;QACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM;YAC5B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAA,iCAAkB,GAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,YAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,IAAA,2BAAY,EAAC,QAAQ,EAAE;YAC3B,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,KAAK;YACzB,KAAK,EAAE,IAAI,CAAC,KAAqB;YACjC,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,IAAA,eAAK,EAAC,iBAAiB,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ProductKitConfig {
|
|
2
|
+
defaultScope: 'global' | 'project';
|
|
3
|
+
toolPaths: {
|
|
4
|
+
claude: string;
|
|
5
|
+
antigravity: string;
|
|
6
|
+
opencode: string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare function getConfig(): ProductKitConfig;
|
|
10
|
+
export declare function setConfigValue(key: string, value: string): void;
|
|
11
|
+
//# sourceMappingURL=config-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../../src/domains/config/config-store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,QAAQ,GAAG,SAAS,CAAC;IAEnC,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAWD,wBAAgB,SAAS,IAAI,gBAAgB,CAQ5C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAe/D"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getConfig = getConfig;
|
|
4
|
+
exports.setConfigValue = setConfigValue;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const fs_extra_1 = require("fs-extra");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const paths_1 = require("../../shared/paths");
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
defaultScope: 'global',
|
|
11
|
+
toolPaths: {
|
|
12
|
+
claude: paths_1.DEFAULT_TOOL_PATHS.claude,
|
|
13
|
+
antigravity: paths_1.DEFAULT_TOOL_PATHS.antigravity,
|
|
14
|
+
opencode: paths_1.DEFAULT_TOOL_PATHS.opencode,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
function getConfig() {
|
|
18
|
+
if (!(0, fs_1.existsSync)(paths_1.CONFIG_PATH))
|
|
19
|
+
return { ...DEFAULT_CONFIG };
|
|
20
|
+
try {
|
|
21
|
+
const raw = JSON.parse((0, fs_1.readFileSync)(paths_1.CONFIG_PATH, 'utf8'));
|
|
22
|
+
return { ...DEFAULT_CONFIG, ...raw, toolPaths: { ...DEFAULT_CONFIG.toolPaths, ...raw.toolPaths } };
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { ...DEFAULT_CONFIG };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function setConfigValue(key, value) {
|
|
29
|
+
const config = getConfig();
|
|
30
|
+
// Support dot notation: "toolPaths.antigravity"
|
|
31
|
+
if (key.startsWith('toolPaths.')) {
|
|
32
|
+
const tool = key.split('.')[1];
|
|
33
|
+
if (tool in config.toolPaths)
|
|
34
|
+
config.toolPaths[tool] = value;
|
|
35
|
+
else
|
|
36
|
+
throw new Error(`Unknown tool path key: ${tool}`);
|
|
37
|
+
}
|
|
38
|
+
else if (key === 'defaultScope') {
|
|
39
|
+
if (value !== 'global' && value !== 'project')
|
|
40
|
+
throw new Error('defaultScope must be global or project');
|
|
41
|
+
config.defaultScope = value;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
throw new Error(`Unknown config key: ${key}. Valid keys: defaultScope, toolPaths.claude, toolPaths.antigravity, toolPaths.opencode`);
|
|
45
|
+
}
|
|
46
|
+
(0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(paths_1.CONFIG_PATH));
|
|
47
|
+
(0, fs_1.writeFileSync)(paths_1.CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=config-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../../src/domains/config/config-store.ts"],"names":[],"mappings":";;AAwBA,8BAQC;AAED,wCAeC;AAjDD,2BAA6D;AAC7D,uCAAyC;AACzC,+BAA+B;AAC/B,8CAAqE;AAYrE,MAAM,cAAc,GAAqB;IACvC,YAAY,EAAE,QAAQ;IACtB,SAAS,EAAE;QACT,MAAM,EAAE,0BAAkB,CAAC,MAAM;QACjC,WAAW,EAAE,0BAAkB,CAAC,WAAW;QAC3C,QAAQ,EAAE,0BAAkB,CAAC,QAAQ;KACtC;CACF,CAAC;AAEF,SAAgB,SAAS;IACvB,IAAI,CAAC,IAAA,eAAU,EAAC,mBAAW,CAAC;QAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,mBAAW,EAAE,MAAM,CAAC,CAA8B,CAAC;QACvF,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;IACrG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,GAAW,EAAE,KAAa;IACvD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,gDAAgD;IAChD,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAwC,CAAC;QACtE,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS;YAAE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;;YACxD,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACzG,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,yFAAyF,CAAC,CAAC;IACvI,CAAC;IACD,IAAA,wBAAa,EAAC,IAAA,cAAO,EAAC,mBAAW,CAAC,CAAC,CAAC;IACpC,IAAA,kBAAa,EAAC,mBAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domains/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setConfigValue = exports.getConfig = void 0;
|
|
4
|
+
var config_store_1 = require("./config-store");
|
|
5
|
+
Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return config_store_1.getConfig; } });
|
|
6
|
+
Object.defineProperty(exports, "setConfigValue", { enumerable: true, get: function () { return config_store_1.setConfigValue; } });
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domains/config/index.ts"],"names":[],"mappings":";;;AAAA,+CAA2D;AAAlD,yGAAA,SAAS,OAAA;AAAE,8GAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type CopyResult = {
|
|
2
|
+
status: 'installed';
|
|
3
|
+
destPath: string;
|
|
4
|
+
} | {
|
|
5
|
+
status: 'skipped';
|
|
6
|
+
reason: string;
|
|
7
|
+
} | {
|
|
8
|
+
status: 'failed';
|
|
9
|
+
error: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function copySkillDir(srcDir: string, destBase: string, force: boolean): Promise<CopyResult>;
|
|
12
|
+
//# sourceMappingURL=copy-skill-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-skill-files.d.ts","sourceRoot":"","sources":["../../../src/domains/installation/copy-skill-files.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIxC,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC,CAqBrB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.copySkillDir = copySkillDir;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const fs_extra_1 = require("fs-extra");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
// Safely copies a skill directory to destBase/skillName.
|
|
8
|
+
// Validates paths to prevent directory traversal attacks.
|
|
9
|
+
async function copySkillDir(srcDir, destBase, force) {
|
|
10
|
+
const skillName = (0, path_1.basename)(srcDir);
|
|
11
|
+
// Path traversal guard: resolved dest must be inside destBase
|
|
12
|
+
const destSkillDir = (0, path_1.join)(destBase, skillName);
|
|
13
|
+
if (!(0, path_1.resolve)(destSkillDir).startsWith((0, path_1.resolve)(destBase))) {
|
|
14
|
+
return { status: 'failed', error: `Path traversal attempt blocked for: ${skillName}` };
|
|
15
|
+
}
|
|
16
|
+
if ((0, fs_1.existsSync)(destSkillDir) && !force) {
|
|
17
|
+
return { status: 'skipped', reason: 'already installed (use --force to overwrite)' };
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
await (0, fs_extra_1.ensureDir)(destBase);
|
|
21
|
+
if ((0, fs_1.existsSync)(destSkillDir) && force)
|
|
22
|
+
await (0, fs_extra_1.remove)(destSkillDir);
|
|
23
|
+
await (0, fs_extra_1.copy)(srcDir, destSkillDir, { overwrite: force });
|
|
24
|
+
return { status: 'installed', destPath: destSkillDir };
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
return { status: 'failed', error: err instanceof Error ? err.message : String(err) };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=copy-skill-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-skill-files.js","sourceRoot":"","sources":["../../../src/domains/installation/copy-skill-files.ts"],"names":[],"mappings":";;AAWA,oCAyBC;AApCD,2BAAgC;AAChC,uCAAmD;AACnD,+BAA+C;AAO/C,yDAAyD;AACzD,0DAA0D;AACnD,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,QAAgB,EAChB,KAAc;IAEd,MAAM,SAAS,GAAG,IAAA,eAAQ,EAAC,MAAM,CAAC,CAAC;IAEnC,8DAA8D;IAC9D,MAAM,YAAY,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAA,cAAO,EAAC,YAAY,CAAC,CAAC,UAAU,CAAC,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,uCAAuC,SAAS,EAAE,EAAE,CAAC;IACzF,CAAC;IAED,IAAI,IAAA,eAAU,EAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC;IACvF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAA,oBAAS,EAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,IAAA,eAAU,EAAC,YAAY,CAAC,IAAI,KAAK;YAAE,MAAM,IAAA,iBAAM,EAAC,YAAY,CAAC,CAAC;QAClE,MAAM,IAAA,eAAI,EAAC,MAAM,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACvF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { getManifestEntries } from './manifest-manager';
|
|
2
|
+
import type { InstallOptions } from '../../types';
|
|
3
|
+
export declare function installSkills(names: string[], opts: InstallOptions): Promise<void>;
|
|
4
|
+
export declare function removeSkills(names: string[]): Promise<void>;
|
|
5
|
+
export declare function updateSkills(names: string[], opts: InstallOptions): Promise<void>;
|
|
6
|
+
export { getManifestEntries };
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domains/installation/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAA2C,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEjG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCxF;AAGD,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBjE;AAGD,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|