@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.
Files changed (96) hide show
  1. package/README.md +42 -0
  2. package/bin/pkit.js +2 -0
  3. package/dist/cli/setup.d.ts +2 -0
  4. package/dist/cli/setup.d.ts.map +1 -0
  5. package/dist/cli/setup.js +29 -0
  6. package/dist/cli/setup.js.map +1 -0
  7. package/dist/commands/config/index.d.ts +3 -0
  8. package/dist/commands/config/index.d.ts.map +1 -0
  9. package/dist/commands/config/index.js +34 -0
  10. package/dist/commands/config/index.js.map +1 -0
  11. package/dist/commands/doctor/index.d.ts +3 -0
  12. package/dist/commands/doctor/index.d.ts.map +1 -0
  13. package/dist/commands/doctor/index.js +94 -0
  14. package/dist/commands/doctor/index.js.map +1 -0
  15. package/dist/commands/install/index.d.ts +3 -0
  16. package/dist/commands/install/index.d.ts.map +1 -0
  17. package/dist/commands/install/index.js +51 -0
  18. package/dist/commands/install/index.js.map +1 -0
  19. package/dist/commands/list/index.d.ts +3 -0
  20. package/dist/commands/list/index.d.ts.map +1 -0
  21. package/dist/commands/list/index.js +25 -0
  22. package/dist/commands/list/index.js.map +1 -0
  23. package/dist/commands/remove/index.d.ts +3 -0
  24. package/dist/commands/remove/index.d.ts.map +1 -0
  25. package/dist/commands/remove/index.js +37 -0
  26. package/dist/commands/remove/index.js.map +1 -0
  27. package/dist/commands/update/index.d.ts +3 -0
  28. package/dist/commands/update/index.d.ts.map +1 -0
  29. package/dist/commands/update/index.js +30 -0
  30. package/dist/commands/update/index.js.map +1 -0
  31. package/dist/domains/config/config-store.d.ts +11 -0
  32. package/dist/domains/config/config-store.d.ts.map +1 -0
  33. package/dist/domains/config/config-store.js +49 -0
  34. package/dist/domains/config/config-store.js.map +1 -0
  35. package/dist/domains/config/index.d.ts +3 -0
  36. package/dist/domains/config/index.d.ts.map +1 -0
  37. package/dist/domains/config/index.js +7 -0
  38. package/dist/domains/config/index.js.map +1 -0
  39. package/dist/domains/installation/copy-skill-files.d.ts +12 -0
  40. package/dist/domains/installation/copy-skill-files.d.ts.map +1 -0
  41. package/dist/domains/installation/copy-skill-files.js +30 -0
  42. package/dist/domains/installation/copy-skill-files.js.map +1 -0
  43. package/dist/domains/installation/index.d.ts +7 -0
  44. package/dist/domains/installation/index.d.ts.map +1 -0
  45. package/dist/domains/installation/index.js +116 -0
  46. package/dist/domains/installation/index.js.map +1 -0
  47. package/dist/domains/installation/manifest-manager.d.ts +9 -0
  48. package/dist/domains/installation/manifest-manager.d.ts.map +1 -0
  49. package/dist/domains/installation/manifest-manager.js +49 -0
  50. package/dist/domains/installation/manifest-manager.js.map +1 -0
  51. package/dist/domains/installation/resolve-paths.d.ts +3 -0
  52. package/dist/domains/installation/resolve-paths.d.ts.map +1 -0
  53. package/dist/domains/installation/resolve-paths.js +40 -0
  54. package/dist/domains/installation/resolve-paths.js.map +1 -0
  55. package/dist/domains/skills/index.d.ts +3 -0
  56. package/dist/domains/skills/index.d.ts.map +1 -0
  57. package/dist/domains/skills/index.js +10 -0
  58. package/dist/domains/skills/index.js.map +1 -0
  59. package/dist/domains/skills/skill-loader.d.ts +4 -0
  60. package/dist/domains/skills/skill-loader.d.ts.map +1 -0
  61. package/dist/domains/skills/skill-loader.js +37 -0
  62. package/dist/domains/skills/skill-loader.js.map +1 -0
  63. package/dist/domains/skills/skill-validator.d.ts +3 -0
  64. package/dist/domains/skills/skill-validator.d.ts.map +1 -0
  65. package/dist/domains/skills/skill-validator.js +39 -0
  66. package/dist/domains/skills/skill-validator.js.map +1 -0
  67. package/dist/domains/ui/prompts.d.ts +15 -0
  68. package/dist/domains/ui/prompts.d.ts.map +1 -0
  69. package/dist/domains/ui/prompts.js +79 -0
  70. package/dist/domains/ui/prompts.js.map +1 -0
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +24 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/schemas/skill-schema.d.ts +8 -0
  76. package/dist/schemas/skill-schema.d.ts.map +1 -0
  77. package/dist/schemas/skill-schema.js +16 -0
  78. package/dist/schemas/skill-schema.js.map +1 -0
  79. package/dist/shared/logger.d.ts +8 -0
  80. package/dist/shared/logger.d.ts.map +1 -0
  81. package/dist/shared/logger.js +20 -0
  82. package/dist/shared/logger.js.map +1 -0
  83. package/dist/shared/paths.d.ts +15 -0
  84. package/dist/shared/paths.d.ts.map +1 -0
  85. package/dist/shared/paths.js +28 -0
  86. package/dist/shared/paths.js.map +1 -0
  87. package/dist/types/index.d.ts +26 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +3 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/package.json +50 -0
  92. package/skills/pkit:brainstorm/SKILL.md +93 -0
  93. package/skills/pkit:competitive-analysis/SKILL.md +103 -0
  94. package/skills/pkit:make-prd/SKILL.md +69 -0
  95. package/skills/pkit:make-prd/templates/prd-template.md +108 -0
  96. package/skills/pkit:roadmap-planner/SKILL.md +101 -0
@@ -0,0 +1,116 @@
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.getManifestEntries = void 0;
37
+ exports.installSkills = installSkills;
38
+ exports.removeSkills = removeSkills;
39
+ exports.updateSkills = updateSkills;
40
+ const fs_1 = require("fs");
41
+ const path_1 = require("path");
42
+ const skills_1 = require("../skills");
43
+ const resolve_paths_1 = require("./resolve-paths");
44
+ const copy_skill_files_1 = require("./copy-skill-files");
45
+ const manifest_manager_1 = require("./manifest-manager");
46
+ Object.defineProperty(exports, "getManifestEntries", { enumerable: true, get: function () { return manifest_manager_1.getManifestEntries; } });
47
+ const logger_1 = require("../../shared/logger");
48
+ // Read current package version for manifest tracking
49
+ function getPkgVersion() {
50
+ try {
51
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', '..', '..', 'package.json'), 'utf8'));
52
+ return pkg.version;
53
+ }
54
+ catch {
55
+ return '0.0.0';
56
+ }
57
+ }
58
+ // Install one or more skills. If names is empty, installs all available.
59
+ async function installSkills(names, opts) {
60
+ const available = (0, skills_1.loadAvailableSkills)();
61
+ const toInstall = names.length
62
+ ? available.filter(s => names.includes(s.name))
63
+ : available;
64
+ if (toInstall.length === 0) {
65
+ logger_1.log.warn(names.length ? `No skills found matching: ${names.join(', ')}` : 'No skills available to install');
66
+ return;
67
+ }
68
+ const destPaths = (0, resolve_paths_1.resolveTargetPaths)(opts.tools, opts.scope);
69
+ const pkgVersion = getPkgVersion();
70
+ for (const skill of toInstall) {
71
+ for (const destBase of destPaths) {
72
+ const result = await (0, copy_skill_files_1.copySkillDir)(skill.dirPath, destBase, opts.force ?? false);
73
+ if (result.status === 'installed') {
74
+ logger_1.log.success(`Installed: ${skill.name} → ${result.destPath}`);
75
+ (0, manifest_manager_1.addManifestEntry)({
76
+ name: skill.name,
77
+ tool: opts.tools,
78
+ destPath: result.destPath,
79
+ installedAt: new Date().toISOString(),
80
+ pkgVersion,
81
+ });
82
+ }
83
+ else if (result.status === 'skipped') {
84
+ logger_1.log.warn(`Skipped: ${skill.name} — ${result.reason}`);
85
+ }
86
+ else {
87
+ logger_1.log.error(`Failed: ${skill.name} — ${result.error}`);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ // Remove skills by name, deleting files from all recorded install paths
93
+ async function removeSkills(names) {
94
+ const { remove } = await Promise.resolve().then(() => __importStar(require('fs-extra')));
95
+ for (const name of names) {
96
+ const removed = (0, manifest_manager_1.removeManifestEntries)(name);
97
+ if (removed.length === 0) {
98
+ logger_1.log.warn(`Not installed: ${name}`);
99
+ continue;
100
+ }
101
+ for (const entry of removed) {
102
+ try {
103
+ await remove(entry.destPath);
104
+ logger_1.log.success(`Removed: ${name} from ${entry.destPath}`);
105
+ }
106
+ catch (err) {
107
+ logger_1.log.error(`Failed to remove ${entry.destPath}: ${err instanceof Error ? err.message : String(err)}`);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ // Update = reinstall with force, comparing pkg version
113
+ async function updateSkills(names, opts) {
114
+ await installSkills(names, { ...opts, force: true });
115
+ }
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domains/installation/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,sCAiCC;AAGD,oCAiBC;AAGD,oCAEC;AA5ED,2BAAkC;AAClC,+BAA4B;AAC5B,sCAAgD;AAChD,mDAAqD;AACrD,yDAAkD;AAClD,yDAAiG;AAyExF,mGAzEyC,qCAAkB,OAyEzC;AAxE3B,gDAA0C;AAG1C,qDAAqD;AACrD,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChG,OAAO,GAAG,CAAC,OAAiB,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,OAAO,CAAC;IAAC,CAAC;AAC7B,CAAC;AAED,yEAAyE;AAClE,KAAK,UAAU,aAAa,CAAC,KAAe,EAAE,IAAoB;IACvE,MAAM,SAAS,GAAG,IAAA,4BAAmB,GAAE,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM;QAC5B,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,YAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;QAC5G,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,kCAAkB,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAY,EAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;YAChF,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,YAAG,CAAC,OAAO,CAAC,cAAc,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC7D,IAAA,mCAAgB,EAAC;oBACf,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,IAAI,CAAC,KAAK;oBAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACrC,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvC,YAAG,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,YAAG,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AACjE,KAAK,UAAU,YAAY,CAAC,KAAe;IAChD,MAAM,EAAE,MAAM,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAA,wCAAqB,EAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,YAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC7B,YAAG,CAAC,OAAO,CAAC,YAAY,IAAI,SAAS,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAG,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvG,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,uDAAuD;AAChD,KAAK,UAAU,YAAY,CAAC,KAAe,EAAE,IAAoB;IACtE,MAAM,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ManifestEntry } from '../../types';
2
+ type Manifest = ManifestEntry[];
3
+ export declare function addManifestEntry(entry: ManifestEntry): void;
4
+ export declare function removeManifestEntries(skillName: string): ManifestEntry[];
5
+ export declare function getManifestEntries(): Manifest;
6
+ export declare function isSkillInstalled(skillName: string): boolean;
7
+ export declare function getInstalledVersion(): string | null;
8
+ export {};
9
+ //# sourceMappingURL=manifest-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-manager.d.ts","sourceRoot":"","sources":["../../../src/domains/installation/manifest-manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,KAAK,QAAQ,GAAG,aAAa,EAAE,CAAC;AAgBhC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAO3D;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE,CAKxE;AAED,wBAAgB,kBAAkB,IAAI,QAAQ,CAE7C;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE3D;AAGD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addManifestEntry = addManifestEntry;
4
+ exports.removeManifestEntries = removeManifestEntries;
5
+ exports.getManifestEntries = getManifestEntries;
6
+ exports.isSkillInstalled = isSkillInstalled;
7
+ exports.getInstalledVersion = getInstalledVersion;
8
+ const fs_1 = require("fs");
9
+ const fs_extra_1 = require("fs-extra");
10
+ const path_1 = require("path");
11
+ const paths_1 = require("../../shared/paths");
12
+ function readManifest() {
13
+ if (!(0, fs_1.existsSync)(paths_1.MANIFEST_PATH))
14
+ return [];
15
+ try {
16
+ return JSON.parse((0, fs_1.readFileSync)(paths_1.MANIFEST_PATH, 'utf8'));
17
+ }
18
+ catch {
19
+ return [];
20
+ }
21
+ }
22
+ function writeManifest(manifest) {
23
+ (0, fs_extra_1.ensureDirSync)((0, path_1.dirname)(paths_1.MANIFEST_PATH));
24
+ (0, fs_1.writeFileSync)(paths_1.MANIFEST_PATH, JSON.stringify(manifest, null, 2));
25
+ }
26
+ function addManifestEntry(entry) {
27
+ const manifest = readManifest();
28
+ // Remove any existing entry for same skill + tool + dest to avoid duplicates
29
+ const filtered = manifest.filter(e => !(e.name === entry.name && e.tool === entry.tool && e.destPath === entry.destPath));
30
+ writeManifest([...filtered, entry]);
31
+ }
32
+ function removeManifestEntries(skillName) {
33
+ const manifest = readManifest();
34
+ const removed = manifest.filter(e => e.name === skillName);
35
+ writeManifest(manifest.filter(e => e.name !== skillName));
36
+ return removed;
37
+ }
38
+ function getManifestEntries() {
39
+ return readManifest();
40
+ }
41
+ function isSkillInstalled(skillName) {
42
+ return readManifest().some(e => e.name === skillName);
43
+ }
44
+ // Returns the package version recorded when skills were last installed
45
+ function getInstalledVersion() {
46
+ const manifest = readManifest();
47
+ return manifest[0]?.pkgVersion ?? null;
48
+ }
49
+ //# sourceMappingURL=manifest-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-manager.js","sourceRoot":"","sources":["../../../src/domains/installation/manifest-manager.ts"],"names":[],"mappings":";;AAsBA,4CAOC;AAED,sDAKC;AAED,gDAEC;AAED,4CAEC;AAGD,kDAGC;AAlDD,2BAA6D;AAC7D,uCAAyC;AACzC,+BAA+B;AAC/B,8CAAmD;AAKnD,SAAS,YAAY;IACnB,IAAI,CAAC,IAAA,eAAU,EAAC,qBAAa,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,qBAAa,EAAE,MAAM,CAAC,CAAa,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAkB;IACvC,IAAA,wBAAa,EAAC,IAAA,cAAO,EAAC,qBAAa,CAAC,CAAC,CAAC;IACtC,IAAA,kBAAa,EAAC,qBAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAoB;IACnD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CACxF,CAAC;IACF,aAAa,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,qBAAqB,CAAC,SAAiB;IACrD,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC3D,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC;AAED,SAAgB,gBAAgB,CAAC,SAAiB;IAChD,OAAO,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,uEAAuE;AACvE,SAAgB,mBAAmB;IACjC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolName, InstallScope } from '../../types';
2
+ export declare function resolveTargetPaths(tool: ToolName, scope: InstallScope): string[];
3
+ //# sourceMappingURL=resolve-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-paths.d.ts","sourceRoot":"","sources":["../../../src/domains/installation/resolve-paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI1D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,EAAE,CA0BhF"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveTargetPaths = resolveTargetPaths;
4
+ const path_1 = require("path");
5
+ const paths_1 = require("../../shared/paths");
6
+ const config_1 = require("../config");
7
+ // Returns the list of destination base directories for a given tool + scope combo.
8
+ // "all" expands to claude + antigravity (opencode shares the claude path).
9
+ function resolveTargetPaths(tool, scope) {
10
+ const config = (0, config_1.getConfig)();
11
+ const cwd = process.cwd();
12
+ if (scope === 'global') {
13
+ if (tool === 'claude')
14
+ return [config.toolPaths.claude];
15
+ if (tool === 'opencode')
16
+ return [config.toolPaths.opencode]; // same as claude by default
17
+ if (tool === 'antigravity')
18
+ return [config.toolPaths.antigravity];
19
+ // "all" — deduplicate in case claude + opencode paths are identical
20
+ const paths = [config.toolPaths.claude, config.toolPaths.antigravity];
21
+ if (config.toolPaths.opencode !== config.toolPaths.claude) {
22
+ paths.push(config.toolPaths.opencode);
23
+ }
24
+ return [...new Set(paths)];
25
+ }
26
+ // Project scope
27
+ if (tool === 'claude')
28
+ return [(0, path_1.join)(cwd, paths_1.PROJECT_TOOL_SEGMENTS.claude)];
29
+ if (tool === 'opencode')
30
+ return [(0, path_1.join)(cwd, paths_1.PROJECT_TOOL_SEGMENTS.opencode)];
31
+ if (tool === 'antigravity')
32
+ return [(0, path_1.join)(cwd, paths_1.PROJECT_TOOL_SEGMENTS.antigravity)];
33
+ // "all"
34
+ return [...new Set([
35
+ (0, path_1.join)(cwd, paths_1.PROJECT_TOOL_SEGMENTS.claude),
36
+ (0, path_1.join)(cwd, paths_1.PROJECT_TOOL_SEGMENTS.antigravity),
37
+ (0, path_1.join)(cwd, paths_1.PROJECT_TOOL_SEGMENTS.opencode),
38
+ ])];
39
+ }
40
+ //# sourceMappingURL=resolve-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-paths.js","sourceRoot":"","sources":["../../../src/domains/installation/resolve-paths.ts"],"names":[],"mappings":";;AAOA,gDA0BC;AAjCD,+BAA4B;AAC5B,8CAA2D;AAC3D,sCAAsC;AAGtC,mFAAmF;AACnF,2EAA2E;AAC3E,SAAgB,kBAAkB,CAAC,IAAc,EAAE,KAAmB;IACpE,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B;QACzF,IAAI,IAAI,KAAK,aAAa;YAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAClE,oEAAoE;QACpE,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,gBAAgB;IAChB,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAA,WAAI,EAAC,GAAG,EAAE,6BAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,CAAC,IAAA,WAAI,EAAC,GAAG,EAAE,6BAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5E,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,CAAC,IAAA,WAAI,EAAC,GAAG,EAAE,6BAAqB,CAAC,WAAW,CAAC,CAAC,CAAC;IAClF,QAAQ;IACR,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;YACjB,IAAA,WAAI,EAAC,GAAG,EAAE,6BAAqB,CAAC,MAAM,CAAC;YACvC,IAAA,WAAI,EAAC,GAAG,EAAE,6BAAqB,CAAC,WAAW,CAAC;YAC5C,IAAA,WAAI,EAAC,GAAG,EAAE,6BAAqB,CAAC,QAAQ,CAAC;SAC1C,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { loadAvailableSkills, findSkillByName } from './skill-loader';
2
+ export { validateSkillContent } from './skill-validator';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domains/skills/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSkillContent = exports.findSkillByName = exports.loadAvailableSkills = void 0;
4
+ // Skills domain facade — public API for skill discovery
5
+ var skill_loader_1 = require("./skill-loader");
6
+ Object.defineProperty(exports, "loadAvailableSkills", { enumerable: true, get: function () { return skill_loader_1.loadAvailableSkills; } });
7
+ Object.defineProperty(exports, "findSkillByName", { enumerable: true, get: function () { return skill_loader_1.findSkillByName; } });
8
+ var skill_validator_1 = require("./skill-validator");
9
+ Object.defineProperty(exports, "validateSkillContent", { enumerable: true, get: function () { return skill_validator_1.validateSkillContent; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domains/skills/index.ts"],"names":[],"mappings":";;;AAAA,wDAAwD;AACxD,+CAAsE;AAA7D,mHAAA,mBAAmB,OAAA;AAAE,+GAAA,eAAe,OAAA;AAC7C,qDAAyD;AAAhD,uHAAA,oBAAoB,OAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Skill } from '../../types';
2
+ export declare function loadAvailableSkills(): Skill[];
3
+ export declare function findSkillByName(name: string): Skill | undefined;
4
+ //# sourceMappingURL=skill-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../../src/domains/skills/skill-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,wBAAgB,mBAAmB,IAAI,KAAK,EAAE,CAsB7C;AAGD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAE/D"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadAvailableSkills = loadAvailableSkills;
4
+ exports.findSkillByName = findSkillByName;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const paths_1 = require("../../shared/paths");
8
+ const skill_validator_1 = require("./skill-validator");
9
+ // Loads all skills from the bundled skills/ directory
10
+ function loadAvailableSkills() {
11
+ if (!(0, fs_1.existsSync)(paths_1.PACKAGE_SKILLS_DIR))
12
+ return [];
13
+ const skills = [];
14
+ const entries = (0, fs_1.readdirSync)(paths_1.PACKAGE_SKILLS_DIR, { withFileTypes: true });
15
+ for (const entry of entries) {
16
+ if (!entry.isDirectory())
17
+ continue;
18
+ const skillDir = (0, path_1.join)(paths_1.PACKAGE_SKILLS_DIR, entry.name);
19
+ const skillFile = (0, path_1.join)(skillDir, 'SKILL.md');
20
+ if (!(0, fs_1.existsSync)(skillFile))
21
+ continue;
22
+ try {
23
+ const content = (0, fs_1.readFileSync)(skillFile, 'utf8');
24
+ const meta = (0, skill_validator_1.validateSkillContent)(content, skillFile);
25
+ skills.push({ name: entry.name, dirPath: skillDir, meta });
26
+ }
27
+ catch {
28
+ // Skip invalid skills silently in production
29
+ }
30
+ }
31
+ return skills;
32
+ }
33
+ // Find a single skill by name (directory name)
34
+ function findSkillByName(name) {
35
+ return loadAvailableSkills().find(s => s.name === name);
36
+ }
37
+ //# sourceMappingURL=skill-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../../src/domains/skills/skill-loader.ts"],"names":[],"mappings":";;AAOA,kDAsBC;AAGD,0CAEC;AAlCD,2BAA2D;AAC3D,+BAA4B;AAC5B,8CAAwD;AACxD,uDAAyD;AAGzD,sDAAsD;AACtD,SAAgB,mBAAmB;IACjC,IAAI,CAAC,IAAA,eAAU,EAAC,0BAAkB,CAAC;QAAE,OAAO,EAAE,CAAC;IAE/C,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAA,gBAAW,EAAC,0BAAkB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,0BAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAA,eAAU,EAAC,SAAS,CAAC;YAAE,SAAS;QAErC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,IAAA,sCAAoB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+CAA+C;AAC/C,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SkillMeta } from '../../types';
2
+ export declare function validateSkillContent(content: string, filePath: string): SkillMeta;
3
+ //# sourceMappingURL=skill-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-validator.d.ts","sourceRoot":"","sources":["../../../src/domains/skills/skill-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmB7C,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAejF"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSkillContent = validateSkillContent;
4
+ const skill_schema_1 = require("../../schemas/skill-schema");
5
+ // Parses YAML frontmatter from SKILL.md content (simple regex, no yaml dep needed)
6
+ function parseFrontmatter(content) {
7
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
8
+ if (!match)
9
+ return null;
10
+ const result = {};
11
+ for (const line of match[1].split('\n')) {
12
+ const colonIdx = line.indexOf(':');
13
+ if (colonIdx === -1)
14
+ continue;
15
+ const key = line.slice(0, colonIdx).trim();
16
+ // Handle multi-line values (>) by collapsing them
17
+ const val = line.slice(colonIdx + 1).trim().replace(/^["']|["']$/g, '').trim();
18
+ if (key && val)
19
+ result[key] = val;
20
+ }
21
+ return result;
22
+ }
23
+ // Validates and returns parsed SKILL.md frontmatter, throws on invalid
24
+ function validateSkillContent(content, filePath) {
25
+ const raw = parseFrontmatter(content);
26
+ if (!raw)
27
+ throw new Error(`No frontmatter found in ${filePath}`);
28
+ // For multi-line description (> block), collect continuation lines
29
+ const descMatch = content.match(/description:\s*>\n([\s\S]*?)(?=\n\w|\n---)/);
30
+ if (descMatch) {
31
+ raw['description'] = descMatch[1].replace(/\n\s*/g, ' ').trim();
32
+ }
33
+ const parsed = skill_schema_1.SkillSchema.safeParse(raw);
34
+ if (!parsed.success) {
35
+ throw new Error(`Invalid SKILL.md at ${filePath}: ${parsed.error.message}`);
36
+ }
37
+ return parsed.data;
38
+ }
39
+ //# sourceMappingURL=skill-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-validator.js","sourceRoot":"","sources":["../../../src/domains/skills/skill-validator.ts"],"names":[],"mappings":";;AAoBA,oDAeC;AAnCD,6DAAyD;AAGzD,mFAAmF;AACnF,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,SAAS;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,kDAAkD;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,IAAI,GAAG,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uEAAuE;AACvE,SAAgB,oBAAoB,CAAC,OAAe,EAAE,QAAgB;IACpE,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IAEjE,mEAAmE;IACnE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC9E,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,0BAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import * as p from '@clack/prompts';
2
+ import type { ToolName } from '../../types';
3
+ export declare function promptToolSelection(): Promise<ToolName | null>;
4
+ export declare function promptSkillSelection(skillNames: string[]): Promise<string[] | null>;
5
+ export declare function promptConfirm(message: string): Promise<boolean>;
6
+ export declare const intro: (title?: string, opts?: p.CommonOptions) => void, outro: (message?: string, opts?: p.CommonOptions) => void, spinner: ({ indicator, onCancel, output, cancelMessage, errorMessage, frames, delay, signal, ...opts }?: p.SpinnerOptions) => p.SpinnerResult, clackLog: {
7
+ message: (message?: string | string[], { symbol, secondarySymbol, output, spacing, withGuide, }?: p.LogMessageOptions) => void;
8
+ info: (message: string, opts?: p.LogMessageOptions) => void;
9
+ success: (message: string, opts?: p.LogMessageOptions) => void;
10
+ step: (message: string, opts?: p.LogMessageOptions) => void;
11
+ warn: (message: string, opts?: p.LogMessageOptions) => void;
12
+ warning: (message: string, opts?: p.LogMessageOptions) => void;
13
+ error: (message: string, opts?: p.LogMessageOptions) => void;
14
+ };
15
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/domains/ui/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAYpE;AAGD,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAQzF;AAGD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIrE;AAED,eAAO,MAAQ,KAAK,oDAAE,KAAK,sDAAE,OAAO,wIAAO,QAAQ;qBACo2K,CAAC,6EAA6E,CAAC;gCAA8D,CAAC;mCAAiE,CAAC;gCAA8D,CAAC;gCAA8D,CAAC;mCAAoG,CAAC;iCAA+D,CAAC;CADj1L,CAAC"}
@@ -0,0 +1,79 @@
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.clackLog = exports.spinner = exports.outro = exports.intro = void 0;
37
+ exports.promptToolSelection = promptToolSelection;
38
+ exports.promptSkillSelection = promptSkillSelection;
39
+ exports.promptConfirm = promptConfirm;
40
+ const p = __importStar(require("@clack/prompts"));
41
+ // Interactive multi-select for tool choice when --tool not provided
42
+ async function promptToolSelection() {
43
+ const selected = await p.select({
44
+ message: 'Install skills to which AI tool?',
45
+ options: [
46
+ { value: 'all', label: 'All tools', hint: 'Claude Code + Antigravity (recommended)' },
47
+ { value: 'claude', label: 'Claude Code', hint: 'Also covers OpenCode (~/.claude/skills/)' },
48
+ { value: 'antigravity', label: 'Antigravity', hint: '~/.gemini/antigravity/skills/' },
49
+ { value: 'opencode', label: 'OpenCode only', hint: '~/.config/opencode/skills/' },
50
+ ],
51
+ });
52
+ if (p.isCancel(selected)) {
53
+ p.cancel('Cancelled.');
54
+ return null;
55
+ }
56
+ return selected;
57
+ }
58
+ // Interactive multi-select for skill names when none provided
59
+ async function promptSkillSelection(skillNames) {
60
+ const selected = await p.multiselect({
61
+ message: 'Select skills to install:',
62
+ options: skillNames.map(n => ({ value: n, label: n })),
63
+ required: true,
64
+ });
65
+ if (p.isCancel(selected)) {
66
+ p.cancel('Cancelled.');
67
+ return null;
68
+ }
69
+ return selected;
70
+ }
71
+ // Confirm destructive actions
72
+ async function promptConfirm(message) {
73
+ const ok = await p.confirm({ message });
74
+ if (p.isCancel(ok))
75
+ return false;
76
+ return ok;
77
+ }
78
+ exports.intro = p.intro, exports.outro = p.outro, exports.spinner = p.spinner, exports.clackLog = p.log;
79
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/domains/ui/prompts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kDAYC;AAGD,oDAQC;AAGD,sCAIC;AAlCD,kDAAoC;AAGpC,oEAAoE;AAC7D,KAAK,UAAU,mBAAmB;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,MAAM,CAAW;QACxC,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,yCAAyC,EAAE;YACrF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,0CAA0C,EAAE;YAC3F,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,+BAA+B,EAAE;YACrF,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,4BAA4B,EAAE;SAClF;KACF,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8DAA8D;AACvD,KAAK,UAAU,oBAAoB,CAAC,UAAoB;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,WAAW,CAAS;QAC3C,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACtD,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAClE,OAAO,QAAoB,CAAC;AAC9B,CAAC;AAED,8BAA8B;AACvB,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,EAAa,CAAC;AACvB,CAAC;AAEc,aAAK,GAAoC,CAAC,QAAnC,aAAK,GAA6B,CAAC,QAA5B,eAAO,GAAoB,CAAC,UAAd,gBAAQ,GAAK,CAAC,KAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const setup_1 = require("./cli/setup");
4
+ const install_1 = require("./commands/install");
5
+ const list_1 = require("./commands/list");
6
+ const update_1 = require("./commands/update");
7
+ const remove_1 = require("./commands/remove");
8
+ const config_1 = require("./commands/config");
9
+ const doctor_1 = require("./commands/doctor");
10
+ const cli = (0, setup_1.createCli)();
11
+ (0, install_1.registerInstall)(cli);
12
+ (0, list_1.registerList)(cli);
13
+ (0, update_1.registerUpdate)(cli);
14
+ (0, remove_1.registerRemove)(cli);
15
+ (0, config_1.registerConfig)(cli);
16
+ (0, doctor_1.registerDoctor)(cli);
17
+ // Show help if no command given
18
+ cli.on('command:*', () => {
19
+ console.error('Unknown command:', cli.args.join(' '));
20
+ cli.outputHelp();
21
+ process.exit(1);
22
+ });
23
+ cli.parse();
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,uCAAwC;AACxC,gDAAqD;AACrD,0CAA+C;AAC/C,8CAAmD;AACnD,8CAAmD;AACnD,8CAAmD;AACnD,8CAAmD;AAEnD,MAAM,GAAG,GAAG,IAAA,iBAAS,GAAE,CAAC;AAExB,IAAA,yBAAe,EAAC,GAAG,CAAC,CAAC;AACrB,IAAA,mBAAY,EAAC,GAAG,CAAC,CAAC;AAClB,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;AACpB,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;AACpB,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;AACpB,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;AAEpB,gCAAgC;AAChC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,UAAU,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { z } from 'zod';
2
+ export declare const SkillSchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ description: z.ZodString;
5
+ license: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strip>;
7
+ export type SkillFrontmatter = z.infer<typeof SkillSchema>;
8
+ //# sourceMappingURL=skill-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-schema.d.ts","sourceRoot":"","sources":["../../src/schemas/skill-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,WAAW;;;;iBAQtB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkillSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ // Validates SKILL.md YAML frontmatter per agentskills.io spec
6
+ // Name: 1-64 chars, lowercase alphanumeric + hyphens + colons (pkit:name pattern)
7
+ exports.SkillSchema = zod_1.z.object({
8
+ name: zod_1.z
9
+ .string()
10
+ .min(1)
11
+ .max(64)
12
+ .regex(/^[a-z0-9:]+([:-][a-z0-9]+)*$/, 'Name must be lowercase alphanumeric with hyphens/colons'),
13
+ description: zod_1.z.string().min(1).max(1024),
14
+ license: zod_1.z.string().optional(),
15
+ });
16
+ //# sourceMappingURL=skill-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-schema.js","sourceRoot":"","sources":["../../src/schemas/skill-schema.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,8DAA8D;AAC9D,kFAAkF;AACrE,QAAA,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,OAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,KAAK,CAAC,8BAA8B,EAAE,yDAAyD,CAAC;IACnG,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACxC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const log: {
2
+ info: (msg: string) => void;
3
+ success: (msg: string) => void;
4
+ warn: (msg: string) => void;
5
+ error: (msg: string) => void;
6
+ plain: (msg: string) => void;
7
+ };
8
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,GAAG;gBACF,MAAM;mBACH,MAAM;gBACT,MAAM;iBACL,MAAM;iBACN,MAAM;CACpB,CAAC"}
@@ -0,0 +1,20 @@
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.log = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ // Respect --json flag to suppress styled output for scripting
9
+ const isJson = process.argv.includes('--json');
10
+ exports.log = {
11
+ info: (msg) => { if (!isJson)
12
+ console.log(chalk_1.default.blue('ℹ'), msg); },
13
+ success: (msg) => { if (!isJson)
14
+ console.log(chalk_1.default.green('✓'), msg); },
15
+ warn: (msg) => { if (!isJson)
16
+ console.log(chalk_1.default.yellow('⚠'), msg); },
17
+ error: (msg) => console.error(chalk_1.default.red('✗'), msg),
18
+ plain: (msg) => console.log(msg),
19
+ };
20
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,8DAA8D;AAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAElC,QAAA,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC1D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;CACzC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare const PACKAGE_SKILLS_DIR: string;
2
+ export declare const CONFIG_DIR: string;
3
+ export declare const MANIFEST_PATH: string;
4
+ export declare const CONFIG_PATH: string;
5
+ export declare const DEFAULT_TOOL_PATHS: {
6
+ readonly claude: string;
7
+ readonly opencode: string;
8
+ readonly antigravity: string;
9
+ };
10
+ export declare const PROJECT_TOOL_SEGMENTS: {
11
+ readonly claude: string;
12
+ readonly opencode: string;
13
+ readonly antigravity: string;
14
+ };
15
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,kBAAkB,QAAwC,CAAC;AAGxE,eAAO,MAAM,UAAU,QAAuC,CAAC;AAC/D,eAAO,MAAM,aAAa,QAAoC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAAkC,CAAC;AAG3D,eAAO,MAAM,kBAAkB;;;;CAOrB,CAAC;AAGX,eAAO,MAAM,qBAAqB;;;;CAIxB,CAAC"}