@t4h.framework/cli 0.14.0 → 0.15.1

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 (53) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +21 -0
  3. package/dist/bin/bin.js +12 -59
  4. package/dist/bin/bin.js.map +1 -1
  5. package/package.json +2 -2
  6. package/dist/commands/bootstrap/bootstrap.js +0 -9
  7. package/dist/commands/bootstrap/bootstrap.js.map +0 -1
  8. package/dist/commands/harness/prompts/get-destination-root-path.js +0 -34
  9. package/dist/commands/harness/prompts/get-destination-root-path.js.map +0 -1
  10. package/dist/commands/harness/target-options.js +0 -33
  11. package/dist/commands/harness/target-options.js.map +0 -1
  12. package/dist/commands/harness/tools/copy.js +0 -6
  13. package/dist/commands/harness/tools/copy.js.map +0 -1
  14. package/dist/commands/harness/tools/create-directory-snapshot.js +0 -29
  15. package/dist/commands/harness/tools/create-directory-snapshot.js.map +0 -1
  16. package/dist/commands/harness/tools/discover-packages.js +0 -16
  17. package/dist/commands/harness/tools/discover-packages.js.map +0 -1
  18. package/dist/commands/harness/tools/find-nearest-package-json-path.js +0 -18
  19. package/dist/commands/harness/tools/find-nearest-package-json-path.js.map +0 -1
  20. package/dist/commands/harness/tools/get-package-path.js +0 -18
  21. package/dist/commands/harness/tools/get-package-path.js.map +0 -1
  22. package/dist/commands/harness/tools/get-skill-sources.js +0 -44
  23. package/dist/commands/harness/tools/get-skill-sources.js.map +0 -1
  24. package/dist/commands/harness/tools/is-directory-equal.js +0 -14
  25. package/dist/commands/harness/tools/is-directory-equal.js.map +0 -1
  26. package/dist/commands/harness/tools/is-directory.js +0 -8
  27. package/dist/commands/harness/tools/is-directory.js.map +0 -1
  28. package/dist/commands/harness/tools/path-exists.js +0 -8
  29. package/dist/commands/harness/tools/path-exists.js.map +0 -1
  30. package/dist/commands/skills/prompts/get-destination-root-path.js +0 -34
  31. package/dist/commands/skills/prompts/get-destination-root-path.js.map +0 -1
  32. package/dist/commands/skills/skills.js +0 -90
  33. package/dist/commands/skills/skills.js.map +0 -1
  34. package/dist/commands/skills/target-options.js +0 -33
  35. package/dist/commands/skills/target-options.js.map +0 -1
  36. package/dist/commands/skills/tools/copy.js +0 -6
  37. package/dist/commands/skills/tools/copy.js.map +0 -1
  38. package/dist/commands/skills/tools/create-directory-snapshot.js +0 -29
  39. package/dist/commands/skills/tools/create-directory-snapshot.js.map +0 -1
  40. package/dist/commands/skills/tools/discover-packages.js +0 -16
  41. package/dist/commands/skills/tools/discover-packages.js.map +0 -1
  42. package/dist/commands/skills/tools/find-nearest-package-json-path.js +0 -18
  43. package/dist/commands/skills/tools/find-nearest-package-json-path.js.map +0 -1
  44. package/dist/commands/skills/tools/get-package-path.js +0 -18
  45. package/dist/commands/skills/tools/get-package-path.js.map +0 -1
  46. package/dist/commands/skills/tools/get-skill-sources.js +0 -44
  47. package/dist/commands/skills/tools/get-skill-sources.js.map +0 -1
  48. package/dist/commands/skills/tools/is-directory-equal.js +0 -14
  49. package/dist/commands/skills/tools/is-directory-equal.js.map +0 -1
  50. package/dist/commands/skills/tools/is-directory.js +0 -8
  51. package/dist/commands/skills/tools/is-directory.js.map +0 -1
  52. package/dist/commands/skills/tools/path-exists.js +0 -8
  53. package/dist/commands/skills/tools/path-exists.js.map +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,121 @@
1
+ # @t4h.framework/cli
2
+
3
+ ## 0.15.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`095c3a9`](https://github.com/tech4humans-brasil/framework/commit/095c3a91191b9f541519447f212a8e9509065569) Thanks [@gusteycamargo](https://github.com/gusteycamargo)! - Republish with resolved dependency versions. The previous release leaked the `workspace:^` protocol into the published manifests, breaking installs outside the monorepo.
8
+
9
+ - Updated dependencies [[`095c3a9`](https://github.com/tech4humans-brasil/framework/commit/095c3a91191b9f541519447f212a8e9509065569)]:
10
+ - @t4h.framework/dev@0.13.1
11
+
12
+ ## 0.15.0
13
+
14
+ ### Minor Changes
15
+
16
+ - [`9171168`](https://github.com/tech4humans-brasil/framework/commit/917116807182d28de7b368e8648560efca9e5559) Thanks [@gusteycamargo](https://github.com/gusteycamargo)! - Remove react server conditions
17
+
18
+ ### Patch Changes
19
+
20
+ - Updated dependencies [[`9171168`](https://github.com/tech4humans-brasil/framework/commit/917116807182d28de7b368e8648560efca9e5559), [`9171168`](https://github.com/tech4humans-brasil/framework/commit/917116807182d28de7b368e8648560efca9e5559)]:
21
+ - @t4h.framework/dev@0.13.0
22
+
23
+ ## 0.14.0
24
+
25
+ ### Patch Changes
26
+
27
+ - Internal dependency updates
28
+
29
+ ## 0.12.0
30
+
31
+ ### Patch Changes
32
+
33
+ - Internal dependency updates
34
+
35
+ ## 0.11.0
36
+
37
+ ### Patch Changes
38
+
39
+ - Internal dependency updates
40
+
41
+ ## 0.10.0
42
+
43
+ ### Minor Changes
44
+
45
+ - Implements harness package ([#102](https://github.com/tech4humans-brasil/framework/pull/102))
46
+
47
+ ## 0.9.1
48
+
49
+ ### Patch Changes
50
+
51
+ - Internal dependency updates
52
+
53
+ ## 0.9.0
54
+
55
+ ### Patch Changes
56
+
57
+ - Internal dependency updates
58
+
59
+ ## 0.8.0
60
+
61
+ ### Patch Changes
62
+
63
+ - Internal dependency updates
64
+
65
+ ## 0.7.0
66
+
67
+ ### Patch Changes
68
+
69
+ - Internal dependency updates
70
+
71
+ ## 0.6.1
72
+
73
+ ### Minor Changes
74
+
75
+ - Handle uncaught exceptions ([`eb90051`](https://github.com/tech4humans-brasil/framework/commit/eb90051f72aa9df388169075554d27a8a60c597c))
76
+
77
+ ## 0.5.0
78
+
79
+ ### Minor Changes
80
+
81
+ - Implements logger ([#82](https://github.com/tech4humans-brasil/framework/pull/82))
82
+ - Adds dev server sftp claim ([#78](https://github.com/tech4humans-brasil/framework/pull/78))
83
+ - Adds skills copy command ([#87](https://github.com/tech4humans-brasil/framework/pull/87))
84
+
85
+ ### Patch Changes
86
+
87
+ - Dev server ([#75](https://github.com/tech4humans-brasil/framework/pull/75))
88
+ - Move dev server to its own package ([#83](https://github.com/tech4humans-brasil/framework/pull/83))
89
+
90
+ ## 0.4.1
91
+
92
+ ### Minor Changes
93
+
94
+ - Build app manifest in core package ([`58c8a63`](https://github.com/tech4humans-brasil/framework/commit/58c8a63fd0475c09d67f3283bb18719b89497f13))
95
+ - Adds support to env in build ([`8740c65`](https://github.com/tech4humans-brasil/framework/commit/8740c65ac759c570e52424b81def34c480540aab))
96
+ - Adds cli dev server ([`eaa5bc8`](https://github.com/tech4humans-brasil/framework/commit/eaa5bc8b443d27efcf0c1e95f384713df2a73a71))
97
+ - Adds async support for serialization ([#10](https://github.com/tech4humans-brasil/framework/pull/10))
98
+ - Adds support to follow redirect in dev server ([`42c76fb`](https://github.com/tech4humans-brasil/framework/commit/42c76fbc237a50454c98a876e381d2489db2ee35))
99
+ - Implements smtp activity ([`ca20afd`](https://github.com/tech4humans-brasil/framework/commit/ca20afdfc324a1004e77ef1881c049e7f97f0eff))
100
+ - Adds type to history item ([#47](https://github.com/tech4humans-brasil/framework/pull/47))
101
+ - Adds support to authorization ([#51](https://github.com/tech4humans-brasil/framework/pull/51))
102
+ - Adds support to async activity on dev server ([#69](https://github.com/tech4humans-brasil/framework/pull/69))
103
+
104
+ ### Patch Changes
105
+
106
+ - Import correct json module on package json ([`3a7c826`](https://github.com/tech4humans-brasil/framework/commit/3a7c8263d701ebab2917e6b11497d7d2bffc9c8a))
107
+ - Rename activity history to history ([`4eaad08`](https://github.com/tech4humans-brasil/framework/commit/4eaad08468815bcdea14c36468c7904655715406))
108
+ - Move run activity and workflow to internal tool ([`e061349`](https://github.com/tech4humans-brasil/framework/commit/e061349de925074f838e82149f7566ddcffc4870))
109
+ - Remove activity prefix from file system claim class name ([`d257bd1`](https://github.com/tech4humans-brasil/framework/commit/d257bd177d477a56a897ba862a0be1f50531c633))
110
+ - Remove activity prefix from http client request claim class name ([`5d37e31`](https://github.com/tech4humans-brasil/framework/commit/5d37e315bafecf949e4c69651c22a4ba4232fe16))
111
+ - Fix eslint warnings and errors ([`9a7eeb5`](https://github.com/tech4humans-brasil/framework/commit/9a7eeb52d81a5e99c44819e8271db7f35b6c5195))
112
+ - Adds github workflow to run, build, tests and lint ([#18](https://github.com/tech4humans-brasil/framework/pull/18))
113
+ - Dont exit process on relaunch cli ([`771741b`](https://github.com/tech4humans-brasil/framework/commit/771741b2cfeb399c620715e005793f2b882a9e88))
114
+ - Simplify dev server file binary constructor ([`858d5ae`](https://github.com/tech4humans-brasil/framework/commit/858d5ae24f3830a47759279a19f658a11dd11d00))
115
+ - Remove runtime from repo ([`751f792`](https://github.com/tech4humans-brasil/framework/commit/751f7920fceef0fe737365c7226c313c9cc1392d))
116
+ - Update package metadata and author information across multiple packages ([`2ca73df`](https://github.com/tech4humans-brasil/framework/commit/2ca73df42dc63c86ed44717b50d5402fca45b4e7))
117
+ - Improve repository info ([`1fad92d`](https://github.com/tech4humans-brasil/framework/commit/1fad92d959b804189fd1486d047115995ac81eb0))
118
+ - Up repo coverage ([`24c057c`](https://github.com/tech4humans-brasil/framework/commit/24c057c470d0829ea9a1e1f71011b6eff408180c))
119
+ - Fix check types and lint errors ([`00ca0df`](https://github.com/tech4humans-brasil/framework/commit/00ca0dfe6c2fddbc4e0dbeefb1556d172c752c55))
120
+ - Update package dependencies across multiple packages ([`8b4fc1d`](https://github.com/tech4humans-brasil/framework/commit/8b4fc1d0e92d6bd880ddf4c8119fb68c49c53760))
121
+ - Fix cli dependencies ([`ddcd660`](https://github.com/tech4humans-brasil/framework/commit/ddcd660dbd50f2fc25198585c3d8e5e052b7f832))
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Tech for humans
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/bin/bin.js CHANGED
@@ -1,63 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import { spawn } from 'node:child_process';
3
- function hasReactServerCondition() {
4
- const argv = process.execArgv;
5
- return (argv.includes('--conditions=react-server') ||
6
- argv.some(a => a.startsWith('--conditions=') &&
7
- a.split('=')[1]?.split(',').includes('react-server')) ||
8
- (argv.includes('--conditions') && argv.includes('react-server')));
9
- }
10
- function relaunchWithReactServerCondition() {
11
- if (process.env.__RELAUNCHED_WITH_REACT_SERVER_CONDITION__ === '1')
12
- return false;
13
- const execArgv = [...process.execArgv];
14
- const filtered = [];
15
- for (let i = 0; i < execArgv.length; i++) {
16
- const a = execArgv[i];
17
- if (a === '--conditions') {
18
- i++;
19
- continue;
20
- }
21
- if (a?.startsWith('--conditions='))
22
- continue;
23
- filtered.push(a);
24
- }
25
- const conditions = ['react-server'];
26
- filtered.push(`--conditions=${conditions.join(',')}`);
27
- const child = spawn(process.execPath,
28
- // @ts-expect-error - process.argv is not typed
29
- [...filtered, process.argv[1], ...process.argv.slice(2)], {
30
- stdio: 'inherit',
31
- env: {
32
- ...process.env,
33
- __RELAUNCHED_WITH_REACT_SERVER_CONDITION__: '1',
34
- },
35
- });
36
- // @ts-expect-error - child is not typed
37
- child.on('exit', code => process.exit(code ?? 0));
38
- // @ts-expect-error - child is not typed
39
- child.on('error', err => {
40
- console.error(err);
41
- process.exit(1);
42
- });
43
- return true;
44
- }
45
- if (!hasReactServerCondition())
46
- relaunchWithReactServerCondition();
47
- else {
48
- const { program } = await import('commander');
49
- const { buildCommand } = await import('../commands/build/build.js');
50
- const { devCommand } = await import('../commands/dev/dev.js');
51
- const { publishCommand } = await import('../commands/publish/publish.js');
52
- const { AIBootstrapCommand } = await import('../commands/ai/ai-bootstrap.js');
53
- const { harnessCommand } = await import('../commands/harness/harness.js');
54
- program.addCommand(devCommand);
55
- program.addCommand(publishCommand);
56
- program.addCommand(buildCommand);
57
- program.addCommand(AIBootstrapCommand);
58
- program.addCommand(harnessCommand);
59
- await program.parseAsync(process.argv);
60
- }
2
+ import { program } from 'commander';
3
+ import { AIBootstrapCommand } from '../commands/ai/ai-bootstrap.js';
4
+ import { buildCommand } from '../commands/build/build.js';
5
+ import { devCommand } from '../commands/dev/dev.js';
6
+ import { harnessCommand } from '../commands/harness/harness.js';
7
+ import { publishCommand } from '../commands/publish/publish.js';
8
+ program.addCommand(devCommand);
9
+ program.addCommand(publishCommand);
10
+ program.addCommand(buildCommand);
11
+ program.addCommand(AIBootstrapCommand);
12
+ program.addCommand(harnessCommand);
13
+ await program.parseAsync(process.argv);
61
14
  process.on('uncaughtException', error => {
62
15
  const isExitPromptError = error instanceof Error && error.name === 'ExitPromptError';
63
16
  if (isExitPromptError)
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin/bin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAE/D,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAC9B,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;AAChC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAA;AACtC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAElC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEtC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,CAAC,EAAE;IACtC,MAAM,iBAAiB,GACrB,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAA;IAE5D,IAAI,iBAAiB;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAE7C,MAAM,KAAK,CAAA;AACb,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t4h.framework/cli",
3
- "version": "0.14.0",
3
+ "version": "0.15.1",
4
4
  "description": "CLI tools for the T4H Framework",
5
5
  "homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/cli",
6
6
  "bugs": "https://github.com/tech4humans-brasil/framework/issues",
@@ -29,7 +29,7 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@inquirer/prompts": "^8.3.0",
32
- "@t4h.framework/dev": "^0.12.0",
32
+ "@t4h.framework/dev": "^0.13.1",
33
33
  "@t4h.framework/harness": "^0.2.0",
34
34
  "commander": "^14.0.3",
35
35
  "form-data": "^4.0.5",
@@ -1,9 +0,0 @@
1
- import { bootstrap } from '@t4h.framework/harness';
2
- import { Command } from 'commander';
3
- export const bootstrapCommand = new Command('bootstrap')
4
- .description('bootstrap')
5
- .action(async () => {
6
- const targetDir = process.env.INIT_CWD ?? process.cwd();
7
- await bootstrap({ targetDir });
8
- });
9
- //# sourceMappingURL=bootstrap.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/commands/bootstrap/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;KACrD,WAAW,CAAC,WAAW,CAAC;KACxB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAEvD,MAAM,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;AAChC,CAAC,CAAC,CAAA"}
@@ -1,34 +0,0 @@
1
- import path from 'node:path';
2
- import { input, select } from '@inquirer/prompts';
3
- import { TARGET_OPTIONS } from '../target-options.js';
4
- export async function getDestinationRootPath(selectedTarget, projectRootPath) {
5
- if (selectedTarget === 'custom') {
6
- const customPath = await input({
7
- message: 'Enter the skills destination folder',
8
- default: path.join(process.cwd(), '.skills'),
9
- required: true,
10
- });
11
- return path.resolve(customPath);
12
- }
13
- const target = TARGET_OPTIONS.find(option => option.value === selectedTarget);
14
- if (!target?.defaultPath)
15
- throw new Error(`Default destination was not found for: ${selectedTarget}`);
16
- const scope = await select({
17
- message: 'Select where skills should be installed',
18
- choices: [
19
- {
20
- name: `Home (${target.defaultPath})`,
21
- value: 'home',
22
- },
23
- {
24
- name: `Project (${path.join(projectRootPath, target.projectFolderName ?? '', 'skills')})`,
25
- value: 'project',
26
- },
27
- ],
28
- default: 'home',
29
- });
30
- if (scope === 'home')
31
- return target.defaultPath;
32
- return path.join(projectRootPath, target.projectFolderName ?? '', 'skills');
33
- }
34
- //# sourceMappingURL=get-destination-root-path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-destination-root-path.js","sourceRoot":"","sources":["../../../../src/commands/harness/prompts/get-destination-root-path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAA;AAIzE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,cAA6B,EAC7B,eAAuB;IAEvB,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC;YAC7B,OAAO,EAAE,qCAAqC;YAC9C,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC;YAC5C,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,cAAc,CAAC,CAAA;IAE7E,IAAI,CAAC,MAAM,EAAE,WAAW;QACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,cAAc,EAAE,CAAC,CAAA;IAE7E,MAAM,KAAK,GAAG,MAAM,MAAM,CAAe;QACvC,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,SAAS,MAAM,CAAC,WAAW,GAAG;gBACpC,KAAK,EAAE,MAAM;aACd;YACD;gBACE,IAAI,EAAE,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,QAAQ,CAAC,GAAG;gBACzF,KAAK,EAAE,SAAS;aACjB;SACF;QACD,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;IAEF,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,WAAW,CAAA;IAE/C,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;AAC7E,CAAC"}
@@ -1,33 +0,0 @@
1
- import os from 'node:os';
2
- import path from 'node:path';
3
- export const TARGET_OPTIONS = [
4
- {
5
- name: 'Cursor (~/.cursor/skills)',
6
- value: 'cursor',
7
- defaultPath: path.join(os.homedir(), '.cursor', 'skills'),
8
- projectFolderName: '.cursor',
9
- },
10
- {
11
- name: 'Claude (~/.claude/skills)',
12
- value: 'claude',
13
- defaultPath: path.join(os.homedir(), '.claude', 'skills'),
14
- projectFolderName: '.claude',
15
- },
16
- {
17
- name: 'Continue (~/.continue/skills)',
18
- value: 'continue',
19
- defaultPath: path.join(os.homedir(), '.continue', 'skills'),
20
- projectFolderName: '.continue',
21
- },
22
- {
23
- name: 'Cline (~/.cline/skills)',
24
- value: 'cline',
25
- defaultPath: path.join(os.homedir(), '.cline', 'skills'),
26
- projectFolderName: '.cline',
27
- },
28
- {
29
- name: 'Custom destination path',
30
- value: 'custom',
31
- },
32
- ];
33
- //# sourceMappingURL=target-options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"target-options.js","sourceRoot":"","sources":["../../../src/commands/harness/target-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAgB5B,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QACzD,iBAAiB,EAAE,SAAS;KAC7B;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QACzD,iBAAiB,EAAE,SAAS;KAC7B;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC;QAC3D,iBAAiB,EAAE,WAAW;KAC/B;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACxD,iBAAiB,EAAE,QAAQ;KAC5B;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,QAAQ;KAChB;CACF,CAAA"}
@@ -1,6 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function copy(source, destination) {
3
- await fs.rm(destination, { recursive: true, force: true });
4
- await fs.cp(source, destination, { recursive: true });
5
- }
6
- //# sourceMappingURL=copy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAc,EAAE,WAAmB;IAC5D,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACvD,CAAC"}
@@ -1,29 +0,0 @@
1
- import crypto from 'node:crypto';
2
- import fs from 'node:fs/promises';
3
- import path from 'node:path';
4
- export async function createDirectorySnapshot(rootPath) {
5
- const snapshot = new Map();
6
- async function walk(currentPath) {
7
- const entries = await fs.readdir(currentPath, {
8
- withFileTypes: true,
9
- });
10
- entries.sort((a, b) => a.name.localeCompare(b.name));
11
- for (const entry of entries) {
12
- const absolutePath = path.join(currentPath, entry.name);
13
- const relativePath = path.relative(rootPath, absolutePath);
14
- if (entry.isDirectory()) {
15
- snapshot.set(`${relativePath}/`, 'directory');
16
- await walk(absolutePath);
17
- continue;
18
- }
19
- if (entry.isFile()) {
20
- const content = await fs.readFile(absolutePath);
21
- const hash = crypto.createHash('sha256').update(content).digest('hex');
22
- snapshot.set(relativePath, `file:${hash}`);
23
- }
24
- }
25
- }
26
- await walk(rootPath);
27
- return snapshot;
28
- }
29
- //# sourceMappingURL=create-directory-snapshot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-directory-snapshot.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/create-directory-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE1C,KAAK,UAAU,IAAI,CAAC,WAAmB;QACrC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;YAC5C,aAAa,EAAE,IAAI;SACpB,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;YAE1D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,GAAG,EAAE,WAAW,CAAC,CAAA;gBAE7C,MAAM,IAAI,CAAC,YAAY,CAAC,CAAA;gBAExB,SAAQ;YACV,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;gBAE/C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAEtE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAA;IAEpB,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -1,16 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function discoverPackages(packageJsonPath) {
3
- const packageJsonContent = await fs.readFile(packageJsonPath, 'utf8');
4
- const packageJson = JSON.parse(packageJsonContent);
5
- const sections = [
6
- packageJson.dependencies ?? {},
7
- packageJson.devDependencies ?? {},
8
- packageJson.peerDependencies ?? {},
9
- packageJson.optionalDependencies ?? {},
10
- ];
11
- const packageNames = new Set(sections
12
- .flatMap(section => Object.keys(section))
13
- .filter(name => name.startsWith('@t4h.framework/')));
14
- return packageNames.values().toArray();
15
- }
16
- //# sourceMappingURL=discover-packages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover-packages.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/discover-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AASjC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,eAAuB;IAC5D,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IAErE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAoB,CAAA;IAErE,MAAM,QAAQ,GAAG;QACf,WAAW,CAAC,YAAY,IAAI,EAAE;QAC9B,WAAW,CAAC,eAAe,IAAI,EAAE;QACjC,WAAW,CAAC,gBAAgB,IAAI,EAAE;QAClC,WAAW,CAAC,oBAAoB,IAAI,EAAE;KACvC,CAAA;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACxC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CACtD,CAAA;IAED,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;AACxC,CAAC"}
@@ -1,18 +0,0 @@
1
- import path from 'node:path';
2
- import { pathExists } from './path-exists.js';
3
- export async function findNearestPackageJsonPath() {
4
- let current = path.resolve(process.cwd());
5
- let parent = path.dirname(current);
6
- while (current !== parent) {
7
- const packageJsonPath = path.join(current, 'package.json');
8
- if (await pathExists(packageJsonPath))
9
- return packageJsonPath;
10
- current = parent;
11
- parent = path.dirname(current);
12
- }
13
- const rootPackageJsonPath = path.join(current, 'package.json');
14
- if (await pathExists(rootPackageJsonPath))
15
- return rootPackageJsonPath;
16
- return null;
17
- }
18
- //# sourceMappingURL=find-nearest-package-json-path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-nearest-package-json-path.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/find-nearest-package-json-path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACzC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAElC,OAAO,OAAO,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAE1D,IAAI,MAAM,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,eAAe,CAAA;QAE7D,OAAO,GAAG,MAAM,CAAA;QAEhB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAE9D,IAAI,MAAM,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,mBAAmB,CAAA;IAErE,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,18 +0,0 @@
1
- import path from 'node:path';
2
- import { isDirectory } from './is-directory.js';
3
- export async function getPackagePath(packageName, packageJsonPath) {
4
- const segments = packageName.split('/');
5
- let current = path.dirname(packageJsonPath);
6
- let parent = path.dirname(current);
7
- while (true) {
8
- const candidatePackagePath = path.join(current, 'node_modules', ...segments);
9
- if (await isDirectory(candidatePackagePath))
10
- return candidatePackagePath;
11
- if (current === parent)
12
- break;
13
- current = parent;
14
- parent = path.dirname(current);
15
- }
16
- return null;
17
- }
18
- //# sourceMappingURL=get-package-path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-package-path.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/get-package-path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,eAAuB;IAEvB,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEvC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC3C,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAElC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,CAAA;QAE5E,IAAI,MAAM,WAAW,CAAC,oBAAoB,CAAC;YAAE,OAAO,oBAAoB,CAAA;QAExE,IAAI,OAAO,KAAK,MAAM;YAAE,MAAK;QAE7B,OAAO,GAAG,MAAM,CAAA;QAEhB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,44 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { getPackagePath } from './get-package-path.js';
4
- import { isDirectory } from './is-directory.js';
5
- async function isDirEntry(entry, fullPath) {
6
- if (entry.isDirectory())
7
- return true;
8
- if (!entry.isSymbolicLink())
9
- return false;
10
- return isDirectory(fullPath);
11
- }
12
- export async function getSkillSources(packageNames, packageJsonPath) {
13
- const seen = new Set();
14
- const sources = [];
15
- for (const packageName of packageNames) {
16
- const packagePath = await getPackagePath(packageName, packageJsonPath);
17
- if (!packagePath)
18
- continue;
19
- const skillsRootPath = path.join(packagePath, '.ai', 'skills');
20
- if (!(await isDirectory(skillsRootPath)))
21
- continue;
22
- const entries = await fs.readdir(skillsRootPath, {
23
- withFileTypes: true,
24
- });
25
- const results = (await Promise.all(entries.map(async (entry) => {
26
- const sourcePath = path.join(skillsRootPath, entry.name);
27
- const entryIsDirectory = await isDirEntry(entry, sourcePath);
28
- return entryIsDirectory ? entry : null;
29
- }))).filter((entry) => entry !== null);
30
- results.forEach(entry => {
31
- const uniqueKey = `${packageName}:${entry.name}`;
32
- if (seen.has(uniqueKey))
33
- return;
34
- seen.add(uniqueKey);
35
- sources.push({
36
- packageName,
37
- skillName: entry.name,
38
- sourcePath: path.join(skillsRootPath, entry.name),
39
- });
40
- });
41
- }
42
- return sources;
43
- }
44
- //# sourceMappingURL=get-skill-sources.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-skill-sources.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/get-skill-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAc/C,KAAK,UAAU,UAAU,CAAC,KAAyB,EAAE,QAAgB;IACnE,IAAI,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAA;IAEpC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAAE,OAAO,KAAK,CAAA;IAEzC,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAsB,EACtB,eAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,OAAO,GAAkB,EAAE,CAAA;IAEjC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;QAEtE,IAAI,CAAC,WAAW;YAAE,SAAQ;QAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;QAE9D,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,cAAc,CAAC,CAAC;YAAE,SAAQ;QAElD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE;YAC/C,aAAa,EAAE,IAAI;SACpB,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,CACd,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;YACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAExD,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;YAE5D,OAAO,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QACxC,CAAC,CAAC,CACH,CACF,CAAC,MAAM,CAAC,CAAC,KAAK,EAAwC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAA;QAEzE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,MAAM,SAAS,GAAG,GAAG,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;YAEhD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAM;YAE/B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAEnB,OAAO,CAAC,IAAI,CAAC;gBACX,WAAW;gBACX,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC;aAClD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -1,14 +0,0 @@
1
- import { createDirectorySnapshot } from './create-directory-snapshot.js';
2
- export async function isDirectoryEqual(leftPath, rightPath) {
3
- const [leftSnapshot, rightSnapshot] = await Promise.all([
4
- createDirectorySnapshot(leftPath),
5
- createDirectorySnapshot(rightPath),
6
- ]);
7
- if (leftSnapshot.size !== rightSnapshot.size)
8
- return false;
9
- for (const [filePath, fileHash] of leftSnapshot)
10
- if (rightSnapshot.get(filePath) !== fileHash)
11
- return false;
12
- return true;
13
- }
14
- //# sourceMappingURL=is-directory-equal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-directory-equal.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/is-directory-equal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AAExE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAiB;IACxE,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,uBAAuB,CAAC,QAAQ,CAAC;QACjC,uBAAuB,CAAC,SAAS,CAAC;KACnC,CAAC,CAAA;IAEF,IAAI,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAE1D,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,YAAY;QAC7C,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;IAE5D,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,8 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function isDirectory(targetPath) {
3
- return await fs
4
- .stat(targetPath)
5
- .then(stat => stat.isDirectory())
6
- .catch(() => false);
7
- }
8
- //# sourceMappingURL=is-directory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-directory.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/is-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,OAAO,MAAM,EAAE;SACZ,IAAI,CAAC,UAAU,CAAC;SAChB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SAChC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC"}
@@ -1,8 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function pathExists(targetPath) {
3
- return await fs
4
- .access(targetPath, fs.constants.F_OK)
5
- .then(() => true)
6
- .catch(() => false);
7
- }
8
- //# sourceMappingURL=path-exists.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-exists.js","sourceRoot":"","sources":["../../../../src/commands/harness/tools/path-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,OAAO,MAAM,EAAE;SACZ,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;SACrC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC"}
@@ -1,34 +0,0 @@
1
- import path from 'node:path';
2
- import { input, select } from '@inquirer/prompts';
3
- import { TARGET_OPTIONS } from '../target-options.js';
4
- export async function getDestinationRootPath(selectedTarget, projectRootPath) {
5
- if (selectedTarget === 'custom') {
6
- const customPath = await input({
7
- message: 'Enter the skills destination folder',
8
- default: path.join(process.cwd(), '.skills'),
9
- required: true,
10
- });
11
- return path.resolve(customPath);
12
- }
13
- const target = TARGET_OPTIONS.find(option => option.value === selectedTarget);
14
- if (!target?.defaultPath)
15
- throw new Error(`Default destination was not found for: ${selectedTarget}`);
16
- const scope = await select({
17
- message: 'Select where skills should be installed',
18
- choices: [
19
- {
20
- name: `Home (${target.defaultPath})`,
21
- value: 'home',
22
- },
23
- {
24
- name: `Project (${path.join(projectRootPath, target.projectFolderName ?? '', 'skills')})`,
25
- value: 'project',
26
- },
27
- ],
28
- default: 'home',
29
- });
30
- if (scope === 'home')
31
- return target.defaultPath;
32
- return path.join(projectRootPath, target.projectFolderName ?? '', 'skills');
33
- }
34
- //# sourceMappingURL=get-destination-root-path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-destination-root-path.js","sourceRoot":"","sources":["../../../../src/commands/skills/prompts/get-destination-root-path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAA;AAIzE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,cAA6B,EAC7B,eAAuB;IAEvB,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC;YAC7B,OAAO,EAAE,qCAAqC;YAC9C,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC;YAC5C,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,cAAc,CAAC,CAAA;IAE7E,IAAI,CAAC,MAAM,EAAE,WAAW;QACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,cAAc,EAAE,CAAC,CAAA;IAE7E,MAAM,KAAK,GAAG,MAAM,MAAM,CAAe;QACvC,OAAO,EAAE,yCAAyC;QAClD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,SAAS,MAAM,CAAC,WAAW,GAAG;gBACpC,KAAK,EAAE,MAAM;aACd;YACD;gBACE,IAAI,EAAE,YAAY,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,QAAQ,CAAC,GAAG;gBACzF,KAAK,EAAE,SAAS;aACjB;SACF;QACD,OAAO,EAAE,MAAM;KAChB,CAAC,CAAA;IAEF,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,WAAW,CAAA;IAE/C,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;AAC7E,CAAC"}
@@ -1,90 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { confirm, select } from '@inquirer/prompts';
4
- import Table from 'cli-table3';
5
- import { Command } from 'commander';
6
- import { getDestinationRootPath } from './prompts/get-destination-root-path.js';
7
- import { TARGET_OPTIONS } from './target-options.js';
8
- import { copy } from './tools/copy.js';
9
- import { discoverPackages } from './tools/discover-packages.js';
10
- import { findNearestPackageJsonPath } from './tools/find-nearest-package-json-path.js';
11
- import { getSkillSources } from './tools/get-skill-sources.js';
12
- import { isDirectoryEqual } from './tools/is-directory-equal.js';
13
- import { isDirectory } from './tools/is-directory.js';
14
- import { pathExists } from './tools/path-exists.js';
15
- export const skillsCommand = new Command('skills')
16
- .description('Install skills from framework packages')
17
- .action(async () => {
18
- const packageJsonPath = await findNearestPackageJsonPath();
19
- if (!packageJsonPath) {
20
- console.log('package.json was not found from the current directory.');
21
- return;
22
- }
23
- const frameworkPackages = await discoverPackages(packageJsonPath);
24
- if (frameworkPackages.length === 0) {
25
- console.log('No framework packages were found in package.json.');
26
- return;
27
- }
28
- const skills = await getSkillSources(frameworkPackages, packageJsonPath);
29
- if (skills.length === 0) {
30
- console.log('No skill was found in the declared framework packages.');
31
- return;
32
- }
33
- skills.sort((a, b) => {
34
- const packageCompare = a.packageName.localeCompare(b.packageName);
35
- if (packageCompare !== 0)
36
- return packageCompare;
37
- return a.skillName.localeCompare(b.skillName);
38
- });
39
- console.log(`Found ${skills.length} skills`);
40
- const table = new Table({
41
- head: ['Skill', 'Package'],
42
- });
43
- skills.forEach(skill => {
44
- table.push([skill.skillName, skill.packageName]);
45
- });
46
- console.log(table.toString());
47
- const targets = await select({
48
- message: 'Where should the skills be installed?',
49
- choices: TARGET_OPTIONS.map(target => ({
50
- name: target.name,
51
- value: target.value,
52
- })),
53
- });
54
- const destinationRoot = await getDestinationRootPath(targets, path.dirname(packageJsonPath));
55
- await fs.promises.mkdir(destinationRoot, { recursive: true });
56
- let copiedCount = 0;
57
- let skippedSameCount = 0;
58
- let skippedByUserCount = 0;
59
- for (const source of skills) {
60
- const destinationPath = path.join(destinationRoot, source.skillName);
61
- const destinationExists = await pathExists(destinationPath);
62
- if (!destinationExists) {
63
- await copy(source.sourcePath, destinationPath);
64
- copiedCount++;
65
- continue;
66
- }
67
- const destinationIsDirectory = await isDirectory(destinationPath);
68
- const hasDifferences = !destinationIsDirectory
69
- ? true
70
- : !(await isDirectoryEqual(source.sourcePath, destinationPath));
71
- if (!hasDifferences) {
72
- skippedSameCount++;
73
- continue;
74
- }
75
- const isOverwriting = await confirm({
76
- message: `Skill "${source.skillName}" already exists and has differences. Overwrite it?`,
77
- default: false,
78
- });
79
- if (!isOverwriting) {
80
- skippedByUserCount++;
81
- continue;
82
- }
83
- await copy(source.sourcePath, destinationPath);
84
- copiedCount++;
85
- }
86
- console.log(`Copied: ${copiedCount}`);
87
- console.log(`Skipped (no diff): ${skippedSameCount}`);
88
- console.log(`Skipped by user choice: ${skippedByUserCount}`);
89
- });
90
- //# sourceMappingURL=skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/commands/skills/skills.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import os from 'node:os';
2
- import path from 'node:path';
3
- export const TARGET_OPTIONS = [
4
- {
5
- name: 'Cursor (~/.cursor/skills)',
6
- value: 'cursor',
7
- defaultPath: path.join(os.homedir(), '.cursor', 'skills'),
8
- projectFolderName: '.cursor',
9
- },
10
- {
11
- name: 'Claude (~/.claude/skills)',
12
- value: 'claude',
13
- defaultPath: path.join(os.homedir(), '.claude', 'skills'),
14
- projectFolderName: '.claude',
15
- },
16
- {
17
- name: 'Continue (~/.continue/skills)',
18
- value: 'continue',
19
- defaultPath: path.join(os.homedir(), '.continue', 'skills'),
20
- projectFolderName: '.continue',
21
- },
22
- {
23
- name: 'Cline (~/.cline/skills)',
24
- value: 'cline',
25
- defaultPath: path.join(os.homedir(), '.cline', 'skills'),
26
- projectFolderName: '.cline',
27
- },
28
- {
29
- name: 'Custom destination path',
30
- value: 'custom',
31
- },
32
- ];
33
- //# sourceMappingURL=target-options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"target-options.js","sourceRoot":"","sources":["../../../src/commands/skills/target-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAgB5B,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QACzD,iBAAiB,EAAE,SAAS;KAC7B;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;QACzD,iBAAiB,EAAE,SAAS;KAC7B;IACD;QACE,IAAI,EAAE,+BAA+B;QACrC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC;QAC3D,iBAAiB,EAAE,WAAW;KAC/B;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACxD,iBAAiB,EAAE,QAAQ;KAC5B;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,KAAK,EAAE,QAAQ;KAChB;CACF,CAAA"}
@@ -1,6 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function copy(source, destination) {
3
- await fs.rm(destination, { recursive: true, force: true });
4
- await fs.cp(source, destination, { recursive: true });
5
- }
6
- //# sourceMappingURL=copy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAc,EAAE,WAAmB;IAC5D,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACvD,CAAC"}
@@ -1,29 +0,0 @@
1
- import crypto from 'node:crypto';
2
- import fs from 'node:fs/promises';
3
- import path from 'node:path';
4
- export async function createDirectorySnapshot(rootPath) {
5
- const snapshot = new Map();
6
- async function walk(currentPath) {
7
- const entries = await fs.readdir(currentPath, {
8
- withFileTypes: true,
9
- });
10
- entries.sort((a, b) => a.name.localeCompare(b.name));
11
- for (const entry of entries) {
12
- const absolutePath = path.join(currentPath, entry.name);
13
- const relativePath = path.relative(rootPath, absolutePath);
14
- if (entry.isDirectory()) {
15
- snapshot.set(`${relativePath}/`, 'directory');
16
- await walk(absolutePath);
17
- continue;
18
- }
19
- if (entry.isFile()) {
20
- const content = await fs.readFile(absolutePath);
21
- const hash = crypto.createHash('sha256').update(content).digest('hex');
22
- snapshot.set(relativePath, `file:${hash}`);
23
- }
24
- }
25
- }
26
- await walk(rootPath);
27
- return snapshot;
28
- }
29
- //# sourceMappingURL=create-directory-snapshot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-directory-snapshot.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/create-directory-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE1C,KAAK,UAAU,IAAI,CAAC,WAAmB;QACrC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;YAC5C,aAAa,EAAE,IAAI;SACpB,CAAC,CAAA;QAEF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEpD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAEvD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;YAE1D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,GAAG,EAAE,WAAW,CAAC,CAAA;gBAE7C,MAAM,IAAI,CAAC,YAAY,CAAC,CAAA;gBAExB,SAAQ;YACV,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;gBAE/C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAEtE,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAA;IAEpB,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -1,16 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function discoverPackages(packageJsonPath) {
3
- const packageJsonContent = await fs.readFile(packageJsonPath, 'utf8');
4
- const packageJson = JSON.parse(packageJsonContent);
5
- const sections = [
6
- packageJson.dependencies ?? {},
7
- packageJson.devDependencies ?? {},
8
- packageJson.peerDependencies ?? {},
9
- packageJson.optionalDependencies ?? {},
10
- ];
11
- const packageNames = new Set(sections
12
- .flatMap(section => Object.keys(section))
13
- .filter(name => name.startsWith('@t4h.framework/')));
14
- return packageNames.values().toArray();
15
- }
16
- //# sourceMappingURL=discover-packages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover-packages.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/discover-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AASjC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,eAAuB;IAC5D,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IAErE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAoB,CAAA;IAErE,MAAM,QAAQ,GAAG;QACf,WAAW,CAAC,YAAY,IAAI,EAAE;QAC9B,WAAW,CAAC,eAAe,IAAI,EAAE;QACjC,WAAW,CAAC,gBAAgB,IAAI,EAAE;QAClC,WAAW,CAAC,oBAAoB,IAAI,EAAE;KACvC,CAAA;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACxC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CACtD,CAAA;IAED,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;AACxC,CAAC"}
@@ -1,18 +0,0 @@
1
- import path from 'node:path';
2
- import { pathExists } from './path-exists.js';
3
- export async function findNearestPackageJsonPath() {
4
- let current = path.resolve(process.cwd());
5
- let parent = path.dirname(current);
6
- while (current !== parent) {
7
- const packageJsonPath = path.join(current, 'package.json');
8
- if (await pathExists(packageJsonPath))
9
- return packageJsonPath;
10
- current = parent;
11
- parent = path.dirname(current);
12
- }
13
- const rootPackageJsonPath = path.join(current, 'package.json');
14
- if (await pathExists(rootPackageJsonPath))
15
- return rootPackageJsonPath;
16
- return null;
17
- }
18
- //# sourceMappingURL=find-nearest-package-json-path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-nearest-package-json-path.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/find-nearest-package-json-path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,CAAC,KAAK,UAAU,0BAA0B;IAC9C,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACzC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAElC,OAAO,OAAO,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAE1D,IAAI,MAAM,UAAU,CAAC,eAAe,CAAC;YAAE,OAAO,eAAe,CAAA;QAE7D,OAAO,GAAG,MAAM,CAAA;QAEhB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAE9D,IAAI,MAAM,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,mBAAmB,CAAA;IAErE,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,18 +0,0 @@
1
- import path from 'node:path';
2
- import { isDirectory } from './is-directory.js';
3
- export async function getPackagePath(packageName, packageJsonPath) {
4
- const segments = packageName.split('/');
5
- let current = path.dirname(packageJsonPath);
6
- let parent = path.dirname(current);
7
- while (true) {
8
- const candidatePackagePath = path.join(current, 'node_modules', ...segments);
9
- if (await isDirectory(candidatePackagePath))
10
- return candidatePackagePath;
11
- if (current === parent)
12
- break;
13
- current = parent;
14
- parent = path.dirname(current);
15
- }
16
- return null;
17
- }
18
- //# sourceMappingURL=get-package-path.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-package-path.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/get-package-path.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,eAAuB;IAEvB,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEvC,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC3C,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAElC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC,CAAA;QAE5E,IAAI,MAAM,WAAW,CAAC,oBAAoB,CAAC;YAAE,OAAO,oBAAoB,CAAA;QAExE,IAAI,OAAO,KAAK,MAAM;YAAE,MAAK;QAE7B,OAAO,GAAG,MAAM,CAAA;QAEhB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,44 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { getPackagePath } from './get-package-path.js';
4
- import { isDirectory } from './is-directory.js';
5
- async function isDirEntry(entry, fullPath) {
6
- if (entry.isDirectory())
7
- return true;
8
- if (!entry.isSymbolicLink())
9
- return false;
10
- return isDirectory(fullPath);
11
- }
12
- export async function getSkillSources(packageNames, packageJsonPath) {
13
- const seen = new Set();
14
- const sources = [];
15
- for (const packageName of packageNames) {
16
- const packagePath = await getPackagePath(packageName, packageJsonPath);
17
- if (!packagePath)
18
- continue;
19
- const skillsRootPath = path.join(packagePath, '.ai', 'skills');
20
- if (!(await isDirectory(skillsRootPath)))
21
- continue;
22
- const entries = await fs.readdir(skillsRootPath, {
23
- withFileTypes: true,
24
- });
25
- const results = (await Promise.all(entries.map(async (entry) => {
26
- const sourcePath = path.join(skillsRootPath, entry.name);
27
- const entryIsDirectory = await isDirEntry(entry, sourcePath);
28
- return entryIsDirectory ? entry : null;
29
- }))).filter((entry) => entry !== null);
30
- results.forEach(entry => {
31
- const uniqueKey = `${packageName}:${entry.name}`;
32
- if (seen.has(uniqueKey))
33
- return;
34
- seen.add(uniqueKey);
35
- sources.push({
36
- packageName,
37
- skillName: entry.name,
38
- sourcePath: path.join(skillsRootPath, entry.name),
39
- });
40
- });
41
- }
42
- return sources;
43
- }
44
- //# sourceMappingURL=get-skill-sources.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-skill-sources.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/get-skill-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAc/C,KAAK,UAAU,UAAU,CAAC,KAAyB,EAAE,QAAgB;IACnE,IAAI,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAA;IAEpC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;QAAE,OAAO,KAAK,CAAA;IAEzC,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,YAAsB,EACtB,eAAuB;IAEvB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,OAAO,GAAkB,EAAE,CAAA;IAEjC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;QAEtE,IAAI,CAAC,WAAW;YAAE,SAAQ;QAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;QAE9D,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,cAAc,CAAC,CAAC;YAAE,SAAQ;QAElD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE;YAC/C,aAAa,EAAE,IAAI;SACpB,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,CACd,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;YACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAExD,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;YAE5D,OAAO,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QACxC,CAAC,CAAC,CACH,CACF,CAAC,MAAM,CAAC,CAAC,KAAK,EAAwC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAA;QAEzE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,MAAM,SAAS,GAAG,GAAG,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE,CAAA;YAEhD,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAM;YAE/B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAEnB,OAAO,CAAC,IAAI,CAAC;gBACX,WAAW;gBACX,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC;aAClD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -1,14 +0,0 @@
1
- import { createDirectorySnapshot } from './create-directory-snapshot.js';
2
- export async function isDirectoryEqual(leftPath, rightPath) {
3
- const [leftSnapshot, rightSnapshot] = await Promise.all([
4
- createDirectorySnapshot(leftPath),
5
- createDirectorySnapshot(rightPath),
6
- ]);
7
- if (leftSnapshot.size !== rightSnapshot.size)
8
- return false;
9
- for (const [filePath, fileHash] of leftSnapshot)
10
- if (rightSnapshot.get(filePath) !== fileHash)
11
- return false;
12
- return true;
13
- }
14
- //# sourceMappingURL=is-directory-equal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-directory-equal.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/is-directory-equal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AAExE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAiB;IACxE,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,uBAAuB,CAAC,QAAQ,CAAC;QACjC,uBAAuB,CAAC,SAAS,CAAC;KACnC,CAAC,CAAA;IAEF,IAAI,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI;QAAE,OAAO,KAAK,CAAA;IAE1D,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,YAAY;QAC7C,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;IAE5D,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1,8 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function isDirectory(targetPath) {
3
- return await fs
4
- .stat(targetPath)
5
- .then(stat => stat.isDirectory())
6
- .catch(() => false);
7
- }
8
- //# sourceMappingURL=is-directory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"is-directory.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/is-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB;IAClD,OAAO,MAAM,EAAE;SACZ,IAAI,CAAC,UAAU,CAAC;SAChB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SAChC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC"}
@@ -1,8 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- export async function pathExists(targetPath) {
3
- return await fs
4
- .access(targetPath, fs.constants.F_OK)
5
- .then(() => true)
6
- .catch(() => false);
7
- }
8
- //# sourceMappingURL=path-exists.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-exists.js","sourceRoot":"","sources":["../../../../src/commands/skills/tools/path-exists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,OAAO,MAAM,EAAE;SACZ,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;SACrC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;AACvB,CAAC"}