@unbrained/pm-cli 2026.5.29 → 2026.5.30
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/CHANGELOG.md +29 -12
- package/dist/cli/bootstrap-args.d.ts +1 -1
- package/dist/cli/bootstrap-args.js +59 -9
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commands/activity.js +4 -4
- package/dist/cli/commands/activity.js.map +1 -1
- package/dist/cli/commands/calendar.js +4 -4
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/close.js +4 -4
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/completion.js +4 -4
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/create.js +18 -5
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/deps.js +4 -4
- package/dist/cli/commands/deps.js.map +1 -1
- package/dist/cli/commands/extension/install-sources.d.ts +1 -0
- package/dist/cli/commands/extension/install-sources.js +20 -2
- package/dist/cli/commands/extension/install-sources.js.map +1 -1
- package/dist/cli/commands/extension.js +26 -5
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/get.js +6 -3
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/list.js +25 -6
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/search.js +3 -3
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/stats.js +4 -4
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/test-all.js +4 -4
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +39 -11
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.js +3 -3
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-setup.js +3 -3
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli-bundle/chunks/chunk-PB2YU2E3.js +164 -0
- package/dist/cli-bundle/chunks/chunk-PB2YU2E3.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-RJONRNXN.js +682 -0
- package/dist/cli-bundle/chunks/chunk-RJONRNXN.js.map +7 -0
- package/dist/cli-bundle/chunks/chunk-SW5BMMCU.js +13864 -0
- package/dist/cli-bundle/chunks/chunk-SW5BMMCU.js.map +7 -0
- package/dist/cli-bundle/chunks/commands-XJ4TJ5UN.js +24225 -0
- package/dist/cli-bundle/chunks/commands-XJ4TJ5UN.js.map +7 -0
- package/dist/cli-bundle/chunks/register-list-query-EIVQ5FMR.js +223 -0
- package/dist/cli-bundle/chunks/register-list-query-EIVQ5FMR.js.map +7 -0
- package/dist/cli-bundle/chunks/register-mutation-RSZNPSGI.js +702 -0
- package/dist/cli-bundle/chunks/register-mutation-RSZNPSGI.js.map +7 -0
- package/dist/cli-bundle/chunks/register-operations-APUSYDMR.js +355 -0
- package/dist/cli-bundle/chunks/register-operations-APUSYDMR.js.map +7 -0
- package/dist/cli-bundle/chunks/register-setup-OZOKSMPJ.js +237 -0
- package/dist/cli-bundle/chunks/register-setup-OZOKSMPJ.js.map +7 -0
- package/dist/cli-bundle/main.js +6896 -0
- package/dist/cli-bundle/main.js.map +7 -0
- package/dist/cli.js +1 -1
- package/dist/core/config/nested-settings.d.ts +2 -0
- package/dist/core/config/nested-settings.js +17 -2
- package/dist/core/config/nested-settings.js.map +1 -1
- package/dist/core/item/type-synonyms.d.ts +20 -0
- package/dist/core/item/type-synonyms.js +42 -0
- package/dist/core/item/type-synonyms.js.map +1 -0
- package/dist/core/search/cache.js +46 -4
- package/dist/core/search/cache.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +73 -32
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/sentry/helpers.d.ts +1 -1
- package/dist/core/sentry/helpers.js +4 -4
- package/dist/core/sentry/helpers.js.map +1 -1
- package/dist/core/shared/constants.js +3 -2
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/html-entity-decode.d.ts +2 -1
- package/dist/core/shared/html-entity-decode.js +14 -9
- package/dist/core/shared/html-entity-decode.js.map +1 -1
- package/dist/core/shared/time.js +52 -2
- package/dist/core/shared/time.js.map +1 -1
- package/dist/core/store/front-matter-cache.d.ts +24 -0
- package/dist/core/store/front-matter-cache.js +119 -8
- package/dist/core/store/front-matter-cache.js.map +1 -1
- package/dist/core/store/item-store.d.ts +7 -0
- package/dist/core/store/item-store.js +13 -3
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings-validator.d.ts +1 -0
- package/dist/core/store/settings-validator.js +3 -2
- package/dist/core/store/settings-validator.js.map +1 -1
- package/dist/core/store/settings.js +19 -3
- package/dist/core/store/settings.js.map +1 -1
- package/dist/mcp/server.js +3 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts.js +5 -5
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/docs/CONFIGURATION.md +11 -0
- package/package.json +7 -4
- package/packages/pm-calendar/extensions/calendar/index.js +27 -2
- package/packages/pm-calendar/extensions/calendar/index.ts +28 -2
- package/scripts/bundle-cli.mjs +39 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="da5e11dd-26df-5d00-8888-dc767b22f814")}catch(e){}}();
|
|
3
3
|
import { getActiveExtensionRegistrations } from "../../core/extensions/index.js";
|
|
4
4
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
5
5
|
import { resolveItemTypeRegistry } from "../../core/item/type-registry.js";
|
|
6
6
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
7
7
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
8
|
-
import {
|
|
8
|
+
import { listAllFrontMatterLight } from "../../core/store/item-store.js";
|
|
9
9
|
import { getSettingsPath, resolvePmRoot } from "../../core/store/paths.js";
|
|
10
10
|
import { readSettings } from "../../core/store/settings.js";
|
|
11
11
|
export const DEPS_FORMAT_VALUES = ["tree", "graph"];
|
|
@@ -175,7 +175,7 @@ export async function runDeps(id, options, global) {
|
|
|
175
175
|
const summaryOnly = options.summary === true;
|
|
176
176
|
const settings = await readSettings(pmRoot);
|
|
177
177
|
const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());
|
|
178
|
-
const items = await
|
|
178
|
+
const items = await listAllFrontMatterLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema);
|
|
179
179
|
const index = new Map(items.map((item) => [item.id, toIndexedItem(item)]));
|
|
180
180
|
if (!index.has(id)) {
|
|
181
181
|
throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);
|
|
@@ -204,4 +204,4 @@ export async function runDeps(id, options, global) {
|
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
//# sourceMappingURL=deps.js.map
|
|
207
|
-
//# debugId=
|
|
207
|
+
//# debugId=da5e11dd-26df-5d00-8888-dc767b22f814
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.js","sources":["cli/commands/deps.ts"],"sourceRoot":"/","sourcesContent":["import { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { listAllFrontMatter } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { Dependency, ItemFrontMatter, ItemStatus, ItemType } from \"../../types/index.js\";\n\nexport const DEPS_FORMAT_VALUES = [\"tree\", \"graph\"] as const;\nexport type DepsFormat = (typeof DEPS_FORMAT_VALUES)[number];\nexport const DEPS_COLLAPSE_VALUES = [\"none\", \"repeated\"] as const;\nexport type DepsCollapseMode = (typeof DEPS_COLLAPSE_VALUES)[number];\n\nexport interface DepsCommandOptions {\n format?: string;\n maxDepth?: string | number;\n collapse?: string;\n summary?: boolean;\n}\n\ninterface IndexedItem {\n id: string;\n title: string;\n type: ItemType;\n status: ItemStatus;\n dependencies: Dependency[];\n}\n\nexport interface DepsTreeNode {\n id: string;\n title?: string;\n type?: ItemType;\n status?: ItemStatus;\n via?: string;\n missing: boolean;\n cycle: boolean;\n truncated?: boolean;\n collapsed?: boolean;\n dependencies: DepsTreeNode[];\n}\n\nexport interface DepsGraphNode {\n id: string;\n title?: string;\n type?: ItemType;\n status?: ItemStatus;\n missing: boolean;\n}\n\nexport interface DepsGraphEdge {\n from: string;\n to: string;\n kind: string;\n}\n\nexport interface DepsGraphResult {\n root_id: string;\n nodes: DepsGraphNode[];\n edges: DepsGraphEdge[];\n missing_ids: string[];\n}\n\nexport interface DepsResult {\n id: string;\n format: DepsFormat;\n node_count: number;\n edge_count: number;\n missing_count: number;\n tree?: DepsTreeNode;\n graph?: DepsGraphResult;\n}\n\nfunction parseFormat(raw: string | undefined): DepsFormat {\n const candidate = raw?.trim().toLowerCase() ?? \"tree\";\n if ((DEPS_FORMAT_VALUES as readonly string[]).includes(candidate)) {\n return candidate as DepsFormat;\n }\n throw new PmCliError(`Invalid --format value \"${raw}\". Use \"tree\" or \"graph\".`, EXIT_CODE.USAGE);\n}\n\nfunction parseMaxDepth(raw: string | number | undefined): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = typeof raw === \"number\" ? raw : Number(raw.trim());\n if (!Number.isInteger(normalized) || normalized < 0) {\n throw new PmCliError(`Invalid --max-depth value \"${raw}\". Use a non-negative integer.`, EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\nfunction parseCollapse(raw: string | undefined): DepsCollapseMode {\n const candidate = raw?.trim().toLowerCase() ?? \"none\";\n if ((DEPS_COLLAPSE_VALUES as readonly string[]).includes(candidate)) {\n return candidate as DepsCollapseMode;\n }\n throw new PmCliError(`Invalid --collapse value \"${raw}\". Use \"none\" or \"repeated\".`, EXIT_CODE.USAGE);\n}\n\nfunction normalizeDependencies(dependencies: Dependency[] | undefined): Dependency[] {\n if (!dependencies || dependencies.length === 0) {\n return [];\n }\n const sorted = [...dependencies].sort((left, right) => {\n const byKind = left.kind.localeCompare(right.kind);\n if (byKind !== 0) return byKind;\n const byId = left.id.localeCompare(right.id);\n if (byId !== 0) return byId;\n return left.created_at.localeCompare(right.created_at);\n });\n const deduped = new Map<string, Dependency>();\n for (const dependency of sorted) {\n const key = `${dependency.kind}::${dependency.id}`;\n if (!deduped.has(key)) {\n deduped.set(key, dependency);\n }\n }\n return [...deduped.values()];\n}\n\nfunction toIndexedItem(item: ItemFrontMatter): IndexedItem {\n return {\n id: item.id,\n title: item.title,\n type: item.type,\n status: item.status,\n dependencies: normalizeDependencies(item.dependencies),\n };\n}\n\nfunction toTreeNode(\n id: string,\n index: Map<string, IndexedItem>,\n lineage: Set<string>,\n maxDepth: number | undefined,\n collapse: DepsCollapseMode,\n expanded: Set<string>,\n depth = 0,\n via?: string,\n): DepsTreeNode {\n const item = index.get(id);\n const baseNode: DepsTreeNode = {\n id,\n title: item?.title,\n type: item?.type,\n status: item?.status,\n via,\n missing: !item,\n cycle: lineage.has(id),\n dependencies: [],\n };\n if (!item || baseNode.cycle) {\n return baseNode;\n }\n if (maxDepth !== undefined && depth >= maxDepth) {\n if (item.dependencies.length > 0) {\n baseNode.truncated = true;\n }\n return baseNode;\n }\n if (collapse === \"repeated\" && expanded.has(id)) {\n baseNode.collapsed = true;\n return baseNode;\n }\n if (collapse === \"repeated\") {\n expanded.add(id);\n }\n const nextLineage = new Set(lineage);\n nextLineage.add(id);\n baseNode.dependencies = item.dependencies.map((dependency) =>\n toTreeNode(dependency.id, index, nextLineage, maxDepth, collapse, expanded, depth + 1, dependency.kind),\n );\n return baseNode;\n}\n\nfunction mergeGraphNode(existing: DepsGraphNode | undefined, candidate: DepsGraphNode): DepsGraphNode {\n if (!existing) {\n return candidate;\n }\n if (existing.missing && !candidate.missing) {\n return candidate;\n }\n return {\n ...existing,\n title: existing.title ?? candidate.title,\n type: existing.type ?? candidate.type,\n status: existing.status ?? candidate.status,\n };\n}\n\nfunction toGraph(root: DepsTreeNode): DepsGraphResult {\n const nodesById = new Map<string, DepsGraphNode>();\n const edgesByKey = new Map<string, DepsGraphEdge>();\n\n const visit = (node: DepsTreeNode): void => {\n nodesById.set(\n node.id,\n mergeGraphNode(nodesById.get(node.id), {\n id: node.id,\n title: node.title,\n type: node.type,\n status: node.status,\n missing: node.missing,\n }),\n );\n for (const child of node.dependencies) {\n nodesById.set(\n child.id,\n mergeGraphNode(nodesById.get(child.id), {\n id: child.id,\n title: child.title,\n type: child.type,\n status: child.status,\n missing: child.missing,\n }),\n );\n const relationKind = child.via ?? \"related\";\n const edgeKey = `${node.id}::${child.id}::${relationKind}`;\n if (!edgesByKey.has(edgeKey)) {\n edgesByKey.set(edgeKey, {\n from: node.id,\n to: child.id,\n kind: relationKind,\n });\n }\n if (!child.cycle) {\n visit(child);\n }\n }\n };\n\n visit(root);\n\n const nodes = [...nodesById.values()].sort((left, right) => left.id.localeCompare(right.id));\n const edges = [...edgesByKey.values()].sort((left, right) => {\n const byFrom = left.from.localeCompare(right.from);\n if (byFrom !== 0) return byFrom;\n const byTo = left.to.localeCompare(right.to);\n if (byTo !== 0) return byTo;\n return left.kind.localeCompare(right.kind);\n });\n const missingIds = nodes.filter((node) => node.missing).map((node) => node.id);\n return {\n root_id: root.id,\n nodes,\n edges,\n missing_ids: missingIds,\n };\n}\n\nexport async function runDeps(id: string, options: DepsCommandOptions, global: GlobalOptions): Promise<DepsResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const format = parseFormat(options.format);\n const maxDepth = parseMaxDepth(options.maxDepth);\n const collapse = parseCollapse(options.collapse);\n const summaryOnly = options.summary === true;\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const items = await listAllFrontMatter(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema);\n const index = new Map(items.map((item) => [item.id, toIndexedItem(item)]));\n if (!index.has(id)) {\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n }\n\n const tree = toTreeNode(id, index, new Set<string>(), maxDepth, collapse, new Set<string>());\n const graph = toGraph(tree);\n const baseResult = {\n id,\n format,\n node_count: graph.nodes.length,\n edge_count: graph.edges.length,\n missing_count: graph.missing_ids.length,\n };\n if (summaryOnly) {\n return baseResult;\n }\n if (format === \"tree\") {\n return {\n ...baseResult,\n tree,\n };\n }\n return {\n ...baseResult,\n graph,\n };\n}\n"],"names":[],"mappings":"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","debugId":"6cfe1514-f544-5828-96da-161aa9eb4d55"}
|
|
1
|
+
{"version":3,"file":"deps.js","sources":["cli/commands/deps.ts"],"sourceRoot":"/","sourcesContent":["import { getActiveExtensionRegistrations } from \"../../core/extensions/index.js\";\nimport { pathExists } from \"../../core/fs/fs-utils.js\";\nimport { resolveItemTypeRegistry } from \"../../core/item/type-registry.js\";\nimport { EXIT_CODE } from \"../../core/shared/constants.js\";\nimport type { GlobalOptions } from \"../../core/shared/command-types.js\";\nimport { PmCliError } from \"../../core/shared/errors.js\";\nimport { listAllFrontMatterLight } from \"../../core/store/item-store.js\";\nimport { getSettingsPath, resolvePmRoot } from \"../../core/store/paths.js\";\nimport { readSettings } from \"../../core/store/settings.js\";\nimport type { Dependency, ItemFrontMatter, ItemStatus, ItemType } from \"../../types/index.js\";\n\nexport const DEPS_FORMAT_VALUES = [\"tree\", \"graph\"] as const;\nexport type DepsFormat = (typeof DEPS_FORMAT_VALUES)[number];\nexport const DEPS_COLLAPSE_VALUES = [\"none\", \"repeated\"] as const;\nexport type DepsCollapseMode = (typeof DEPS_COLLAPSE_VALUES)[number];\n\nexport interface DepsCommandOptions {\n format?: string;\n maxDepth?: string | number;\n collapse?: string;\n summary?: boolean;\n}\n\ninterface IndexedItem {\n id: string;\n title: string;\n type: ItemType;\n status: ItemStatus;\n dependencies: Dependency[];\n}\n\nexport interface DepsTreeNode {\n id: string;\n title?: string;\n type?: ItemType;\n status?: ItemStatus;\n via?: string;\n missing: boolean;\n cycle: boolean;\n truncated?: boolean;\n collapsed?: boolean;\n dependencies: DepsTreeNode[];\n}\n\nexport interface DepsGraphNode {\n id: string;\n title?: string;\n type?: ItemType;\n status?: ItemStatus;\n missing: boolean;\n}\n\nexport interface DepsGraphEdge {\n from: string;\n to: string;\n kind: string;\n}\n\nexport interface DepsGraphResult {\n root_id: string;\n nodes: DepsGraphNode[];\n edges: DepsGraphEdge[];\n missing_ids: string[];\n}\n\nexport interface DepsResult {\n id: string;\n format: DepsFormat;\n node_count: number;\n edge_count: number;\n missing_count: number;\n tree?: DepsTreeNode;\n graph?: DepsGraphResult;\n}\n\nfunction parseFormat(raw: string | undefined): DepsFormat {\n const candidate = raw?.trim().toLowerCase() ?? \"tree\";\n if ((DEPS_FORMAT_VALUES as readonly string[]).includes(candidate)) {\n return candidate as DepsFormat;\n }\n throw new PmCliError(`Invalid --format value \"${raw}\". Use \"tree\" or \"graph\".`, EXIT_CODE.USAGE);\n}\n\nfunction parseMaxDepth(raw: string | number | undefined): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const normalized = typeof raw === \"number\" ? raw : Number(raw.trim());\n if (!Number.isInteger(normalized) || normalized < 0) {\n throw new PmCliError(`Invalid --max-depth value \"${raw}\". Use a non-negative integer.`, EXIT_CODE.USAGE);\n }\n return normalized;\n}\n\nfunction parseCollapse(raw: string | undefined): DepsCollapseMode {\n const candidate = raw?.trim().toLowerCase() ?? \"none\";\n if ((DEPS_COLLAPSE_VALUES as readonly string[]).includes(candidate)) {\n return candidate as DepsCollapseMode;\n }\n throw new PmCliError(`Invalid --collapse value \"${raw}\". Use \"none\" or \"repeated\".`, EXIT_CODE.USAGE);\n}\n\nfunction normalizeDependencies(dependencies: Dependency[] | undefined): Dependency[] {\n if (!dependencies || dependencies.length === 0) {\n return [];\n }\n const sorted = [...dependencies].sort((left, right) => {\n const byKind = left.kind.localeCompare(right.kind);\n if (byKind !== 0) return byKind;\n const byId = left.id.localeCompare(right.id);\n if (byId !== 0) return byId;\n return left.created_at.localeCompare(right.created_at);\n });\n const deduped = new Map<string, Dependency>();\n for (const dependency of sorted) {\n const key = `${dependency.kind}::${dependency.id}`;\n if (!deduped.has(key)) {\n deduped.set(key, dependency);\n }\n }\n return [...deduped.values()];\n}\n\nfunction toIndexedItem(item: ItemFrontMatter): IndexedItem {\n return {\n id: item.id,\n title: item.title,\n type: item.type,\n status: item.status,\n dependencies: normalizeDependencies(item.dependencies),\n };\n}\n\nfunction toTreeNode(\n id: string,\n index: Map<string, IndexedItem>,\n lineage: Set<string>,\n maxDepth: number | undefined,\n collapse: DepsCollapseMode,\n expanded: Set<string>,\n depth = 0,\n via?: string,\n): DepsTreeNode {\n const item = index.get(id);\n const baseNode: DepsTreeNode = {\n id,\n title: item?.title,\n type: item?.type,\n status: item?.status,\n via,\n missing: !item,\n cycle: lineage.has(id),\n dependencies: [],\n };\n if (!item || baseNode.cycle) {\n return baseNode;\n }\n if (maxDepth !== undefined && depth >= maxDepth) {\n if (item.dependencies.length > 0) {\n baseNode.truncated = true;\n }\n return baseNode;\n }\n if (collapse === \"repeated\" && expanded.has(id)) {\n baseNode.collapsed = true;\n return baseNode;\n }\n if (collapse === \"repeated\") {\n expanded.add(id);\n }\n const nextLineage = new Set(lineage);\n nextLineage.add(id);\n baseNode.dependencies = item.dependencies.map((dependency) =>\n toTreeNode(dependency.id, index, nextLineage, maxDepth, collapse, expanded, depth + 1, dependency.kind),\n );\n return baseNode;\n}\n\nfunction mergeGraphNode(existing: DepsGraphNode | undefined, candidate: DepsGraphNode): DepsGraphNode {\n if (!existing) {\n return candidate;\n }\n if (existing.missing && !candidate.missing) {\n return candidate;\n }\n return {\n ...existing,\n title: existing.title ?? candidate.title,\n type: existing.type ?? candidate.type,\n status: existing.status ?? candidate.status,\n };\n}\n\nfunction toGraph(root: DepsTreeNode): DepsGraphResult {\n const nodesById = new Map<string, DepsGraphNode>();\n const edgesByKey = new Map<string, DepsGraphEdge>();\n\n const visit = (node: DepsTreeNode): void => {\n nodesById.set(\n node.id,\n mergeGraphNode(nodesById.get(node.id), {\n id: node.id,\n title: node.title,\n type: node.type,\n status: node.status,\n missing: node.missing,\n }),\n );\n for (const child of node.dependencies) {\n nodesById.set(\n child.id,\n mergeGraphNode(nodesById.get(child.id), {\n id: child.id,\n title: child.title,\n type: child.type,\n status: child.status,\n missing: child.missing,\n }),\n );\n const relationKind = child.via ?? \"related\";\n const edgeKey = `${node.id}::${child.id}::${relationKind}`;\n if (!edgesByKey.has(edgeKey)) {\n edgesByKey.set(edgeKey, {\n from: node.id,\n to: child.id,\n kind: relationKind,\n });\n }\n if (!child.cycle) {\n visit(child);\n }\n }\n };\n\n visit(root);\n\n const nodes = [...nodesById.values()].sort((left, right) => left.id.localeCompare(right.id));\n const edges = [...edgesByKey.values()].sort((left, right) => {\n const byFrom = left.from.localeCompare(right.from);\n if (byFrom !== 0) return byFrom;\n const byTo = left.to.localeCompare(right.to);\n if (byTo !== 0) return byTo;\n return left.kind.localeCompare(right.kind);\n });\n const missingIds = nodes.filter((node) => node.missing).map((node) => node.id);\n return {\n root_id: root.id,\n nodes,\n edges,\n missing_ids: missingIds,\n };\n}\n\nexport async function runDeps(id: string, options: DepsCommandOptions, global: GlobalOptions): Promise<DepsResult> {\n const pmRoot = resolvePmRoot(process.cwd(), global.path);\n if (!(await pathExists(getSettingsPath(pmRoot)))) {\n throw new PmCliError(`Tracker is not initialized at ${pmRoot}. Run pm init first.`, EXIT_CODE.NOT_FOUND);\n }\n const format = parseFormat(options.format);\n const maxDepth = parseMaxDepth(options.maxDepth);\n const collapse = parseCollapse(options.collapse);\n const summaryOnly = options.summary === true;\n const settings = await readSettings(pmRoot);\n const typeRegistry = resolveItemTypeRegistry(settings, getActiveExtensionRegistrations());\n const items = await listAllFrontMatterLight(pmRoot, settings.item_format, typeRegistry.type_to_folder, undefined, settings.schema);\n const index = new Map(items.map((item) => [item.id, toIndexedItem(item)]));\n if (!index.has(id)) {\n throw new PmCliError(`Item ${id} not found`, EXIT_CODE.NOT_FOUND);\n }\n\n const tree = toTreeNode(id, index, new Set<string>(), maxDepth, collapse, new Set<string>());\n const graph = toGraph(tree);\n const baseResult = {\n id,\n format,\n node_count: graph.nodes.length,\n edge_count: graph.edges.length,\n missing_count: graph.missing_ids.length,\n };\n if (summaryOnly) {\n return baseResult;\n }\n if (format === \"tree\") {\n return {\n ...baseResult,\n tree,\n };\n }\n return {\n ...baseResult,\n graph,\n };\n}\n"],"names":[],"mappings":"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","debugId":"da5e11dd-26df-5d00-8888-dc767b22f814"}
|
|
@@ -32,6 +32,7 @@ export declare function parseExtensionInstallSource(input: string, options?: {
|
|
|
32
32
|
ref?: string;
|
|
33
33
|
}): InstallSource;
|
|
34
34
|
export declare function runGitCommand(args: string[]): Promise<string>;
|
|
35
|
+
export declare function normalizeNpmLocalFileAliasSpec(spec: string, cwd?: string): string;
|
|
35
36
|
export declare function resolveInstallSource(source: InstallSource): Promise<ResolvedInstallSource>;
|
|
36
37
|
export declare function areDirectoriesEquivalent(left: string, right: string): Promise<boolean>;
|
|
37
38
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cec0e555-a7a2-5a98-8783-c736e340200c")}catch(e){}}();
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
4
|
import fs from "node:fs/promises";
|
|
5
5
|
import os from "node:os";
|
|
@@ -161,11 +161,29 @@ async function resolveNpmPackSpec(spec) {
|
|
|
161
161
|
if (localPath) {
|
|
162
162
|
return pathToFileURL(localPath).href;
|
|
163
163
|
}
|
|
164
|
+
const localFileAlias = normalizeNpmLocalFileAliasSpec(spec);
|
|
165
|
+
if (localFileAlias !== spec) {
|
|
166
|
+
return localFileAlias;
|
|
167
|
+
}
|
|
164
168
|
if (/^[a-z][a-z0-9+.-]*:/i.test(spec)) {
|
|
165
169
|
return spec;
|
|
166
170
|
}
|
|
167
171
|
return spec;
|
|
168
172
|
}
|
|
173
|
+
export function normalizeNpmLocalFileAliasSpec(spec, cwd = process.cwd()) {
|
|
174
|
+
const marker = "@file:";
|
|
175
|
+
const markerIndex = spec.lastIndexOf(marker);
|
|
176
|
+
if (markerIndex <= 0) {
|
|
177
|
+
return spec;
|
|
178
|
+
}
|
|
179
|
+
const packageName = spec.slice(0, markerIndex);
|
|
180
|
+
const target = spec.slice(markerIndex + marker.length);
|
|
181
|
+
if (packageName.trim().length === 0 || target.trim().length === 0 || target.startsWith("//")) {
|
|
182
|
+
return spec;
|
|
183
|
+
}
|
|
184
|
+
const absolutePath = path.isAbsolute(target) || path.win32.isAbsolute(target) ? target : path.resolve(cwd, target);
|
|
185
|
+
return `${packageName}@${pathToFileURL(absolutePath).href}`;
|
|
186
|
+
}
|
|
169
187
|
function parsePackedNpmPackage(stdout, packDirectory) {
|
|
170
188
|
try {
|
|
171
189
|
const parsed = JSON.parse(stdout);
|
|
@@ -381,4 +399,4 @@ export async function areDirectoriesEquivalent(left, right) {
|
|
|
381
399
|
return leftRealPath === rightRealPath;
|
|
382
400
|
}
|
|
383
401
|
//# sourceMappingURL=install-sources.js.map
|
|
384
|
-
//# debugId=
|
|
402
|
+
//# debugId=cec0e555-a7a2-5a98-8783-c736e340200c
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-sources.js","sources":["cli/commands/extension/install-sources.ts"],"sourceRoot":"/","sourcesContent":["import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { promisify } from \"node:util\";\nimport { collectPackageExtensionDirectories } from \"../../../core/packages/manifest.js\";\nimport { pathExists } from \"../../../core/fs/fs-utils.js\";\nimport { isPathWithinDirectory } from \"../../../core/fs/path-utils.js\";\nimport { EXIT_CODE } from \"../../../core/shared/constants.js\";\nimport { PmCliError } from \"../../../core/shared/errors.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface LocalInstallSource {\n kind: \"local\";\n input: string;\n absolute_path: string;\n}\n\ninterface GithubInstallSource {\n kind: \"github\";\n input: string;\n owner: string;\n repo: string;\n repository: string;\n ref?: string;\n subpath?: string;\n}\n\ninterface NpmInstallSource {\n kind: \"npm\";\n input: string;\n spec: string;\n}\n\ntype InstallSource = LocalInstallSource | GithubInstallSource | NpmInstallSource;\n\ninterface ResolvedInstallSource {\n source: InstallSource;\n directory: string;\n resolved_subpath?: string;\n commit?: string;\n npm_package?: string;\n npm_version?: string;\n cleanup?: () => Promise<void>;\n}\n\nfunction parseGithubPathSpec(pathSpec: string, input: string, refOverride?: string): GithubInstallSource | null {\n const segments = pathSpec\n .split(\"/\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n if (segments.length < 2) {\n return null;\n }\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/i, \"\");\n if (owner.length === 0 || repo.length === 0) {\n return null;\n }\n const tail = segments.slice(2);\n let ref: string | undefined;\n let subpath: string | undefined;\n if (tail[0] === \"tree\" && tail.length >= 2) {\n ref = tail[1];\n subpath = tail.slice(2).join(\"/\");\n } else if (tail.length > 0) {\n subpath = tail.join(\"/\");\n }\n if (typeof refOverride === \"string\" && refOverride.trim().length > 0) {\n ref = refOverride.trim();\n }\n return {\n kind: \"github\",\n input,\n owner,\n repo,\n repository: `https://github.com/${owner}/${repo}.git`,\n ref,\n subpath: subpath && subpath.length > 0 ? subpath : undefined,\n };\n}\n\nexport function parseExtensionInstallSource(input: string, options: { forceGithub?: boolean; ref?: string } = {}): InstallSource {\n const normalizedInput = input.trim();\n if (normalizedInput.length === 0) {\n throw new PmCliError(\"Extension source is required for --install.\", EXIT_CODE.USAGE);\n }\n const refOverride = typeof options.ref === \"string\" && options.ref.trim().length > 0 ? options.ref.trim() : undefined;\n\n if (normalizedInput.startsWith(\"npm:\")) {\n const spec = normalizedInput.slice(\"npm:\".length).trim();\n if (spec.length === 0) {\n throw new PmCliError('npm package source must include a package spec after \"npm:\".', EXIT_CODE.USAGE);\n }\n if (options.forceGithub) {\n throw new PmCliError('Options \"--gh/--github\" cannot be combined with npm: package sources.', EXIT_CODE.USAGE);\n }\n if (refOverride) {\n throw new PmCliError('Option \"--ref\" cannot be combined with npm: package sources.', EXIT_CODE.USAGE);\n }\n return {\n kind: \"npm\",\n input: normalizedInput,\n spec,\n };\n }\n\n const maybeGithubByUrl = (() => {\n try {\n const parsed = new URL(normalizedInput);\n if (parsed.hostname !== \"github.com\") {\n return null;\n }\n const pathSpec = parsed.pathname.replace(/^\\/+/, \"\");\n return parseGithubPathSpec(pathSpec, normalizedInput, refOverride);\n } catch {\n return null;\n }\n })();\n if (maybeGithubByUrl) {\n return maybeGithubByUrl;\n }\n\n const strippedDomainInput = normalizedInput.startsWith(\"github.com/\") ? normalizedInput.slice(\"github.com/\".length) : null;\n if (strippedDomainInput) {\n const parsed = parseGithubPathSpec(strippedDomainInput, normalizedInput, refOverride);\n if (!parsed) {\n throw new PmCliError(`Invalid GitHub source \"${normalizedInput}\".`, EXIT_CODE.USAGE);\n }\n return parsed;\n }\n\n if (options.forceGithub) {\n const parsed = parseGithubPathSpec(normalizedInput, normalizedInput, refOverride);\n if (!parsed) {\n throw new PmCliError(`Invalid GitHub shorthand \"${normalizedInput}\".`, EXIT_CODE.USAGE);\n }\n return parsed;\n }\n\n if (/^https?:\\/\\//i.test(normalizedInput)) {\n throw new PmCliError(\n `Unsupported extension source URL \"${normalizedInput}\". Supported remote source host: github.com.`,\n EXIT_CODE.USAGE,\n );\n }\n\n return {\n kind: \"local\",\n input: normalizedInput,\n absolute_path: path.resolve(process.cwd(), normalizedInput),\n };\n}\n\nexport async function runGitCommand(args: string[]): Promise<string> {\n try {\n const result = await execFileAsync(\"git\", args, { encoding: \"utf8\" });\n return (result.stdout ?? \"\").trim();\n } catch (error: unknown) {\n const stderr = typeof error === \"object\" && error !== null && \"stderr\" in error ? String((error as { stderr: unknown }).stderr) : \"\";\n const message = stderr.trim().length > 0 ? stderr.trim() : error instanceof Error ? error.message : String(error);\n throw new PmCliError(`Git command failed: git ${args.join(\" \")}\\n${message}`, EXIT_CODE.GENERIC_FAILURE);\n }\n}\n\nasync function runNpmCommand(args: string[], cwd?: string): Promise<string> {\n try {\n const result = await execFileAsync(\"npm\", args, { cwd, encoding: \"utf8\" });\n return (result.stdout ?? \"\").trim();\n } catch (error: unknown) {\n const stderr = typeof error === \"object\" && error !== null && \"stderr\" in error ? String((error as { stderr: unknown }).stderr) : \"\";\n const message = stderr.trim().length > 0 ? stderr.trim() : error instanceof Error ? error.message : String(error);\n throw new PmCliError(`npm command failed: npm ${args.join(\" \")}\\n${message}`, EXIT_CODE.GENERIC_FAILURE);\n }\n}\n\nasync function resolveLocalNpmPackagePath(spec: string): Promise<string | null> {\n if (path.isAbsolute(spec) || spec.startsWith(\".\") || spec.startsWith(\"..\")) {\n const absolutePath = path.resolve(process.cwd(), spec);\n return (await pathExists(absolutePath)) ? absolutePath : null;\n }\n\n try {\n const parsed = new URL(spec);\n if (parsed.protocol === \"file:\") {\n const absolutePath = fileURLToPath(parsed);\n return (await pathExists(absolutePath)) ? absolutePath : null;\n }\n } catch {\n // Registry package specs are not URLs.\n }\n\n if (!/^[a-z][a-z0-9+.-]*:/i.test(spec)) {\n const absolutePath = path.resolve(process.cwd(), spec);\n if (await pathExists(absolutePath)) {\n return absolutePath;\n }\n }\n\n return null;\n}\n\nasync function resolveNpmPackSpec(spec: string): Promise<string> {\n const localPath = await resolveLocalNpmPackagePath(spec);\n if (localPath) {\n return pathToFileURL(localPath).href;\n }\n\n if (/^[a-z][a-z0-9+.-]*:/i.test(spec)) {\n return spec;\n }\n\n return spec;\n}\n\nfunction parsePackedNpmPackage(stdout: string, packDirectory: string): { tarball: string; package?: string; version?: string } {\n try {\n const parsed = JSON.parse(stdout) as Array<{ filename?: unknown; name?: unknown; version?: unknown }>;\n const first = Array.isArray(parsed) ? parsed[0] : undefined;\n if (first && typeof first.filename === \"string\" && first.filename.trim().length > 0) {\n return {\n tarball: path.resolve(packDirectory, first.filename),\n package: typeof first.name === \"string\" ? first.name : undefined,\n version: typeof first.version === \"string\" ? first.version : undefined,\n };\n }\n } catch {\n // Fall back to the last stdout line for older npm output.\n }\n const lastLine = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .at(-1);\n if (!lastLine) {\n throw new PmCliError(\"npm pack did not report a tarball filename.\", EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n tarball: path.resolve(packDirectory, lastLine),\n };\n}\n\nasync function resolveNpmSourceDirectory(source: NpmInstallSource): Promise<{\n directory: string;\n package?: string;\n version?: string;\n cleanup: () => Promise<void>;\n}> {\n const localPackageRoot = await resolveLocalNpmPackagePath(source.spec);\n if (localPackageRoot) {\n const packageJsonPath = path.join(localPackageRoot, \"package.json\");\n const packageJson = (await pathExists(packageJsonPath))\n ? JSON.parse(await fs.readFile(packageJsonPath, \"utf8\")) as { name?: unknown; version?: unknown }\n : {};\n return {\n directory: await resolvePackageExtensionDirectory(localPackageRoot, source.input),\n package: typeof packageJson.name === \"string\" ? packageJson.name : undefined,\n version: typeof packageJson.version === \"string\" ? packageJson.version : undefined,\n cleanup: async () => {},\n };\n }\n\n const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"pm-npm-package-source-\"));\n const packDirectory = path.join(tempRoot, \"pack\");\n const extractDirectory = path.join(tempRoot, \"extract\");\n await fs.mkdir(packDirectory, { recursive: true });\n await fs.mkdir(extractDirectory, { recursive: true });\n\n try {\n const packSpec = await resolveNpmPackSpec(source.spec);\n const packStdout = await runNpmCommand([\"pack\", packSpec, \"--json\", \"--pack-destination\", packDirectory]);\n const packed = parsePackedNpmPackage(packStdout, packDirectory);\n await execFileAsync(\"tar\", [\"-xzf\", packed.tarball, \"-C\", extractDirectory], { encoding: \"utf8\" });\n const packageRoot = path.join(extractDirectory, \"package\");\n await installNpmPackageRuntimeDependencies(packageRoot);\n const directory = await resolvePackageExtensionDirectory(packageRoot, source.input);\n return {\n directory,\n package: packed.package,\n version: packed.version,\n cleanup: async () => {\n await fs.rm(tempRoot, { recursive: true, force: true });\n },\n };\n } catch (error: unknown) {\n await fs.rm(tempRoot, { recursive: true, force: true });\n throw error;\n }\n}\n\nasync function installNpmPackageRuntimeDependencies(packageRoot: string): Promise<void> {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (!(await pathExists(packageJsonPath))) {\n return;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(await fs.readFile(packageJsonPath, \"utf8\")) as unknown;\n } catch {\n return;\n }\n if (typeof parsed !== \"object\" || parsed === null) {\n return;\n }\n\n const manifest = parsed as { dependencies?: unknown; optionalDependencies?: unknown; peerDependencies?: unknown };\n const dependencySpecs = runtimeDependencyInstallSpecs(manifest);\n if (dependencySpecs.length === 0) {\n return;\n }\n\n const runtimeOnlyManifest = { ...(parsed as Record<string, unknown>) };\n delete runtimeOnlyManifest.devDependencies;\n await fs.writeFile(packageJsonPath, `${JSON.stringify(runtimeOnlyManifest, null, 2)}\\n`, \"utf8\");\n await Promise.all([\n fs.rm(path.join(packageRoot, \"package-lock.json\"), { force: true }),\n fs.rm(path.join(packageRoot, \"npm-shrinkwrap.json\"), { force: true }),\n ]);\n\n await runNpmCommand(\n [\"install\", \"--ignore-scripts\", \"--no-audit\", \"--fund=false\", \"--package-lock=false\", \"--no-save\", ...dependencySpecs],\n packageRoot,\n );\n}\n\nfunction runtimeDependencyInstallSpecs(manifest: {\n dependencies?: unknown;\n optionalDependencies?: unknown;\n peerDependencies?: unknown;\n}): string[] {\n const specs = new Map<string, string>();\n for (const dependencyMap of [manifest.dependencies, manifest.optionalDependencies, manifest.peerDependencies]) {\n if (typeof dependencyMap !== \"object\" || dependencyMap === null) {\n continue;\n }\n for (const [name, version] of Object.entries(dependencyMap)) {\n if (typeof version !== \"string\" || version.trim().length === 0 || specs.has(name)) {\n continue;\n }\n specs.set(name, `${name}@${version.trim()}`);\n }\n }\n return [...specs.values()];\n}\n\nasync function resolvePackageExtensionDirectory(packageRoot: string, sourceLabel: string): Promise<string> {\n const discovered = await collectPackageExtensionDirectories(packageRoot);\n if (discovered.length === 1) {\n return discovered[0];\n }\n if (discovered.length > 1) {\n const choices = discovered\n .map((entry) => path.relative(packageRoot, entry).replaceAll(path.sep, \"/\"))\n .sort((left, right) => left.localeCompare(right));\n throw new PmCliError(\n `Package source \"${sourceLabel}\" contains multiple extension manifests. Provide an explicit extension path. Candidates: ${choices.join(\", \")}`,\n EXIT_CODE.USAGE,\n );\n }\n throw new PmCliError(\n `Unable to locate a pm extension manifest in package source \"${sourceLabel}\". Package installs currently activate only extension resources, so add package.json pm.extensions or an extensions/ directory. Metadata-only resources like pm.docs/pm.examples are catalog metadata and do not activate commands.`,\n EXIT_CODE.USAGE,\n );\n}\n\nasync function resolveGithubSourceDirectory(cloneDirectory: string, source: GithubInstallSource): Promise<{ directory: string; resolved_subpath?: string }> {\n const candidatePaths: string[] = [];\n if (source.subpath) {\n candidatePaths.push(source.subpath);\n candidatePaths.push(path.posix.join(\".agents/pm/extensions\", source.subpath));\n candidatePaths.push(path.posix.join(\".custom/pm-extensions\", source.subpath));\n candidatePaths.push(path.posix.join(\".custom/pm-extension\", source.subpath));\n }\n\n for (const candidate of candidatePaths) {\n const absolute = path.resolve(cloneDirectory, candidate);\n if (!isPathWithinDirectory(cloneDirectory, absolute)) {\n // source.subpath is user-controlled; never resolve a manifest outside the\n // cloned repository (path-traversal guard).\n continue;\n }\n if (await pathExists(path.join(absolute, \"manifest.json\"))) {\n return { directory: absolute, resolved_subpath: candidate };\n }\n }\n\n if (await pathExists(path.join(cloneDirectory, \"manifest.json\"))) {\n return { directory: cloneDirectory, resolved_subpath: \".\" };\n }\n\n const discoveredDirectory = await resolvePackageExtensionDirectory(cloneDirectory, source.input);\n return {\n directory: discoveredDirectory,\n resolved_subpath: path.relative(cloneDirectory, discoveredDirectory).replaceAll(path.sep, \"/\"),\n };\n}\n\nexport async function resolveInstallSource(source: InstallSource): Promise<ResolvedInstallSource> {\n if (source.kind === \"local\") {\n let localStats;\n try {\n localStats = await fs.stat(source.absolute_path);\n } catch {\n throw new PmCliError(`Local extension source does not exist: \"${source.absolute_path}\".`, EXIT_CODE.NOT_FOUND);\n }\n if (!localStats.isDirectory()) {\n throw new PmCliError(`Local extension source must be a directory: \"${source.absolute_path}\".`, EXIT_CODE.USAGE);\n }\n const directory = await resolvePackageExtensionDirectory(source.absolute_path, source.input);\n return {\n source,\n directory,\n };\n }\n\n if (source.kind === \"npm\") {\n const resolved = await resolveNpmSourceDirectory(source);\n return {\n source,\n directory: resolved.directory,\n cleanup: resolved.cleanup,\n resolved_subpath: path.relative(path.dirname(resolved.directory), resolved.directory).replaceAll(path.sep, \"/\"),\n npm_package: resolved.package,\n npm_version: resolved.version,\n };\n }\n\n const cloneDirectory = await fs.mkdtemp(path.join(os.tmpdir(), \"pm-extension-source-\"));\n const cloneArgs = [\"clone\", \"--depth\", \"1\"];\n if (source.ref) {\n cloneArgs.push(\"--branch\", source.ref);\n }\n cloneArgs.push(source.repository, cloneDirectory);\n\n try {\n await runGitCommand(cloneArgs);\n const commit = await runGitCommand([\"-C\", cloneDirectory, \"rev-parse\", \"HEAD\"]);\n const resolved = await resolveGithubSourceDirectory(cloneDirectory, source);\n return {\n source,\n directory: resolved.directory,\n resolved_subpath: resolved.resolved_subpath,\n commit,\n cleanup: async () => {\n await fs.rm(cloneDirectory, { recursive: true, force: true });\n },\n };\n } catch (error: unknown) {\n await fs.rm(cloneDirectory, { recursive: true, force: true });\n throw error;\n }\n}\n\nexport async function areDirectoriesEquivalent(left: string, right: string): Promise<boolean> {\n if (!(await pathExists(left)) || !(await pathExists(right))) {\n return false;\n }\n const [leftRealPath, rightRealPath] = await Promise.all([fs.realpath(left), fs.realpath(right)]);\n return leftRealPath === rightRealPath;\n}\n"],"names":[],"mappings":"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","debugId":"23a34bde-7fd3-5371-adc9-648198007ad7"}
|
|
1
|
+
{"version":3,"file":"install-sources.js","sources":["cli/commands/extension/install-sources.ts"],"sourceRoot":"/","sourcesContent":["import { execFile } from \"node:child_process\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { promisify } from \"node:util\";\nimport { collectPackageExtensionDirectories } from \"../../../core/packages/manifest.js\";\nimport { pathExists } from \"../../../core/fs/fs-utils.js\";\nimport { isPathWithinDirectory } from \"../../../core/fs/path-utils.js\";\nimport { EXIT_CODE } from \"../../../core/shared/constants.js\";\nimport { PmCliError } from \"../../../core/shared/errors.js\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface LocalInstallSource {\n kind: \"local\";\n input: string;\n absolute_path: string;\n}\n\ninterface GithubInstallSource {\n kind: \"github\";\n input: string;\n owner: string;\n repo: string;\n repository: string;\n ref?: string;\n subpath?: string;\n}\n\ninterface NpmInstallSource {\n kind: \"npm\";\n input: string;\n spec: string;\n}\n\ntype InstallSource = LocalInstallSource | GithubInstallSource | NpmInstallSource;\n\ninterface ResolvedInstallSource {\n source: InstallSource;\n directory: string;\n resolved_subpath?: string;\n commit?: string;\n npm_package?: string;\n npm_version?: string;\n cleanup?: () => Promise<void>;\n}\n\nfunction parseGithubPathSpec(pathSpec: string, input: string, refOverride?: string): GithubInstallSource | null {\n const segments = pathSpec\n .split(\"/\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n if (segments.length < 2) {\n return null;\n }\n const owner = segments[0];\n const repo = segments[1].replace(/\\.git$/i, \"\");\n if (owner.length === 0 || repo.length === 0) {\n return null;\n }\n const tail = segments.slice(2);\n let ref: string | undefined;\n let subpath: string | undefined;\n if (tail[0] === \"tree\" && tail.length >= 2) {\n ref = tail[1];\n subpath = tail.slice(2).join(\"/\");\n } else if (tail.length > 0) {\n subpath = tail.join(\"/\");\n }\n if (typeof refOverride === \"string\" && refOverride.trim().length > 0) {\n ref = refOverride.trim();\n }\n return {\n kind: \"github\",\n input,\n owner,\n repo,\n repository: `https://github.com/${owner}/${repo}.git`,\n ref,\n subpath: subpath && subpath.length > 0 ? subpath : undefined,\n };\n}\n\nexport function parseExtensionInstallSource(input: string, options: { forceGithub?: boolean; ref?: string } = {}): InstallSource {\n const normalizedInput = input.trim();\n if (normalizedInput.length === 0) {\n throw new PmCliError(\"Extension source is required for --install.\", EXIT_CODE.USAGE);\n }\n const refOverride = typeof options.ref === \"string\" && options.ref.trim().length > 0 ? options.ref.trim() : undefined;\n\n if (normalizedInput.startsWith(\"npm:\")) {\n const spec = normalizedInput.slice(\"npm:\".length).trim();\n if (spec.length === 0) {\n throw new PmCliError('npm package source must include a package spec after \"npm:\".', EXIT_CODE.USAGE);\n }\n if (options.forceGithub) {\n throw new PmCliError('Options \"--gh/--github\" cannot be combined with npm: package sources.', EXIT_CODE.USAGE);\n }\n if (refOverride) {\n throw new PmCliError('Option \"--ref\" cannot be combined with npm: package sources.', EXIT_CODE.USAGE);\n }\n return {\n kind: \"npm\",\n input: normalizedInput,\n spec,\n };\n }\n\n const maybeGithubByUrl = (() => {\n try {\n const parsed = new URL(normalizedInput);\n if (parsed.hostname !== \"github.com\") {\n return null;\n }\n const pathSpec = parsed.pathname.replace(/^\\/+/, \"\");\n return parseGithubPathSpec(pathSpec, normalizedInput, refOverride);\n } catch {\n return null;\n }\n })();\n if (maybeGithubByUrl) {\n return maybeGithubByUrl;\n }\n\n const strippedDomainInput = normalizedInput.startsWith(\"github.com/\") ? normalizedInput.slice(\"github.com/\".length) : null;\n if (strippedDomainInput) {\n const parsed = parseGithubPathSpec(strippedDomainInput, normalizedInput, refOverride);\n if (!parsed) {\n throw new PmCliError(`Invalid GitHub source \"${normalizedInput}\".`, EXIT_CODE.USAGE);\n }\n return parsed;\n }\n\n if (options.forceGithub) {\n const parsed = parseGithubPathSpec(normalizedInput, normalizedInput, refOverride);\n if (!parsed) {\n throw new PmCliError(`Invalid GitHub shorthand \"${normalizedInput}\".`, EXIT_CODE.USAGE);\n }\n return parsed;\n }\n\n if (/^https?:\\/\\//i.test(normalizedInput)) {\n throw new PmCliError(\n `Unsupported extension source URL \"${normalizedInput}\". Supported remote source host: github.com.`,\n EXIT_CODE.USAGE,\n );\n }\n\n return {\n kind: \"local\",\n input: normalizedInput,\n absolute_path: path.resolve(process.cwd(), normalizedInput),\n };\n}\n\nexport async function runGitCommand(args: string[]): Promise<string> {\n try {\n const result = await execFileAsync(\"git\", args, { encoding: \"utf8\" });\n return (result.stdout ?? \"\").trim();\n } catch (error: unknown) {\n const stderr = typeof error === \"object\" && error !== null && \"stderr\" in error ? String((error as { stderr: unknown }).stderr) : \"\";\n const message = stderr.trim().length > 0 ? stderr.trim() : error instanceof Error ? error.message : String(error);\n throw new PmCliError(`Git command failed: git ${args.join(\" \")}\\n${message}`, EXIT_CODE.GENERIC_FAILURE);\n }\n}\n\nasync function runNpmCommand(args: string[], cwd?: string): Promise<string> {\n try {\n const result = await execFileAsync(\"npm\", args, { cwd, encoding: \"utf8\" });\n return (result.stdout ?? \"\").trim();\n } catch (error: unknown) {\n const stderr = typeof error === \"object\" && error !== null && \"stderr\" in error ? String((error as { stderr: unknown }).stderr) : \"\";\n const message = stderr.trim().length > 0 ? stderr.trim() : error instanceof Error ? error.message : String(error);\n throw new PmCliError(`npm command failed: npm ${args.join(\" \")}\\n${message}`, EXIT_CODE.GENERIC_FAILURE);\n }\n}\n\nasync function resolveLocalNpmPackagePath(spec: string): Promise<string | null> {\n if (path.isAbsolute(spec) || spec.startsWith(\".\") || spec.startsWith(\"..\")) {\n const absolutePath = path.resolve(process.cwd(), spec);\n return (await pathExists(absolutePath)) ? absolutePath : null;\n }\n\n try {\n const parsed = new URL(spec);\n if (parsed.protocol === \"file:\") {\n const absolutePath = fileURLToPath(parsed);\n return (await pathExists(absolutePath)) ? absolutePath : null;\n }\n } catch {\n // Registry package specs are not URLs.\n }\n\n if (!/^[a-z][a-z0-9+.-]*:/i.test(spec)) {\n const absolutePath = path.resolve(process.cwd(), spec);\n if (await pathExists(absolutePath)) {\n return absolutePath;\n }\n }\n\n return null;\n}\n\nasync function resolveNpmPackSpec(spec: string): Promise<string> {\n const localPath = await resolveLocalNpmPackagePath(spec);\n if (localPath) {\n return pathToFileURL(localPath).href;\n }\n\n const localFileAlias = normalizeNpmLocalFileAliasSpec(spec);\n if (localFileAlias !== spec) {\n return localFileAlias;\n }\n\n if (/^[a-z][a-z0-9+.-]*:/i.test(spec)) {\n return spec;\n }\n\n return spec;\n}\n\nexport function normalizeNpmLocalFileAliasSpec(spec: string, cwd: string = process.cwd()): string {\n const marker = \"@file:\";\n const markerIndex = spec.lastIndexOf(marker);\n if (markerIndex <= 0) {\n return spec;\n }\n const packageName = spec.slice(0, markerIndex);\n const target = spec.slice(markerIndex + marker.length);\n if (packageName.trim().length === 0 || target.trim().length === 0 || target.startsWith(\"//\")) {\n return spec;\n }\n const absolutePath = path.isAbsolute(target) || path.win32.isAbsolute(target) ? target : path.resolve(cwd, target);\n return `${packageName}@${pathToFileURL(absolutePath).href}`;\n}\n\nfunction parsePackedNpmPackage(stdout: string, packDirectory: string): { tarball: string; package?: string; version?: string } {\n try {\n const parsed = JSON.parse(stdout) as Array<{ filename?: unknown; name?: unknown; version?: unknown }>;\n const first = Array.isArray(parsed) ? parsed[0] : undefined;\n if (first && typeof first.filename === \"string\" && first.filename.trim().length > 0) {\n return {\n tarball: path.resolve(packDirectory, first.filename),\n package: typeof first.name === \"string\" ? first.name : undefined,\n version: typeof first.version === \"string\" ? first.version : undefined,\n };\n }\n } catch {\n // Fall back to the last stdout line for older npm output.\n }\n const lastLine = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .at(-1);\n if (!lastLine) {\n throw new PmCliError(\"npm pack did not report a tarball filename.\", EXIT_CODE.GENERIC_FAILURE);\n }\n return {\n tarball: path.resolve(packDirectory, lastLine),\n };\n}\n\nasync function resolveNpmSourceDirectory(source: NpmInstallSource): Promise<{\n directory: string;\n package?: string;\n version?: string;\n cleanup: () => Promise<void>;\n}> {\n const localPackageRoot = await resolveLocalNpmPackagePath(source.spec);\n if (localPackageRoot) {\n const packageJsonPath = path.join(localPackageRoot, \"package.json\");\n const packageJson = (await pathExists(packageJsonPath))\n ? JSON.parse(await fs.readFile(packageJsonPath, \"utf8\")) as { name?: unknown; version?: unknown }\n : {};\n return {\n directory: await resolvePackageExtensionDirectory(localPackageRoot, source.input),\n package: typeof packageJson.name === \"string\" ? packageJson.name : undefined,\n version: typeof packageJson.version === \"string\" ? packageJson.version : undefined,\n cleanup: async () => {},\n };\n }\n\n const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"pm-npm-package-source-\"));\n const packDirectory = path.join(tempRoot, \"pack\");\n const extractDirectory = path.join(tempRoot, \"extract\");\n await fs.mkdir(packDirectory, { recursive: true });\n await fs.mkdir(extractDirectory, { recursive: true });\n\n try {\n const packSpec = await resolveNpmPackSpec(source.spec);\n const packStdout = await runNpmCommand([\"pack\", packSpec, \"--json\", \"--pack-destination\", packDirectory]);\n const packed = parsePackedNpmPackage(packStdout, packDirectory);\n await execFileAsync(\"tar\", [\"-xzf\", packed.tarball, \"-C\", extractDirectory], { encoding: \"utf8\" });\n const packageRoot = path.join(extractDirectory, \"package\");\n await installNpmPackageRuntimeDependencies(packageRoot);\n const directory = await resolvePackageExtensionDirectory(packageRoot, source.input);\n return {\n directory,\n package: packed.package,\n version: packed.version,\n cleanup: async () => {\n await fs.rm(tempRoot, { recursive: true, force: true });\n },\n };\n } catch (error: unknown) {\n await fs.rm(tempRoot, { recursive: true, force: true });\n throw error;\n }\n}\n\nasync function installNpmPackageRuntimeDependencies(packageRoot: string): Promise<void> {\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (!(await pathExists(packageJsonPath))) {\n return;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(await fs.readFile(packageJsonPath, \"utf8\")) as unknown;\n } catch {\n return;\n }\n if (typeof parsed !== \"object\" || parsed === null) {\n return;\n }\n\n const manifest = parsed as { dependencies?: unknown; optionalDependencies?: unknown; peerDependencies?: unknown };\n const dependencySpecs = runtimeDependencyInstallSpecs(manifest);\n if (dependencySpecs.length === 0) {\n return;\n }\n\n const runtimeOnlyManifest = { ...(parsed as Record<string, unknown>) };\n delete runtimeOnlyManifest.devDependencies;\n await fs.writeFile(packageJsonPath, `${JSON.stringify(runtimeOnlyManifest, null, 2)}\\n`, \"utf8\");\n await Promise.all([\n fs.rm(path.join(packageRoot, \"package-lock.json\"), { force: true }),\n fs.rm(path.join(packageRoot, \"npm-shrinkwrap.json\"), { force: true }),\n ]);\n\n await runNpmCommand(\n [\"install\", \"--ignore-scripts\", \"--no-audit\", \"--fund=false\", \"--package-lock=false\", \"--no-save\", ...dependencySpecs],\n packageRoot,\n );\n}\n\nfunction runtimeDependencyInstallSpecs(manifest: {\n dependencies?: unknown;\n optionalDependencies?: unknown;\n peerDependencies?: unknown;\n}): string[] {\n const specs = new Map<string, string>();\n for (const dependencyMap of [manifest.dependencies, manifest.optionalDependencies, manifest.peerDependencies]) {\n if (typeof dependencyMap !== \"object\" || dependencyMap === null) {\n continue;\n }\n for (const [name, version] of Object.entries(dependencyMap)) {\n if (typeof version !== \"string\" || version.trim().length === 0 || specs.has(name)) {\n continue;\n }\n specs.set(name, `${name}@${version.trim()}`);\n }\n }\n return [...specs.values()];\n}\n\nasync function resolvePackageExtensionDirectory(packageRoot: string, sourceLabel: string): Promise<string> {\n const discovered = await collectPackageExtensionDirectories(packageRoot);\n if (discovered.length === 1) {\n return discovered[0];\n }\n if (discovered.length > 1) {\n const choices = discovered\n .map((entry) => path.relative(packageRoot, entry).replaceAll(path.sep, \"/\"))\n .sort((left, right) => left.localeCompare(right));\n throw new PmCliError(\n `Package source \"${sourceLabel}\" contains multiple extension manifests. Provide an explicit extension path. Candidates: ${choices.join(\", \")}`,\n EXIT_CODE.USAGE,\n );\n }\n throw new PmCliError(\n `Unable to locate a pm extension manifest in package source \"${sourceLabel}\". Package installs currently activate only extension resources, so add package.json pm.extensions or an extensions/ directory. Metadata-only resources like pm.docs/pm.examples are catalog metadata and do not activate commands.`,\n EXIT_CODE.USAGE,\n );\n}\n\nasync function resolveGithubSourceDirectory(cloneDirectory: string, source: GithubInstallSource): Promise<{ directory: string; resolved_subpath?: string }> {\n const candidatePaths: string[] = [];\n if (source.subpath) {\n candidatePaths.push(source.subpath);\n candidatePaths.push(path.posix.join(\".agents/pm/extensions\", source.subpath));\n candidatePaths.push(path.posix.join(\".custom/pm-extensions\", source.subpath));\n candidatePaths.push(path.posix.join(\".custom/pm-extension\", source.subpath));\n }\n\n for (const candidate of candidatePaths) {\n const absolute = path.resolve(cloneDirectory, candidate);\n if (!isPathWithinDirectory(cloneDirectory, absolute)) {\n // source.subpath is user-controlled; never resolve a manifest outside the\n // cloned repository (path-traversal guard).\n continue;\n }\n if (await pathExists(path.join(absolute, \"manifest.json\"))) {\n return { directory: absolute, resolved_subpath: candidate };\n }\n }\n\n if (await pathExists(path.join(cloneDirectory, \"manifest.json\"))) {\n return { directory: cloneDirectory, resolved_subpath: \".\" };\n }\n\n const discoveredDirectory = await resolvePackageExtensionDirectory(cloneDirectory, source.input);\n return {\n directory: discoveredDirectory,\n resolved_subpath: path.relative(cloneDirectory, discoveredDirectory).replaceAll(path.sep, \"/\"),\n };\n}\n\nexport async function resolveInstallSource(source: InstallSource): Promise<ResolvedInstallSource> {\n if (source.kind === \"local\") {\n let localStats;\n try {\n localStats = await fs.stat(source.absolute_path);\n } catch {\n throw new PmCliError(`Local extension source does not exist: \"${source.absolute_path}\".`, EXIT_CODE.NOT_FOUND);\n }\n if (!localStats.isDirectory()) {\n throw new PmCliError(`Local extension source must be a directory: \"${source.absolute_path}\".`, EXIT_CODE.USAGE);\n }\n const directory = await resolvePackageExtensionDirectory(source.absolute_path, source.input);\n return {\n source,\n directory,\n };\n }\n\n if (source.kind === \"npm\") {\n const resolved = await resolveNpmSourceDirectory(source);\n return {\n source,\n directory: resolved.directory,\n cleanup: resolved.cleanup,\n resolved_subpath: path.relative(path.dirname(resolved.directory), resolved.directory).replaceAll(path.sep, \"/\"),\n npm_package: resolved.package,\n npm_version: resolved.version,\n };\n }\n\n const cloneDirectory = await fs.mkdtemp(path.join(os.tmpdir(), \"pm-extension-source-\"));\n const cloneArgs = [\"clone\", \"--depth\", \"1\"];\n if (source.ref) {\n cloneArgs.push(\"--branch\", source.ref);\n }\n cloneArgs.push(source.repository, cloneDirectory);\n\n try {\n await runGitCommand(cloneArgs);\n const commit = await runGitCommand([\"-C\", cloneDirectory, \"rev-parse\", \"HEAD\"]);\n const resolved = await resolveGithubSourceDirectory(cloneDirectory, source);\n return {\n source,\n directory: resolved.directory,\n resolved_subpath: resolved.resolved_subpath,\n commit,\n cleanup: async () => {\n await fs.rm(cloneDirectory, { recursive: true, force: true });\n },\n };\n } catch (error: unknown) {\n await fs.rm(cloneDirectory, { recursive: true, force: true });\n throw error;\n }\n}\n\nexport async function areDirectoriesEquivalent(left: string, right: string): Promise<boolean> {\n if (!(await pathExists(left)) || !(await pathExists(right))) {\n return false;\n }\n const [leftRealPath, rightRealPath] = await Promise.all([fs.realpath(left), fs.realpath(right)]);\n return leftRealPath === rightRealPath;\n}\n"],"names":[],"mappings":"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","debugId":"cec0e555-a7a2-5a98-8783-c736e340200c"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="dc0411c0-3d3c-5495-9be5-d221c8a9498d")}catch(e){}}();
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
4
|
import fs from "node:fs/promises";
|
|
5
|
+
import os from "node:os";
|
|
5
6
|
import path from "node:path";
|
|
6
7
|
import { promisify } from "node:util";
|
|
7
8
|
import { activateExtensions, loadExtensions, nextExtensionReloadToken } from "../../core/extensions/index.js";
|
|
8
9
|
import { resolveExtensionRoots } from "../../core/extensions/loader.js";
|
|
9
10
|
import { pathExists } from "../../core/fs/fs-utils.js";
|
|
11
|
+
import { isPathWithinDirectory } from "../../core/fs/path-utils.js";
|
|
10
12
|
import { EXIT_CODE } from "../../core/shared/constants.js";
|
|
11
13
|
import { PmCliError } from "../../core/shared/errors.js";
|
|
12
14
|
import { nowIso } from "../../core/shared/time.js";
|
|
@@ -105,23 +107,42 @@ function sleep(ms) {
|
|
|
105
107
|
});
|
|
106
108
|
}
|
|
107
109
|
export async function copyExtensionDirectoryForInstall(sourceDirectory, destinationDirectory, copyDirectory = fs.cp) {
|
|
108
|
-
let lastError = null;
|
|
109
110
|
for (let attempt = 1; attempt <= EXTENSION_INSTALL_COPY_ATTEMPTS; attempt += 1) {
|
|
110
111
|
try {
|
|
111
112
|
if (await pathExists(destinationDirectory)) {
|
|
112
113
|
await fs.rm(destinationDirectory, { recursive: true, force: true });
|
|
113
114
|
}
|
|
114
|
-
await
|
|
115
|
+
await copyExtensionDirectoryWithoutSelfNesting(sourceDirectory, destinationDirectory, copyDirectory);
|
|
115
116
|
return;
|
|
116
117
|
}
|
|
117
118
|
catch (error) {
|
|
118
119
|
if (!isRetriableExtensionInstallCopyError(error) || attempt === EXTENSION_INSTALL_COPY_ATTEMPTS) {
|
|
119
120
|
throw error;
|
|
120
121
|
}
|
|
121
|
-
|
|
122
|
+
await sleep(EXTENSION_INSTALL_LOCK_DELAY_MS);
|
|
122
123
|
}
|
|
123
124
|
}
|
|
124
125
|
}
|
|
126
|
+
async function copyExtensionDirectoryWithoutSelfNesting(sourceDirectory, destinationDirectory, copyDirectory) {
|
|
127
|
+
const resolvedSource = path.resolve(sourceDirectory);
|
|
128
|
+
const resolvedDestination = path.resolve(destinationDirectory);
|
|
129
|
+
if (resolvedSource === resolvedDestination) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!isPathWithinDirectory(resolvedSource, resolvedDestination)) {
|
|
133
|
+
await copyDirectory(sourceDirectory, destinationDirectory, { recursive: true, force: true });
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const stagingRoot = await fs.mkdtemp(path.join(os.tmpdir(), "pm-extension-copy-"));
|
|
137
|
+
const stagedDirectory = path.join(stagingRoot, "extension");
|
|
138
|
+
try {
|
|
139
|
+
await copyDirectory(sourceDirectory, stagedDirectory, { recursive: true, force: true });
|
|
140
|
+
await copyDirectory(stagedDirectory, destinationDirectory, { recursive: true, force: true });
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
await fs.rm(stagingRoot, { recursive: true, force: true });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
125
146
|
async function withExtensionInstallLock(settingsRoot, destinationDirectoryName, run) {
|
|
126
147
|
const lockRoot = path.join(settingsRoot, "runtime", "extension-install-locks");
|
|
127
148
|
const lockPath = path.join(lockRoot, `${destinationDirectoryName}.lock`);
|
|
@@ -1333,4 +1354,4 @@ export async function runExtension(target, options, global) {
|
|
|
1333
1354
|
throw new PmCliError(`Unsupported extension action "${action}".`, EXIT_CODE.USAGE);
|
|
1334
1355
|
}
|
|
1335
1356
|
//# sourceMappingURL=extension.js.map
|
|
1336
|
-
//# debugId=
|
|
1357
|
+
//# debugId=dc0411c0-3d3c-5495-9be5-d221c8a9498d
|