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.
- package/EXTERNAL_ALPHA.md +74 -0
- package/README.md +57 -0
- package/assets/claude-local/CLAUDE.md.template +45 -0
- package/assets/claude-local/bundle.json +22 -0
- package/assets/claude-local/skills/README.md +6 -0
- package/assets/claude-local/skills/app-pack-authoring.md +8 -0
- package/assets/claude-local/skills/event-bus.md +8 -0
- package/assets/claude-local/skills/ontology-mapping.md +8 -0
- package/assets/claude-local/skills/openclaw-skill-importer.md +7 -0
- package/assets/claude-local/skills/schema-engine.md +8 -0
- package/assets/claude-local/skills/secrets-runtime-bridge.md +9 -0
- package/assets/claude-local/skills/sidecar-generation.md +9 -0
- package/assets/templates/fastapi-sidecar/.env.example +8 -0
- package/assets/templates/fastapi-sidecar/README.md +77 -0
- package/assets/templates/fastapi-sidecar/poetry.lock +757 -0
- package/assets/templates/fastapi-sidecar/pyproject.toml +42 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/__init__.py +3 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/auth.py +70 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/bridge/__init__.py +3 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/bridge/client.py +71 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/logging_utils.py +25 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/main.py +85 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/receipts.py +24 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/settings.py +41 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/template_validation.py +26 -0
- package/assets/templates/fastapi-sidecar/src/fastapi_sidecar/worker.py +33 -0
- package/assets/templates/fastapi-sidecar/template.json +43 -0
- package/assets/templates/fastapi-sidecar/template.schema.json +160 -0
- package/assets/templates/fastapi-sidecar/tests/conftest.py +36 -0
- package/assets/templates/fastapi-sidecar/tests/test_app.py +39 -0
- package/assets/templates/fastapi-sidecar/tests/test_auth.py +32 -0
- package/assets/templates/fastapi-sidecar/tests/test_bridge_client.py +31 -0
- package/assets/templates/fastapi-sidecar/tests/test_materialization.py +55 -0
- package/assets/templates/fastapi-sidecar/tests/test_template_contract.py +49 -0
- package/assets/templates/fastapi-sidecar/tests/test_worker.py +7 -0
- package/assets/templates/fastapi-sidecar/tools/template/validate_template.py +20 -0
- package/assets/templates/next-tenant-app/.env.example +8 -0
- package/assets/templates/next-tenant-app/.storybook/main.ts +19 -0
- package/assets/templates/next-tenant-app/.storybook/preview.tsx +38 -0
- package/assets/templates/next-tenant-app/README.md +115 -0
- package/assets/templates/next-tenant-app/components.json +21 -0
- package/assets/templates/next-tenant-app/eslint.config.mjs +41 -0
- package/assets/templates/next-tenant-app/next-env.d.ts +6 -0
- package/assets/templates/next-tenant-app/next.config.ts +8 -0
- package/assets/templates/next-tenant-app/package-lock.json +9682 -0
- package/assets/templates/next-tenant-app/package.json +59 -0
- package/assets/templates/next-tenant-app/pnpm-lock.yaml +6062 -0
- package/assets/templates/next-tenant-app/postcss.config.mjs +8 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/context/route.test.ts +90 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/context/route.ts +78 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/login/route.ts +31 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/logout/route.ts +16 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/password-change/route.test.ts +79 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/password-change/route.ts +40 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/password-status/route.test.ts +42 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/password-status/route.ts +29 -0
- package/assets/templates/next-tenant-app/src/app/api/auth/session/route.ts +26 -0
- package/assets/templates/next-tenant-app/src/app/api/gateway/commands/[runId]/route.test.ts +40 -0
- package/assets/templates/next-tenant-app/src/app/api/gateway/commands/[runId]/route.ts +47 -0
- package/assets/templates/next-tenant-app/src/app/api/gateway/commands/route.test.ts +43 -0
- package/assets/templates/next-tenant-app/src/app/api/gateway/commands/route.ts +45 -0
- package/assets/templates/next-tenant-app/src/app/app/examples/runtime-commands/page.test.ts +83 -0
- package/assets/templates/next-tenant-app/src/app/app/examples/runtime-commands/page.tsx +30 -0
- package/assets/templates/next-tenant-app/src/app/app/layout.tsx +20 -0
- package/assets/templates/next-tenant-app/src/app/app/page.test.ts +62 -0
- package/assets/templates/next-tenant-app/src/app/app/page.tsx +24 -0
- package/assets/templates/next-tenant-app/src/app/blog/[slug]/page.test.ts +70 -0
- package/assets/templates/next-tenant-app/src/app/blog/[slug]/page.tsx +57 -0
- package/assets/templates/next-tenant-app/src/app/blog/page.test.ts +42 -0
- package/assets/templates/next-tenant-app/src/app/blog/page.tsx +37 -0
- package/assets/templates/next-tenant-app/src/app/docs/[...slug]/page.test.ts +70 -0
- package/assets/templates/next-tenant-app/src/app/docs/[...slug]/page.tsx +55 -0
- package/assets/templates/next-tenant-app/src/app/docs/page.test.ts +42 -0
- package/assets/templates/next-tenant-app/src/app/docs/page.tsx +37 -0
- package/assets/templates/next-tenant-app/src/app/globals.css +70 -0
- package/assets/templates/next-tenant-app/src/app/layout.tsx +69 -0
- package/assets/templates/next-tenant-app/src/app/login/page.test.ts +55 -0
- package/assets/templates/next-tenant-app/src/app/login/page.tsx +33 -0
- package/assets/templates/next-tenant-app/src/app/page.test.ts +56 -0
- package/assets/templates/next-tenant-app/src/app/page.tsx +35 -0
- package/assets/templates/next-tenant-app/src/app/pricing/page.test.ts +55 -0
- package/assets/templates/next-tenant-app/src/app/pricing/page.tsx +35 -0
- package/assets/templates/next-tenant-app/src/app/providers.tsx +25 -0
- package/assets/templates/next-tenant-app/src/app/robots.test.ts +20 -0
- package/assets/templates/next-tenant-app/src/app/robots.ts +18 -0
- package/assets/templates/next-tenant-app/src/app/sitemap.test.ts +49 -0
- package/assets/templates/next-tenant-app/src/app/sitemap.ts +54 -0
- package/assets/templates/next-tenant-app/src/components/ui/button.tsx +59 -0
- package/assets/templates/next-tenant-app/src/components/ui/input.tsx +21 -0
- package/assets/templates/next-tenant-app/src/design-system/docs/governance.mdx +26 -0
- package/assets/templates/next-tenant-app/src/design-system/patterns/panel-frame.stories.tsx +48 -0
- package/assets/templates/next-tenant-app/src/design-system/patterns/panel-frame.tsx +26 -0
- package/assets/templates/next-tenant-app/src/design-system/patterns/status-badge.stories.tsx +26 -0
- package/assets/templates/next-tenant-app/src/design-system/patterns/status-badge.tsx +35 -0
- package/assets/templates/next-tenant-app/src/design-system/patterns/theme-mode-toggle.stories.tsx +21 -0
- package/assets/templates/next-tenant-app/src/design-system/patterns/theme-mode-toggle.tsx +75 -0
- package/assets/templates/next-tenant-app/src/design-system/primitives/button.stories.tsx +37 -0
- package/assets/templates/next-tenant-app/src/design-system/primitives/button.ts +1 -0
- package/assets/templates/next-tenant-app/src/design-system/primitives/input.stories.tsx +26 -0
- package/assets/templates/next-tenant-app/src/design-system/primitives/input.ts +1 -0
- package/assets/templates/next-tenant-app/src/design-system/recipes/chrome.ts +28 -0
- package/assets/templates/next-tenant-app/src/design-system/tokens/foundation.css +31 -0
- package/assets/templates/next-tenant-app/src/design-system/tokens/index.css +3 -0
- package/assets/templates/next-tenant-app/src/design-system/tokens/manifest.json +85 -0
- package/assets/templates/next-tenant-app/src/design-system/tokens/manifest.ts +87 -0
- package/assets/templates/next-tenant-app/src/design-system/tokens/semantic.css +105 -0
- package/assets/templates/next-tenant-app/src/design-system/tokens/theme.css +59 -0
- package/assets/templates/next-tenant-app/src/design-system/tokens/tokens.stories.tsx +71 -0
- package/assets/templates/next-tenant-app/src/features/auth/components/login-screen.tsx +198 -0
- package/assets/templates/next-tenant-app/src/features/dashboard/components/tenant-dashboard.tsx +153 -0
- package/assets/templates/next-tenant-app/src/features/examples/runtime-command-demo/components/runtime-command-demo.tsx +342 -0
- package/assets/templates/next-tenant-app/src/features/public-shell/components/content-article.tsx +66 -0
- package/assets/templates/next-tenant-app/src/features/public-shell/components/content-collection.tsx +108 -0
- package/assets/templates/next-tenant-app/src/features/public-shell/components/marketing-page-canvas.tsx +111 -0
- package/assets/templates/next-tenant-app/src/features/public-shell/components/public-site-shell.tsx +111 -0
- package/assets/templates/next-tenant-app/src/features/shell/components/private-app-shell.tsx +624 -0
- package/assets/templates/next-tenant-app/src/lib/app-routes.test.ts +20 -0
- package/assets/templates/next-tenant-app/src/lib/app-routes.ts +59 -0
- package/assets/templates/next-tenant-app/src/lib/content/__fixtures__/public-site-snapshot.ts +189 -0
- package/assets/templates/next-tenant-app/src/lib/content/adapter.server.test.ts +318 -0
- package/assets/templates/next-tenant-app/src/lib/content/adapter.server.ts +232 -0
- package/assets/templates/next-tenant-app/src/lib/content/contracts.ts +339 -0
- package/assets/templates/next-tenant-app/src/lib/content/custom-adapter.ts +5 -0
- package/assets/templates/next-tenant-app/src/lib/content/empty-state.ts +96 -0
- package/assets/templates/next-tenant-app/src/lib/platform/auth.server.test.ts +75 -0
- package/assets/templates/next-tenant-app/src/lib/platform/auth.server.ts +25 -0
- package/assets/templates/next-tenant-app/src/lib/platform/client.server.test.ts +170 -0
- package/assets/templates/next-tenant-app/src/lib/platform/client.server.ts +661 -0
- package/assets/templates/next-tenant-app/src/lib/platform/contracts.ts +131 -0
- package/assets/templates/next-tenant-app/src/lib/platform/endpoints.server.ts +34 -0
- package/assets/templates/next-tenant-app/src/lib/platform/env.server.test.ts +102 -0
- package/assets/templates/next-tenant-app/src/lib/platform/env.server.ts +87 -0
- package/assets/templates/next-tenant-app/src/lib/platform/route-response.ts +33 -0
- package/assets/templates/next-tenant-app/src/lib/platform/session.server.ts +108 -0
- package/assets/templates/next-tenant-app/src/lib/public-site.test.ts +20 -0
- package/assets/templates/next-tenant-app/src/lib/public-site.ts +49 -0
- package/assets/templates/next-tenant-app/src/lib/theme-config.ts +10 -0
- package/assets/templates/next-tenant-app/src/lib/theme.tsx +159 -0
- package/assets/templates/next-tenant-app/src/lib/utils.ts +6 -0
- package/assets/templates/next-tenant-app/template.json +27 -0
- package/assets/templates/next-tenant-app/template.schema.json +160 -0
- package/assets/templates/next-tenant-app/test/server-only-stub.ts +1 -0
- package/assets/templates/next-tenant-app/tools/design-system/build-token-manifest.mjs +3 -0
- package/assets/templates/next-tenant-app/tools/design-system/check-imports.mjs +9 -0
- package/assets/templates/next-tenant-app/tools/design-system/check-stories.mjs +9 -0
- package/assets/templates/next-tenant-app/tools/design-system/check-values.mjs +9 -0
- package/assets/templates/next-tenant-app/tools/design-system/checks.mjs +238 -0
- package/assets/templates/next-tenant-app/tools/design-system/eslint-plugin-design-system.mjs +184 -0
- package/assets/templates/next-tenant-app/tools/design-system/playwright.config.mjs +34 -0
- package/assets/templates/next-tenant-app/tools/design-system/run-checks.mjs +22 -0
- package/assets/templates/next-tenant-app/tools/design-system/shared.mjs +166 -0
- package/assets/templates/next-tenant-app/tools/design-system/visual.spec.ts +41 -0
- package/assets/templates/next-tenant-app/tools/template/validate-route-contract.mjs +39 -0
- package/assets/templates/next-tenant-app/tools/template/validate-template.mjs +45 -0
- package/assets/templates/next-tenant-app/tsconfig.json +42 -0
- package/assets/templates/next-tenant-app/vitest.config.ts +25 -0
- package/bin/minutework.js +40 -0
- package/dist/auth.d.ts +59 -0
- package/dist/auth.js +338 -0
- package/dist/auth.js.map +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +26 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/compile.d.ts +20 -0
- package/dist/compile.js +121 -0
- package/dist/compile.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/deploy-state.d.ts +35 -0
- package/dist/deploy-state.js +30 -0
- package/dist/deploy-state.js.map +1 -0
- package/dist/deploy.d.ts +22 -0
- package/dist/deploy.js +308 -0
- package/dist/deploy.js.map +1 -0
- package/dist/developer-client.d.ts +88 -0
- package/dist/developer-client.js +78 -0
- package/dist/developer-client.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +290 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +22 -0
- package/dist/init.js +421 -0
- package/dist/init.js.map +1 -0
- package/dist/launcher.d.ts +1 -0
- package/dist/launcher.js +50 -0
- package/dist/launcher.js.map +1 -0
- package/dist/paths.d.ts +12 -0
- package/dist/paths.js +33 -0
- package/dist/paths.js.map +1 -0
- package/dist/sandbox.d.ts +30 -0
- package/dist/sandbox.js +852 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/state.d.ts +46 -0
- package/dist/state.js +82 -0
- package/dist/state.js.map +1 -0
- package/dist/tokens.d.ts +14 -0
- package/dist/tokens.js +293 -0
- package/dist/tokens.js.map +1 -0
- package/package.json +43 -0
package/dist/init.js
ADDED
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const ROOT_ENV_EXAMPLE = `# Optional repo-local MinuteWork CLI overrides.
|
|
5
|
+
# The local platform URL is wired automatically inside a MinuteWork workspace.
|
|
6
|
+
# Starter-local runtime variables stay inside tenant-app/.env.example and sidecar/.env.example.
|
|
7
|
+
MW_CLI_DEFAULT_ENV=preview
|
|
8
|
+
`;
|
|
9
|
+
const ROOT_GITIGNORE = `node_modules/
|
|
10
|
+
.venv/
|
|
11
|
+
__pycache__/
|
|
12
|
+
*.py[cod]
|
|
13
|
+
.pytest_cache/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
.next/
|
|
16
|
+
dist/
|
|
17
|
+
build/
|
|
18
|
+
storybook-static/
|
|
19
|
+
test-results/
|
|
20
|
+
*.tsbuildinfo
|
|
21
|
+
.env
|
|
22
|
+
.env.local
|
|
23
|
+
.minutework/
|
|
24
|
+
sidecar/.secrets/
|
|
25
|
+
`;
|
|
26
|
+
const SCHEMA_README = `# Schemas
|
|
27
|
+
|
|
28
|
+
This directory is the repo-authored schema layer for MinuteWork.
|
|
29
|
+
|
|
30
|
+
The default scaffolded authoring input is \`schemas/schema.ts\`.
|
|
31
|
+
|
|
32
|
+
MinuteWork also supports a root-level \`schema.mw\` file as an alternative
|
|
33
|
+
authoring input for later compiler work, but \`minutework init\` does not create
|
|
34
|
+
it by default.
|
|
35
|
+
|
|
36
|
+
The TypeScript path is the canonical local developer experience. It should use a
|
|
37
|
+
builder-style DSL that feels closer to Prisma/Drizzle-style authoring than to a
|
|
38
|
+
raw JSON blob, while still compiling into MinuteWork runtime contracts rather
|
|
39
|
+
than ORM tables.
|
|
40
|
+
|
|
41
|
+
Choose one authoring input per workspace. Do not keep both \`schemas/schema.ts\`
|
|
42
|
+
and \`schema.mw\` in the same repo.
|
|
43
|
+
`;
|
|
44
|
+
export const STARTER_IDS = ["tenant-app", "sidecar"];
|
|
45
|
+
const STARTER_ID_SET = new Set(STARTER_IDS);
|
|
46
|
+
const STARTER_DEFINITIONS = {
|
|
47
|
+
"tenant-app": {
|
|
48
|
+
destinationDirectory: "tenant-app",
|
|
49
|
+
templateDirectory: "next-tenant-app",
|
|
50
|
+
shouldSkip(relativePath) {
|
|
51
|
+
return (hasSkippedPathSegment(relativePath, [
|
|
52
|
+
".next",
|
|
53
|
+
"node_modules",
|
|
54
|
+
"storybook-static",
|
|
55
|
+
"test-results",
|
|
56
|
+
"__screenshots__",
|
|
57
|
+
"playwright-report",
|
|
58
|
+
]) ||
|
|
59
|
+
hasSkippedBasename(relativePath, ["pnpm-lock.yaml", "package-lock.json"]) ||
|
|
60
|
+
isLocalEnvFile(relativePath));
|
|
61
|
+
},
|
|
62
|
+
transformFile(relativePath, content, workspaceSlug) {
|
|
63
|
+
if (relativePath === "package.json") {
|
|
64
|
+
const parsed = JSON.parse(content);
|
|
65
|
+
parsed.name = `${workspaceSlug}-tenant-app`;
|
|
66
|
+
return JSON.stringify(parsed, null, 2) + "\n";
|
|
67
|
+
}
|
|
68
|
+
return content;
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
sidecar: {
|
|
72
|
+
destinationDirectory: "sidecar",
|
|
73
|
+
templateDirectory: "fastapi-sidecar",
|
|
74
|
+
shouldSkip(relativePath) {
|
|
75
|
+
return (hasSkippedPathSegment(relativePath, [".pytest_cache", ".ruff_cache", "__pycache__", ".venv"]) ||
|
|
76
|
+
hasSkippedBasename(relativePath, ["poetry.lock"]) ||
|
|
77
|
+
hasSkippedExtension(relativePath, [".pyc", ".pyo"]));
|
|
78
|
+
},
|
|
79
|
+
transformFile(relativePath, content, workspaceSlug) {
|
|
80
|
+
if (relativePath === "pyproject.toml") {
|
|
81
|
+
return content
|
|
82
|
+
.replace('name = "fastapi-sidecar-template"', `name = "${workspaceSlug}-sidecar"`)
|
|
83
|
+
.replace('description = "Canonical FastAPI internal sidecar scaffold for MinuteWork Builder."', 'description = "Generated MinuteWork internal sidecar scaffold."');
|
|
84
|
+
}
|
|
85
|
+
return content;
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
export async function runInit(options) {
|
|
90
|
+
const targetDirectory = path.resolve(options.cwd, options.targetDirectory);
|
|
91
|
+
await ensureEmptyDirectory(targetDirectory);
|
|
92
|
+
const workspaceSlug = deriveWorkspaceSlug(targetDirectory);
|
|
93
|
+
await fs.mkdir(targetDirectory, { recursive: true });
|
|
94
|
+
await Promise.all([
|
|
95
|
+
fs.mkdir(path.join(targetDirectory, ".cursor"), { recursive: true }),
|
|
96
|
+
fs.mkdir(path.join(targetDirectory, "mcp"), { recursive: true }),
|
|
97
|
+
fs.mkdir(path.join(targetDirectory, "schemas"), { recursive: true }),
|
|
98
|
+
fs.mkdir(path.join(targetDirectory, ".minutework"), { recursive: true }),
|
|
99
|
+
]);
|
|
100
|
+
await writeBaseWorkspace(targetDirectory, workspaceSlug, options.starters);
|
|
101
|
+
await materializeBuilderClaudeBundle(targetDirectory);
|
|
102
|
+
if (options.starters.tenantApp) {
|
|
103
|
+
await materializeStarter(targetDirectory, workspaceSlug, "tenant-app");
|
|
104
|
+
await writeRootNodeWorkspace(targetDirectory, workspaceSlug, options.starters);
|
|
105
|
+
}
|
|
106
|
+
if (options.starters.sidecar) {
|
|
107
|
+
await materializeStarter(targetDirectory, workspaceSlug, "sidecar");
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
rootDirectory: targetDirectory,
|
|
111
|
+
workspaceSlug,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function deriveWorkspaceSlug(targetDirectory) {
|
|
115
|
+
const basename = path.basename(path.resolve(targetDirectory));
|
|
116
|
+
const normalized = basename
|
|
117
|
+
.toLowerCase()
|
|
118
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
119
|
+
.replace(/^-+|-+$/g, "")
|
|
120
|
+
.slice(0, 48);
|
|
121
|
+
return normalized || "minutework-workspace";
|
|
122
|
+
}
|
|
123
|
+
async function ensureEmptyDirectory(targetDirectory) {
|
|
124
|
+
const stats = await fs.stat(targetDirectory).catch((error) => {
|
|
125
|
+
if (error.code === "ENOENT") {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
});
|
|
130
|
+
if (!stats) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!stats.isDirectory()) {
|
|
134
|
+
throw new Error(`Target path already exists and is not a directory: ${targetDirectory}`);
|
|
135
|
+
}
|
|
136
|
+
const entries = await fs.readdir(targetDirectory);
|
|
137
|
+
if (entries.length > 0) {
|
|
138
|
+
throw new Error(`Target directory must be empty. Refusing to scaffold into an existing workspace: ${targetDirectory}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function writeBaseWorkspace(targetDirectory, workspaceSlug, starters) {
|
|
142
|
+
await Promise.all([
|
|
143
|
+
fs.writeFile(path.join(targetDirectory, ".env.example"), ROOT_ENV_EXAMPLE, "utf8"),
|
|
144
|
+
fs.writeFile(path.join(targetDirectory, ".gitignore"), ROOT_GITIGNORE, "utf8"),
|
|
145
|
+
fs.writeFile(path.join(targetDirectory, "minutework.config.ts"), renderMinuteWorkConfig(workspaceSlug, starters), "utf8"),
|
|
146
|
+
fs.writeFile(path.join(targetDirectory, "schemas", "README.md"), SCHEMA_README, "utf8"),
|
|
147
|
+
fs.writeFile(path.join(targetDirectory, "schemas", "schema.ts"), renderSchemaSeed(workspaceSlug), "utf8"),
|
|
148
|
+
fs.writeFile(path.join(targetDirectory, ".cursor", "mcp.json"), JSON.stringify(renderCursorMcpConfig(), null, 2) + "\n", "utf8"),
|
|
149
|
+
fs.writeFile(path.join(targetDirectory, "mcp", "claude-desktop.sample.json"), JSON.stringify(renderClaudeDesktopSample(), null, 2) + "\n", "utf8"),
|
|
150
|
+
]);
|
|
151
|
+
}
|
|
152
|
+
async function writeRootNodeWorkspace(targetDirectory, workspaceSlug, starters) {
|
|
153
|
+
await Promise.all([
|
|
154
|
+
fs.writeFile(path.join(targetDirectory, "package.json"), JSON.stringify(renderRootPackageJson(workspaceSlug, starters), null, 2) + "\n", "utf8"),
|
|
155
|
+
fs.writeFile(path.join(targetDirectory, "pnpm-workspace.yaml"), "packages:\n - 'tenant-app'\n", "utf8"),
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
export function isStarterId(value) {
|
|
159
|
+
return STARTER_ID_SET.has(value);
|
|
160
|
+
}
|
|
161
|
+
export function resolveCliPackageRoot(moduleUrl) {
|
|
162
|
+
return path.resolve(path.dirname(fileURLToPath(moduleUrl)), "..");
|
|
163
|
+
}
|
|
164
|
+
export function resolveBundledStarterTemplateRoot(moduleUrl, starterId) {
|
|
165
|
+
return path.join(resolveCliPackageRoot(moduleUrl), "assets", "templates", STARTER_DEFINITIONS[starterId].templateDirectory);
|
|
166
|
+
}
|
|
167
|
+
export function resolveBundledBuilderBundleRoot(moduleUrl) {
|
|
168
|
+
return path.join(resolveCliPackageRoot(moduleUrl), "assets", "claude-local");
|
|
169
|
+
}
|
|
170
|
+
export function shouldSkipStarterMaterializationPath(starterId, relativePath) {
|
|
171
|
+
return STARTER_DEFINITIONS[starterId].shouldSkip(relativePath);
|
|
172
|
+
}
|
|
173
|
+
async function materializeStarter(targetDirectory, workspaceSlug, starterId) {
|
|
174
|
+
const starterDefinition = STARTER_DEFINITIONS[starterId];
|
|
175
|
+
const templateRoot = await requireBundledStarterTemplateRoot(import.meta.url, starterId);
|
|
176
|
+
const destinationRoot = path.join(targetDirectory, starterDefinition.destinationDirectory);
|
|
177
|
+
await copyDirectory({
|
|
178
|
+
destinationRoot,
|
|
179
|
+
sourceRoot: templateRoot,
|
|
180
|
+
shouldSkip(relativePath) {
|
|
181
|
+
return starterDefinition.shouldSkip(relativePath);
|
|
182
|
+
},
|
|
183
|
+
transformFile(relativePath, content) {
|
|
184
|
+
return starterDefinition.transformFile(relativePath, content, workspaceSlug);
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
async function materializeBuilderClaudeBundle(targetDirectory) {
|
|
189
|
+
const bundleRoot = await requireBundledBuilderBundleRoot(import.meta.url);
|
|
190
|
+
const manifestPath = path.join(bundleRoot, "bundle.json");
|
|
191
|
+
const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
|
|
192
|
+
const templatePath = path.join(bundleRoot, manifest.render.template);
|
|
193
|
+
const renderedClaudeMd = await fs.readFile(templatePath, "utf8");
|
|
194
|
+
await fs.writeFile(path.join(targetDirectory, manifest.render.output), renderedClaudeMd, "utf8");
|
|
195
|
+
const skillsSourceRoot = path.join(bundleRoot, manifest.directories.skills);
|
|
196
|
+
const skillsStats = await fs.stat(skillsSourceRoot).catch((error) => {
|
|
197
|
+
if (error.code === "ENOENT") {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
throw error;
|
|
201
|
+
});
|
|
202
|
+
if (!skillsStats?.isDirectory()) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
await copyDirectory({
|
|
206
|
+
destinationRoot: path.join(targetDirectory, manifest.directories.skills),
|
|
207
|
+
sourceRoot: skillsSourceRoot,
|
|
208
|
+
shouldSkip() {
|
|
209
|
+
return false;
|
|
210
|
+
},
|
|
211
|
+
transformFile(_relativePath, content) {
|
|
212
|
+
return content;
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
async function copyDirectory(options) {
|
|
217
|
+
await fs.mkdir(options.destinationRoot, { recursive: true });
|
|
218
|
+
await walkAndCopy(options, "");
|
|
219
|
+
}
|
|
220
|
+
async function walkAndCopy(options, relativeDirectory) {
|
|
221
|
+
const sourceDirectory = path.join(options.sourceRoot, relativeDirectory);
|
|
222
|
+
const entries = await fs.readdir(sourceDirectory, { withFileTypes: true });
|
|
223
|
+
for (const entry of entries) {
|
|
224
|
+
const relativePath = relativeDirectory ? path.join(relativeDirectory, entry.name) : entry.name;
|
|
225
|
+
if (options.shouldSkip(relativePath)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const sourcePath = path.join(options.sourceRoot, relativePath);
|
|
229
|
+
const destinationPath = path.join(options.destinationRoot, relativePath);
|
|
230
|
+
if (entry.isDirectory()) {
|
|
231
|
+
await fs.mkdir(destinationPath, { recursive: true });
|
|
232
|
+
await walkAndCopy(options, relativePath);
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
if (!entry.isFile()) {
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const transformedContent = options.transformFile(relativePath, await fs.readFile(sourcePath, "utf8"));
|
|
239
|
+
await fs.mkdir(path.dirname(destinationPath), { recursive: true });
|
|
240
|
+
await fs.writeFile(destinationPath, transformedContent, "utf8");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function renderMinuteWorkConfig(workspaceSlug, starters) {
|
|
244
|
+
return `const config = {
|
|
245
|
+
workspace: {
|
|
246
|
+
name: "${workspaceSlug}",
|
|
247
|
+
},
|
|
248
|
+
schema: {
|
|
249
|
+
// The default scaffold uses schemas/schema.ts as the canonical TypeScript
|
|
250
|
+
// authoring path. A root schema.mw file is a supported compact alternative
|
|
251
|
+
// for later compile/validate flows, not a second default scaffold.
|
|
252
|
+
directory: "schemas",
|
|
253
|
+
entrypoint: "schemas/schema.ts",
|
|
254
|
+
},
|
|
255
|
+
starters: {
|
|
256
|
+
tenantApp: {
|
|
257
|
+
enabled: ${starters.tenantApp},
|
|
258
|
+
path: "tenant-app",
|
|
259
|
+
},
|
|
260
|
+
sidecar: {
|
|
261
|
+
enabled: ${starters.sidecar},
|
|
262
|
+
path: "sidecar",
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
localState: {
|
|
266
|
+
directory: ".minutework",
|
|
267
|
+
},
|
|
268
|
+
platform: {
|
|
269
|
+
defaultEnvironment: "preview",
|
|
270
|
+
},
|
|
271
|
+
mcp: {
|
|
272
|
+
cursorConfigPath: ".cursor/mcp.json",
|
|
273
|
+
claudeDesktopSamplePath: "mcp/claude-desktop.sample.json",
|
|
274
|
+
},
|
|
275
|
+
} as const;
|
|
276
|
+
|
|
277
|
+
export default config;
|
|
278
|
+
`;
|
|
279
|
+
}
|
|
280
|
+
function renderSchemaSeed(workspaceSlug) {
|
|
281
|
+
return `// Default MinuteWork schema authoring input.
|
|
282
|
+
// A root-level schema.mw file is supported as an alternative, but init seeds
|
|
283
|
+
// exactly one input by default.
|
|
284
|
+
// These tiny local helpers mirror the TypeScript-first schema DSL shape without
|
|
285
|
+
// requiring extra workspace package installs before validate/compile runs.
|
|
286
|
+
type FieldOptions = {
|
|
287
|
+
description?: string;
|
|
288
|
+
indexed?: boolean;
|
|
289
|
+
maxLength?: number;
|
|
290
|
+
required?: boolean;
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
const defineSchema = <const T>(schema: T) => schema;
|
|
294
|
+
|
|
295
|
+
const entity = <const TFields extends Record<string, unknown>>(
|
|
296
|
+
name: string,
|
|
297
|
+
config: {
|
|
298
|
+
description?: string;
|
|
299
|
+
fields: TFields;
|
|
300
|
+
},
|
|
301
|
+
) => ({
|
|
302
|
+
name,
|
|
303
|
+
...config,
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
const text = (options: FieldOptions = {}) => ({
|
|
307
|
+
type: "text",
|
|
308
|
+
...options,
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
const enumeration = (
|
|
312
|
+
values: readonly string[],
|
|
313
|
+
options: Omit<FieldOptions, "maxLength"> = {},
|
|
314
|
+
) => ({
|
|
315
|
+
type: "enum",
|
|
316
|
+
values,
|
|
317
|
+
...options,
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
export const schema = defineSchema({
|
|
321
|
+
namespace: "${workspaceSlug}",
|
|
322
|
+
entities: [
|
|
323
|
+
entity("ExampleRecord", {
|
|
324
|
+
description: "Starter entity for local MinuteWork schema authoring.",
|
|
325
|
+
fields: {
|
|
326
|
+
title: text({
|
|
327
|
+
description: "Human-readable label for the record.",
|
|
328
|
+
maxLength: 160,
|
|
329
|
+
required: true,
|
|
330
|
+
}),
|
|
331
|
+
status: enumeration(["draft", "active", "archived"], {
|
|
332
|
+
description: "Starter lifecycle state for local authoring and validation.",
|
|
333
|
+
indexed: true,
|
|
334
|
+
required: true,
|
|
335
|
+
}),
|
|
336
|
+
},
|
|
337
|
+
}),
|
|
338
|
+
],
|
|
339
|
+
} as const);
|
|
340
|
+
`;
|
|
341
|
+
}
|
|
342
|
+
function renderCursorMcpConfig() {
|
|
343
|
+
return {
|
|
344
|
+
mcpServers: {
|
|
345
|
+
minutework: {
|
|
346
|
+
command: "npx",
|
|
347
|
+
args: ["-y", "minutework", "mcp"],
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
function renderClaudeDesktopSample() {
|
|
353
|
+
return {
|
|
354
|
+
mcpServers: {
|
|
355
|
+
minutework: {
|
|
356
|
+
command: "npx",
|
|
357
|
+
args: ["-y", "minutework", "mcp"],
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
function renderRootPackageJson(workspaceSlug, starters) {
|
|
363
|
+
const scripts = {
|
|
364
|
+
"dev:tenant-app": "pnpm --dir tenant-app dev",
|
|
365
|
+
"build:tenant-app": "pnpm --dir tenant-app build",
|
|
366
|
+
"test:tenant-app": "pnpm --dir tenant-app test",
|
|
367
|
+
"typecheck:tenant-app": "pnpm --dir tenant-app typecheck",
|
|
368
|
+
};
|
|
369
|
+
if (starters.sidecar) {
|
|
370
|
+
scripts["dev:sidecar"] = "cd sidecar && poetry run uvicorn fastapi_sidecar.main:app --reload";
|
|
371
|
+
scripts["test:sidecar"] = "cd sidecar && poetry run pytest";
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
name: workspaceSlug,
|
|
375
|
+
version: "0.1.0",
|
|
376
|
+
private: true,
|
|
377
|
+
packageManager: "pnpm@9.0.0",
|
|
378
|
+
scripts,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
async function requireBundledStarterTemplateRoot(moduleUrl, starterId) {
|
|
382
|
+
const templateRoot = resolveBundledStarterTemplateRoot(moduleUrl, starterId);
|
|
383
|
+
const stats = await fs.stat(templateRoot).catch((error) => {
|
|
384
|
+
if (error.code === "ENOENT") {
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
throw error;
|
|
388
|
+
});
|
|
389
|
+
if (!stats?.isDirectory()) {
|
|
390
|
+
throw new Error(`Bundled ${starterId} starter assets are missing at ${templateRoot}. Run the CLI asset sync/build step before using "minutework init".`);
|
|
391
|
+
}
|
|
392
|
+
return templateRoot;
|
|
393
|
+
}
|
|
394
|
+
async function requireBundledBuilderBundleRoot(moduleUrl) {
|
|
395
|
+
const bundleRoot = resolveBundledBuilderBundleRoot(moduleUrl);
|
|
396
|
+
const stats = await fs.stat(bundleRoot).catch((error) => {
|
|
397
|
+
if (error.code === "ENOENT") {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
throw error;
|
|
401
|
+
});
|
|
402
|
+
if (!stats?.isDirectory()) {
|
|
403
|
+
throw new Error(`Bundled Builder Claude assets are missing at ${bundleRoot}. Run the CLI asset sync/build step before using "minutework init".`);
|
|
404
|
+
}
|
|
405
|
+
return bundleRoot;
|
|
406
|
+
}
|
|
407
|
+
function hasSkippedBasename(relativePath, basenames) {
|
|
408
|
+
return basenames.includes(path.basename(relativePath));
|
|
409
|
+
}
|
|
410
|
+
function isLocalEnvFile(relativePath) {
|
|
411
|
+
const basename = path.basename(relativePath);
|
|
412
|
+
return basename.startsWith(".env") && basename !== ".env.example";
|
|
413
|
+
}
|
|
414
|
+
function hasSkippedExtension(relativePath, extensions) {
|
|
415
|
+
return extensions.some((extension) => relativePath.endsWith(extension));
|
|
416
|
+
}
|
|
417
|
+
function hasSkippedPathSegment(relativePath, segmentsToSkip) {
|
|
418
|
+
const segments = relativePath.split(path.sep).filter(Boolean);
|
|
419
|
+
return segments.some((segment) => segmentsToSkip.includes(segment));
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,gBAAgB,GAAG;;;;CAIxB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;CAgBtB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;CAiBrB,CAAC;AAOF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,SAAS,CAAU,CAAC;AAqB9D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,WAAW,CAAC,CAAC;AAEpD,MAAM,mBAAmB,GAAyC;IAChE,YAAY,EAAE;QACZ,oBAAoB,EAAE,YAAY;QAClC,iBAAiB,EAAE,iBAAiB;QACpC,UAAU,CAAC,YAAY;YACrB,OAAO,CACL,qBAAqB,CAAC,YAAY,EAAE;gBAClC,OAAO;gBACP,cAAc;gBACd,kBAAkB;gBAClB,cAAc;gBACd,iBAAiB;gBACjB,mBAAmB;aACpB,CAAC;gBACF,kBAAkB,CAAC,YAAY,EAAE,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;gBACzE,cAAc,CAAC,YAAY,CAAC,CAC7B,CAAC;QACJ,CAAC;QACD,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,aAAa;YAChD,IAAI,YAAY,KAAK,cAAc,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,CAAC,IAAI,GAAG,GAAG,aAAa,aAAa,CAAC;gBAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YAChD,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF;IACD,OAAO,EAAE;QACP,oBAAoB,EAAE,SAAS;QAC/B,iBAAiB,EAAE,iBAAiB;QACpC,UAAU,CAAC,YAAY;YACrB,OAAO,CACL,qBAAqB,CAAC,YAAY,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;gBAC7F,kBAAkB,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,CAAC;gBACjD,mBAAmB,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CACpD,CAAC;QACJ,CAAC;QACD,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,aAAa;YAChD,IAAI,YAAY,KAAK,gBAAgB,EAAE,CAAC;gBACtC,OAAO,OAAO;qBACX,OAAO,CAAC,mCAAmC,EAAE,WAAW,aAAa,WAAW,CAAC;qBACjF,OAAO,CACN,qFAAqF,EACrF,iEAAiE,CAClE,CAAC;YACN,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;KACF;CACF,CAAC;AAQF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAIhD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3E,MAAM,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,aAAa,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACpE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACzE,CAAC,CAAC;IAEH,MAAM,kBAAkB,CAAC,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3E,MAAM,8BAA8B,CAAC,eAAe,CAAC,CAAC;IAEtD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,kBAAkB,CAAC,eAAe,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QACvE,MAAM,sBAAsB,CAAC,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,kBAAkB,CAAC,eAAe,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,aAAa,EAAE,eAAe;QAC9B,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,eAAuB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,QAAQ;SACxB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,OAAO,UAAU,IAAI,sBAAsB,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,eAAuB;IACzD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QAClF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,eAAe,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,oFAAoF,eAAe,EAAE,CACtG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,eAAuB,EACvB,aAAqB,EACrB,QAA0B;IAE1B,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC;QAClF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC;QAC9E,EAAE,CAAC,SAAS,CACV,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,sBAAsB,CAAC,EAClD,sBAAsB,CAAC,aAAa,EAAE,QAAQ,CAAC,EAC/C,MAAM,CACP;QACD,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC;QACvF,EAAE,CAAC,SAAS,CACV,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,WAAW,CAAC,EAClD,gBAAgB,CAAC,aAAa,CAAC,EAC/B,MAAM,CACP;QACD,EAAE,CAAC,SAAS,CACV,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,UAAU,CAAC,EACjD,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACvD,MAAM,CACP;QACD,EAAE,CAAC,SAAS,CACV,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,4BAA4B,CAAC,EAC/D,IAAI,CAAC,SAAS,CAAC,yBAAyB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAC3D,MAAM,CACP;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,eAAuB,EACvB,aAAqB,EACrB,QAA0B;IAE1B,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,SAAS,CACV,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,EAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAC9E,MAAM,CACP;QACD,EAAE,CAAC,SAAS,CACV,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,qBAAqB,CAAC,EACjD,+BAA+B,EAC/B,MAAM,CACP;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,SAAiB,EAAE,SAAoB;IACvF,OAAO,IAAI,CAAC,IAAI,CACd,qBAAqB,CAAC,SAAS,CAAC,EAChC,QAAQ,EACR,WAAW,EACX,mBAAmB,CAAC,SAAS,CAAC,CAAC,iBAAiB,CACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,SAAiB;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,SAAoB,EAAE,YAAoB;IAC7F,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,eAAuB,EACvB,aAAqB,EACrB,SAAoB;IAEpB,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,MAAM,iCAAiC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IAE3F,MAAM,aAAa,CAAC;QAClB,eAAe;QACf,UAAU,EAAE,YAAY;QACxB,UAAU,CAAC,YAAY;YACrB,OAAO,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC;QACD,aAAa,CAAC,YAAY,EAAE,OAAO;YACjC,OAAO,iBAAiB,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/E,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,eAAuB;IACnE,MAAM,UAAU,GAAG,MAAM,+BAA+B,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CACT,CAAC;IACjC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrE,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAEjE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAClD,gBAAgB,EAChB,MAAM,CACP,CAAC;IAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QACzF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,aAAa,CAAC;QAClB,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC;QACxE,UAAU,EAAE,gBAAgB;QAC5B,UAAU;YACR,OAAO,KAAK,CAAC;QACf,CAAC;QACD,aAAa,CAAC,aAAa,EAAE,OAAO;YAClC,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAK5B;IACC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAKC,EACD,iBAAyB;IAEzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/F,IAAI,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACrC,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAEzE,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YACzC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAC9C,YAAY,EACZ,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CACtC,CAAC;QACF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,aAAqB,EAAE,QAA0B;IAC/E,OAAO;;aAEI,aAAa;;;;;;;;;;;iBAWT,QAAQ,CAAC,SAAS;;;;iBAIlB,QAAQ,CAAC,OAAO;;;;;;;;;;;;;;;;;CAiBhC,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,aAAqB;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAwCO,aAAa;;;;;;;;;;;;;;;;;;;CAmB5B,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;QACL,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC;aAClC;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB;IAChC,OAAO;QACL,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC;aAClC;SACF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,aAAqB,EAAE,QAA0B;IAC9E,MAAM,OAAO,GAA2B;QACtC,gBAAgB,EAAE,2BAA2B;QAC7C,kBAAkB,EAAE,6BAA6B;QACjD,iBAAiB,EAAE,4BAA4B;QAC/C,sBAAsB,EAAE,iCAAiC;KAC1D,CAAC;IAEF,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,aAAa,CAAC,GAAG,oEAAoE,CAAC;QAC9F,OAAO,CAAC,cAAc,CAAC,GAAG,iCAAiC,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,YAAY;QAC5B,OAAO;KACR,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iCAAiC,CAAC,SAAiB,EAAE,SAAoB;IACtF,MAAM,YAAY,GAAG,iCAAiC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QAC/E,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,kCAAkC,YAAY,qEAAqE,CACxI,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,+BAA+B,CAAC,SAAiB;IAC9D,MAAM,UAAU,GAAG,+BAA+B,CAAC,SAAS,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QAC7E,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,gDAAgD,UAAU,qEAAqE,CAChI,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAoB,EAAE,SAAmB;IACnE,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC7C,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,QAAQ,KAAK,cAAc,CAAC;AACpE,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB,EAAE,UAAoB;IACrE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAoB,EAAE,cAAwB;IAC3E,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runCliFromPackageRoot(moduleUrl: string, argv: string[]): Promise<number>;
|
package/dist/launcher.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
import { createJiti } from "jiti";
|
|
5
|
+
export async function runCliFromPackageRoot(moduleUrl, argv) {
|
|
6
|
+
const packageRoot = resolvePackageRoot(moduleUrl);
|
|
7
|
+
const srcIndexPath = path.join(packageRoot, "src", "index.ts");
|
|
8
|
+
const distIndexPath = path.join(packageRoot, "dist", "index.js");
|
|
9
|
+
const runCli = (await exists(srcIndexPath))
|
|
10
|
+
? await loadRunCliFromSource(srcIndexPath)
|
|
11
|
+
: await loadRunCliFromDist(distIndexPath);
|
|
12
|
+
return runCli(argv);
|
|
13
|
+
}
|
|
14
|
+
async function loadRunCliFromSource(srcIndexPath) {
|
|
15
|
+
const jiti = createJiti(import.meta.url, {
|
|
16
|
+
fsCache: false,
|
|
17
|
+
interopDefault: false,
|
|
18
|
+
moduleCache: false,
|
|
19
|
+
});
|
|
20
|
+
const loaded = await jiti.import(srcIndexPath);
|
|
21
|
+
return pickRunCli(loaded, srcIndexPath);
|
|
22
|
+
}
|
|
23
|
+
async function loadRunCliFromDist(distIndexPath) {
|
|
24
|
+
const loaded = await import(pathToFileURL(distIndexPath).href);
|
|
25
|
+
return pickRunCli(loaded, distIndexPath);
|
|
26
|
+
}
|
|
27
|
+
function pickRunCli(loaded, sourcePath) {
|
|
28
|
+
const candidate = loaded;
|
|
29
|
+
if (typeof candidate.runCli !== "function") {
|
|
30
|
+
throw new Error(`MinuteWork CLI entrypoint did not export runCli: ${sourcePath}`);
|
|
31
|
+
}
|
|
32
|
+
return candidate.runCli;
|
|
33
|
+
}
|
|
34
|
+
function resolvePackageRoot(moduleUrl) {
|
|
35
|
+
return path.resolve(path.dirname(fileURLToPath(moduleUrl)), "..");
|
|
36
|
+
}
|
|
37
|
+
async function exists(targetPath) {
|
|
38
|
+
try {
|
|
39
|
+
await fs.access(targetPath);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const errno = error;
|
|
44
|
+
if (errno.code === "ENOENT") {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAIlC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,IAAc;IAC3E,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC,CAAC,MAAM,oBAAoB,CAAC,YAAY,CAAC;QAC1C,CAAC,CAAC,MAAM,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,YAAoB;IACtD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACvC,OAAO,EAAE,KAAK;QACd,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,aAAqB;IACrD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,MAAe,EAAE,UAAkB;IACrD,MAAM,SAAS,GAAG,MAA6B,CAAC;IAChD,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,oDAAoD,UAAU,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,UAAkB;IACtC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,KAA8B,CAAC;QAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type PlatformName = NodeJS.Platform;
|
|
2
|
+
export type CliStatePaths = {
|
|
3
|
+
platform: PlatformName;
|
|
4
|
+
minuteworkHome: string;
|
|
5
|
+
cliRoot: string;
|
|
6
|
+
authRoot: string;
|
|
7
|
+
workspacesRoot: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function resolveCliStatePaths(options?: {
|
|
10
|
+
env?: NodeJS.ProcessEnv;
|
|
11
|
+
platform?: PlatformName;
|
|
12
|
+
}): CliStatePaths;
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export function resolveCliStatePaths(options) {
|
|
3
|
+
const env = options?.env ?? process.env;
|
|
4
|
+
const platform = options?.platform ?? process.platform;
|
|
5
|
+
const home = env.HOME ?? env.USERPROFILE ?? "";
|
|
6
|
+
const localAppData = env.LOCALAPPDATA ?? "";
|
|
7
|
+
let minuteworkHome;
|
|
8
|
+
if (platform === "darwin") {
|
|
9
|
+
minuteworkHome = path.posix.join(home || "~", "Library", "Application Support", "MinuteWork");
|
|
10
|
+
}
|
|
11
|
+
else if (platform === "linux") {
|
|
12
|
+
minuteworkHome = path.posix.join(home || "~", ".local", "share", "minutework");
|
|
13
|
+
}
|
|
14
|
+
else if (platform === "win32") {
|
|
15
|
+
const windowsBase = localAppData ||
|
|
16
|
+
(home ? path.win32.join(home, "AppData", "Local") : path.win32.join("~", "AppData", "Local"));
|
|
17
|
+
minuteworkHome = path.win32.join(windowsBase, "MinuteWork");
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
throw new Error(`Unsupported platform for MinuteWork CLI state: ${platform}`);
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
platform,
|
|
24
|
+
minuteworkHome,
|
|
25
|
+
cliRoot: joinForPlatform(platform, minuteworkHome, "cli"),
|
|
26
|
+
authRoot: joinForPlatform(platform, minuteworkHome, "cli", "auth"),
|
|
27
|
+
workspacesRoot: joinForPlatform(platform, minuteworkHome, "cli", "workspaces"),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function joinForPlatform(platform, root, ...segments) {
|
|
31
|
+
return platform === "win32" ? path.win32.join(root, ...segments) : path.posix.join(root, ...segments);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAY7B,MAAM,UAAU,oBAAoB,CAAC,OAGpC;IACC,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACxC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACvD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAE5C,IAAI,cAAsB,CAAC;IAE3B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,CAAC,CAAC;IAChG,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACjF,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,MAAM,WAAW,GACf,YAAY;YACZ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAChG,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,kDAAkD,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,OAAO;QACL,QAAQ;QACR,cAAc;QACd,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC;QACzD,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC;QAClE,cAAc,EAAE,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,CAAC;KAC/E,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,QAAsB,EAAE,IAAY,EAAE,GAAG,QAAkB;IAClF,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as childProcess from "node:child_process";
|
|
2
|
+
import type { CliIo } from "./index.js";
|
|
3
|
+
type LocalRuntimeSignalTarget = {
|
|
4
|
+
off: (signal: NodeJS.Signals, listener: () => void) => void;
|
|
5
|
+
on: (signal: NodeJS.Signals, listener: () => void) => void;
|
|
6
|
+
};
|
|
7
|
+
type LocalRuntimeCommandOptions = {
|
|
8
|
+
args: string[];
|
|
9
|
+
cwd: string;
|
|
10
|
+
dependencies?: LocalRuntimeDependencies;
|
|
11
|
+
env: NodeJS.ProcessEnv;
|
|
12
|
+
io: CliIo;
|
|
13
|
+
platform: NodeJS.Platform;
|
|
14
|
+
};
|
|
15
|
+
export type LocalRuntimeSpawnProcess = (program: string, args: readonly string[], options: childProcess.SpawnOptions) => childProcess.ChildProcess;
|
|
16
|
+
export type LocalRuntimeDependencies = {
|
|
17
|
+
controllerPid?: number;
|
|
18
|
+
signalTarget?: LocalRuntimeSignalTarget;
|
|
19
|
+
spawnProcess?: LocalRuntimeSpawnProcess;
|
|
20
|
+
};
|
|
21
|
+
export declare function runSandboxCommand(options: {
|
|
22
|
+
args: string[];
|
|
23
|
+
cwd: string;
|
|
24
|
+
env: NodeJS.ProcessEnv;
|
|
25
|
+
io: CliIo;
|
|
26
|
+
platform: NodeJS.Platform;
|
|
27
|
+
}): Promise<0 | 1>;
|
|
28
|
+
export declare function runDevCommand(options: LocalRuntimeCommandOptions): Promise<number>;
|
|
29
|
+
export declare function runTestCommand(options: LocalRuntimeCommandOptions): Promise<number>;
|
|
30
|
+
export {};
|