@t4h.framework/cli 0.9.1 → 0.10.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/dist/bin/bin.js +4 -2
- package/dist/bin/bin.js.map +1 -1
- package/dist/commands/ai/ai-bootstrap.js +93 -0
- package/dist/commands/ai/ai-bootstrap.js.map +1 -0
- package/dist/commands/ai/ai-providers.js +13 -0
- package/dist/commands/ai/ai-providers.js.map +1 -0
- package/dist/commands/ai/tools/copy.js +6 -0
- package/dist/commands/ai/tools/copy.js.map +1 -0
- package/dist/commands/ai/tools/create-directory-snapshot.js +29 -0
- package/dist/commands/ai/tools/create-directory-snapshot.js.map +1 -0
- package/dist/commands/ai/tools/discover-packages.js +16 -0
- package/dist/commands/ai/tools/discover-packages.js.map +1 -0
- package/dist/commands/ai/tools/find-nearest-package-json-path.js +18 -0
- package/dist/commands/ai/tools/find-nearest-package-json-path.js.map +1 -0
- package/dist/commands/ai/tools/get-asset-sources.js +55 -0
- package/dist/commands/ai/tools/get-asset-sources.js.map +1 -0
- package/dist/commands/ai/tools/get-package-path.js +18 -0
- package/dist/commands/ai/tools/get-package-path.js.map +1 -0
- package/dist/commands/ai/tools/is-directory-equal.js +14 -0
- package/dist/commands/ai/tools/is-directory-equal.js.map +1 -0
- package/dist/commands/ai/tools/is-directory.js +8 -0
- package/dist/commands/ai/tools/is-directory.js.map +1 -0
- package/dist/commands/ai/tools/path-exists.js +8 -0
- package/dist/commands/ai/tools/path-exists.js.map +1 -0
- package/dist/commands/bootstrap/bootstrap.js +9 -0
- package/dist/commands/bootstrap/bootstrap.js.map +1 -0
- package/dist/commands/harness/harness.js +16 -0
- package/dist/commands/harness/harness.js.map +1 -0
- package/dist/commands/harness/prompts/get-destination-root-path.js +34 -0
- package/dist/commands/harness/prompts/get-destination-root-path.js.map +1 -0
- package/dist/commands/harness/target-options.js +33 -0
- package/dist/commands/harness/target-options.js.map +1 -0
- package/dist/commands/harness/tools/copy.js +6 -0
- package/dist/commands/harness/tools/copy.js.map +1 -0
- package/dist/commands/harness/tools/create-directory-snapshot.js +29 -0
- package/dist/commands/harness/tools/create-directory-snapshot.js.map +1 -0
- package/dist/commands/harness/tools/discover-packages.js +16 -0
- package/dist/commands/harness/tools/discover-packages.js.map +1 -0
- package/dist/commands/harness/tools/find-nearest-package-json-path.js +18 -0
- package/dist/commands/harness/tools/find-nearest-package-json-path.js.map +1 -0
- package/dist/commands/harness/tools/get-package-path.js +18 -0
- package/dist/commands/harness/tools/get-package-path.js.map +1 -0
- package/dist/commands/harness/tools/get-skill-sources.js +44 -0
- package/dist/commands/harness/tools/get-skill-sources.js.map +1 -0
- package/dist/commands/harness/tools/is-directory-equal.js +14 -0
- package/dist/commands/harness/tools/is-directory-equal.js.map +1 -0
- package/dist/commands/harness/tools/is-directory.js +8 -0
- package/dist/commands/harness/tools/is-directory.js.map +1 -0
- package/dist/commands/harness/tools/path-exists.js +8 -0
- package/dist/commands/harness/tools/path-exists.js.map +1 -0
- package/package.json +2 -2
- package/dist/bin/bin.d.ts +0 -2
- package/dist/commands/build/build.d.ts +0 -6
- package/dist/commands/dev/dev.d.ts +0 -7
- package/dist/commands/dev-server-up-app-process.d.ts +0 -2
- package/dist/commands/dev-server-up-app-process.js +0 -31
- package/dist/commands/dev-server-up-app-process.js.map +0 -1
- package/dist/commands/publish/publish.d.ts +0 -11
- package/dist/dev-runtime/__tests__/fixtures.d.ts +0 -57
- package/dist/dev-runtime/__tests__/fixtures.js +0 -31
- package/dist/dev-runtime/__tests__/fixtures.js.map +0 -1
- package/dist/dev-runtime/bootstrap.js +0 -51
- package/dist/dev-runtime/bootstrap.js.map +0 -1
- package/dist/dev-runtime/claims.d.ts +0 -24
- package/dist/dev-runtime/claims.js +0 -62
- package/dist/dev-runtime/claims.js.map +0 -1
- package/dist/dev-runtime/models/DevServerCacheClaim.d.ts +0 -6
- package/dist/dev-runtime/models/DevServerCacheClaim.js +0 -12
- package/dist/dev-runtime/models/DevServerCacheClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerFileBinary.d.ts +0 -15
- package/dist/dev-runtime/models/DevServerFileBinary.js +0 -27
- package/dist/dev-runtime/models/DevServerFileBinary.js.map +0 -1
- package/dist/dev-runtime/models/DevServerFileSystemClaim.d.ts +0 -7
- package/dist/dev-runtime/models/DevServerFileSystemClaim.js +0 -30
- package/dist/dev-runtime/models/DevServerFileSystemClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerGetActivityUniqueIdentifierClaim.d.ts +0 -7
- package/dist/dev-runtime/models/DevServerGetActivityUniqueIdentifierClaim.js +0 -31
- package/dist/dev-runtime/models/DevServerGetActivityUniqueIdentifierClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerGetProjectUniqueIdentifierClaim.d.ts +0 -6
- package/dist/dev-runtime/models/DevServerGetProjectUniqueIdentifierClaim.js +0 -13
- package/dist/dev-runtime/models/DevServerGetProjectUniqueIdentifierClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerGetProjectVersionUniqueIdentifierClaim.d.ts +0 -6
- package/dist/dev-runtime/models/DevServerGetProjectVersionUniqueIdentifierClaim.js +0 -13
- package/dist/dev-runtime/models/DevServerGetProjectVersionUniqueIdentifierClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerGetProjectVersionWorkflowUniqueIdentifierClaim.d.ts +0 -7
- package/dist/dev-runtime/models/DevServerGetProjectVersionWorkflowUniqueIdentifierClaim.js +0 -31
- package/dist/dev-runtime/models/DevServerGetProjectVersionWorkflowUniqueIdentifierClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerGetWorkflowUniqueIdentifierClaim.d.ts +0 -7
- package/dist/dev-runtime/models/DevServerGetWorkflowUniqueIdentifierClaim.js +0 -31
- package/dist/dev-runtime/models/DevServerGetWorkflowUniqueIdentifierClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerHttpClientRequestClaim.d.ts +0 -5
- package/dist/dev-runtime/models/DevServerHttpClientRequestClaim.js +0 -39
- package/dist/dev-runtime/models/DevServerHttpClientRequestClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerORMClaim.d.ts +0 -8
- package/dist/dev-runtime/models/DevServerORMClaim.js +0 -37
- package/dist/dev-runtime/models/DevServerORMClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerSmtpSendEmailClaim.d.ts +0 -6
- package/dist/dev-runtime/models/DevServerSmtpSendEmailClaim.js +0 -32
- package/dist/dev-runtime/models/DevServerSmtpSendEmailClaim.js.map +0 -1
- package/dist/dev-runtime/models/DevServerWorkflowClaim.d.ts +0 -7
- package/dist/dev-runtime/models/DevServerWorkflowClaim.js +0 -38
- package/dist/dev-runtime/models/DevServerWorkflowClaim.js.map +0 -1
- package/dist/dev-runtime/models/WorkflowRun.d.ts +0 -18
- package/dist/dev-runtime/models/WorkflowRun.js +0 -19
- package/dist/dev-runtime/models/WorkflowRun.js.map +0 -1
- package/dist/dev-runtime/models/WorkflowRunActivity.d.ts +0 -40
- package/dist/dev-runtime/models/WorkflowRunActivity.js +0 -52
- package/dist/dev-runtime/models/WorkflowRunActivity.js.map +0 -1
- package/dist/dev-runtime/repositories/WorkflowRun.repository.d.ts +0 -8
- package/dist/dev-runtime/repositories/WorkflowRun.repository.js +0 -27
- package/dist/dev-runtime/repositories/WorkflowRun.repository.js.map +0 -1
- package/dist/dev-runtime/repositories/WorkflowRunActivity.repository.d.ts +0 -8
- package/dist/dev-runtime/repositories/WorkflowRunActivity.repository.js +0 -36
- package/dist/dev-runtime/repositories/WorkflowRunActivity.repository.js.map +0 -1
- package/dist/dev-runtime/services/BuildWorkflowRunResult.service.d.ts +0 -8
- package/dist/dev-runtime/services/BuildWorkflowRunResult.service.js +0 -49
- package/dist/dev-runtime/services/BuildWorkflowRunResult.service.js.map +0 -1
- package/dist/dev-runtime/services/RuntimeContext.service.d.ts +0 -10
- package/dist/dev-runtime/services/RuntimeContext.service.js +0 -22
- package/dist/dev-runtime/services/RuntimeContext.service.js.map +0 -1
- package/dist/dev-runtime/services/TimeoutScheduler.service.d.ts +0 -5
- package/dist/dev-runtime/services/TimeoutScheduler.service.js +0 -33
- package/dist/dev-runtime/services/TimeoutScheduler.service.js.map +0 -1
- package/dist/dev-runtime/services/WorkflowRunAsyncActivityFacade.service.d.ts +0 -20
- package/dist/dev-runtime/services/WorkflowRunAsyncActivityFacade.service.js +0 -54
- package/dist/dev-runtime/services/WorkflowRunAsyncActivityFacade.service.js.map +0 -1
- package/dist/dev-runtime/services/WorkflowRunFacade.service.d.ts +0 -13
- package/dist/dev-runtime/services/WorkflowRunFacade.service.js +0 -40
- package/dist/dev-runtime/services/WorkflowRunFacade.service.js.map +0 -1
- package/dist/dev-runtime/services/WorkflowRunSyncActivityFacade.service.d.ts +0 -7
- package/dist/dev-runtime/services/WorkflowRunSyncActivityFacade.service.js +0 -26
- package/dist/dev-runtime/services/WorkflowRunSyncActivityFacade.service.js.map +0 -1
- package/dist/dev-runtime/tools/find-claim-by-constructor.d.ts +0 -1
- package/dist/dev-runtime/tools/find-claim-by-constructor.js +0 -5
- package/dist/dev-runtime/tools/find-claim-by-constructor.js.map +0 -1
- package/dist/dev-runtime/transport/DevServerJsonRpc.d.ts +0 -2
- package/dist/dev-runtime/transport/DevServerJsonRpc.js +0 -42
- package/dist/dev-runtime/transport/DevServerJsonRpc.js.map +0 -1
- package/dist/dev-runtime/use-cases/CallbackWorkflowRunAsyncActivity.usecase.d.ts +0 -14
- package/dist/dev-runtime/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js +0 -64
- package/dist/dev-runtime/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/CreateWorkflowRun.usecase.d.ts +0 -14
- package/dist/dev-runtime/use-cases/CreateWorkflowRun.usecase.js +0 -43
- package/dist/dev-runtime/use-cases/CreateWorkflowRun.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +0 -9
- package/dist/dev-runtime/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +0 -68
- package/dist/dev-runtime/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/NextTickWorkflowRun.usecase.d.ts +0 -20
- package/dist/dev-runtime/use-cases/NextTickWorkflowRun.usecase.js +0 -150
- package/dist/dev-runtime/use-cases/NextTickWorkflowRun.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.d.ts +0 -8
- package/dist/dev-runtime/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js +0 -38
- package/dist/dev-runtime/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivity.usecase.d.ts +0 -7
- package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivity.usecase.js +0 -44
- package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivity.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivityAdvance.usecase.d.ts +0 -10
- package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js +0 -57
- package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/WorkflowRunBuildHistory.usecase.d.ts +0 -8
- package/dist/dev-runtime/use-cases/WorkflowRunBuildHistory.usecase.js +0 -41
- package/dist/dev-runtime/use-cases/WorkflowRunBuildHistory.usecase.js.map +0 -1
- package/dist/dev-runtime/use-cases/WorkflowRunSyncActivity.usecase.d.ts +0 -4
- package/dist/dev-runtime/use-cases/WorkflowRunSyncActivity.usecase.js +0 -26
- package/dist/dev-runtime/use-cases/WorkflowRunSyncActivity.usecase.js.map +0 -1
- package/dist/models/DevServer.d.ts +0 -24
- package/dist/models/DevServer.js +0 -86
- package/dist/models/DevServer.js.map +0 -1
- package/dist/models/InMemoryDatabase.d.ts +0 -20
- package/dist/models/InMemoryDatabase.js +0 -86
- package/dist/models/InMemoryDatabase.js.map +0 -1
- package/dist/models/JSONCodec.d.ts +0 -30
- package/dist/models/JSONCodec.js +0 -110
- package/dist/models/JSONCodec.js.map +0 -1
- package/dist/models/JSONCodecKindFrameworkSerializableClass.d.ts +0 -8
- package/dist/models/JSONCodecKindFrameworkSerializableClass.js +0 -7
- package/dist/models/JSONCodecKindFrameworkSerializableClass.js.map +0 -1
- package/dist/models/JSONRPCClient.d.ts +0 -11
- package/dist/models/JSONRPCClient.js +0 -50
- package/dist/models/JSONRPCClient.js.map +0 -1
- package/dist/models/JSONRPCServer.d.ts +0 -63
- package/dist/models/JSONRPCServer.js +0 -61
- package/dist/models/JSONRPCServer.js.map +0 -1
- package/dist/tools/is-workflow-waiting.d.ts +0 -4
- package/dist/tools/is-workflow-waiting.js +0 -12
- package/dist/tools/is-workflow-waiting.js.map +0 -1
- package/dist/tools/json-codec.d.ts +0 -8
- package/dist/tools/json-codec.js +0 -17
- package/dist/tools/json-codec.js.map +0 -1
- package/dist/tools/json-schema-to-inquirer-question.d.ts +0 -11
- package/dist/tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.d.ts +0 -1
- package/dist/tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.js +0 -11
- package/dist/tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.js.map +0 -1
- package/dist/tools/resolve-package-json-path.d.ts +0 -1
- package/dist/tools/resolve-package-json-path.js +0 -21
- package/dist/tools/resolve-package-json-path.js.map +0 -1
- package/dist/tools/resolve-tsconfig-path-from-package-json-path.d.ts +0 -1
- package/dist/tools/resolve-tsconfig-path-from-package-json-path.js +0 -14
- package/dist/tools/resolve-tsconfig-path-from-package-json-path.js.map +0 -1
- package/dist/tools/ts-build-watch.d.ts +0 -12
- package/dist/tools/ts-build-watch.js +0 -46
- package/dist/tools/ts-build-watch.js.map +0 -1
- package/dist/tools/ts-build.d.ts +0 -6
- package/dist/tools/ts-build.js +0 -37
- package/dist/tools/ts-build.js.map +0 -1
- package/dist/tools/up-app.d.ts +0 -2
- package/dist/tools/up-app.js +0 -10
- package/dist/tools/up-app.js.map +0 -1
package/dist/bin/bin.js
CHANGED
|
@@ -49,11 +49,13 @@ else {
|
|
|
49
49
|
const { buildCommand } = await import('../commands/build/build.js');
|
|
50
50
|
const { devCommand } = await import('../commands/dev/dev.js');
|
|
51
51
|
const { publishCommand } = await import('../commands/publish/publish.js');
|
|
52
|
-
const {
|
|
52
|
+
const { AIBootstrapCommand } = await import('../commands/ai/ai-bootstrap.js');
|
|
53
|
+
const { harnessCommand } = await import('../commands/harness/harness.js');
|
|
53
54
|
program.addCommand(devCommand);
|
|
54
55
|
program.addCommand(publishCommand);
|
|
55
56
|
program.addCommand(buildCommand);
|
|
56
|
-
program.addCommand(
|
|
57
|
+
program.addCommand(AIBootstrapCommand);
|
|
58
|
+
program.addCommand(harnessCommand);
|
|
57
59
|
await program.parseAsync(process.argv);
|
|
58
60
|
}
|
|
59
61
|
process.on('uncaughtException', error => {
|
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,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,SAAS,uBAAuB;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAA;IAC7B,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1C,IAAI,CAAC,IAAI,CACP,CAAC,CAAC,EAAE,CACF,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC;YAC7B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CACvD;QACD,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CACjE,CAAA;AACH,CAAC;AAED,SAAS,gCAAgC;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,0CAA0C,KAAK,GAAG;QAChE,OAAO,KAAK,CAAA;IAEd,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAEtC,MAAM,QAAQ,GAAG,EAAE,CAAA;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACrB,IAAI,CAAC,KAAK,cAAc,EAAE,CAAC;YACzB,CAAC,EAAE,CAAA;YACH,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC;YAAE,SAAQ;QAC5C,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,cAAc,CAAC,CAAA;IACnC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAErD,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ;IAChB,+CAA+C;IAC/C,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACxD;QACE,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE;YACH,GAAG,OAAO,CAAC,GAAG;YACd,0CAA0C,EAAE,GAAG;SAChD;KACF,CACF,CAAA;IAED,wCAAwC;IACxC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IACjD,wCAAwC;IACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,IAAI,CAAC,uBAAuB,EAAE;IAAE,gCAAgC,EAAE,CAAA;KAC7D,CAAC;IACJ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAA;IAE7C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAA;IACnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAA;IAC7D,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAA;IACzE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { confirm, select } from '@inquirer/prompts';
|
|
4
|
+
import { bootstrap as bootstrapHarness } from '@t4h.framework/harness';
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { AI_PROVIDERS } from './ai-providers.js';
|
|
7
|
+
import { copy } from './tools/copy.js';
|
|
8
|
+
import { discoverPackages } from './tools/discover-packages.js';
|
|
9
|
+
import { findNearestPackageJsonPath } from './tools/find-nearest-package-json-path.js';
|
|
10
|
+
import { getAssetSources } from './tools/get-asset-sources.js';
|
|
11
|
+
import { isDirectoryEqual } from './tools/is-directory-equal.js';
|
|
12
|
+
import { isDirectory } from './tools/is-directory.js';
|
|
13
|
+
import { pathExists } from './tools/path-exists.js';
|
|
14
|
+
async function syncAsset(sourcePath, destinationPath, assetName, row) {
|
|
15
|
+
const destinationExists = await pathExists(destinationPath);
|
|
16
|
+
if (!destinationExists) {
|
|
17
|
+
await copy(sourcePath, destinationPath);
|
|
18
|
+
row.copied++;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const destinationIsDirectory = await isDirectory(destinationPath);
|
|
22
|
+
const hasDifferences = !destinationIsDirectory
|
|
23
|
+
? true
|
|
24
|
+
: !(await isDirectoryEqual(sourcePath, destinationPath));
|
|
25
|
+
if (!hasDifferences) {
|
|
26
|
+
row.ignored++;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const isOverwriting = await confirm({
|
|
30
|
+
message: `Asset "${assetName}" already exists and has differences. Overwrite it?`,
|
|
31
|
+
default: false,
|
|
32
|
+
});
|
|
33
|
+
if (!isOverwriting) {
|
|
34
|
+
row.skipped++;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
await copy(sourcePath, destinationPath);
|
|
38
|
+
row.copied++;
|
|
39
|
+
}
|
|
40
|
+
export const AIBootstrapCommand = new Command('ai-bootstrap')
|
|
41
|
+
.description('Bootstrap AI assets from framework packages')
|
|
42
|
+
.action(async () => {
|
|
43
|
+
const packageJsonPath = await findNearestPackageJsonPath();
|
|
44
|
+
if (!packageJsonPath) {
|
|
45
|
+
console.error('package.json was not found from the current directory.');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const frameworkPackages = await discoverPackages(packageJsonPath);
|
|
49
|
+
if (frameworkPackages.length === 0) {
|
|
50
|
+
console.warn('No framework packages were found in package.json.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const assets = await getAssetSources(frameworkPackages, packageJsonPath);
|
|
54
|
+
if (!Object.keys(assets).length) {
|
|
55
|
+
console.log('No AI assets were found in the declared framework packages.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const provider = await select({
|
|
59
|
+
message: 'Select a AI provider',
|
|
60
|
+
choices: AI_PROVIDERS.map(target => ({
|
|
61
|
+
name: target.name,
|
|
62
|
+
value: target,
|
|
63
|
+
})),
|
|
64
|
+
});
|
|
65
|
+
const targetDir = process.env.INIT_CWD ?? process.cwd();
|
|
66
|
+
await bootstrapHarness({ targetDir });
|
|
67
|
+
const settingsPath = path.join(targetDir, '.framework', 'settings.json');
|
|
68
|
+
await fs.promises.writeFile(settingsPath, JSON.stringify({ provider: provider.value }, null, 2));
|
|
69
|
+
const summary = {};
|
|
70
|
+
const providerNames = new Set(AI_PROVIDERS.map(entry => entry.value));
|
|
71
|
+
for (const [assetType, sources] of Object.entries(assets)) {
|
|
72
|
+
const row = (summary[assetType] ??= {
|
|
73
|
+
copied: 0,
|
|
74
|
+
ignored: 0,
|
|
75
|
+
skipped: 0,
|
|
76
|
+
});
|
|
77
|
+
const targetPath = path.join(targetDir, provider.dir, assetType);
|
|
78
|
+
await fs.promises.mkdir(targetPath, { recursive: true });
|
|
79
|
+
for (const source of sources) {
|
|
80
|
+
if (providerNames.has(source.assetName)) {
|
|
81
|
+
if (source.assetName !== provider.value)
|
|
82
|
+
continue;
|
|
83
|
+
const entries = await fs.promises.readdir(source.sourcePath);
|
|
84
|
+
for (const entry of entries)
|
|
85
|
+
await syncAsset(path.join(source.sourcePath, entry), path.join(targetPath, entry), entry, row);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
await syncAsset(source.sourcePath, path.join(targetPath, source.assetName), source.assetName, row);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
console.table(summary);
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=ai-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-bootstrap.js","sourceRoot":"","sources":["../../../src/commands/ai/ai-bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-providers.js","sourceRoot":"","sources":["../../../src/commands/ai/ai-providers.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,SAAS;KACf;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,SAAS;KACf;CACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-directory-snapshot.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-packages.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-nearest-package-json-path.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
const AI_ASSET_TYPES = ['skills', 'hooks', 'rules', 'commands'];
|
|
6
|
+
async function isSyncableEntry(entry, fullPath) {
|
|
7
|
+
if (entry.name.startsWith('.'))
|
|
8
|
+
return false;
|
|
9
|
+
if (entry.isDirectory() || entry.isFile())
|
|
10
|
+
return true;
|
|
11
|
+
if (!entry.isSymbolicLink())
|
|
12
|
+
return false;
|
|
13
|
+
return fs
|
|
14
|
+
.stat(fullPath)
|
|
15
|
+
.then(stat => stat.isDirectory() || stat.isFile())
|
|
16
|
+
.catch(() => false);
|
|
17
|
+
}
|
|
18
|
+
export async function getAssetSources(packageNames, packageJsonPath) {
|
|
19
|
+
const seen = new Set();
|
|
20
|
+
const sources = new Map();
|
|
21
|
+
const promises = AI_ASSET_TYPES.map(async (assetType) => {
|
|
22
|
+
for (const packageName of packageNames) {
|
|
23
|
+
const packagePath = await getPackagePath(packageName, packageJsonPath);
|
|
24
|
+
if (!packagePath)
|
|
25
|
+
continue;
|
|
26
|
+
const assetRootPath = path.join(packagePath, '.ai', assetType);
|
|
27
|
+
if (!(await isDirectory(assetRootPath)))
|
|
28
|
+
continue;
|
|
29
|
+
const entries = await fs.readdir(assetRootPath, {
|
|
30
|
+
withFileTypes: true,
|
|
31
|
+
});
|
|
32
|
+
const results = (await Promise.all(entries.map(async (entry) => {
|
|
33
|
+
const sourcePath = path.join(assetRootPath, entry.name);
|
|
34
|
+
const isSyncable = await isSyncableEntry(entry, sourcePath);
|
|
35
|
+
return isSyncable ? entry : null;
|
|
36
|
+
}))).filter((entry) => entry !== null);
|
|
37
|
+
const assets = sources.get(assetType) ?? [];
|
|
38
|
+
results.forEach(entry => {
|
|
39
|
+
const uniqueKey = `${packageName}:${assetType}:${entry.name}`;
|
|
40
|
+
if (seen.has(uniqueKey))
|
|
41
|
+
return;
|
|
42
|
+
seen.add(uniqueKey);
|
|
43
|
+
assets.push({
|
|
44
|
+
packageName,
|
|
45
|
+
assetName: entry.name,
|
|
46
|
+
sourcePath: path.join(assetRootPath, entry.name),
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
sources.set(assetType, assets);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
await Promise.all(promises);
|
|
53
|
+
return Object.fromEntries(sources.entries());
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=get-asset-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-asset-sources.js","sourceRoot":"","sources":["../../../../src/commands/ai/tools/get-asset-sources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-package-path.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-directory-equal.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-directory.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-exists.js","sourceRoot":"","sources":["../../../../src/commands/ai/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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { runPlan } from '@t4h.framework/harness';
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
export const harnessCommand = new Command('run')
|
|
6
|
+
.description('Run harness')
|
|
7
|
+
.option('--plan <plan>', 'The plan slug to run')
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
const targetDir = process.env.INIT_CWD ?? process.cwd();
|
|
10
|
+
const content = await fs.promises.readFile(path.join(targetDir, '.framework', 'settings.json'), { encoding: 'utf-8' });
|
|
11
|
+
const settings = JSON.parse(content);
|
|
12
|
+
if (!settings.provider)
|
|
13
|
+
throw new Error('Provider not specified in settings');
|
|
14
|
+
await runPlan(settings.provider, options.plan);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../src/commands/harness/harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KAC7C,WAAW,CAAC,aAAa,CAAC;KAC1B,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,OAA8B,EAAE,EAAE;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAEvD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CACxC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,eAAe,CAAC,EACnD,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAyB,CAAA;IAE5D,IAAI,CAAC,QAAQ,CAAC,QAAQ;QACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IAEvD,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|