minutework 0.1.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 (203) hide show
  1. package/EXTERNAL_ALPHA.md +74 -0
  2. package/README.md +57 -0
  3. package/assets/claude-local/CLAUDE.md.template +45 -0
  4. package/assets/claude-local/bundle.json +22 -0
  5. package/assets/claude-local/skills/README.md +6 -0
  6. package/assets/claude-local/skills/app-pack-authoring.md +8 -0
  7. package/assets/claude-local/skills/event-bus.md +8 -0
  8. package/assets/claude-local/skills/ontology-mapping.md +8 -0
  9. package/assets/claude-local/skills/openclaw-skill-importer.md +7 -0
  10. package/assets/claude-local/skills/schema-engine.md +8 -0
  11. package/assets/claude-local/skills/secrets-runtime-bridge.md +9 -0
  12. package/assets/claude-local/skills/sidecar-generation.md +9 -0
  13. package/assets/templates/fastapi-sidecar/.env.example +8 -0
  14. package/assets/templates/fastapi-sidecar/README.md +77 -0
  15. package/assets/templates/fastapi-sidecar/poetry.lock +757 -0
  16. package/assets/templates/fastapi-sidecar/pyproject.toml +42 -0
  17. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/__init__.py +3 -0
  18. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/auth.py +70 -0
  19. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/bridge/__init__.py +3 -0
  20. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/bridge/client.py +71 -0
  21. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/logging_utils.py +25 -0
  22. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/main.py +85 -0
  23. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/receipts.py +24 -0
  24. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/settings.py +41 -0
  25. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/template_validation.py +26 -0
  26. package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/worker.py +33 -0
  27. package/assets/templates/fastapi-sidecar/template.json +43 -0
  28. package/assets/templates/fastapi-sidecar/template.schema.json +160 -0
  29. package/assets/templates/fastapi-sidecar/tests/conftest.py +36 -0
  30. package/assets/templates/fastapi-sidecar/tests/test_app.py +39 -0
  31. package/assets/templates/fastapi-sidecar/tests/test_auth.py +32 -0
  32. package/assets/templates/fastapi-sidecar/tests/test_bridge_client.py +31 -0
  33. package/assets/templates/fastapi-sidecar/tests/test_materialization.py +55 -0
  34. package/assets/templates/fastapi-sidecar/tests/test_template_contract.py +49 -0
  35. package/assets/templates/fastapi-sidecar/tests/test_worker.py +7 -0
  36. package/assets/templates/fastapi-sidecar/tools/template/validate_template.py +20 -0
  37. package/assets/templates/next-tenant-app/.env.example +8 -0
  38. package/assets/templates/next-tenant-app/.storybook/main.ts +19 -0
  39. package/assets/templates/next-tenant-app/.storybook/preview.tsx +38 -0
  40. package/assets/templates/next-tenant-app/README.md +115 -0
  41. package/assets/templates/next-tenant-app/components.json +21 -0
  42. package/assets/templates/next-tenant-app/eslint.config.mjs +41 -0
  43. package/assets/templates/next-tenant-app/next-env.d.ts +6 -0
  44. package/assets/templates/next-tenant-app/next.config.ts +8 -0
  45. package/assets/templates/next-tenant-app/package-lock.json +9682 -0
  46. package/assets/templates/next-tenant-app/package.json +59 -0
  47. package/assets/templates/next-tenant-app/pnpm-lock.yaml +6062 -0
  48. package/assets/templates/next-tenant-app/postcss.config.mjs +8 -0
  49. package/assets/templates/next-tenant-app/src/app/api/auth/context/route.test.ts +90 -0
  50. package/assets/templates/next-tenant-app/src/app/api/auth/context/route.ts +78 -0
  51. package/assets/templates/next-tenant-app/src/app/api/auth/login/route.ts +31 -0
  52. package/assets/templates/next-tenant-app/src/app/api/auth/logout/route.ts +16 -0
  53. package/assets/templates/next-tenant-app/src/app/api/auth/password-change/route.test.ts +79 -0
  54. package/assets/templates/next-tenant-app/src/app/api/auth/password-change/route.ts +40 -0
  55. package/assets/templates/next-tenant-app/src/app/api/auth/password-status/route.test.ts +42 -0
  56. package/assets/templates/next-tenant-app/src/app/api/auth/password-status/route.ts +29 -0
  57. package/assets/templates/next-tenant-app/src/app/api/auth/session/route.ts +26 -0
  58. package/assets/templates/next-tenant-app/src/app/api/gateway/commands/[runId]/route.test.ts +40 -0
  59. package/assets/templates/next-tenant-app/src/app/api/gateway/commands/[runId]/route.ts +47 -0
  60. package/assets/templates/next-tenant-app/src/app/api/gateway/commands/route.test.ts +43 -0
  61. package/assets/templates/next-tenant-app/src/app/api/gateway/commands/route.ts +45 -0
  62. package/assets/templates/next-tenant-app/src/app/app/examples/runtime-commands/page.test.ts +83 -0
  63. package/assets/templates/next-tenant-app/src/app/app/examples/runtime-commands/page.tsx +30 -0
  64. package/assets/templates/next-tenant-app/src/app/app/layout.tsx +20 -0
  65. package/assets/templates/next-tenant-app/src/app/app/page.test.ts +62 -0
  66. package/assets/templates/next-tenant-app/src/app/app/page.tsx +24 -0
  67. package/assets/templates/next-tenant-app/src/app/blog/[slug]/page.test.ts +70 -0
  68. package/assets/templates/next-tenant-app/src/app/blog/[slug]/page.tsx +57 -0
  69. package/assets/templates/next-tenant-app/src/app/blog/page.test.ts +42 -0
  70. package/assets/templates/next-tenant-app/src/app/blog/page.tsx +37 -0
  71. package/assets/templates/next-tenant-app/src/app/docs/[...slug]/page.test.ts +70 -0
  72. package/assets/templates/next-tenant-app/src/app/docs/[...slug]/page.tsx +55 -0
  73. package/assets/templates/next-tenant-app/src/app/docs/page.test.ts +42 -0
  74. package/assets/templates/next-tenant-app/src/app/docs/page.tsx +37 -0
  75. package/assets/templates/next-tenant-app/src/app/globals.css +70 -0
  76. package/assets/templates/next-tenant-app/src/app/layout.tsx +69 -0
  77. package/assets/templates/next-tenant-app/src/app/login/page.test.ts +55 -0
  78. package/assets/templates/next-tenant-app/src/app/login/page.tsx +33 -0
  79. package/assets/templates/next-tenant-app/src/app/page.test.ts +56 -0
  80. package/assets/templates/next-tenant-app/src/app/page.tsx +35 -0
  81. package/assets/templates/next-tenant-app/src/app/pricing/page.test.ts +55 -0
  82. package/assets/templates/next-tenant-app/src/app/pricing/page.tsx +35 -0
  83. package/assets/templates/next-tenant-app/src/app/providers.tsx +25 -0
  84. package/assets/templates/next-tenant-app/src/app/robots.test.ts +20 -0
  85. package/assets/templates/next-tenant-app/src/app/robots.ts +18 -0
  86. package/assets/templates/next-tenant-app/src/app/sitemap.test.ts +49 -0
  87. package/assets/templates/next-tenant-app/src/app/sitemap.ts +54 -0
  88. package/assets/templates/next-tenant-app/src/components/ui/button.tsx +59 -0
  89. package/assets/templates/next-tenant-app/src/components/ui/input.tsx +21 -0
  90. package/assets/templates/next-tenant-app/src/design-system/docs/governance.mdx +26 -0
  91. package/assets/templates/next-tenant-app/src/design-system/patterns/panel-frame.stories.tsx +48 -0
  92. package/assets/templates/next-tenant-app/src/design-system/patterns/panel-frame.tsx +26 -0
  93. package/assets/templates/next-tenant-app/src/design-system/patterns/status-badge.stories.tsx +26 -0
  94. package/assets/templates/next-tenant-app/src/design-system/patterns/status-badge.tsx +35 -0
  95. package/assets/templates/next-tenant-app/src/design-system/patterns/theme-mode-toggle.stories.tsx +21 -0
  96. package/assets/templates/next-tenant-app/src/design-system/patterns/theme-mode-toggle.tsx +75 -0
  97. package/assets/templates/next-tenant-app/src/design-system/primitives/button.stories.tsx +37 -0
  98. package/assets/templates/next-tenant-app/src/design-system/primitives/button.ts +1 -0
  99. package/assets/templates/next-tenant-app/src/design-system/primitives/input.stories.tsx +26 -0
  100. package/assets/templates/next-tenant-app/src/design-system/primitives/input.ts +1 -0
  101. package/assets/templates/next-tenant-app/src/design-system/recipes/chrome.ts +28 -0
  102. package/assets/templates/next-tenant-app/src/design-system/tokens/foundation.css +31 -0
  103. package/assets/templates/next-tenant-app/src/design-system/tokens/index.css +3 -0
  104. package/assets/templates/next-tenant-app/src/design-system/tokens/manifest.json +85 -0
  105. package/assets/templates/next-tenant-app/src/design-system/tokens/manifest.ts +87 -0
  106. package/assets/templates/next-tenant-app/src/design-system/tokens/semantic.css +105 -0
  107. package/assets/templates/next-tenant-app/src/design-system/tokens/theme.css +59 -0
  108. package/assets/templates/next-tenant-app/src/design-system/tokens/tokens.stories.tsx +71 -0
  109. package/assets/templates/next-tenant-app/src/features/auth/components/login-screen.tsx +198 -0
  110. package/assets/templates/next-tenant-app/src/features/dashboard/components/tenant-dashboard.tsx +153 -0
  111. package/assets/templates/next-tenant-app/src/features/examples/runtime-command-demo/components/runtime-command-demo.tsx +342 -0
  112. package/assets/templates/next-tenant-app/src/features/public-shell/components/content-article.tsx +66 -0
  113. package/assets/templates/next-tenant-app/src/features/public-shell/components/content-collection.tsx +108 -0
  114. package/assets/templates/next-tenant-app/src/features/public-shell/components/marketing-page-canvas.tsx +111 -0
  115. package/assets/templates/next-tenant-app/src/features/public-shell/components/public-site-shell.tsx +111 -0
  116. package/assets/templates/next-tenant-app/src/features/shell/components/private-app-shell.tsx +624 -0
  117. package/assets/templates/next-tenant-app/src/lib/app-routes.test.ts +20 -0
  118. package/assets/templates/next-tenant-app/src/lib/app-routes.ts +59 -0
  119. package/assets/templates/next-tenant-app/src/lib/content/__fixtures__/public-site-snapshot.ts +189 -0
  120. package/assets/templates/next-tenant-app/src/lib/content/adapter.server.test.ts +318 -0
  121. package/assets/templates/next-tenant-app/src/lib/content/adapter.server.ts +232 -0
  122. package/assets/templates/next-tenant-app/src/lib/content/contracts.ts +339 -0
  123. package/assets/templates/next-tenant-app/src/lib/content/custom-adapter.ts +5 -0
  124. package/assets/templates/next-tenant-app/src/lib/content/empty-state.ts +96 -0
  125. package/assets/templates/next-tenant-app/src/lib/platform/auth.server.test.ts +75 -0
  126. package/assets/templates/next-tenant-app/src/lib/platform/auth.server.ts +25 -0
  127. package/assets/templates/next-tenant-app/src/lib/platform/client.server.test.ts +170 -0
  128. package/assets/templates/next-tenant-app/src/lib/platform/client.server.ts +661 -0
  129. package/assets/templates/next-tenant-app/src/lib/platform/contracts.ts +131 -0
  130. package/assets/templates/next-tenant-app/src/lib/platform/endpoints.server.ts +34 -0
  131. package/assets/templates/next-tenant-app/src/lib/platform/env.server.test.ts +102 -0
  132. package/assets/templates/next-tenant-app/src/lib/platform/env.server.ts +87 -0
  133. package/assets/templates/next-tenant-app/src/lib/platform/route-response.ts +33 -0
  134. package/assets/templates/next-tenant-app/src/lib/platform/session.server.ts +108 -0
  135. package/assets/templates/next-tenant-app/src/lib/public-site.test.ts +20 -0
  136. package/assets/templates/next-tenant-app/src/lib/public-site.ts +49 -0
  137. package/assets/templates/next-tenant-app/src/lib/theme-config.ts +10 -0
  138. package/assets/templates/next-tenant-app/src/lib/theme.tsx +159 -0
  139. package/assets/templates/next-tenant-app/src/lib/utils.ts +6 -0
  140. package/assets/templates/next-tenant-app/template.json +27 -0
  141. package/assets/templates/next-tenant-app/template.schema.json +160 -0
  142. package/assets/templates/next-tenant-app/test/server-only-stub.ts +1 -0
  143. package/assets/templates/next-tenant-app/tools/design-system/build-token-manifest.mjs +3 -0
  144. package/assets/templates/next-tenant-app/tools/design-system/check-imports.mjs +9 -0
  145. package/assets/templates/next-tenant-app/tools/design-system/check-stories.mjs +9 -0
  146. package/assets/templates/next-tenant-app/tools/design-system/check-values.mjs +9 -0
  147. package/assets/templates/next-tenant-app/tools/design-system/checks.mjs +238 -0
  148. package/assets/templates/next-tenant-app/tools/design-system/eslint-plugin-design-system.mjs +184 -0
  149. package/assets/templates/next-tenant-app/tools/design-system/playwright.config.mjs +34 -0
  150. package/assets/templates/next-tenant-app/tools/design-system/run-checks.mjs +22 -0
  151. package/assets/templates/next-tenant-app/tools/design-system/shared.mjs +166 -0
  152. package/assets/templates/next-tenant-app/tools/design-system/visual.spec.ts +41 -0
  153. package/assets/templates/next-tenant-app/tools/template/validate-route-contract.mjs +39 -0
  154. package/assets/templates/next-tenant-app/tools/template/validate-template.mjs +45 -0
  155. package/assets/templates/next-tenant-app/tsconfig.json +42 -0
  156. package/assets/templates/next-tenant-app/vitest.config.ts +25 -0
  157. package/bin/minutework.js +40 -0
  158. package/dist/auth.d.ts +59 -0
  159. package/dist/auth.js +338 -0
  160. package/dist/auth.js.map +1 -0
  161. package/dist/browser.d.ts +1 -0
  162. package/dist/browser.js +26 -0
  163. package/dist/browser.js.map +1 -0
  164. package/dist/cli.d.ts +2 -0
  165. package/dist/cli.js +5 -0
  166. package/dist/cli.js.map +1 -0
  167. package/dist/compile.d.ts +20 -0
  168. package/dist/compile.js +121 -0
  169. package/dist/compile.js.map +1 -0
  170. package/dist/config.d.ts +25 -0
  171. package/dist/config.js +102 -0
  172. package/dist/config.js.map +1 -0
  173. package/dist/deploy-state.d.ts +35 -0
  174. package/dist/deploy-state.js +30 -0
  175. package/dist/deploy-state.js.map +1 -0
  176. package/dist/deploy.d.ts +22 -0
  177. package/dist/deploy.js +308 -0
  178. package/dist/deploy.js.map +1 -0
  179. package/dist/developer-client.d.ts +88 -0
  180. package/dist/developer-client.js +78 -0
  181. package/dist/developer-client.js.map +1 -0
  182. package/dist/index.d.ts +27 -0
  183. package/dist/index.js +290 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/init.d.ts +22 -0
  186. package/dist/init.js +421 -0
  187. package/dist/init.js.map +1 -0
  188. package/dist/launcher.d.ts +1 -0
  189. package/dist/launcher.js +50 -0
  190. package/dist/launcher.js.map +1 -0
  191. package/dist/paths.d.ts +12 -0
  192. package/dist/paths.js +33 -0
  193. package/dist/paths.js.map +1 -0
  194. package/dist/sandbox.d.ts +30 -0
  195. package/dist/sandbox.js +852 -0
  196. package/dist/sandbox.js.map +1 -0
  197. package/dist/state.d.ts +46 -0
  198. package/dist/state.js +82 -0
  199. package/dist/state.js.map +1 -0
  200. package/dist/tokens.d.ts +14 -0
  201. package/dist/tokens.js +293 -0
  202. package/dist/tokens.js.map +1 -0
  203. package/package.json +43 -0
package/dist/auth.js ADDED
@@ -0,0 +1,338 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { promises as fs } from "node:fs";
3
+ import { createServer } from "node:http";
4
+ import path from "node:path";
5
+ import { loadWorkspaceConfig } from "@minutework/schema-compiler";
6
+ import { openExternalUrl } from "./browser.js";
7
+ import { assertWorkspacePlatformMatchesAuthProfile, parseLoginArgs, resolveLoginPlatformBaseUrl, resolveOptionalCliWorkspaceConfig, } from "./config.js";
8
+ import { createDeveloperClient } from "./developer-client.js";
9
+ import { findWorkspaceRoot, loadCurrentAuthProfile, loadWorkspaceBinding, saveAuthProfile, writeWorkspaceBinding, } from "./state.js";
10
+ export async function runLoginCommand(options) {
11
+ const parsed = parseLoginArgs(options.args);
12
+ if (parsed.help) {
13
+ options.io.stdout(`Usage:
14
+ minutework login [--platform <url>]
15
+
16
+ Inside a MinuteWork workspace, the CLI uses the wired local platform automatically.
17
+ Use --platform only when intentionally targeting a non-default backend.
18
+ `);
19
+ return 0;
20
+ }
21
+ const fetchImpl = options.dependencies?.fetchImpl ?? fetch;
22
+ const openUrl = options.dependencies?.openExternalUrl ?? openExternalUrl;
23
+ const createReceiver = options.dependencies?.createLoopbackReceiver ?? defaultCreateLoopbackReceiver;
24
+ const resolvedWorkspaceConfig = await resolveOptionalCliWorkspaceConfig({
25
+ cwd: options.cwd,
26
+ env: options.env,
27
+ });
28
+ const platformBaseUrl = resolveLoginPlatformBaseUrl({
29
+ env: options.env,
30
+ flagPlatformBaseUrl: parsed.platformBaseUrl,
31
+ resolvedWorkspaceConfig,
32
+ });
33
+ const loopback = await createReceiver();
34
+ const state = randomToken();
35
+ const codeVerifier = randomToken(48);
36
+ const codeChallenge = buildCodeChallenge(codeVerifier);
37
+ const authorizeUrl = new URL("/developer/cli/authorize/", `${platformBaseUrl}/`);
38
+ authorizeUrl.searchParams.set("redirect_uri", loopback.redirectUri);
39
+ authorizeUrl.searchParams.set("state", state);
40
+ authorizeUrl.searchParams.set("code_challenge", codeChallenge);
41
+ options.io.stdout("Opening browser for MinuteWork CLI authorization.");
42
+ options.io.stdout(`If the browser does not open, navigate to: ${authorizeUrl.toString()}`);
43
+ try {
44
+ await openUrl(authorizeUrl.toString(), options.platform);
45
+ }
46
+ catch (error) {
47
+ options.io.stderr(`Unable to launch a browser automatically: ${error instanceof Error ? error.message : String(error)}`);
48
+ }
49
+ try {
50
+ const code = await loopback.waitForCode(state);
51
+ const exchange = await exchangeAuthorizationCode({
52
+ code,
53
+ codeVerifier,
54
+ fetchImpl,
55
+ platformBaseUrl,
56
+ redirectUri: loopback.redirectUri,
57
+ });
58
+ const profile = buildStoredAuthProfile({
59
+ platformBaseUrl,
60
+ response: exchange,
61
+ });
62
+ await saveAuthProfile({
63
+ paths: options.paths,
64
+ platformBaseUrl,
65
+ profile,
66
+ });
67
+ options.io.stdout(`Authenticated for workspace ${profile.tenantName} (${profile.tenantSlug}).`);
68
+ options.io.stdout(`Active auth profile: ${profile.id}`);
69
+ return 0;
70
+ }
71
+ finally {
72
+ await loopback.close();
73
+ }
74
+ }
75
+ export async function requireCurrentAuthProfile(paths) {
76
+ return loadCurrentAuthProfile(paths);
77
+ }
78
+ export async function runLinkCommand(options) {
79
+ if (options.args.includes("--help") || options.args.includes("-h")) {
80
+ options.io.stdout(`Usage:
81
+ minutework link
82
+ `);
83
+ return 0;
84
+ }
85
+ if (options.args.length > 0) {
86
+ throw new Error("The link command does not accept positional arguments.");
87
+ }
88
+ const workspaceRoot = await findWorkspaceRoot(options.cwd);
89
+ const resolvedWorkspaceConfig = await resolveOptionalCliWorkspaceConfig({
90
+ cwd: workspaceRoot,
91
+ env: options.env,
92
+ });
93
+ const profile = await requireCurrentAuthProfile(options.paths);
94
+ assertWorkspacePlatformMatchesAuthProfile({
95
+ commandLabel: "minutework link",
96
+ profilePlatformBaseUrl: profile.platformBaseUrl,
97
+ resolvedWorkspaceConfig,
98
+ });
99
+ const client = createDeveloperClient({
100
+ dependencies: options.dependencies,
101
+ profile,
102
+ });
103
+ const publicSiteDefaults = await resolveWorkspacePublicSiteDefaults(workspaceRoot);
104
+ const linkedProperty = await client.linkPublicSite({
105
+ defaultReleaseClass: publicSiteDefaults.releaseClass,
106
+ displayName: publicSiteDefaults.displayName,
107
+ propertyKey: publicSiteDefaults.propertyKey,
108
+ });
109
+ const binding = {
110
+ authProfileId: profile.id,
111
+ environment: resolvedWorkspaceConfig?.defaultEnvironment ?? normalizeEnvironment(options.env.MW_CLI_DEFAULT_ENV),
112
+ platformBaseUrl: profile.platformBaseUrl,
113
+ propertyKey: linkedProperty.property.property_key,
114
+ releaseClass: linkedProperty.property.default_release_class,
115
+ tenantId: profile.tenantId,
116
+ tenantSlug: profile.tenantSlug,
117
+ workspaceName: profile.tenantName,
118
+ };
119
+ const bindingPath = await writeWorkspaceBinding({
120
+ binding,
121
+ platform: options.platform,
122
+ workspaceRoot,
123
+ });
124
+ options.io.stdout(`Linked workspace ${path.basename(workspaceRoot)} to ${binding.workspaceName} (${binding.propertyKey}).`);
125
+ options.io.stdout(`Binding file: ${bindingPath}`);
126
+ return 0;
127
+ }
128
+ export async function runEnvUseCommand(options) {
129
+ if (options.args.includes("--help") || options.args.includes("-h")) {
130
+ options.io.stdout(`Usage:
131
+ minutework env use <preview|live>
132
+ `);
133
+ return 0;
134
+ }
135
+ if (options.args.length !== 1) {
136
+ throw new Error('The "env use" command requires exactly one environment: preview or live.');
137
+ }
138
+ const workspaceRoot = await findWorkspaceRoot(options.cwd);
139
+ const binding = await loadWorkspaceBinding({
140
+ platform: options.platform,
141
+ workspaceRoot,
142
+ });
143
+ const nextEnvironment = normalizeEnvironment(options.args[0]);
144
+ const nextBinding = {
145
+ ...binding,
146
+ environment: nextEnvironment,
147
+ };
148
+ const bindingPath = await writeWorkspaceBinding({
149
+ binding: nextBinding,
150
+ platform: options.platform,
151
+ workspaceRoot,
152
+ });
153
+ options.io.stdout(`Selected ${nextEnvironment} for workspace ${nextBinding.workspaceName}.`);
154
+ options.io.stdout(`Binding file: ${bindingPath}`);
155
+ return 0;
156
+ }
157
+ function buildStoredAuthProfile(options) {
158
+ return {
159
+ createdAt: new Date().toISOString(),
160
+ expiresAt: options.response.token.expires_at,
161
+ id: options.response.token.id,
162
+ platformBaseUrl: options.platformBaseUrl,
163
+ scopeTemplate: options.response.token.scope_template,
164
+ scopes: [...options.response.token.scopes],
165
+ tenantId: options.response.token.tenant_id,
166
+ tenantName: options.response.token.tenant_name,
167
+ tenantSlug: options.response.token.tenant_slug,
168
+ token: options.response.plaintext_token,
169
+ tokenKind: options.response.token.kind,
170
+ user: { ...options.response.token.issued_for_user },
171
+ };
172
+ }
173
+ async function exchangeAuthorizationCode(options) {
174
+ const response = await options.fetchImpl(`${options.platformBaseUrl}/api/v1/developer/cli/token-exchange/`, {
175
+ method: "POST",
176
+ headers: {
177
+ "Content-Type": "application/json",
178
+ },
179
+ body: JSON.stringify({
180
+ code: options.code,
181
+ code_verifier: options.codeVerifier,
182
+ redirect_uri: options.redirectUri,
183
+ }),
184
+ });
185
+ const payload = (await response.json().catch(() => ({})));
186
+ if (!response.ok) {
187
+ throw new Error(String(payload.detail || "CLI token exchange failed."));
188
+ }
189
+ if (typeof payload.plaintext_token !== "string" ||
190
+ typeof payload.token !== "object" ||
191
+ payload.token === null) {
192
+ throw new Error("CLI token exchange returned an invalid payload.");
193
+ }
194
+ return payload;
195
+ }
196
+ function randomToken(size = 32) {
197
+ return randomBytes(size).toString("base64url");
198
+ }
199
+ function buildCodeChallenge(codeVerifier) {
200
+ return createHash("sha256").update(codeVerifier).digest("base64url");
201
+ }
202
+ async function resolveWorkspacePublicSiteDefaults(workspaceRoot) {
203
+ const config = await loadWorkspaceConfig(path.join(workspaceRoot, "minutework.config.ts"));
204
+ const fallbackDisplayName = config.workspace.name;
205
+ if (!config.starters.tenantApp.enabled) {
206
+ return {
207
+ displayName: fallbackDisplayName,
208
+ propertyKey: "main-site",
209
+ releaseClass: "ssr_container",
210
+ };
211
+ }
212
+ const envExamplePath = path.join(workspaceRoot, config.starters.tenantApp.path, ".env.example");
213
+ const envExampleContents = await readOptionalFile(envExamplePath);
214
+ if (!envExampleContents) {
215
+ return {
216
+ displayName: fallbackDisplayName,
217
+ propertyKey: "main-site",
218
+ releaseClass: "ssr_container",
219
+ };
220
+ }
221
+ const envValues = parseSimpleEnvFile(envExampleContents);
222
+ return {
223
+ displayName: String(envValues.MW_TEMPLATE_APP_NAME || "").trim() || fallbackDisplayName,
224
+ propertyKey: String(envValues.MW_PUBLIC_SITE_PROPERTY_KEY || "main-site")
225
+ .trim()
226
+ .toLowerCase(),
227
+ releaseClass: "ssr_container",
228
+ };
229
+ }
230
+ async function readOptionalFile(targetPath) {
231
+ try {
232
+ return await fs.readFile(targetPath, "utf8");
233
+ }
234
+ catch (error) {
235
+ const errno = error;
236
+ if (errno.code === "ENOENT") {
237
+ return "";
238
+ }
239
+ throw error;
240
+ }
241
+ }
242
+ function parseSimpleEnvFile(contents) {
243
+ const values = {};
244
+ for (const rawLine of contents.split(/\r?\n/u)) {
245
+ const trimmedLine = rawLine.trim();
246
+ if (!trimmedLine || trimmedLine.startsWith("#")) {
247
+ continue;
248
+ }
249
+ const line = trimmedLine.startsWith("export ") ? trimmedLine.slice("export ".length).trim() : trimmedLine;
250
+ const separatorIndex = line.indexOf("=");
251
+ if (separatorIndex <= 0) {
252
+ continue;
253
+ }
254
+ const key = line.slice(0, separatorIndex).trim();
255
+ if (!key) {
256
+ continue;
257
+ }
258
+ values[key] = line.slice(separatorIndex + 1).trim().replace(/^['"]|['"]$/g, "");
259
+ }
260
+ return values;
261
+ }
262
+ function normalizeEnvironment(value) {
263
+ const normalized = String(value || "preview").trim().toLowerCase();
264
+ if (normalized !== "preview" && normalized !== "live") {
265
+ throw new Error(`Unsupported environment "${value}". Use "preview" or "live".`);
266
+ }
267
+ return normalized;
268
+ }
269
+ async function defaultCreateLoopbackReceiver() {
270
+ const server = createServer();
271
+ const redirectUri = await new Promise((resolve, reject) => {
272
+ server.once("error", reject);
273
+ server.listen(0, "127.0.0.1", () => {
274
+ const address = server.address();
275
+ if (!address || typeof address === "string") {
276
+ reject(new Error("Unable to allocate a loopback port for CLI login."));
277
+ return;
278
+ }
279
+ resolve(`http://127.0.0.1:${address.port}/callback`);
280
+ });
281
+ });
282
+ return {
283
+ async close() {
284
+ await new Promise((resolve, reject) => {
285
+ server.close((error) => {
286
+ if (error) {
287
+ reject(error);
288
+ return;
289
+ }
290
+ resolve();
291
+ });
292
+ }).catch(() => undefined);
293
+ },
294
+ redirectUri,
295
+ waitForCode(expectedState) {
296
+ return new Promise((resolve, reject) => {
297
+ const timeout = setTimeout(() => {
298
+ cleanup();
299
+ reject(new Error("Timed out waiting for the browser authorization callback."));
300
+ }, 5 * 60 * 1000);
301
+ const cleanup = () => {
302
+ clearTimeout(timeout);
303
+ server.removeAllListeners("request");
304
+ };
305
+ server.on("request", (request, response) => {
306
+ const requestUrl = new URL(request.url || "/", redirectUri);
307
+ if (requestUrl.pathname !== "/callback") {
308
+ response.statusCode = 404;
309
+ response.end("Not found.");
310
+ return;
311
+ }
312
+ const returnedState = String(requestUrl.searchParams.get("state") || "");
313
+ const code = String(requestUrl.searchParams.get("code") || "");
314
+ if (!code) {
315
+ response.statusCode = 400;
316
+ response.end("Missing authorization code.");
317
+ cleanup();
318
+ reject(new Error("Browser callback did not include an authorization code."));
319
+ return;
320
+ }
321
+ if (returnedState !== expectedState) {
322
+ response.statusCode = 400;
323
+ response.end("Invalid state.");
324
+ cleanup();
325
+ reject(new Error("Browser callback state mismatch."));
326
+ return;
327
+ }
328
+ response.statusCode = 200;
329
+ response.setHeader("Content-Type", "text/html; charset=utf-8");
330
+ response.end("<!doctype html><html><body><p>MinuteWork CLI authorization received. You can close this window.</p></body></html>");
331
+ cleanup();
332
+ resolve(code);
333
+ });
334
+ });
335
+ },
336
+ };
337
+ }
338
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function openExternalUrl(url: string, platform?: NodeJS.Platform): Promise<void>;
@@ -0,0 +1,26 @@
1
+ import { spawn } from "node:child_process";
2
+ export async function openExternalUrl(url, platform = process.platform) {
3
+ const command = browserCommandForPlatform(platform, url);
4
+ await new Promise((resolve, reject) => {
5
+ const child = spawn(command.file, command.args, {
6
+ detached: true,
7
+ stdio: "ignore",
8
+ });
9
+ child.on("error", reject);
10
+ child.unref();
11
+ resolve();
12
+ });
13
+ }
14
+ function browserCommandForPlatform(platform, url) {
15
+ if (platform === "darwin") {
16
+ return { file: "open", args: [url] };
17
+ }
18
+ if (platform === "win32") {
19
+ return {
20
+ file: "rundll32",
21
+ args: ["url.dll,FileProtocolHandler", url],
22
+ };
23
+ }
24
+ return { file: "xdg-open", args: [url] };
25
+ }
26
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC7F,MAAM,OAAO,GAAG,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;YAC9C,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,SAAS,yBAAyB,CAAC,QAAyB,EAAE,GAAW;IACvE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3C,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { runCliFromPackageRoot } from "./launcher.js";
3
+ const exitCode = await runCliFromPackageRoot(import.meta.url, process.argv.slice(2));
4
+ process.exit(exitCode);
5
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type CompilerWorkspaceAnalysis, type CompileGraph, type ValidateReport } from "@minutework/schema-compiler";
2
+ import type { CliIo } from "./index.js";
3
+ export declare function runValidateCommand(options: {
4
+ args: string[];
5
+ cwd: string;
6
+ io: CliIo;
7
+ }): Promise<0 | 1>;
8
+ export declare function runCompileCommand(options: {
9
+ args: string[];
10
+ cwd: string;
11
+ io: CliIo;
12
+ }): Promise<0 | 1>;
13
+ export declare function runCodegenCommand(options: {
14
+ args: string[];
15
+ cwd: string;
16
+ io: CliIo;
17
+ }): Promise<0 | 1>;
18
+ export declare function writeCompileGraph(workspaceRoot: string, compileGraph: CompileGraph): Promise<void>;
19
+ export declare function writeCodegenArtifacts(workspaceRoot: string, artifacts: CompileGraph["artifacts"], codegenArtifacts: NonNullable<CompilerWorkspaceAnalysis["codegenArtifacts"]>): Promise<void>;
20
+ export declare function formatJson(payload: CompileGraph | ValidateReport | Record<string, unknown>): string;
@@ -0,0 +1,121 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ import { analyzeCompilerWorkspace, discoverCompilerWorkspaceRoot, } from "@minutework/schema-compiler";
4
+ export async function runValidateCommand(options) {
5
+ const parsed = parseCompilerCommandArgs(options.args, "validate");
6
+ if (parsed.help) {
7
+ options.io.stdout(renderValidateHelp());
8
+ return 0;
9
+ }
10
+ const workspaceRoot = await discoverCompilerWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
11
+ const analysis = await analyzeCompilerWorkspace(workspaceRoot);
12
+ options.io.stdout(formatJson(analysis.validateReport));
13
+ return analysis.validateReport.status === "ok" ? 0 : 1;
14
+ }
15
+ export async function runCompileCommand(options) {
16
+ const parsed = parseCompilerCommandArgs(options.args, "compile");
17
+ if (parsed.help) {
18
+ options.io.stdout(renderCompileHelp());
19
+ return 0;
20
+ }
21
+ const workspaceRoot = await discoverCompilerWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
22
+ const analysis = await analyzeCompilerWorkspace(workspaceRoot);
23
+ if (!analysis.compileGraph) {
24
+ options.io.stderr(formatJson(analysis.validateReport));
25
+ return 1;
26
+ }
27
+ await writeCompileGraph(workspaceRoot, analysis.compileGraph);
28
+ options.io.stdout(formatJson(analysis.compileGraph));
29
+ return 0;
30
+ }
31
+ export async function runCodegenCommand(options) {
32
+ const parsed = parseCompilerCommandArgs(options.args, "codegen");
33
+ if (parsed.help) {
34
+ options.io.stdout(renderCodegenHelp());
35
+ return 0;
36
+ }
37
+ const workspaceRoot = await discoverCompilerWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
38
+ const analysis = await analyzeCompilerWorkspace(workspaceRoot);
39
+ if (!analysis.compileGraph || !analysis.codegenArtifacts) {
40
+ options.io.stderr(formatJson(analysis.validateReport));
41
+ return 1;
42
+ }
43
+ await writeCompileGraph(workspaceRoot, analysis.compileGraph);
44
+ await writeCodegenArtifacts(workspaceRoot, analysis.compileGraph.artifacts, analysis.codegenArtifacts);
45
+ options.io.stdout(formatJson(analysis.compileGraph));
46
+ return 0;
47
+ }
48
+ function parseCompilerCommandArgs(args, command) {
49
+ let workspacePath;
50
+ const setWorkspacePath = (value) => {
51
+ if (workspacePath) {
52
+ throw new Error(`${command} accepts at most one workspace path.`);
53
+ }
54
+ workspacePath = value;
55
+ };
56
+ for (let index = 0; index < args.length; index += 1) {
57
+ const arg = args[index];
58
+ if (arg === "--help" || arg === "-h") {
59
+ return { help: true };
60
+ }
61
+ if (arg === "--workspace") {
62
+ const next = args[index + 1];
63
+ if (!next || next.startsWith("--")) {
64
+ throw new Error(`The "${command}" command requires a path after --workspace.`);
65
+ }
66
+ setWorkspacePath(next);
67
+ index += 1;
68
+ continue;
69
+ }
70
+ if (arg.startsWith("--workspace=")) {
71
+ const value = arg.slice("--workspace=".length);
72
+ if (!value) {
73
+ throw new Error(`The "${command}" command requires a path after --workspace.`);
74
+ }
75
+ setWorkspacePath(value);
76
+ continue;
77
+ }
78
+ if (arg.startsWith("--")) {
79
+ throw new Error(`Unknown ${command} option: ${arg}`);
80
+ }
81
+ setWorkspacePath(arg);
82
+ }
83
+ return {
84
+ help: false,
85
+ workspacePath,
86
+ };
87
+ }
88
+ export async function writeCompileGraph(workspaceRoot, compileGraph) {
89
+ const absoluteOutputPath = path.join(workspaceRoot, compileGraph.artifacts.compileGraphPath);
90
+ await fs.mkdir(path.dirname(absoluteOutputPath), { recursive: true });
91
+ await fs.writeFile(absoluteOutputPath, formatJson(compileGraph), "utf8");
92
+ }
93
+ export async function writeCodegenArtifacts(workspaceRoot, artifacts, codegenArtifacts) {
94
+ const absoluteOpenapiPath = path.join(workspaceRoot, artifacts.openapiPath);
95
+ const absoluteClientTypesPath = path.join(workspaceRoot, artifacts.clientTypesPath);
96
+ await fs.mkdir(path.dirname(absoluteOpenapiPath), { recursive: true });
97
+ await fs.writeFile(absoluteOpenapiPath, formatJson(codegenArtifacts.openapi), "utf8");
98
+ await fs.writeFile(absoluteClientTypesPath, codegenArtifacts.clientTypes, "utf8");
99
+ }
100
+ export function formatJson(payload) {
101
+ return `${JSON.stringify(payload, null, 2)}\n`;
102
+ }
103
+ function renderValidateHelp() {
104
+ return `Usage:
105
+ minutework validate [workspace] [--workspace <path>]
106
+
107
+ Validate the local MinuteWork schema authoring source and print a deterministic validate report.`;
108
+ }
109
+ function renderCompileHelp() {
110
+ return `Usage:
111
+ minutework compile [workspace] [--workspace <path>]
112
+
113
+ Compile the local MinuteWork schema source and write the canonical graph.json artifact under the configured local state directory.`;
114
+ }
115
+ function renderCodegenHelp() {
116
+ return `Usage:
117
+ minutework codegen [workspace] [--workspace <path>]
118
+
119
+ Generate deterministic OpenAPI and client-type artifacts from the local compile graph, refreshing graph.json first when validation succeeds.`;
120
+ }
121
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type ResolvedWorkspaceCliConfig } from "@minutework/schema-compiler";
2
+ export type ResolvedCliWorkspaceConfig = ResolvedWorkspaceCliConfig & {
3
+ workspaceRoot: string;
4
+ };
5
+ export declare function resolveOptionalCliWorkspaceConfig(options: {
6
+ cwd: string;
7
+ env: NodeJS.ProcessEnv;
8
+ }): Promise<ResolvedCliWorkspaceConfig | null>;
9
+ export declare function resolveLoginPlatformBaseUrl(options: {
10
+ env: NodeJS.ProcessEnv;
11
+ flagPlatformBaseUrl?: string | null;
12
+ resolvedWorkspaceConfig: ResolvedCliWorkspaceConfig | null;
13
+ }): string;
14
+ export declare function assertWorkspacePlatformMatchesAuthProfile(options: {
15
+ commandLabel: string;
16
+ profilePlatformBaseUrl: string;
17
+ resolvedWorkspaceConfig: ResolvedCliWorkspaceConfig | null;
18
+ }): void;
19
+ export declare function parseLoginArgs(args: string[]): {
20
+ help: true;
21
+ platformBaseUrl: null;
22
+ } | {
23
+ help: false;
24
+ platformBaseUrl: string | null;
25
+ };