@t4h.framework/cli 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/bin/bin.js +12 -59
- package/dist/bin/bin.js.map +1 -1
- package/package.json +4 -4
- package/dist/commands/bootstrap/bootstrap.js +0 -9
- package/dist/commands/bootstrap/bootstrap.js.map +0 -1
- package/dist/commands/harness/prompts/get-destination-root-path.js +0 -34
- package/dist/commands/harness/prompts/get-destination-root-path.js.map +0 -1
- package/dist/commands/harness/target-options.js +0 -33
- package/dist/commands/harness/target-options.js.map +0 -1
- package/dist/commands/harness/tools/copy.js +0 -6
- package/dist/commands/harness/tools/copy.js.map +0 -1
- package/dist/commands/harness/tools/create-directory-snapshot.js +0 -29
- package/dist/commands/harness/tools/create-directory-snapshot.js.map +0 -1
- package/dist/commands/harness/tools/discover-packages.js +0 -16
- package/dist/commands/harness/tools/discover-packages.js.map +0 -1
- package/dist/commands/harness/tools/find-nearest-package-json-path.js +0 -18
- package/dist/commands/harness/tools/find-nearest-package-json-path.js.map +0 -1
- package/dist/commands/harness/tools/get-package-path.js +0 -18
- package/dist/commands/harness/tools/get-package-path.js.map +0 -1
- package/dist/commands/harness/tools/get-skill-sources.js +0 -44
- package/dist/commands/harness/tools/get-skill-sources.js.map +0 -1
- package/dist/commands/harness/tools/is-directory-equal.js +0 -14
- package/dist/commands/harness/tools/is-directory-equal.js.map +0 -1
- package/dist/commands/harness/tools/is-directory.js +0 -8
- package/dist/commands/harness/tools/is-directory.js.map +0 -1
- package/dist/commands/harness/tools/path-exists.js +0 -8
- package/dist/commands/harness/tools/path-exists.js.map +0 -1
- package/dist/commands/skills/prompts/get-destination-root-path.js +0 -34
- package/dist/commands/skills/prompts/get-destination-root-path.js.map +0 -1
- package/dist/commands/skills/skills.js +0 -90
- package/dist/commands/skills/skills.js.map +0 -1
- package/dist/commands/skills/target-options.js +0 -33
- package/dist/commands/skills/target-options.js.map +0 -1
- package/dist/commands/skills/tools/copy.js +0 -6
- package/dist/commands/skills/tools/copy.js.map +0 -1
- package/dist/commands/skills/tools/create-directory-snapshot.js +0 -29
- package/dist/commands/skills/tools/create-directory-snapshot.js.map +0 -1
- package/dist/commands/skills/tools/discover-packages.js +0 -16
- package/dist/commands/skills/tools/discover-packages.js.map +0 -1
- package/dist/commands/skills/tools/find-nearest-package-json-path.js +0 -18
- package/dist/commands/skills/tools/find-nearest-package-json-path.js.map +0 -1
- package/dist/commands/skills/tools/get-package-path.js +0 -18
- package/dist/commands/skills/tools/get-package-path.js.map +0 -1
- package/dist/commands/skills/tools/get-skill-sources.js +0 -44
- package/dist/commands/skills/tools/get-skill-sources.js.map +0 -1
- package/dist/commands/skills/tools/is-directory-equal.js +0 -14
- package/dist/commands/skills/tools/is-directory-equal.js.map +0 -1
- package/dist/commands/skills/tools/is-directory.js +0 -8
- package/dist/commands/skills/tools/is-directory.js.map +0 -1
- package/dist/commands/skills/tools/path-exists.js +0 -8
- package/dist/commands/skills/tools/path-exists.js.map +0 -1
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 {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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)
|
package/dist/bin/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,
|
|
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.
|
|
3
|
+
"version": "0.15.0",
|
|
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,8 +29,8 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@inquirer/prompts": "^8.3.0",
|
|
32
|
-
"@t4h.framework/dev": "
|
|
33
|
-
"@t4h.framework/harness": "
|
|
32
|
+
"@t4h.framework/dev": "workspace:^",
|
|
33
|
+
"@t4h.framework/harness": "workspace:^",
|
|
34
34
|
"commander": "^14.0.3",
|
|
35
35
|
"form-data": "^4.0.5",
|
|
36
36
|
"qs": "^6.15.0",
|
|
@@ -49,4 +49,4 @@
|
|
|
49
49
|
"engines": {
|
|
50
50
|
"node": ">=22"
|
|
51
51
|
}
|
|
52
|
-
}
|
|
52
|
+
}
|
|
@@ -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 +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 +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 +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 +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 +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 +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"}
|