@launch77/cli 1.2.0 → 1.4.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 (215) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/cli.js +8 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/infrastructure/git.d.ts +37 -0
  5. package/dist/infrastructure/git.d.ts.map +1 -0
  6. package/dist/infrastructure/git.js +82 -0
  7. package/dist/infrastructure/git.js.map +1 -0
  8. package/dist/infrastructure/github.d.ts +43 -0
  9. package/dist/infrastructure/github.d.ts.map +1 -0
  10. package/dist/infrastructure/github.js +89 -0
  11. package/dist/infrastructure/github.js.map +1 -0
  12. package/dist/infrastructure/template-generator.d.ts +1 -1
  13. package/dist/infrastructure/template-generator.d.ts.map +1 -1
  14. package/dist/infrastructure/template.d.ts +5 -0
  15. package/dist/infrastructure/template.d.ts.map +1 -1
  16. package/dist/infrastructure/template.js +11 -0
  17. package/dist/infrastructure/template.js.map +1 -1
  18. package/dist/modules/app/commands/create-app.js +1 -1
  19. package/dist/modules/app/commands/create-app.js.map +1 -1
  20. package/dist/modules/app/commands/delete-app.js +1 -1
  21. package/dist/modules/app/commands/delete-app.js.map +1 -1
  22. package/dist/modules/app/services/app-svc.d.ts +1 -1
  23. package/dist/modules/app/services/app-svc.d.ts.map +1 -1
  24. package/dist/modules/app/services/manifest-svc.d.ts +1 -1
  25. package/dist/modules/app/services/manifest-svc.d.ts.map +1 -1
  26. package/dist/modules/catalog/config/catalog-config.test.js +1 -1
  27. package/dist/modules/catalog/config/catalog-config.test.js.map +1 -1
  28. package/dist/modules/catalog/schemas/catalog-ui-components.schema.json +2 -18
  29. package/dist/modules/git/commands/git-connect.d.ts +3 -0
  30. package/dist/modules/git/commands/git-connect.d.ts.map +1 -0
  31. package/dist/modules/git/commands/git-connect.js +156 -0
  32. package/dist/modules/git/commands/git-connect.js.map +1 -0
  33. package/dist/modules/git/errors/git-errors.d.ts +21 -0
  34. package/dist/modules/git/errors/git-errors.d.ts.map +1 -0
  35. package/dist/modules/git/errors/git-errors.js +41 -0
  36. package/dist/modules/git/errors/git-errors.js.map +1 -0
  37. package/dist/modules/git/index.d.ts +5 -0
  38. package/dist/modules/git/index.d.ts.map +1 -0
  39. package/dist/modules/git/index.js +8 -0
  40. package/dist/modules/git/index.js.map +1 -0
  41. package/dist/modules/git/services/git-service.d.ts +24 -0
  42. package/dist/modules/git/services/git-service.d.ts.map +1 -0
  43. package/dist/modules/git/services/git-service.js +56 -0
  44. package/dist/modules/git/services/git-service.js.map +1 -0
  45. package/dist/modules/git/services/github-service.d.ts +27 -0
  46. package/dist/modules/git/services/github-service.d.ts.map +1 -0
  47. package/dist/modules/git/services/github-service.js +45 -0
  48. package/dist/modules/git/services/github-service.js.map +1 -0
  49. package/dist/modules/plugin/commands/plugin-create.d.ts +3 -0
  50. package/dist/modules/plugin/commands/plugin-create.d.ts.map +1 -0
  51. package/dist/modules/plugin/commands/plugin-create.js +59 -0
  52. package/dist/modules/plugin/commands/plugin-create.js.map +1 -0
  53. package/dist/modules/plugin/commands/plugin-install.d.ts.map +1 -1
  54. package/dist/modules/plugin/commands/plugin-install.js +9 -24
  55. package/dist/modules/plugin/commands/plugin-install.js.map +1 -1
  56. package/dist/modules/plugin/errors/plugin-errors.d.ts +24 -1
  57. package/dist/modules/plugin/errors/plugin-errors.d.ts.map +1 -1
  58. package/dist/modules/plugin/errors/plugin-errors.js +79 -6
  59. package/dist/modules/plugin/errors/plugin-errors.js.map +1 -1
  60. package/dist/modules/plugin/index.d.ts +4 -2
  61. package/dist/modules/plugin/index.d.ts.map +1 -1
  62. package/dist/modules/plugin/index.js +4 -2
  63. package/dist/modules/plugin/index.js.map +1 -1
  64. package/dist/modules/plugin/lib/plugin-registry.d.ts +6 -12
  65. package/dist/modules/plugin/lib/plugin-registry.d.ts.map +1 -1
  66. package/dist/modules/plugin/lib/plugin-registry.js +13 -30
  67. package/dist/modules/plugin/lib/plugin-registry.js.map +1 -1
  68. package/dist/modules/plugin/lib/plugin-resolver.d.ts +76 -0
  69. package/dist/modules/plugin/lib/plugin-resolver.d.ts.map +1 -0
  70. package/dist/modules/plugin/lib/plugin-resolver.js +128 -0
  71. package/dist/modules/plugin/lib/plugin-resolver.js.map +1 -0
  72. package/dist/modules/plugin/lib/plugin-resolver.test.d.ts +2 -0
  73. package/dist/modules/plugin/lib/plugin-resolver.test.d.ts.map +1 -0
  74. package/dist/modules/plugin/lib/plugin-resolver.test.js +175 -0
  75. package/dist/modules/plugin/lib/plugin-resolver.test.js.map +1 -0
  76. package/dist/modules/plugin/services/plugin-create-service.d.ts +16 -0
  77. package/dist/modules/plugin/services/plugin-create-service.d.ts.map +1 -0
  78. package/dist/modules/plugin/services/plugin-create-service.js +47 -0
  79. package/dist/modules/plugin/services/plugin-create-service.js.map +1 -0
  80. package/dist/modules/plugin/services/plugin-svc.d.ts +8 -3
  81. package/dist/modules/plugin/services/plugin-svc.d.ts.map +1 -1
  82. package/dist/modules/plugin/services/plugin-svc.js +96 -15
  83. package/dist/modules/plugin/services/plugin-svc.js.map +1 -1
  84. package/dist/modules/release/commands/release-init.d.ts +3 -0
  85. package/dist/modules/release/commands/release-init.d.ts.map +1 -0
  86. package/dist/modules/release/commands/release-init.js +92 -0
  87. package/dist/modules/release/commands/release-init.js.map +1 -0
  88. package/dist/modules/release/errors/release-errors.d.ts +7 -0
  89. package/dist/modules/release/errors/release-errors.d.ts.map +1 -0
  90. package/dist/modules/release/errors/release-errors.js +13 -0
  91. package/dist/modules/release/errors/release-errors.js.map +1 -0
  92. package/dist/modules/release/index.d.ts +4 -0
  93. package/dist/modules/release/index.d.ts.map +1 -0
  94. package/dist/modules/release/index.js +7 -0
  95. package/dist/modules/release/index.js.map +1 -0
  96. package/dist/modules/release/services/release-service.d.ts +34 -0
  97. package/dist/modules/release/services/release-service.d.ts.map +1 -0
  98. package/dist/modules/release/services/release-service.js +154 -0
  99. package/dist/modules/release/services/release-service.js.map +1 -0
  100. package/dist/modules/workspace/commands/init-workspace.d.ts.map +1 -1
  101. package/dist/modules/workspace/commands/init-workspace.js +4 -5
  102. package/dist/modules/workspace/commands/init-workspace.js.map +1 -1
  103. package/dist/modules/workspace/services/workspace-service.d.ts +2 -1
  104. package/dist/modules/workspace/services/workspace-service.d.ts.map +1 -1
  105. package/dist/modules/workspace/services/workspace-service.js +27 -1
  106. package/dist/modules/workspace/services/workspace-service.js.map +1 -1
  107. package/dist/templates/plugin/README.md.hbs +39 -0
  108. package/dist/{plugins/theme/package.json → templates/plugin/package.json.hbs} +5 -3
  109. package/dist/templates/plugin/plugin.json.hbs +7 -0
  110. package/dist/templates/plugin/src/generator.ts.hbs +64 -0
  111. package/dist/templates/plugin/templates/src/.gitkeep +0 -0
  112. package/dist/templates/plugin/tsconfig.json +10 -0
  113. package/dist/{plugins/theme → templates/plugin}/tsup.config.ts +0 -1
  114. package/dist/templates/workspace/.github/workflows/ci.yml +102 -0
  115. package/dist/templates/workspace/package.json +16 -1
  116. package/dist/templates/workspace/turbo.json +5 -0
  117. package/dist/utils/launch77-context.d.ts +1 -1
  118. package/dist/utils/launch77-context.d.ts.map +1 -1
  119. package/dist/utils/launch77-context.js +25 -2
  120. package/dist/utils/launch77-context.js.map +1 -1
  121. package/dist/utils/launch77-validation.d.ts +1 -1
  122. package/dist/utils/launch77-validation.d.ts.map +1 -1
  123. package/dist/utils/string.d.ts +13 -0
  124. package/dist/utils/string.d.ts.map +1 -0
  125. package/dist/utils/string.js +18 -0
  126. package/dist/utils/string.js.map +1 -0
  127. package/package.json +7 -10
  128. package/src/cli.ts +10 -1
  129. package/src/infrastructure/git.ts +86 -0
  130. package/src/infrastructure/github.ts +111 -0
  131. package/src/infrastructure/template-generator.ts +1 -1
  132. package/src/infrastructure/template.ts +14 -0
  133. package/src/modules/app/commands/create-app.ts +1 -1
  134. package/src/modules/app/commands/delete-app.ts +1 -1
  135. package/src/modules/app/services/app-svc.ts +1 -1
  136. package/src/modules/app/services/manifest-svc.ts +1 -1
  137. package/src/modules/catalog/config/catalog-config.test.ts +1 -1
  138. package/src/modules/git/commands/git-connect.ts +183 -0
  139. package/src/modules/git/errors/git-errors.ts +44 -0
  140. package/src/modules/git/index.ts +9 -0
  141. package/src/modules/git/services/git-service.ts +63 -0
  142. package/src/modules/git/services/github-service.ts +52 -0
  143. package/src/modules/plugin/commands/plugin-create.ts +68 -0
  144. package/src/modules/plugin/commands/plugin-install.ts +9 -26
  145. package/src/modules/plugin/errors/plugin-errors.ts +87 -6
  146. package/src/modules/plugin/index.ts +4 -2
  147. package/src/modules/plugin/lib/plugin-registry.ts +14 -37
  148. package/src/modules/plugin/lib/plugin-resolver.test.ts +215 -0
  149. package/src/modules/plugin/lib/plugin-resolver.ts +160 -0
  150. package/src/modules/plugin/services/plugin-create-service.ts +69 -0
  151. package/src/modules/plugin/services/plugin-svc.ts +108 -15
  152. package/src/modules/release/commands/release-init.ts +102 -0
  153. package/src/modules/release/errors/release-errors.ts +13 -0
  154. package/src/modules/release/index.ts +8 -0
  155. package/src/modules/release/services/release-service.ts +170 -0
  156. package/src/modules/workspace/commands/init-workspace.ts +4 -6
  157. package/src/modules/workspace/services/workspace-service.ts +30 -1
  158. package/src/utils/launch77-context.ts +29 -3
  159. package/src/utils/launch77-validation.ts +1 -1
  160. package/src/utils/string.ts +17 -0
  161. package/templates/plugin/README.md.hbs +39 -0
  162. package/templates/plugin/package.json.hbs +34 -0
  163. package/templates/plugin/plugin.json.hbs +7 -0
  164. package/templates/plugin/src/generator.ts.hbs +64 -0
  165. package/templates/plugin/templates/src/.gitkeep +0 -0
  166. package/templates/plugin/tsconfig.json +10 -0
  167. package/templates/plugin/tsup.config.ts +9 -0
  168. package/templates/workspace/.github/workflows/ci.yml +102 -0
  169. package/templates/workspace/package.json +5 -0
  170. package/templates/workspace/turbo.json +5 -0
  171. package/tests/integration/cli.test.ts +25 -0
  172. package/tests/integration/setup.ts +20 -0
  173. package/vitest.config.ts +9 -0
  174. package/vitest.integration.config.ts +9 -0
  175. package/dist/app-templates/webapp/.env.ci +0 -6
  176. package/dist/app-templates/webapp/.env.example +0 -9
  177. package/dist/app-templates/webapp/.eslintrc.json +0 -6
  178. package/dist/app-templates/webapp/README.md.hbs +0 -80
  179. package/dist/app-templates/webapp/app/about/page.tsx.hbs +0 -41
  180. package/dist/app-templates/webapp/app/dashboard/page.tsx.hbs +0 -51
  181. package/dist/app-templates/webapp/app/globals.css +0 -31
  182. package/dist/app-templates/webapp/app/layout.tsx.hbs +0 -26
  183. package/dist/app-templates/webapp/app/page.tsx.hbs +0 -30
  184. package/dist/app-templates/webapp/next.config.js +0 -99
  185. package/dist/app-templates/webapp/package.json.hbs +0 -30
  186. package/dist/app-templates/webapp/postcss.config.js +0 -6
  187. package/dist/app-templates/webapp/tailwind.config.ts +0 -24
  188. package/dist/app-templates/webapp/tsconfig.json +0 -29
  189. package/dist/app-templates/webapp/vercel.json.hbs +0 -7
  190. package/dist/modules/catalog/schemas/schemas/catalog-ui-components.schema.json +0 -145
  191. package/dist/plugins/theme/plugin.json +0 -9
  192. package/dist/plugins/theme/src/generator.ts +0 -92
  193. package/dist/plugins/theme/src/utils/config-modifier.ts +0 -142
  194. package/dist/plugins/theme/src/utils/css-modifier.ts +0 -89
  195. package/dist/plugins/theme/templates/app/theme-test/page.tsx +0 -156
  196. package/dist/plugins/theme/templates/src/modules/theme/README.md +0 -209
  197. package/dist/plugins/theme/templates/src/modules/theme/config/brand.css +0 -23
  198. package/dist/plugins/theme/tsconfig.json +0 -14
  199. package/dist/templates/templates/startup/apps/.gitkeep +0 -8
  200. package/dist/templates/templates/workspace/.launch77/workspace.json +0 -3
  201. package/dist/templates/templates/workspace/README.md +0 -62
  202. package/dist/templates/templates/workspace/app-templates/.gitkeep +0 -1
  203. package/dist/templates/templates/workspace/apps/.gitkeep +0 -1
  204. package/dist/templates/templates/workspace/libraries/.gitkeep +0 -1
  205. package/dist/templates/templates/workspace/package.json +0 -31
  206. package/dist/templates/templates/workspace/plugins/.gitkeep +0 -1
  207. package/dist/templates/templates/workspace/tsconfig.json +0 -22
  208. package/dist/templates/templates/workspace/turbo.json +0 -25
  209. package/launch77-cli-1.2.0.tgz +0 -0
  210. package/src/modules/plugin/lib/launch77-workspace.code-workspace +0 -14
  211. /package/dist/templates/{templates/workspace → workspace}/.eslintignore +0 -0
  212. /package/dist/templates/{templates/workspace → workspace}/.eslintrc.js +0 -0
  213. /package/dist/templates/{templates/workspace → workspace}/.husky/pre-push +0 -0
  214. /package/dist/templates/{templates/workspace → workspace}/.lintstagedrc.json +0 -0
  215. /package/dist/templates/{templates/workspace → workspace}/.prettierrc +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-resolver.test.js","sourceRoot":"","sources":["../../../../src/modules/plugin/lib/plugin-resolver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Launch77Context } from '@launch77/plugin-runtime';
2
+ export interface CreatePluginRequest {
3
+ pluginName: string;
4
+ description?: string;
5
+ }
6
+ export interface CreatePluginResult {
7
+ pluginName: string;
8
+ pluginPath: string;
9
+ }
10
+ export declare class PluginCreateService {
11
+ /**
12
+ * Create a new plugin from template
13
+ */
14
+ createPlugin(request: CreatePluginRequest, context: Launch77Context): Promise<CreatePluginResult>;
15
+ }
16
+ //# sourceMappingURL=plugin-create-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-create-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-create-service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,mBAAmB;IAC9B;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA4CxG"}
@@ -0,0 +1,47 @@
1
+ import * as path from 'path';
2
+ import fs from 'fs-extra';
3
+ import { validatePluginName } from '@launch77/plugin-runtime';
4
+ import { processTemplate, getPluginTemplatePath } from '../../../infrastructure/template.js';
5
+ import { toPascalCase } from '../../../utils/string.js';
6
+ export class PluginCreateService {
7
+ /**
8
+ * Create a new plugin from template
9
+ */
10
+ async createPlugin(request, context) {
11
+ const { pluginName, description } = request;
12
+ // 1. Validate plugin name
13
+ const nameValidation = validatePluginName(pluginName);
14
+ if (!nameValidation.isValid) {
15
+ throw new Error(nameValidation.error || 'Invalid plugin name');
16
+ }
17
+ // 2. Validate workspace context
18
+ if (!context.isValid) {
19
+ throw new Error('Must be run from within a Launch77 workspace');
20
+ }
21
+ // 3. Determine plugin path
22
+ const pluginPath = path.join(context.workspaceRoot, 'plugins', pluginName);
23
+ // 4. Check if plugin already exists
24
+ if (await fs.pathExists(pluginPath)) {
25
+ throw new Error(`Plugin '${pluginName}' already exists at ${pluginPath}`);
26
+ }
27
+ // 5. Get plugin template path
28
+ const templatePath = getPluginTemplatePath('plugin');
29
+ // 6. Check if template exists
30
+ if (!(await fs.pathExists(templatePath))) {
31
+ throw new Error(`Plugin template not found at ${templatePath}`);
32
+ }
33
+ // 7. Process template with context
34
+ await processTemplate(templatePath, pluginPath, {
35
+ appName: pluginName, // Required by TemplateContext but not used for plugin templates
36
+ pluginName,
37
+ pluginNamePascal: toPascalCase(pluginName),
38
+ workspaceName: context.workspaceName,
39
+ description: description || `Launch77 plugin for ${pluginName}`,
40
+ });
41
+ return {
42
+ pluginName,
43
+ pluginPath,
44
+ };
45
+ }
46
+ }
47
+ //# sourceMappingURL=plugin-create-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-create-service.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-create-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAcvD,MAAM,OAAO,mBAAmB;IAC9B;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAA4B,EAAE,OAAwB;QACvE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;QAE3C,0BAA0B;QAC1B,MAAM,cAAc,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;QACrD,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,IAAI,qBAAqB,CAAC,CAAA;QAChE,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACjE,CAAC;QAED,2BAA2B;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QAE1E,oCAAoC;QACpC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,uBAAuB,UAAU,EAAE,CAAC,CAAA;QAC3E,CAAC;QAED,8BAA8B;QAC9B,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAEpD,8BAA8B;QAC9B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAA;QACjE,CAAC;QAED,mCAAmC;QACnC,MAAM,eAAe,CAAC,YAAY,EAAE,UAAU,EAAE;YAC9C,OAAO,EAAE,UAAU,EAAE,gEAAgE;YACrF,UAAU;YACV,gBAAgB,EAAE,YAAY,CAAC,UAAU,CAAC;YAC1C,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,WAAW,EAAE,WAAW,IAAI,uBAAuB,UAAU,EAAE;SAChE,CAAC,CAAA;QAEF,OAAO;YACL,UAAU;YACV,UAAU;SACX,CAAA;IACH,CAAC;CACF"}
@@ -1,10 +1,15 @@
1
- import type { Launch77Context } from '../../../utils/launch77-context.js';
1
+ import type { Launch77Context } from '@launch77/plugin-runtime';
2
2
  import type { InstallPluginRequest, InstallPluginResult } from '../types/plugin-types.js';
3
3
  export declare class PluginService {
4
4
  /**
5
- * Install a plugin to the current app
5
+ * Install a plugin to the current package
6
6
  */
7
- installPlugin(request: InstallPluginRequest, context: Launch77Context): Promise<InstallPluginResult>;
7
+ installPlugin(request: InstallPluginRequest, context: Launch77Context, logger?: (message: string) => void): Promise<InstallPluginResult>;
8
+ /**
9
+ * Download and install an npm plugin package
10
+ */
11
+ private downloadNpmPlugin;
12
+ private getPackagePath;
8
13
  private runGenerator;
9
14
  }
10
15
  //# sourceMappingURL=plugin-svc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEzF,qBAAa,aAAa;IACxB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;YA0B5F,YAAY;CAY3B"}
1
+ {"version":3,"file":"plugin-svc.d.ts","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,0BAA0B,CAAA;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAoBzF,qBAAa,aAAa;IACxB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA8D3J;;OAEG;YACW,iBAAiB;IAkB/B,OAAO,CAAC,cAAc;YAgBR,YAAY;CAY3B"}
@@ -1,26 +1,73 @@
1
1
  import * as path from 'path';
2
+ import chalk from 'chalk';
2
3
  import { execa } from 'execa';
3
- import { PluginInstallationError, PluginNotFoundError, InvalidPluginContextError, createInvalidContextError } from '../errors/plugin-errors.js';
4
- import { pluginExists, getPluginPath } from '../lib/plugin-registry.js';
4
+ import { readPluginMetadata } from '@launch77/plugin-runtime';
5
+ import { PluginInstallationError, InvalidPluginContextError, createInvalidContextError, MissingPluginTargetsError, createInvalidTargetError, NpmInstallationError, PluginResolutionError } from '../errors/plugin-errors.js';
6
+ import { validatePluginInput, resolvePluginLocation } from '../lib/plugin-resolver.js';
7
+ /**
8
+ * Map location type to target string
9
+ */
10
+ function locationTypeToTarget(locationType) {
11
+ switch (locationType) {
12
+ case 'workspace-app':
13
+ return 'app';
14
+ case 'workspace-library':
15
+ return 'library';
16
+ case 'workspace-plugin':
17
+ return 'plugin';
18
+ case 'workspace-app-template':
19
+ return 'app-template';
20
+ default:
21
+ return null;
22
+ }
23
+ }
5
24
  export class PluginService {
6
25
  /**
7
- * Install a plugin to the current app
26
+ * Install a plugin to the current package
8
27
  */
9
- async installPlugin(request, context) {
28
+ async installPlugin(request, context, logger = console.log) {
10
29
  const { pluginName } = request;
11
- // Validate context - must be in app directory
12
- if (context.locationType !== 'workspace-app')
30
+ // Must be in a package directory (app, library, plugin, or app-template)
31
+ const currentTarget = locationTypeToTarget(context.locationType);
32
+ if (!currentTarget)
13
33
  throw createInvalidContextError(context.locationType);
14
34
  if (!context.appName)
15
- throw new InvalidPluginContextError('Could not determine app name. This is a bug. Please report it.');
16
- // Get app directory path
17
- const appPath = path.join(context.appsDir, context.appName);
18
- // Check if plugin exists
19
- if (!(await pluginExists(pluginName)))
20
- throw new PluginNotFoundError(pluginName);
21
- const pluginPath = getPluginPath(pluginName);
22
- // Run generator
23
- await this.runGenerator(pluginPath, appPath, context);
35
+ throw new InvalidPluginContextError('Could not determine package name. This is a bug. Please report it.');
36
+ // Step 1: Validate plugin input
37
+ logger(chalk.blue(`\nšŸ” Resolving plugin "${pluginName}"...`));
38
+ logger(` ā”œā”€ Validating plugin name...`);
39
+ const validation = validatePluginInput(pluginName);
40
+ if (!validation.isValid) {
41
+ throw new PluginResolutionError(pluginName, validation.error || 'Invalid plugin name');
42
+ }
43
+ logger(` │ └─ ${chalk.green('āœ“')} Valid plugin name`);
44
+ // Step 2: Resolve plugin location
45
+ logger(` ā”œā”€ Checking local workspace: ${chalk.dim(`plugins/${pluginName}`)}`);
46
+ const resolution = await resolvePluginLocation(pluginName, context.workspaceRoot);
47
+ let pluginPath;
48
+ if (resolution.source === 'local') {
49
+ logger(` │ └─ ${chalk.green('āœ“')} Found local plugin`);
50
+ pluginPath = resolution.localPath;
51
+ }
52
+ else {
53
+ logger(` │ └─ ${chalk.dim('Not found locally')}`);
54
+ logger(` ā”œā”€ Resolving to npm package: ${chalk.cyan(resolution.npmPackage)}`);
55
+ // Download npm plugin
56
+ pluginPath = await this.downloadNpmPlugin(resolution.npmPackage, context.workspaceRoot, logger);
57
+ }
58
+ logger(` └─ ${chalk.green('āœ“')} Plugin resolved\n`);
59
+ // Step 3: Read plugin metadata and validate targets
60
+ const metadata = await readPluginMetadata(pluginPath);
61
+ if (!metadata.targets || metadata.targets.length === 0) {
62
+ throw new MissingPluginTargetsError(pluginName);
63
+ }
64
+ if (!metadata.targets.includes(currentTarget)) {
65
+ throw createInvalidTargetError(pluginName, currentTarget, metadata.targets);
66
+ }
67
+ // Step 4: Get package directory path
68
+ const packagePath = this.getPackagePath(context);
69
+ // Step 5: Run generator
70
+ await this.runGenerator(pluginPath, packagePath, context);
24
71
  return {
25
72
  pluginName,
26
73
  filesInstalled: true,
@@ -28,6 +75,40 @@ export class PluginService {
28
75
  dependenciesInstalled: true,
29
76
  };
30
77
  }
78
+ /**
79
+ * Download and install an npm plugin package
80
+ */
81
+ async downloadNpmPlugin(npmPackage, workspaceRoot, logger) {
82
+ logger(` └─ Installing from npm: ${chalk.cyan(npmPackage)}...`);
83
+ try {
84
+ // Install the npm package to the workspace
85
+ await execa('npm', ['install', npmPackage, '--save-dev'], {
86
+ cwd: workspaceRoot,
87
+ stdio: 'pipe', // Capture output for clean logging
88
+ });
89
+ // Return path to installed plugin in node_modules
90
+ const pluginPath = path.join(workspaceRoot, 'node_modules', npmPackage);
91
+ return pluginPath;
92
+ }
93
+ catch (error) {
94
+ throw new NpmInstallationError(npmPackage, error instanceof Error ? error : undefined);
95
+ }
96
+ }
97
+ getPackagePath(context) {
98
+ // Determine the base directory based on location type
99
+ switch (context.locationType) {
100
+ case 'workspace-app':
101
+ return path.join(context.appsDir, context.appName);
102
+ case 'workspace-library':
103
+ return path.join(context.workspaceRoot, 'libraries', context.appName);
104
+ case 'workspace-plugin':
105
+ return path.join(context.workspaceRoot, 'plugins', context.appName);
106
+ case 'workspace-app-template':
107
+ return path.join(context.workspaceRoot, 'app-templates', context.appName);
108
+ default:
109
+ throw new InvalidPluginContextError(`Cannot install plugin from ${context.locationType}`);
110
+ }
111
+ }
31
112
  async runGenerator(pluginPath, appPath, context) {
32
113
  try {
33
114
  const generatorPath = path.join(pluginPath, 'dist/generator.js');
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-svc.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAE7B,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAC/I,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAKvE,MAAM,OAAO,aAAa;IACxB;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAA6B,EAAE,OAAwB;QACzE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;QAE9B,8CAA8C;QAC9C,IAAI,OAAO,CAAC,YAAY,KAAK,eAAe;YAAE,MAAM,yBAAyB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACnG,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,MAAM,IAAI,yBAAyB,CAAC,gEAAgE,CAAC,CAAA;QAE3H,yBAAyB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAE3D,yBAAyB;QACzB,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;YAAE,MAAM,IAAI,mBAAmB,CAAC,UAAU,CAAC,CAAA;QAEhF,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;QAE5C,gBAAgB;QAChB,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAErD,OAAO;YACL,UAAU;YACV,cAAc,EAAE,IAAI;YACpB,kBAAkB,EAAE,IAAI;YACxB,qBAAqB,EAAE,IAAI;SAC5B,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,OAAe,EAAE,OAAwB;QACtF,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAA;YAEhE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,aAAa,OAAO,EAAE,EAAE,aAAa,OAAO,CAAC,OAAO,EAAE,EAAE,mBAAmB,OAAO,CAAC,aAAa,EAAE,EAAE,gBAAgB,UAAU,EAAE,CAAC,EAAE;gBACrK,GAAG,EAAE,UAAU;gBACf,KAAK,EAAE,SAAS;aACjB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,uBAAuB,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC9J,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"plugin-svc.js","sourceRoot":"","sources":["../../../../src/modules/plugin/services/plugin-svc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function releaseInitCommand(): Command;
3
+ //# sourceMappingURL=release-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-init.d.ts","sourceRoot":"","sources":["../../../../src/modules/release/commands/release-init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,kBAAkB,IAAI,OAAO,CA4F5C"}
@@ -0,0 +1,92 @@
1
+ import chalk from 'chalk';
2
+ import { Command } from 'commander';
3
+ import ora from 'ora';
4
+ import { detectLaunch77Context } from '@launch77/plugin-runtime';
5
+ import { GitService, GitHubService, GitHubCLINotInstalledError, GitHubNotAuthenticatedError, NotInWorkspaceError, GitHubNotConnectedError } from '../../git/index.js';
6
+ import { ReleaseService } from '../services/release-service.js';
7
+ import { ChangesetNotInitializedError } from '../errors/release-errors.js';
8
+ export function releaseInitCommand() {
9
+ return new Command('release:init').description('Initialize complete release workflow setup').action(async () => {
10
+ console.log(chalk.blue('\nšŸš€ Initializing release workflow...\n'));
11
+ const cwd = process.cwd();
12
+ const gitService = new GitService();
13
+ const githubService = new GitHubService();
14
+ const releaseService = new ReleaseService(githubService);
15
+ try {
16
+ // 1. Verify we're in a workspace root
17
+ const context = await detectLaunch77Context(cwd);
18
+ if (!context.isValid || context.locationType !== 'workspace-root') {
19
+ throw new NotInWorkspaceError(cwd);
20
+ }
21
+ // 2. Verify prerequisites (GitHub CLI installed and authenticated)
22
+ const spinner = ora('Checking prerequisites...').start();
23
+ await githubService.verifyPrerequisites();
24
+ spinner.succeed('Prerequisites verified');
25
+ // 3. Ensure connected to GitHub
26
+ try {
27
+ await gitService.ensureConnectedToGitHub(context.workspaceRoot);
28
+ }
29
+ catch (error) {
30
+ if (error instanceof GitHubNotConnectedError) {
31
+ console.error(chalk.red(`\nāŒ ${error.message}\n`));
32
+ console.log(chalk.gray(` Connect to GitHub first: ${chalk.cyan('launch77 git:connect')}\n`));
33
+ process.exit(1);
34
+ }
35
+ throw error;
36
+ }
37
+ // 4. Get repository information
38
+ const repoSpinner = ora('Detecting repository...').start();
39
+ const { owner, repo } = await githubService.getCurrentRepository(context.workspaceRoot);
40
+ repoSpinner.succeed(`Repository: ${owner}/${repo}`);
41
+ // 5. Fix changeset config access setting
42
+ console.log(chalk.cyan('\nšŸ“ Configuring changesets...\n'));
43
+ try {
44
+ const changesetSpinner = ora('Checking changeset configuration...').start();
45
+ const wasChanged = await releaseService.fixChangesetAccess(context.workspaceRoot);
46
+ if (wasChanged) {
47
+ changesetSpinner.succeed('Updated .changeset/config.json access to "public"');
48
+ }
49
+ else {
50
+ changesetSpinner.succeed('Changeset already configured correctly');
51
+ }
52
+ }
53
+ catch (error) {
54
+ if (error instanceof ChangesetNotInitializedError) {
55
+ console.error(chalk.red(`\nāŒ ${error.message}\n`));
56
+ console.log(chalk.gray(' Changesets should be initialized during workspace creation.'));
57
+ console.log(chalk.gray(` Run manually: ${chalk.cyan('npx changeset init')}\n`));
58
+ process.exit(1);
59
+ }
60
+ throw error;
61
+ }
62
+ // 6. Setup RELEASE_TOKEN
63
+ releaseService.explainReleaseToken();
64
+ const token = await releaseService.promptForReleaseToken();
65
+ await releaseService.setupReleaseToken(owner, repo, token);
66
+ // 7. Guide npm Trusted Publishing setup
67
+ releaseService.explainNpmTrustedPublishing();
68
+ // 8. Show success summary
69
+ releaseService.showSuccessSummary();
70
+ }
71
+ catch (error) {
72
+ if (error instanceof GitHubCLINotInstalledError) {
73
+ console.error(chalk.red(`\nāŒ ${error.message}\n`));
74
+ console.log(chalk.gray(` Install with: ${chalk.cyan('brew install gh')}\n`));
75
+ console.log(chalk.gray(` Or visit: ${chalk.cyan('https://cli.github.com/')}\n`));
76
+ process.exit(1);
77
+ }
78
+ if (error instanceof GitHubNotAuthenticatedError) {
79
+ console.error(chalk.red(`\nāŒ ${error.message}\n`));
80
+ console.log(chalk.gray(` Authenticate with: ${chalk.cyan('gh auth login')}\n`));
81
+ process.exit(1);
82
+ }
83
+ if (error instanceof NotInWorkspaceError) {
84
+ console.error(chalk.red(`\nāŒ ${error.message}\n`));
85
+ console.log(chalk.gray(` This command must be run from a Launch77 workspace root directory\n`));
86
+ process.exit(1);
87
+ }
88
+ throw error;
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=release-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-init.js","sourceRoot":"","sources":["../../../../src/modules/release/commands/release-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class InvalidReleaseTokenError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class ChangesetNotInitializedError extends Error {
5
+ constructor();
6
+ }
7
+ //# sourceMappingURL=release-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-errors.d.ts","sourceRoot":"","sources":["../../../../src/modules/release/errors/release-errors.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,4BAA6B,SAAQ,KAAK;;CAKtD"}
@@ -0,0 +1,13 @@
1
+ export class InvalidReleaseTokenError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'InvalidReleaseTokenError';
5
+ }
6
+ }
7
+ export class ChangesetNotInitializedError extends Error {
8
+ constructor() {
9
+ super('Changesets are not initialized in this workspace');
10
+ this.name = 'ChangesetNotInitializedError';
11
+ }
12
+ }
13
+ //# sourceMappingURL=release-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-errors.js","sourceRoot":"","sources":["../../../../src/modules/release/errors/release-errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD;QACE,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACzD,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAC5C,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { ReleaseService } from './services/release-service.js';
2
+ export { InvalidReleaseTokenError, ChangesetNotInitializedError } from './errors/release-errors.js';
3
+ export { releaseInitCommand } from './commands/release-init.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/release/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAG9D,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AAGnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,7 @@
1
+ // Services
2
+ export { ReleaseService } from './services/release-service.js';
3
+ // Errors
4
+ export { InvalidReleaseTokenError, ChangesetNotInitializedError } from './errors/release-errors.js';
5
+ // Commands
6
+ export { releaseInitCommand } from './commands/release-init.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/release/index.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,SAAS;AACT,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;AAEnG,WAAW;AACX,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { GitHubService } from '../../git/index.js';
2
+ export declare class ReleaseService {
3
+ private githubService;
4
+ constructor(githubService?: GitHubService);
5
+ /**
6
+ * Validate GitHub Personal Access Token format
7
+ */
8
+ validateReleaseToken(token: string): void;
9
+ /**
10
+ * Explain what RELEASE_TOKEN is and why it's needed
11
+ */
12
+ explainReleaseToken(): void;
13
+ /**
14
+ * Prompt user for RELEASE_TOKEN
15
+ */
16
+ promptForReleaseToken(): Promise<string>;
17
+ /**
18
+ * Setup RELEASE_TOKEN secret in GitHub repository
19
+ */
20
+ setupReleaseToken(owner: string, repo: string, token: string): Promise<void>;
21
+ /**
22
+ * Fix changeset config to set access to "public"
23
+ */
24
+ fixChangesetAccess(workspaceRoot: string): Promise<boolean>;
25
+ /**
26
+ * Explain npm Trusted Publishing (OIDC)
27
+ */
28
+ explainNpmTrustedPublishing(): void;
29
+ /**
30
+ * Show success summary for release setup
31
+ */
32
+ showSuccessSummary(): void;
33
+ }
34
+ //# sourceMappingURL=release-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-service.d.ts","sourceRoot":"","sources":["../../../../src/modules/release/services/release-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,qBAAa,cAAc;IACb,OAAO,CAAC,aAAa;gBAAb,aAAa,GAAE,aAAmC;IAEtE;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAWzC;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAoB3B;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkB9C;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlF;;OAEG;IACG,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BjE;;OAEG;IACH,2BAA2B,IAAI,IAAI;IAsBnC;;OAEG;IACH,kBAAkB,IAAI,IAAI;CAW3B"}
@@ -0,0 +1,154 @@
1
+ import chalk from 'chalk';
2
+ import { password, confirm } from '@inquirer/prompts';
3
+ import ora from 'ora';
4
+ import fs from 'fs/promises';
5
+ import path from 'path';
6
+ import { GitHubService } from '../../git/index.js';
7
+ import { InvalidReleaseTokenError, ChangesetNotInitializedError } from '../errors/release-errors.js';
8
+ export class ReleaseService {
9
+ githubService;
10
+ constructor(githubService = new GitHubService()) {
11
+ this.githubService = githubService;
12
+ }
13
+ /**
14
+ * Validate GitHub Personal Access Token format
15
+ */
16
+ validateReleaseToken(token) {
17
+ if (!token || token.trim().length === 0) {
18
+ throw new InvalidReleaseTokenError('Token cannot be empty');
19
+ }
20
+ // GitHub PATs start with specific prefixes
21
+ if (!token.startsWith('ghp_') && !token.startsWith('github_pat_')) {
22
+ throw new InvalidReleaseTokenError('Invalid token format. GitHub PATs should start with "ghp_" or "github_pat_"');
23
+ }
24
+ }
25
+ /**
26
+ * Explain what RELEASE_TOKEN is and why it's needed
27
+ */
28
+ explainReleaseToken() {
29
+ console.log(chalk.cyan('\nšŸ“‹ About RELEASE_TOKEN:\n'));
30
+ console.log(chalk.white('The RELEASE_TOKEN is a GitHub Personal Access Token (PAT) that allows'));
31
+ console.log(chalk.white('the Changesets action to create Pull Requests for version updates.\n'));
32
+ console.log(chalk.white('Why is this needed?'));
33
+ console.log(chalk.gray(' • The default GITHUB_TOKEN has limited permissions'));
34
+ console.log(chalk.gray(' • Creating PRs that trigger CI requires a PAT'));
35
+ console.log(chalk.gray(' • This enables automated release workflows\n'));
36
+ console.log(chalk.white('Required permissions:'));
37
+ console.log(chalk.gray(' • Contents: Read and write'));
38
+ console.log(chalk.gray(' • Pull requests: Read and write\n'));
39
+ // Provide link to create PAT
40
+ const tokenUrl = 'https://github.com/settings/personal-access-tokens/new';
41
+ console.log(chalk.cyan('šŸ”— Create your token:'));
42
+ console.log(chalk.gray(` ${chalk.cyan(tokenUrl)}`));
43
+ console.log(chalk.gray(` Name: Launch77 Release Token`));
44
+ console.log(chalk.gray(` Permissions: Contents (Read and write), Pull requests (Read and write)\n`));
45
+ }
46
+ /**
47
+ * Prompt user for RELEASE_TOKEN
48
+ */
49
+ async promptForReleaseToken() {
50
+ return password({
51
+ message: 'Paste your Personal Access Token (PAT):',
52
+ mask: '*',
53
+ validate: (value) => {
54
+ try {
55
+ this.validateReleaseToken(value);
56
+ return true;
57
+ }
58
+ catch (error) {
59
+ if (error instanceof InvalidReleaseTokenError) {
60
+ return error.message;
61
+ }
62
+ return 'Invalid token';
63
+ }
64
+ },
65
+ });
66
+ }
67
+ /**
68
+ * Setup RELEASE_TOKEN secret in GitHub repository
69
+ */
70
+ async setupReleaseToken(owner, repo, token) {
71
+ this.validateReleaseToken(token);
72
+ // Confirm before setting
73
+ console.log(chalk.yellow('\n⚠ Note: This will overwrite any existing RELEASE_TOKEN secret\n'));
74
+ const shouldContinue = await confirm({
75
+ message: 'Continue and set RELEASE_TOKEN?',
76
+ default: true,
77
+ });
78
+ if (!shouldContinue) {
79
+ console.log(chalk.green('\nāœ… No changes made.\n'));
80
+ process.exit(0);
81
+ }
82
+ // Set the secret
83
+ const setSpinner = ora('Setting RELEASE_TOKEN secret...').start();
84
+ try {
85
+ await this.githubService.setRepositorySecret(owner, repo, 'RELEASE_TOKEN', token);
86
+ setSpinner.succeed('RELEASE_TOKEN configured successfully!');
87
+ }
88
+ catch (error) {
89
+ setSpinner.fail('Failed to set RELEASE_TOKEN');
90
+ throw error;
91
+ }
92
+ }
93
+ /**
94
+ * Fix changeset config to set access to "public"
95
+ */
96
+ async fixChangesetAccess(workspaceRoot) {
97
+ const configPath = path.join(workspaceRoot, '.changeset', 'config.json');
98
+ try {
99
+ // Check if config exists
100
+ const configContent = await fs.readFile(configPath, 'utf-8');
101
+ const config = JSON.parse(configContent);
102
+ // Check if already public
103
+ if (config.access === 'public') {
104
+ return false; // No change needed
105
+ }
106
+ // Update to public
107
+ config.access = 'public';
108
+ // Write back
109
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
110
+ return true; // Changed
111
+ }
112
+ catch (error) {
113
+ if (error.code === 'ENOENT') {
114
+ throw new ChangesetNotInitializedError();
115
+ }
116
+ throw error;
117
+ }
118
+ }
119
+ /**
120
+ * Explain npm Trusted Publishing (OIDC)
121
+ */
122
+ explainNpmTrustedPublishing() {
123
+ console.log(chalk.cyan('\nšŸ“¦ Setting up npm publishing with Trusted Publishers (OIDC):\n'));
124
+ console.log(chalk.white('Trusted Publishing uses OpenID Connect (OIDC) for secure, token-free publishing.'));
125
+ console.log(chalk.white('This is the recommended approach (no tokens to manage or expire).\n'));
126
+ console.log(chalk.white('Steps to configure:'));
127
+ console.log(chalk.gray(' 1. Visit: https://www.npmjs.com/settings/~/publishers'));
128
+ console.log(chalk.gray(' 2. Click "Add a trusted publisher"'));
129
+ console.log(chalk.gray(' 3. Select "GitHub Actions"'));
130
+ console.log(chalk.gray(' 4. Enter your repository information:'));
131
+ console.log(chalk.gray(' - Repository owner (your GitHub username or org)'));
132
+ console.log(chalk.gray(' - Repository name'));
133
+ console.log(chalk.gray(' - Workflow file: .github/workflows/ci.yml'));
134
+ console.log(chalk.gray(' 5. Save the configuration\n'));
135
+ console.log(chalk.white('Your GitHub workflow already has the required permission:'));
136
+ console.log(chalk.gray(' āœ“ id-token: write\n'));
137
+ console.log(chalk.cyan('šŸ“š Learn more:'));
138
+ console.log(chalk.gray(' https://docs.npmjs.com/trusted-publishers/\n'));
139
+ }
140
+ /**
141
+ * Show success summary for release setup
142
+ */
143
+ showSuccessSummary() {
144
+ console.log(chalk.green('\nāœ… Release automation is ready!\n'));
145
+ console.log(chalk.white('What happens now:'));
146
+ console.log(chalk.gray(' • When you push to main, CI runs as usual'));
147
+ console.log(chalk.gray(' • Changesets detects version changes'));
148
+ console.log(chalk.gray(' • A "Version Packages" PR is created automatically'));
149
+ console.log(chalk.gray(' • Merge the PR to publish your packages\n'));
150
+ console.log(chalk.cyan('šŸ“š Learn more:'));
151
+ console.log(chalk.gray(` ${chalk.cyan('https://github.com/changesets/changesets')}\n`));
152
+ }
153
+ }
154
+ //# sourceMappingURL=release-service.js.map