minutework 0.1.8 → 0.1.11
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 +3 -0
- package/README.md +2 -0
- package/assets/claude-local/CLAUDE.md.template +60 -0
- package/assets/claude-local/skills/README.md +14 -0
- package/assets/claude-local/skills/ai-capability-defaults.md +21 -0
- package/assets/claude-local/skills/app-pack-authoring.md +16 -0
- package/assets/claude-local/skills/capability-gap-reporting.md +26 -0
- package/assets/claude-local/skills/email-ingress-and-thread-routing.md +36 -0
- package/assets/claude-local/skills/generated-workspace-architecture.md +55 -0
- package/assets/claude-local/skills/layering-and-import-modes.md +28 -0
- package/assets/claude-local/skills/ontology-mapping.md +16 -1
- package/assets/claude-local/skills/runtime-capability-inventory.md +46 -0
- package/assets/claude-local/skills/shadow-participation-and-guest-threads.md +33 -0
- package/assets/claude-local/skills/sidecar-generation.md +4 -0
- package/dist/cli.js +0 -0
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/init.js +5 -64
- package/dist/init.js.map +1 -1
- package/dist/orchestrator-context.js +15 -1
- package/dist/orchestrator-context.js.map +1 -1
- package/dist/orchestrator-state.d.ts +12 -5
- package/dist/orchestrator-state.js +1 -1
- package/dist/orchestrator-state.js.map +1 -1
- package/dist/orchestrator.js +6 -2
- package/dist/orchestrator.js.map +1 -1
- package/dist/reporting.js +1 -1
- package/dist/reporting.js.map +1 -1
- package/dist/sandbox.js +1 -1
- package/dist/sandbox.js.map +1 -1
- package/dist/workspace-assets.d.ts +56 -0
- package/dist/workspace-assets.js +409 -0
- package/dist/workspace-assets.js.map +1 -0
- package/dist/workspace.d.ts +8 -0
- package/dist/workspace.js +158 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +7 -5
- package/vendor/workspace-mcp/cli.d.ts +2 -0
- package/vendor/workspace-mcp/cli.js +5 -0
- package/vendor/workspace-mcp/cli.js.map +1 -0
- package/vendor/workspace-mcp/context.d.ts +89 -0
- package/vendor/workspace-mcp/context.js +1840 -0
- package/vendor/workspace-mcp/context.js.map +1 -0
- package/vendor/workspace-mcp/index.d.ts +5 -0
- package/vendor/workspace-mcp/index.js +4 -0
- package/vendor/workspace-mcp/index.js.map +1 -0
- package/vendor/workspace-mcp/runtime-state.d.ts +23 -0
- package/vendor/workspace-mcp/runtime-state.js +88 -0
- package/vendor/workspace-mcp/runtime-state.js.map +1 -0
- package/vendor/workspace-mcp/server.d.ts +17 -0
- package/vendor/workspace-mcp/server.js +94 -0
- package/vendor/workspace-mcp/server.js.map +1 -0
- package/vendor/workspace-mcp/types.d.ts +1527 -0
- package/vendor/workspace-mcp/types.js +432 -0
- package/vendor/workspace-mcp/types.js.map +1 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { PlatformName } from "./paths.js";
|
|
2
|
+
export declare const DEFAULT_MANAGED_WORKSPACE_ASSET_MANIFEST_PATH: string;
|
|
3
|
+
export type ManagedWorkspaceAsset = {
|
|
4
|
+
assetId: string;
|
|
5
|
+
appliedDigest: string;
|
|
6
|
+
content: string;
|
|
7
|
+
relativePath: string;
|
|
8
|
+
};
|
|
9
|
+
export type ManagedWorkspaceAssetManifest = {
|
|
10
|
+
cli: {
|
|
11
|
+
package: string;
|
|
12
|
+
version: string;
|
|
13
|
+
};
|
|
14
|
+
entries: Array<{
|
|
15
|
+
appliedDigest: string;
|
|
16
|
+
assetId: string;
|
|
17
|
+
path: string;
|
|
18
|
+
}>;
|
|
19
|
+
treeDigest: string;
|
|
20
|
+
version: number;
|
|
21
|
+
};
|
|
22
|
+
export type WorkspaceAssetSyncResult = {
|
|
23
|
+
blockedByConflicts: boolean;
|
|
24
|
+
check: boolean;
|
|
25
|
+
conflicts: string[];
|
|
26
|
+
created: string[];
|
|
27
|
+
deleted: string[];
|
|
28
|
+
manifestUpdated: boolean;
|
|
29
|
+
updated: string[];
|
|
30
|
+
workspaceRoot: string;
|
|
31
|
+
};
|
|
32
|
+
export declare function resolveManagedWorkspaceMcpSpecifierFromPackageMetadata(metadata: {
|
|
33
|
+
dependencies: Record<string, string>;
|
|
34
|
+
isPublishedInstall?: boolean;
|
|
35
|
+
name: string;
|
|
36
|
+
version: string;
|
|
37
|
+
}): string;
|
|
38
|
+
export declare function materializeManagedWorkspaceAssets(options: {
|
|
39
|
+
moduleUrl: string;
|
|
40
|
+
targetDirectory: string;
|
|
41
|
+
}): Promise<ManagedWorkspaceAssetManifest>;
|
|
42
|
+
export declare function syncManagedWorkspaceAssets(options: {
|
|
43
|
+
check: boolean;
|
|
44
|
+
force: boolean;
|
|
45
|
+
moduleUrl: string;
|
|
46
|
+
platform: PlatformName;
|
|
47
|
+
workspaceRoot: string;
|
|
48
|
+
}): Promise<WorkspaceAssetSyncResult>;
|
|
49
|
+
export declare function buildManagedWorkspaceAssetManifest(options: {
|
|
50
|
+
assets?: ManagedWorkspaceAsset[];
|
|
51
|
+
moduleUrl: string;
|
|
52
|
+
}): Promise<ManagedWorkspaceAssetManifest>;
|
|
53
|
+
export declare function resolveManagedWorkspaceAssetManifestPath(options: {
|
|
54
|
+
platform: PlatformName;
|
|
55
|
+
workspaceRoot: string;
|
|
56
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { resolveWorkspaceLocalStateDirectory } from "./state.js";
|
|
6
|
+
const MANIFEST_VERSION = 1;
|
|
7
|
+
const MANAGED_ASSET_MANIFEST_FILENAME = "asset-manifest.json";
|
|
8
|
+
const GENERATED_DIRECTORY = "generated";
|
|
9
|
+
const INTERNAL_PUBLISHED_DEPENDENCIES = [
|
|
10
|
+
"@minutework/platform-config",
|
|
11
|
+
"@minutework/schema-compiler",
|
|
12
|
+
];
|
|
13
|
+
const EXACT_DEPENDENCY_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
14
|
+
export const DEFAULT_MANAGED_WORKSPACE_ASSET_MANIFEST_PATH = path.posix.join(".minutework", GENERATED_DIRECTORY, MANAGED_ASSET_MANIFEST_FILENAME);
|
|
15
|
+
const MANAGED_WORKSPACE_EXACT_PATHS = new Set([
|
|
16
|
+
".cursor/mcp.json",
|
|
17
|
+
"CLAUDE.md",
|
|
18
|
+
"mcp/claude-desktop.sample.json",
|
|
19
|
+
]);
|
|
20
|
+
const MANAGED_WORKSPACE_PREFIX_PATHS = ["skills/"];
|
|
21
|
+
export function resolveManagedWorkspaceMcpSpecifierFromPackageMetadata(metadata) {
|
|
22
|
+
if (metadata.isPublishedInstall !== false && canExactPinManagedWorkspaceMcp(metadata.dependencies)) {
|
|
23
|
+
return `${metadata.name}@${metadata.version}`;
|
|
24
|
+
}
|
|
25
|
+
return metadata.name;
|
|
26
|
+
}
|
|
27
|
+
export async function materializeManagedWorkspaceAssets(options) {
|
|
28
|
+
const assets = await collectManagedWorkspaceAssets(options.moduleUrl);
|
|
29
|
+
const manifest = await buildManagedWorkspaceAssetManifest({
|
|
30
|
+
assets,
|
|
31
|
+
moduleUrl: options.moduleUrl,
|
|
32
|
+
});
|
|
33
|
+
await writeManagedWorkspaceAssets({
|
|
34
|
+
assets,
|
|
35
|
+
workspaceRoot: options.targetDirectory,
|
|
36
|
+
});
|
|
37
|
+
await writeManagedWorkspaceAssetManifest({
|
|
38
|
+
manifest,
|
|
39
|
+
platform: process.platform,
|
|
40
|
+
workspaceRoot: options.targetDirectory,
|
|
41
|
+
});
|
|
42
|
+
return manifest;
|
|
43
|
+
}
|
|
44
|
+
export async function syncManagedWorkspaceAssets(options) {
|
|
45
|
+
const manifestPath = await resolveManagedWorkspaceAssetManifestPath({
|
|
46
|
+
platform: options.platform,
|
|
47
|
+
workspaceRoot: options.workspaceRoot,
|
|
48
|
+
});
|
|
49
|
+
const manifest = await readManagedWorkspaceAssetManifest(manifestPath);
|
|
50
|
+
const desiredAssets = await collectManagedWorkspaceAssets(options.moduleUrl);
|
|
51
|
+
const desiredByPath = new Map(desiredAssets.map((asset) => [asset.relativePath, asset]));
|
|
52
|
+
const manifestEntries = new Map(manifest.entries.map((entry) => [entry.path, entry]));
|
|
53
|
+
const statuses = [];
|
|
54
|
+
for (const asset of desiredAssets) {
|
|
55
|
+
const relativePath = asset.relativePath;
|
|
56
|
+
const filePath = resolveWorkspaceAssetPath(options.workspaceRoot, relativePath);
|
|
57
|
+
const currentContent = await readOptionalUtf8File(filePath);
|
|
58
|
+
const currentDigest = currentContent === null ? null : createContentDigest(currentContent);
|
|
59
|
+
const manifestEntry = manifestEntries.get(relativePath) ?? null;
|
|
60
|
+
if (!manifestEntry) {
|
|
61
|
+
if (currentDigest === null) {
|
|
62
|
+
statuses.push({ action: "create", asset, reason: "missing", relativePath });
|
|
63
|
+
}
|
|
64
|
+
else if (currentDigest === asset.appliedDigest) {
|
|
65
|
+
statuses.push({ action: "manifest_only", reason: "already_matches_desired", relativePath });
|
|
66
|
+
}
|
|
67
|
+
else if (options.force) {
|
|
68
|
+
statuses.push({ action: "update", asset, reason: "force", relativePath });
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
statuses.push({ action: "conflict", reason: "unexpected_existing_file", relativePath });
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
manifestEntries.delete(relativePath);
|
|
76
|
+
if (currentDigest === asset.appliedDigest) {
|
|
77
|
+
if (manifestEntry.appliedDigest !== asset.appliedDigest || manifestEntry.assetId !== asset.assetId) {
|
|
78
|
+
statuses.push({ action: "manifest_only", reason: "already_matches_desired", relativePath });
|
|
79
|
+
}
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (currentDigest === null) {
|
|
83
|
+
statuses.push({ action: "create", asset, reason: "missing", relativePath });
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (currentDigest === manifestEntry.appliedDigest) {
|
|
87
|
+
statuses.push({
|
|
88
|
+
action: "update",
|
|
89
|
+
asset,
|
|
90
|
+
reason: "current_matches_manifest",
|
|
91
|
+
relativePath,
|
|
92
|
+
});
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (options.force) {
|
|
96
|
+
statuses.push({ action: "update", asset, reason: "force", relativePath });
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
statuses.push({ action: "conflict", reason: "modified", relativePath });
|
|
100
|
+
}
|
|
101
|
+
for (const entry of manifestEntries.values()) {
|
|
102
|
+
const filePath = resolveWorkspaceAssetPath(options.workspaceRoot, entry.path);
|
|
103
|
+
const currentContent = await readOptionalUtf8File(filePath);
|
|
104
|
+
const currentDigest = currentContent === null ? null : createContentDigest(currentContent);
|
|
105
|
+
if (!desiredByPath.has(entry.path)) {
|
|
106
|
+
if (currentDigest === null) {
|
|
107
|
+
statuses.push({ action: "manifest_only", reason: "missing_removed_asset", relativePath: entry.path });
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (currentDigest === entry.appliedDigest) {
|
|
111
|
+
statuses.push({
|
|
112
|
+
action: "delete",
|
|
113
|
+
appliedDigest: entry.appliedDigest,
|
|
114
|
+
reason: "current_matches_manifest",
|
|
115
|
+
relativePath: entry.path,
|
|
116
|
+
});
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (options.force) {
|
|
120
|
+
statuses.push({
|
|
121
|
+
action: "delete",
|
|
122
|
+
appliedDigest: entry.appliedDigest,
|
|
123
|
+
reason: "force",
|
|
124
|
+
relativePath: entry.path,
|
|
125
|
+
});
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
statuses.push({ action: "conflict", reason: "modified", relativePath: entry.path });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const conflicts = statuses.flatMap((status) => status.action === "conflict" ? [status.relativePath] : []);
|
|
132
|
+
const created = statuses.flatMap((status) => status.action === "create" ? [status.relativePath] : []);
|
|
133
|
+
const updated = statuses.flatMap((status) => status.action === "update" ? [status.relativePath] : []);
|
|
134
|
+
const deleted = statuses.flatMap((status) => status.action === "delete" ? [status.relativePath] : []);
|
|
135
|
+
const manifestOnlyUpdates = statuses.flatMap((status) => status.action === "manifest_only" ? [status.relativePath] : []);
|
|
136
|
+
const manifestUpdated = created.length > 0 ||
|
|
137
|
+
updated.length > 0 ||
|
|
138
|
+
deleted.length > 0 ||
|
|
139
|
+
manifestOnlyUpdates.length > 0;
|
|
140
|
+
if (!options.check && conflicts.length === 0) {
|
|
141
|
+
for (const status of statuses) {
|
|
142
|
+
if (status.action === "create" || status.action === "update") {
|
|
143
|
+
const targetPath = resolveWorkspaceAssetPath(options.workspaceRoot, status.relativePath);
|
|
144
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
145
|
+
await fs.writeFile(targetPath, status.asset.content, "utf8");
|
|
146
|
+
}
|
|
147
|
+
if (status.action === "delete") {
|
|
148
|
+
const targetPath = resolveWorkspaceAssetPath(options.workspaceRoot, status.relativePath);
|
|
149
|
+
await fs.rm(targetPath, { force: true });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (manifestUpdated) {
|
|
153
|
+
await writeManagedWorkspaceAssetManifest({
|
|
154
|
+
manifest: await buildManagedWorkspaceAssetManifest({
|
|
155
|
+
assets: desiredAssets,
|
|
156
|
+
moduleUrl: options.moduleUrl,
|
|
157
|
+
}),
|
|
158
|
+
platform: options.platform,
|
|
159
|
+
workspaceRoot: options.workspaceRoot,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
blockedByConflicts: conflicts.length > 0,
|
|
165
|
+
check: options.check,
|
|
166
|
+
conflicts,
|
|
167
|
+
created,
|
|
168
|
+
deleted,
|
|
169
|
+
manifestUpdated: manifestUpdated && !options.check && conflicts.length === 0,
|
|
170
|
+
updated,
|
|
171
|
+
workspaceRoot: options.workspaceRoot,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
export async function buildManagedWorkspaceAssetManifest(options) {
|
|
175
|
+
const assets = [...(options.assets ?? (await collectManagedWorkspaceAssets(options.moduleUrl)))].sort((left, right) => left.relativePath.localeCompare(right.relativePath));
|
|
176
|
+
const cli = await readCliPackageMetadata(options.moduleUrl);
|
|
177
|
+
return {
|
|
178
|
+
cli: {
|
|
179
|
+
package: cli.name,
|
|
180
|
+
version: cli.version,
|
|
181
|
+
},
|
|
182
|
+
entries: assets.map((asset) => ({
|
|
183
|
+
appliedDigest: asset.appliedDigest,
|
|
184
|
+
assetId: asset.assetId,
|
|
185
|
+
path: asset.relativePath,
|
|
186
|
+
})),
|
|
187
|
+
treeDigest: createContentDigest(assets.map((asset) => `${asset.relativePath}:${asset.appliedDigest}`).join("\n")),
|
|
188
|
+
version: MANIFEST_VERSION,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
export async function resolveManagedWorkspaceAssetManifestPath(options) {
|
|
192
|
+
const localStateDirectory = await resolveWorkspaceLocalStateDirectory(options.workspaceRoot, options.platform);
|
|
193
|
+
return path.join(localStateDirectory, GENERATED_DIRECTORY, MANAGED_ASSET_MANIFEST_FILENAME);
|
|
194
|
+
}
|
|
195
|
+
async function collectManagedWorkspaceAssets(moduleUrl) {
|
|
196
|
+
const cliSpecifier = await buildManagedWorkspaceMcpSpecifier(moduleUrl);
|
|
197
|
+
const assets = [];
|
|
198
|
+
const bundleRoot = resolveBundledBuilderBundleRoot(moduleUrl);
|
|
199
|
+
const bundleManifestPath = path.join(bundleRoot, "bundle.json");
|
|
200
|
+
const bundleManifest = JSON.parse(await fs.readFile(bundleManifestPath, "utf8"));
|
|
201
|
+
const claudeTemplatePath = path.join(bundleRoot, bundleManifest.render.template);
|
|
202
|
+
assets.push(createManagedWorkspaceAsset({
|
|
203
|
+
content: JSON.stringify(renderCursorMcpConfig(cliSpecifier), null, 2) + "\n",
|
|
204
|
+
relativePath: ".cursor/mcp.json",
|
|
205
|
+
}), createManagedWorkspaceAsset({
|
|
206
|
+
content: JSON.stringify(renderClaudeDesktopSample(cliSpecifier), null, 2) + "\n",
|
|
207
|
+
relativePath: "mcp/claude-desktop.sample.json",
|
|
208
|
+
}), createManagedWorkspaceAsset({
|
|
209
|
+
content: await fs.readFile(claudeTemplatePath, "utf8"),
|
|
210
|
+
relativePath: bundleManifest.render.output,
|
|
211
|
+
}));
|
|
212
|
+
const skillsRoot = path.join(bundleRoot, bundleManifest.directories.skills);
|
|
213
|
+
const skillPaths = await collectRelativeFiles(skillsRoot);
|
|
214
|
+
for (const relativeSkillPath of skillPaths) {
|
|
215
|
+
const skillContent = await fs.readFile(path.join(skillsRoot, ...relativeSkillPath.split("/")), "utf8");
|
|
216
|
+
assets.push(createManagedWorkspaceAsset({
|
|
217
|
+
content: skillContent,
|
|
218
|
+
relativePath: path.posix.join(bundleManifest.directories.skills, relativeSkillPath),
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
return assets.sort((left, right) => left.relativePath.localeCompare(right.relativePath));
|
|
222
|
+
}
|
|
223
|
+
async function writeManagedWorkspaceAssets(options) {
|
|
224
|
+
for (const asset of options.assets) {
|
|
225
|
+
const targetPath = resolveWorkspaceAssetPath(options.workspaceRoot, asset.relativePath);
|
|
226
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
227
|
+
await fs.writeFile(targetPath, asset.content, "utf8");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function writeManagedWorkspaceAssetManifest(options) {
|
|
231
|
+
const manifestPath = await resolveManagedWorkspaceAssetManifestPath({
|
|
232
|
+
platform: options.platform,
|
|
233
|
+
workspaceRoot: options.workspaceRoot,
|
|
234
|
+
});
|
|
235
|
+
await fs.mkdir(path.dirname(manifestPath), { recursive: true });
|
|
236
|
+
await fs.writeFile(manifestPath, JSON.stringify(options.manifest, null, 2) + "\n", "utf8");
|
|
237
|
+
}
|
|
238
|
+
async function readManagedWorkspaceAssetManifest(manifestPath) {
|
|
239
|
+
let manifest;
|
|
240
|
+
try {
|
|
241
|
+
manifest = JSON.parse(await fs.readFile(manifestPath, "utf8"));
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
const errno = error;
|
|
245
|
+
if (errno.code === "ENOENT") {
|
|
246
|
+
throw new Error("Managed workspace assets are not initialized for this workspace. Recreate the workspace with a current CLI before using `minutework workspace sync-assets`.");
|
|
247
|
+
}
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
if (!manifest ||
|
|
251
|
+
typeof manifest !== "object" ||
|
|
252
|
+
!Array.isArray(manifest.entries) ||
|
|
253
|
+
manifest.version !== MANIFEST_VERSION) {
|
|
254
|
+
throw new Error(`Unsupported managed workspace asset manifest at ${manifestPath}. Recreate the workspace with a current CLI before using \`minutework workspace sync-assets\`.`);
|
|
255
|
+
}
|
|
256
|
+
const typedManifest = manifest;
|
|
257
|
+
const validatedEntries = typedManifest.entries.map((entry) => {
|
|
258
|
+
if (!entry ||
|
|
259
|
+
typeof entry !== "object" ||
|
|
260
|
+
typeof entry.assetId !== "string" ||
|
|
261
|
+
typeof entry.appliedDigest !== "string" ||
|
|
262
|
+
typeof entry.path !== "string") {
|
|
263
|
+
throw new Error(`Unsupported managed workspace asset manifest at ${manifestPath}. Recreate the workspace with a current CLI before using \`minutework workspace sync-assets\`.`);
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
...entry,
|
|
267
|
+
path: validateManagedRelativePath(entry.path),
|
|
268
|
+
};
|
|
269
|
+
});
|
|
270
|
+
const uniquePaths = new Set(validatedEntries.map((entry) => entry.path));
|
|
271
|
+
if (uniquePaths.size !== validatedEntries.length) {
|
|
272
|
+
throw new Error(`Unsupported managed workspace asset manifest at ${manifestPath}. Recreate the workspace with a current CLI before using \`minutework workspace sync-assets\`.`);
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
...typedManifest,
|
|
276
|
+
entries: validatedEntries,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function renderCursorMcpConfig(cliSpecifier) {
|
|
280
|
+
return {
|
|
281
|
+
mcpServers: {
|
|
282
|
+
minutework: {
|
|
283
|
+
command: "npx",
|
|
284
|
+
args: ["-y", cliSpecifier, "mcp"],
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function renderClaudeDesktopSample(cliSpecifier) {
|
|
290
|
+
return {
|
|
291
|
+
mcpServers: {
|
|
292
|
+
minutework: {
|
|
293
|
+
command: "npx",
|
|
294
|
+
args: ["-y", cliSpecifier, "mcp"],
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function createManagedWorkspaceAsset(options) {
|
|
300
|
+
const relativePath = validateManagedRelativePath(options.relativePath);
|
|
301
|
+
return {
|
|
302
|
+
appliedDigest: createContentDigest(options.content),
|
|
303
|
+
assetId: relativePath,
|
|
304
|
+
content: options.content,
|
|
305
|
+
relativePath,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
function createContentDigest(content) {
|
|
309
|
+
return `sha256:${createHash("sha256").update(content).digest("hex")}`;
|
|
310
|
+
}
|
|
311
|
+
function resolveWorkspaceAssetPath(workspaceRoot, relativePath) {
|
|
312
|
+
const validatedPath = validateManagedRelativePath(relativePath);
|
|
313
|
+
const root = path.resolve(workspaceRoot);
|
|
314
|
+
const resolved = path.resolve(root, ...validatedPath.split("/"));
|
|
315
|
+
const relativeToRoot = path.relative(root, resolved);
|
|
316
|
+
if (relativeToRoot.startsWith("..") || path.isAbsolute(relativeToRoot)) {
|
|
317
|
+
throw new Error(`Managed workspace asset path escapes the workspace root: ${relativePath}`);
|
|
318
|
+
}
|
|
319
|
+
return resolved;
|
|
320
|
+
}
|
|
321
|
+
async function readCliPackageMetadata(moduleUrl) {
|
|
322
|
+
const packageRoot = resolveCliPackageRoot(moduleUrl);
|
|
323
|
+
const packageJson = JSON.parse(await fs.readFile(path.join(packageRoot, "package.json"), "utf8"));
|
|
324
|
+
const dependencies = Object.fromEntries(Object.entries(packageJson.dependencies ?? {}).flatMap(([dependencyName, dependencyRange]) => typeof dependencyRange === "string" ? [[dependencyName, dependencyRange]] : []));
|
|
325
|
+
const name = String(packageJson.name || "").trim();
|
|
326
|
+
const version = String(packageJson.version || "").trim();
|
|
327
|
+
const isPublishedInstall = !(await pathExists(path.join(packageRoot, "src")));
|
|
328
|
+
if (!name || !version) {
|
|
329
|
+
throw new Error(`Unable to resolve CLI package metadata from ${path.join(packageRoot, "package.json")}.`);
|
|
330
|
+
}
|
|
331
|
+
return { dependencies, isPublishedInstall, name, version };
|
|
332
|
+
}
|
|
333
|
+
async function buildManagedWorkspaceMcpSpecifier(moduleUrl) {
|
|
334
|
+
const metadata = await readCliPackageMetadata(moduleUrl);
|
|
335
|
+
return resolveManagedWorkspaceMcpSpecifierFromPackageMetadata(metadata);
|
|
336
|
+
}
|
|
337
|
+
function resolveCliPackageRoot(moduleUrl) {
|
|
338
|
+
return path.resolve(path.dirname(fileURLToPath(moduleUrl)), "..");
|
|
339
|
+
}
|
|
340
|
+
function resolveBundledBuilderBundleRoot(moduleUrl) {
|
|
341
|
+
return path.join(resolveCliPackageRoot(moduleUrl), "assets", "claude-local");
|
|
342
|
+
}
|
|
343
|
+
async function collectRelativeFiles(rootDirectory, relativeDirectory = "") {
|
|
344
|
+
const directory = path.join(rootDirectory, relativeDirectory);
|
|
345
|
+
const entries = await fs.readdir(directory, { withFileTypes: true });
|
|
346
|
+
const files = [];
|
|
347
|
+
for (const entry of entries) {
|
|
348
|
+
const relativePath = relativeDirectory
|
|
349
|
+
? path.posix.join(relativeDirectory.replaceAll(path.sep, "/"), entry.name)
|
|
350
|
+
: entry.name;
|
|
351
|
+
if (entry.isDirectory()) {
|
|
352
|
+
files.push(...(await collectRelativeFiles(rootDirectory, relativePath)));
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
if (entry.isFile()) {
|
|
356
|
+
files.push(relativePath);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return files.sort((left, right) => left.localeCompare(right));
|
|
360
|
+
}
|
|
361
|
+
async function readOptionalUtf8File(targetPath) {
|
|
362
|
+
try {
|
|
363
|
+
return await fs.readFile(targetPath, "utf8");
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
const errno = error;
|
|
367
|
+
if (errno.code === "ENOENT") {
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
throw error;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async function pathExists(targetPath) {
|
|
374
|
+
try {
|
|
375
|
+
await fs.stat(targetPath);
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
const errno = error;
|
|
380
|
+
if (errno.code === "ENOENT") {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
throw error;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function canExactPinManagedWorkspaceMcp(dependencies) {
|
|
387
|
+
return INTERNAL_PUBLISHED_DEPENDENCIES.every((dependencyName) => isExactPublishedDependencyRange(dependencies[dependencyName] ?? ""));
|
|
388
|
+
}
|
|
389
|
+
function isExactPublishedDependencyRange(range) {
|
|
390
|
+
return EXACT_DEPENDENCY_PATTERN.test(range.trim());
|
|
391
|
+
}
|
|
392
|
+
function validateManagedRelativePath(relativePath) {
|
|
393
|
+
const normalized = path.posix.normalize(relativePath);
|
|
394
|
+
if (!relativePath || relativePath.includes("\\") || path.posix.isAbsolute(relativePath)) {
|
|
395
|
+
throw new Error(`Managed workspace asset path must stay relative to the workspace root: ${relativePath}`);
|
|
396
|
+
}
|
|
397
|
+
if (normalized === "." ||
|
|
398
|
+
normalized.startsWith("../") ||
|
|
399
|
+
normalized !== relativePath ||
|
|
400
|
+
relativePath.split("/").some((segment) => segment.length === 0 || segment === "." || segment === "..")) {
|
|
401
|
+
throw new Error(`Managed workspace asset path must stay relative to the workspace root: ${relativePath}`);
|
|
402
|
+
}
|
|
403
|
+
if (!MANAGED_WORKSPACE_EXACT_PATHS.has(normalized) &&
|
|
404
|
+
!MANAGED_WORKSPACE_PREFIX_PATHS.some((prefix) => normalized.startsWith(prefix) && normalized.length > prefix.length)) {
|
|
405
|
+
throw new Error(`Managed workspace asset path must stay inside the managed asset scope: ${relativePath}`);
|
|
406
|
+
}
|
|
407
|
+
return relativePath;
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=workspace-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-assets.js","sourceRoot":"","sources":["../src/workspace-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { findWorkspaceRoot } from "./state.js";
|
|
3
|
+
import { syncManagedWorkspaceAssets } from "./workspace-assets.js";
|
|
4
|
+
export async function runWorkspaceCommand(options) {
|
|
5
|
+
const [subcommand, ...rest] = options.args;
|
|
6
|
+
if (!subcommand || subcommand === "--help" || subcommand === "-h" || subcommand === "help") {
|
|
7
|
+
options.io.stdout(renderWorkspaceHelp());
|
|
8
|
+
return 0;
|
|
9
|
+
}
|
|
10
|
+
if (subcommand === "sync-assets") {
|
|
11
|
+
return runWorkspaceSyncAssetsCommand({
|
|
12
|
+
args: rest,
|
|
13
|
+
cwd: options.cwd,
|
|
14
|
+
io: options.io,
|
|
15
|
+
platform: options.platform,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
options.io.stderr(`Unknown "workspace" subcommand: ${subcommand}`);
|
|
19
|
+
options.io.stderr("");
|
|
20
|
+
options.io.stderr(renderWorkspaceHelp());
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
function renderWorkspaceHelp() {
|
|
24
|
+
return `Usage:
|
|
25
|
+
minutework workspace sync-assets [workspace] [--workspace <path>] [--check] [--force]
|
|
26
|
+
|
|
27
|
+
Workspace commands:
|
|
28
|
+
sync-assets Reconcile managed workspace guidance and MCP wiring files.`;
|
|
29
|
+
}
|
|
30
|
+
function renderWorkspaceSyncAssetsHelp() {
|
|
31
|
+
return `Usage:
|
|
32
|
+
minutework workspace sync-assets [workspace] [--workspace <path>] [--check] [--force]
|
|
33
|
+
|
|
34
|
+
Managed files:
|
|
35
|
+
- CLAUDE.md
|
|
36
|
+
- skills/**
|
|
37
|
+
- .cursor/mcp.json
|
|
38
|
+
- mcp/claude-desktop.sample.json
|
|
39
|
+
|
|
40
|
+
Options:
|
|
41
|
+
--workspace Explicit workspace path. Accepts either a positional path or this flag.
|
|
42
|
+
--check Report drift and conflicts without writing files.
|
|
43
|
+
--force Overwrite conflicting managed files.`;
|
|
44
|
+
}
|
|
45
|
+
async function runWorkspaceSyncAssetsCommand(options) {
|
|
46
|
+
const parsed = parseWorkspaceSyncAssetsArgs(options.args);
|
|
47
|
+
if (parsed.help) {
|
|
48
|
+
options.io.stdout(renderWorkspaceSyncAssetsHelp());
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
const workspaceRoot = await findWorkspaceRoot(path.resolve(options.cwd, parsed.workspacePath ?? "."));
|
|
52
|
+
const result = await syncManagedWorkspaceAssets({
|
|
53
|
+
check: parsed.check,
|
|
54
|
+
force: parsed.force,
|
|
55
|
+
moduleUrl: import.meta.url,
|
|
56
|
+
platform: options.platform,
|
|
57
|
+
workspaceRoot,
|
|
58
|
+
});
|
|
59
|
+
if (parsed.check) {
|
|
60
|
+
if (result.created.length === 0 &&
|
|
61
|
+
result.updated.length === 0 &&
|
|
62
|
+
result.deleted.length === 0 &&
|
|
63
|
+
result.conflicts.length === 0) {
|
|
64
|
+
options.io.stdout("Managed workspace assets are up to date.");
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
options.io.stdout("Managed workspace asset drift detected.");
|
|
68
|
+
for (const relativePath of result.created) {
|
|
69
|
+
options.io.stdout(`create ${relativePath}`);
|
|
70
|
+
}
|
|
71
|
+
for (const relativePath of result.updated) {
|
|
72
|
+
options.io.stdout(`update ${relativePath}`);
|
|
73
|
+
}
|
|
74
|
+
for (const relativePath of result.deleted) {
|
|
75
|
+
options.io.stdout(`delete ${relativePath}`);
|
|
76
|
+
}
|
|
77
|
+
for (const relativePath of result.conflicts) {
|
|
78
|
+
options.io.stdout(`conflict ${relativePath}`);
|
|
79
|
+
}
|
|
80
|
+
return 0;
|
|
81
|
+
}
|
|
82
|
+
if (result.blockedByConflicts) {
|
|
83
|
+
options.io.stderr("Managed workspace asset sync blocked by local modifications.");
|
|
84
|
+
options.io.stderr("Re-run with `minutework workspace sync-assets --force` to overwrite managed files.");
|
|
85
|
+
for (const relativePath of result.conflicts) {
|
|
86
|
+
options.io.stderr(`conflict ${relativePath}`);
|
|
87
|
+
}
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
if (result.created.length === 0 && result.updated.length === 0 && result.deleted.length === 0) {
|
|
91
|
+
options.io.stdout("Managed workspace assets are up to date.");
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
options.io.stdout("Managed workspace assets synchronized.");
|
|
95
|
+
for (const relativePath of result.created) {
|
|
96
|
+
options.io.stdout(`create ${relativePath}`);
|
|
97
|
+
}
|
|
98
|
+
for (const relativePath of result.updated) {
|
|
99
|
+
options.io.stdout(`update ${relativePath}`);
|
|
100
|
+
}
|
|
101
|
+
for (const relativePath of result.deleted) {
|
|
102
|
+
options.io.stdout(`delete ${relativePath}`);
|
|
103
|
+
}
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
function parseWorkspaceSyncAssetsArgs(args) {
|
|
107
|
+
let workspacePath;
|
|
108
|
+
let check = false;
|
|
109
|
+
let force = false;
|
|
110
|
+
const setWorkspacePath = (value) => {
|
|
111
|
+
if (workspacePath) {
|
|
112
|
+
throw new Error("workspace sync-assets accepts at most one workspace path.");
|
|
113
|
+
}
|
|
114
|
+
workspacePath = value;
|
|
115
|
+
};
|
|
116
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
117
|
+
const arg = args[index];
|
|
118
|
+
if (arg === "--help" || arg === "-h") {
|
|
119
|
+
return { help: true };
|
|
120
|
+
}
|
|
121
|
+
if (arg === "--workspace") {
|
|
122
|
+
const next = args[index + 1];
|
|
123
|
+
if (!next || next.startsWith("--")) {
|
|
124
|
+
throw new Error('The "workspace sync-assets" command requires a path after --workspace.');
|
|
125
|
+
}
|
|
126
|
+
setWorkspacePath(next);
|
|
127
|
+
index += 1;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (arg.startsWith("--workspace=")) {
|
|
131
|
+
const value = arg.slice("--workspace=".length);
|
|
132
|
+
if (!value) {
|
|
133
|
+
throw new Error('The "workspace sync-assets" command requires a path after --workspace.');
|
|
134
|
+
}
|
|
135
|
+
setWorkspacePath(value);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (arg === "--check") {
|
|
139
|
+
check = true;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (arg === "--force") {
|
|
143
|
+
force = true;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (arg.startsWith("--")) {
|
|
147
|
+
throw new Error(`Unknown workspace sync-assets option: ${arg}`);
|
|
148
|
+
}
|
|
149
|
+
setWorkspacePath(arg);
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
check,
|
|
153
|
+
force,
|
|
154
|
+
help: false,
|
|
155
|
+
workspacePath,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=workspace.js.map
|