@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.
Files changed (208) hide show
  1. package/dist/bin/bin.js +4 -2
  2. package/dist/bin/bin.js.map +1 -1
  3. package/dist/commands/ai/ai-bootstrap.js +93 -0
  4. package/dist/commands/ai/ai-bootstrap.js.map +1 -0
  5. package/dist/commands/ai/ai-providers.js +13 -0
  6. package/dist/commands/ai/ai-providers.js.map +1 -0
  7. package/dist/commands/ai/tools/copy.js +6 -0
  8. package/dist/commands/ai/tools/copy.js.map +1 -0
  9. package/dist/commands/ai/tools/create-directory-snapshot.js +29 -0
  10. package/dist/commands/ai/tools/create-directory-snapshot.js.map +1 -0
  11. package/dist/commands/ai/tools/discover-packages.js +16 -0
  12. package/dist/commands/ai/tools/discover-packages.js.map +1 -0
  13. package/dist/commands/ai/tools/find-nearest-package-json-path.js +18 -0
  14. package/dist/commands/ai/tools/find-nearest-package-json-path.js.map +1 -0
  15. package/dist/commands/ai/tools/get-asset-sources.js +55 -0
  16. package/dist/commands/ai/tools/get-asset-sources.js.map +1 -0
  17. package/dist/commands/ai/tools/get-package-path.js +18 -0
  18. package/dist/commands/ai/tools/get-package-path.js.map +1 -0
  19. package/dist/commands/ai/tools/is-directory-equal.js +14 -0
  20. package/dist/commands/ai/tools/is-directory-equal.js.map +1 -0
  21. package/dist/commands/ai/tools/is-directory.js +8 -0
  22. package/dist/commands/ai/tools/is-directory.js.map +1 -0
  23. package/dist/commands/ai/tools/path-exists.js +8 -0
  24. package/dist/commands/ai/tools/path-exists.js.map +1 -0
  25. package/dist/commands/bootstrap/bootstrap.js +9 -0
  26. package/dist/commands/bootstrap/bootstrap.js.map +1 -0
  27. package/dist/commands/harness/harness.js +16 -0
  28. package/dist/commands/harness/harness.js.map +1 -0
  29. package/dist/commands/harness/prompts/get-destination-root-path.js +34 -0
  30. package/dist/commands/harness/prompts/get-destination-root-path.js.map +1 -0
  31. package/dist/commands/harness/target-options.js +33 -0
  32. package/dist/commands/harness/target-options.js.map +1 -0
  33. package/dist/commands/harness/tools/copy.js +6 -0
  34. package/dist/commands/harness/tools/copy.js.map +1 -0
  35. package/dist/commands/harness/tools/create-directory-snapshot.js +29 -0
  36. package/dist/commands/harness/tools/create-directory-snapshot.js.map +1 -0
  37. package/dist/commands/harness/tools/discover-packages.js +16 -0
  38. package/dist/commands/harness/tools/discover-packages.js.map +1 -0
  39. package/dist/commands/harness/tools/find-nearest-package-json-path.js +18 -0
  40. package/dist/commands/harness/tools/find-nearest-package-json-path.js.map +1 -0
  41. package/dist/commands/harness/tools/get-package-path.js +18 -0
  42. package/dist/commands/harness/tools/get-package-path.js.map +1 -0
  43. package/dist/commands/harness/tools/get-skill-sources.js +44 -0
  44. package/dist/commands/harness/tools/get-skill-sources.js.map +1 -0
  45. package/dist/commands/harness/tools/is-directory-equal.js +14 -0
  46. package/dist/commands/harness/tools/is-directory-equal.js.map +1 -0
  47. package/dist/commands/harness/tools/is-directory.js +8 -0
  48. package/dist/commands/harness/tools/is-directory.js.map +1 -0
  49. package/dist/commands/harness/tools/path-exists.js +8 -0
  50. package/dist/commands/harness/tools/path-exists.js.map +1 -0
  51. package/package.json +2 -2
  52. package/dist/bin/bin.d.ts +0 -2
  53. package/dist/commands/build/build.d.ts +0 -6
  54. package/dist/commands/dev/dev.d.ts +0 -7
  55. package/dist/commands/dev-server-up-app-process.d.ts +0 -2
  56. package/dist/commands/dev-server-up-app-process.js +0 -31
  57. package/dist/commands/dev-server-up-app-process.js.map +0 -1
  58. package/dist/commands/publish/publish.d.ts +0 -11
  59. package/dist/dev-runtime/__tests__/fixtures.d.ts +0 -57
  60. package/dist/dev-runtime/__tests__/fixtures.js +0 -31
  61. package/dist/dev-runtime/__tests__/fixtures.js.map +0 -1
  62. package/dist/dev-runtime/bootstrap.js +0 -51
  63. package/dist/dev-runtime/bootstrap.js.map +0 -1
  64. package/dist/dev-runtime/claims.d.ts +0 -24
  65. package/dist/dev-runtime/claims.js +0 -62
  66. package/dist/dev-runtime/claims.js.map +0 -1
  67. package/dist/dev-runtime/models/DevServerCacheClaim.d.ts +0 -6
  68. package/dist/dev-runtime/models/DevServerCacheClaim.js +0 -12
  69. package/dist/dev-runtime/models/DevServerCacheClaim.js.map +0 -1
  70. package/dist/dev-runtime/models/DevServerFileBinary.d.ts +0 -15
  71. package/dist/dev-runtime/models/DevServerFileBinary.js +0 -27
  72. package/dist/dev-runtime/models/DevServerFileBinary.js.map +0 -1
  73. package/dist/dev-runtime/models/DevServerFileSystemClaim.d.ts +0 -7
  74. package/dist/dev-runtime/models/DevServerFileSystemClaim.js +0 -30
  75. package/dist/dev-runtime/models/DevServerFileSystemClaim.js.map +0 -1
  76. package/dist/dev-runtime/models/DevServerGetActivityUniqueIdentifierClaim.d.ts +0 -7
  77. package/dist/dev-runtime/models/DevServerGetActivityUniqueIdentifierClaim.js +0 -31
  78. package/dist/dev-runtime/models/DevServerGetActivityUniqueIdentifierClaim.js.map +0 -1
  79. package/dist/dev-runtime/models/DevServerGetProjectUniqueIdentifierClaim.d.ts +0 -6
  80. package/dist/dev-runtime/models/DevServerGetProjectUniqueIdentifierClaim.js +0 -13
  81. package/dist/dev-runtime/models/DevServerGetProjectUniqueIdentifierClaim.js.map +0 -1
  82. package/dist/dev-runtime/models/DevServerGetProjectVersionUniqueIdentifierClaim.d.ts +0 -6
  83. package/dist/dev-runtime/models/DevServerGetProjectVersionUniqueIdentifierClaim.js +0 -13
  84. package/dist/dev-runtime/models/DevServerGetProjectVersionUniqueIdentifierClaim.js.map +0 -1
  85. package/dist/dev-runtime/models/DevServerGetProjectVersionWorkflowUniqueIdentifierClaim.d.ts +0 -7
  86. package/dist/dev-runtime/models/DevServerGetProjectVersionWorkflowUniqueIdentifierClaim.js +0 -31
  87. package/dist/dev-runtime/models/DevServerGetProjectVersionWorkflowUniqueIdentifierClaim.js.map +0 -1
  88. package/dist/dev-runtime/models/DevServerGetWorkflowUniqueIdentifierClaim.d.ts +0 -7
  89. package/dist/dev-runtime/models/DevServerGetWorkflowUniqueIdentifierClaim.js +0 -31
  90. package/dist/dev-runtime/models/DevServerGetWorkflowUniqueIdentifierClaim.js.map +0 -1
  91. package/dist/dev-runtime/models/DevServerHttpClientRequestClaim.d.ts +0 -5
  92. package/dist/dev-runtime/models/DevServerHttpClientRequestClaim.js +0 -39
  93. package/dist/dev-runtime/models/DevServerHttpClientRequestClaim.js.map +0 -1
  94. package/dist/dev-runtime/models/DevServerORMClaim.d.ts +0 -8
  95. package/dist/dev-runtime/models/DevServerORMClaim.js +0 -37
  96. package/dist/dev-runtime/models/DevServerORMClaim.js.map +0 -1
  97. package/dist/dev-runtime/models/DevServerSmtpSendEmailClaim.d.ts +0 -6
  98. package/dist/dev-runtime/models/DevServerSmtpSendEmailClaim.js +0 -32
  99. package/dist/dev-runtime/models/DevServerSmtpSendEmailClaim.js.map +0 -1
  100. package/dist/dev-runtime/models/DevServerWorkflowClaim.d.ts +0 -7
  101. package/dist/dev-runtime/models/DevServerWorkflowClaim.js +0 -38
  102. package/dist/dev-runtime/models/DevServerWorkflowClaim.js.map +0 -1
  103. package/dist/dev-runtime/models/WorkflowRun.d.ts +0 -18
  104. package/dist/dev-runtime/models/WorkflowRun.js +0 -19
  105. package/dist/dev-runtime/models/WorkflowRun.js.map +0 -1
  106. package/dist/dev-runtime/models/WorkflowRunActivity.d.ts +0 -40
  107. package/dist/dev-runtime/models/WorkflowRunActivity.js +0 -52
  108. package/dist/dev-runtime/models/WorkflowRunActivity.js.map +0 -1
  109. package/dist/dev-runtime/repositories/WorkflowRun.repository.d.ts +0 -8
  110. package/dist/dev-runtime/repositories/WorkflowRun.repository.js +0 -27
  111. package/dist/dev-runtime/repositories/WorkflowRun.repository.js.map +0 -1
  112. package/dist/dev-runtime/repositories/WorkflowRunActivity.repository.d.ts +0 -8
  113. package/dist/dev-runtime/repositories/WorkflowRunActivity.repository.js +0 -36
  114. package/dist/dev-runtime/repositories/WorkflowRunActivity.repository.js.map +0 -1
  115. package/dist/dev-runtime/services/BuildWorkflowRunResult.service.d.ts +0 -8
  116. package/dist/dev-runtime/services/BuildWorkflowRunResult.service.js +0 -49
  117. package/dist/dev-runtime/services/BuildWorkflowRunResult.service.js.map +0 -1
  118. package/dist/dev-runtime/services/RuntimeContext.service.d.ts +0 -10
  119. package/dist/dev-runtime/services/RuntimeContext.service.js +0 -22
  120. package/dist/dev-runtime/services/RuntimeContext.service.js.map +0 -1
  121. package/dist/dev-runtime/services/TimeoutScheduler.service.d.ts +0 -5
  122. package/dist/dev-runtime/services/TimeoutScheduler.service.js +0 -33
  123. package/dist/dev-runtime/services/TimeoutScheduler.service.js.map +0 -1
  124. package/dist/dev-runtime/services/WorkflowRunAsyncActivityFacade.service.d.ts +0 -20
  125. package/dist/dev-runtime/services/WorkflowRunAsyncActivityFacade.service.js +0 -54
  126. package/dist/dev-runtime/services/WorkflowRunAsyncActivityFacade.service.js.map +0 -1
  127. package/dist/dev-runtime/services/WorkflowRunFacade.service.d.ts +0 -13
  128. package/dist/dev-runtime/services/WorkflowRunFacade.service.js +0 -40
  129. package/dist/dev-runtime/services/WorkflowRunFacade.service.js.map +0 -1
  130. package/dist/dev-runtime/services/WorkflowRunSyncActivityFacade.service.d.ts +0 -7
  131. package/dist/dev-runtime/services/WorkflowRunSyncActivityFacade.service.js +0 -26
  132. package/dist/dev-runtime/services/WorkflowRunSyncActivityFacade.service.js.map +0 -1
  133. package/dist/dev-runtime/tools/find-claim-by-constructor.d.ts +0 -1
  134. package/dist/dev-runtime/tools/find-claim-by-constructor.js +0 -5
  135. package/dist/dev-runtime/tools/find-claim-by-constructor.js.map +0 -1
  136. package/dist/dev-runtime/transport/DevServerJsonRpc.d.ts +0 -2
  137. package/dist/dev-runtime/transport/DevServerJsonRpc.js +0 -42
  138. package/dist/dev-runtime/transport/DevServerJsonRpc.js.map +0 -1
  139. package/dist/dev-runtime/use-cases/CallbackWorkflowRunAsyncActivity.usecase.d.ts +0 -14
  140. package/dist/dev-runtime/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js +0 -64
  141. package/dist/dev-runtime/use-cases/CallbackWorkflowRunAsyncActivity.usecase.js.map +0 -1
  142. package/dist/dev-runtime/use-cases/CreateWorkflowRun.usecase.d.ts +0 -14
  143. package/dist/dev-runtime/use-cases/CreateWorkflowRun.usecase.js +0 -43
  144. package/dist/dev-runtime/use-cases/CreateWorkflowRun.usecase.js.map +0 -1
  145. package/dist/dev-runtime/use-cases/CreateWorkflowRunAsyncActivity.usecase.d.ts +0 -9
  146. package/dist/dev-runtime/use-cases/CreateWorkflowRunAsyncActivity.usecase.js +0 -68
  147. package/dist/dev-runtime/use-cases/CreateWorkflowRunAsyncActivity.usecase.js.map +0 -1
  148. package/dist/dev-runtime/use-cases/NextTickWorkflowRun.usecase.d.ts +0 -20
  149. package/dist/dev-runtime/use-cases/NextTickWorkflowRun.usecase.js +0 -150
  150. package/dist/dev-runtime/use-cases/NextTickWorkflowRun.usecase.js.map +0 -1
  151. package/dist/dev-runtime/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.d.ts +0 -8
  152. package/dist/dev-runtime/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js +0 -38
  153. package/dist/dev-runtime/use-cases/TimeoutWorkflowRunAsyncActivity.usecase.js.map +0 -1
  154. package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivity.usecase.d.ts +0 -7
  155. package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivity.usecase.js +0 -44
  156. package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivity.usecase.js.map +0 -1
  157. package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivityAdvance.usecase.d.ts +0 -10
  158. package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js +0 -57
  159. package/dist/dev-runtime/use-cases/WorkflowRunAsyncActivityAdvance.usecase.js.map +0 -1
  160. package/dist/dev-runtime/use-cases/WorkflowRunBuildHistory.usecase.d.ts +0 -8
  161. package/dist/dev-runtime/use-cases/WorkflowRunBuildHistory.usecase.js +0 -41
  162. package/dist/dev-runtime/use-cases/WorkflowRunBuildHistory.usecase.js.map +0 -1
  163. package/dist/dev-runtime/use-cases/WorkflowRunSyncActivity.usecase.d.ts +0 -4
  164. package/dist/dev-runtime/use-cases/WorkflowRunSyncActivity.usecase.js +0 -26
  165. package/dist/dev-runtime/use-cases/WorkflowRunSyncActivity.usecase.js.map +0 -1
  166. package/dist/models/DevServer.d.ts +0 -24
  167. package/dist/models/DevServer.js +0 -86
  168. package/dist/models/DevServer.js.map +0 -1
  169. package/dist/models/InMemoryDatabase.d.ts +0 -20
  170. package/dist/models/InMemoryDatabase.js +0 -86
  171. package/dist/models/InMemoryDatabase.js.map +0 -1
  172. package/dist/models/JSONCodec.d.ts +0 -30
  173. package/dist/models/JSONCodec.js +0 -110
  174. package/dist/models/JSONCodec.js.map +0 -1
  175. package/dist/models/JSONCodecKindFrameworkSerializableClass.d.ts +0 -8
  176. package/dist/models/JSONCodecKindFrameworkSerializableClass.js +0 -7
  177. package/dist/models/JSONCodecKindFrameworkSerializableClass.js.map +0 -1
  178. package/dist/models/JSONRPCClient.d.ts +0 -11
  179. package/dist/models/JSONRPCClient.js +0 -50
  180. package/dist/models/JSONRPCClient.js.map +0 -1
  181. package/dist/models/JSONRPCServer.d.ts +0 -63
  182. package/dist/models/JSONRPCServer.js +0 -61
  183. package/dist/models/JSONRPCServer.js.map +0 -1
  184. package/dist/tools/is-workflow-waiting.d.ts +0 -4
  185. package/dist/tools/is-workflow-waiting.js +0 -12
  186. package/dist/tools/is-workflow-waiting.js.map +0 -1
  187. package/dist/tools/json-codec.d.ts +0 -8
  188. package/dist/tools/json-codec.js +0 -17
  189. package/dist/tools/json-codec.js.map +0 -1
  190. package/dist/tools/json-schema-to-inquirer-question.d.ts +0 -11
  191. package/dist/tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.d.ts +0 -1
  192. package/dist/tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.js +0 -11
  193. package/dist/tools/mkdir-out-dir-project-from-ts-config-path-and-json-package-path.js.map +0 -1
  194. package/dist/tools/resolve-package-json-path.d.ts +0 -1
  195. package/dist/tools/resolve-package-json-path.js +0 -21
  196. package/dist/tools/resolve-package-json-path.js.map +0 -1
  197. package/dist/tools/resolve-tsconfig-path-from-package-json-path.d.ts +0 -1
  198. package/dist/tools/resolve-tsconfig-path-from-package-json-path.js +0 -14
  199. package/dist/tools/resolve-tsconfig-path-from-package-json-path.js.map +0 -1
  200. package/dist/tools/ts-build-watch.d.ts +0 -12
  201. package/dist/tools/ts-build-watch.js +0 -46
  202. package/dist/tools/ts-build-watch.js.map +0 -1
  203. package/dist/tools/ts-build.d.ts +0 -6
  204. package/dist/tools/ts-build.js +0 -37
  205. package/dist/tools/ts-build.js.map +0 -1
  206. package/dist/tools/up-app.d.ts +0 -2
  207. package/dist/tools/up-app.js +0 -10
  208. 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 { skillsCommand } = await import('../commands/skills/skills.js');
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(skillsCommand);
57
+ program.addCommand(AIBootstrapCommand);
58
+ program.addCommand(harnessCommand);
57
59
  await program.parseAsync(process.argv);
58
60
  }
59
61
  process.on('uncaughtException', error => {
@@ -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,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAA;IAEtE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IAC9B,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;IAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;IAEjC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAED,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"}
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,13 @@
1
+ export const AI_PROVIDERS = [
2
+ {
3
+ name: 'Cursor (.cursor)',
4
+ value: 'cursor',
5
+ dir: '.cursor',
6
+ },
7
+ {
8
+ name: 'Claude (.claude)',
9
+ value: 'claude',
10
+ dir: '.claude',
11
+ },
12
+ ];
13
+ //# sourceMappingURL=ai-providers.js.map
@@ -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,6 @@
1
+ import fs from 'node:fs/promises';
2
+ export async function copy(source, destination) {
3
+ await fs.rm(destination, { recursive: true, force: true });
4
+ await fs.cp(source, destination, { recursive: true });
5
+ }
6
+ //# sourceMappingURL=copy.js.map
@@ -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,8 @@
1
+ import fs from 'node:fs/promises';
2
+ export async function isDirectory(targetPath) {
3
+ return await fs
4
+ .stat(targetPath)
5
+ .then(stat => stat.isDirectory())
6
+ .catch(() => false);
7
+ }
8
+ //# sourceMappingURL=is-directory.js.map
@@ -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,8 @@
1
+ import fs from 'node:fs/promises';
2
+ export async function pathExists(targetPath) {
3
+ return await fs
4
+ .access(targetPath, fs.constants.F_OK)
5
+ .then(() => true)
6
+ .catch(() => false);
7
+ }
8
+ //# sourceMappingURL=path-exists.js.map
@@ -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,6 @@
1
+ import fs from 'node:fs/promises';
2
+ export async function copy(source, destination) {
3
+ await fs.rm(destination, { recursive: true, force: true });
4
+ await fs.cp(source, destination, { recursive: true });
5
+ }
6
+ //# sourceMappingURL=copy.js.map
@@ -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"}