@unbrained/pm-cli 2026.5.10 → 2026.5.12
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/.claude-plugin/marketplace.json +4 -4
- package/AGENTS.md +3 -116
- package/CHANGELOG.md +14 -0
- package/PRD.md +11 -11
- package/README.md +20 -2
- package/dist/cli/argv-utils.d.ts +5 -0
- package/dist/cli/argv-utils.js +34 -0
- package/dist/cli/argv-utils.js.map +1 -0
- package/dist/cli/bootstrap-args.d.ts +15 -0
- package/dist/cli/bootstrap-args.js +211 -0
- package/dist/cli/bootstrap-args.js.map +1 -1
- package/dist/cli/commander-usage.js +109 -3
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/completion.js +7 -3
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/contracts.d.ts +19 -0
- package/dist/cli/commands/contracts.js +40 -2
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +112 -51
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/docs.js +9 -2
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/extension.d.ts +12 -3
- package/dist/cli/commands/extension.js +421 -69
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +9 -2
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +21 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/metadata-normalizers.d.ts +4 -0
- package/dist/cli/commands/metadata-normalizers.js +37 -0
- package/dist/cli/commands/metadata-normalizers.js.map +1 -0
- package/dist/cli/commands/reindex.js +173 -135
- package/dist/cli/commands/reindex.js.map +1 -1
- package/dist/cli/commands/search.js +16 -6
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/test.js +23 -8
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update.js +70 -39
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/upgrade.d.ts +63 -0
- package/dist/cli/commands/upgrade.js +260 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/error-guidance.d.ts +9 -1
- package/dist/cli/error-guidance.js +147 -6
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/guide-topics.js +18 -16
- package/dist/cli/guide-topics.js.map +1 -1
- package/dist/cli/help-content.js +42 -2
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.js +11 -1
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +69 -6
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-setup.js +174 -82
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/telemetry-flush.d.ts +2 -0
- package/dist/cli/telemetry-flush.js +4 -0
- package/dist/cli/telemetry-flush.js.map +1 -0
- package/dist/cli.js +1 -2
- package/dist/cli.js.map +1 -1
- package/dist/core/extensions/extension-types.d.ts +72 -0
- package/dist/core/extensions/extension-types.js +24 -0
- package/dist/core/extensions/extension-types.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +1 -0
- package/dist/core/extensions/loader.js +766 -7
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/lock/lock.js +2 -0
- package/dist/core/lock/lock.js.map +1 -1
- package/dist/core/packages/manifest.d.ts +13 -0
- package/dist/core/packages/manifest.js +139 -0
- package/dist/core/packages/manifest.js.map +1 -0
- package/dist/core/sentry/instrument.d.ts +15 -0
- package/dist/core/sentry/instrument.js +35 -3
- package/dist/core/sentry/instrument.js.map +1 -1
- package/dist/core/shared/constants.js +20 -0
- package/dist/core/shared/constants.js.map +1 -1
- package/dist/core/shared/errors.d.ts +8 -0
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/shared/levenshtein.d.ts +1 -0
- package/dist/core/shared/levenshtein.js +37 -0
- package/dist/core/shared/levenshtein.js.map +1 -0
- package/dist/core/store/paths.js +34 -1
- package/dist/core/store/paths.js.map +1 -1
- package/dist/core/store/settings.js +210 -1
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/runtime.d.ts +1 -0
- package/dist/core/telemetry/runtime.js +102 -3
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/mcp/server.js +11 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +38 -17
- package/dist/sdk/cli-contracts.js +387 -35
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/index.d.ts +13 -1
- package/dist/sdk/index.js +9 -1
- package/dist/sdk/index.js.map +1 -1
- package/dist/types.d.ts +41 -0
- package/dist/types.js.map +1 -1
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/CLAUDE_CODE_PLUGIN.md +39 -0
- package/docs/COMMANDS.md +14 -1
- package/docs/EXTENSIONS.md +782 -12
- package/docs/MIGRATION_CLI_SIMPLIFICATION.md +64 -0
- package/docs/QUICKSTART.md +10 -2
- package/docs/README.md +4 -6
- package/docs/SDK.md +445 -0
- package/docs/examples/ci/github-actions-pm-extension-gate.yml +53 -0
- package/docs/examples/ci/gitlab-ci-pm-extension-gate.yml +41 -0
- package/docs/examples/ci/jenkins-pm-extension-gate.Jenkinsfile +45 -0
- package/docs/examples/policy-restricted-extension/README.md +74 -0
- package/docs/examples/policy-restricted-extension/index.js +21 -0
- package/docs/examples/policy-restricted-extension/manifest.json +21 -0
- package/docs/examples/policy-restricted-extension/package.json +8 -0
- package/docs/examples/sdk-app-embedding/README.md +39 -0
- package/docs/examples/sdk-app-embedding/package.json +9 -0
- package/docs/examples/sdk-app-embedding/run-embedded-pm.mjs +61 -0
- package/docs/examples/sdk-contract-consumer/README.md +57 -0
- package/docs/examples/sdk-contract-consumer/inspect-contracts.mjs +47 -0
- package/docs/examples/sdk-contract-consumer/package.json +10 -0
- package/docs/examples/starter-extension/README.md +57 -42
- package/docs/examples/starter-extension/manifest.json +15 -0
- package/marketplace.json +3 -3
- package/package.json +5 -23
- package/packages/pm-beads/README.md +10 -0
- package/{.agents/pm → packages/pm-beads}/extensions/beads/index.js +24 -9
- package/packages/pm-beads/extensions/beads/index.ts +131 -0
- package/packages/pm-beads/package.json +17 -0
- package/packages/pm-todos/README.md +11 -0
- package/{.agents/pm → packages/pm-todos}/extensions/todos/index.js +24 -9
- package/packages/pm-todos/extensions/todos/index.ts +149 -0
- package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.js +1 -1
- package/{.agents/pm → packages/pm-todos}/extensions/todos/runtime.ts +1 -1
- package/packages/pm-todos/package.json +17 -0
- package/plugins/pm-cli-claude/.claude-plugin/plugin.json +2 -2
- package/plugins/pm-cli-claude/README.md +54 -14
- package/plugins/pm-cli-claude/agents/pm-delivery-chain.md +88 -0
- package/plugins/pm-cli-claude/agents/pm-triage-agent.md +83 -0
- package/plugins/pm-cli-claude/agents/pm-verification-agent.md +88 -0
- package/plugins/pm-cli-claude/hooks/session-start.mjs +35 -21
- package/.agents/pm/extensions/.managed-extensions.json +0 -42
- package/.agents/skills/HARNESS_COMPATIBILITY.md +0 -45
- package/.agents/skills/README.md +0 -21
- package/.agents/skills/pm-developer/SKILL.md +0 -73
- package/.agents/skills/pm-developer/references/COMMAND_PLAYBOOK.md +0 -48
- package/.agents/skills/pm-developer/references/PROMPTS.md +0 -17
- package/.agents/skills/pm-extensions/SKILL.md +0 -57
- package/.agents/skills/pm-extensions/references/LIFECYCLE.md +0 -40
- package/.agents/skills/pm-extensions/references/TROUBLESHOOTING.md +0 -25
- package/.agents/skills/pm-sdk/SKILL.md +0 -50
- package/.agents/skills/pm-sdk/references/INTEGRATION_CHECKLIST.md +0 -31
- package/.agents/skills/pm-sdk/references/PROMPTS.md +0 -13
- package/.agents/skills/pm-user/SKILL.md +0 -59
- package/.agents/skills/pm-user/references/PROMPTS.md +0 -17
- package/.agents/skills/pm-user/references/WORKFLOWS.md +0 -35
- package/.pi/README.md +0 -26
- package/.pi/extensions/pm-cli/index.js +0 -147
- package/.pi/prompts/pm-workflow.md +0 -5
- package/.pi/skills/pm-native/SKILL.md +0 -40
- package/.pi/skills/pm-release/SKILL.md +0 -35
- package/dist/pi/native.d.ts +0 -5
- package/dist/pi/native.js +0 -183
- package/dist/pi/native.js.map +0 -1
- package/docs/PI_PACKAGE.md +0 -56
- /package/{.agents/pm → packages/pm-beads}/extensions/beads/manifest.json +0 -0
- /package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.js +0 -0
- /package/{.agents/pm → packages/pm-beads}/extensions/beads/runtime.ts +0 -0
- /package/{.agents/pm → packages/pm-todos}/extensions/todos/manifest.json +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
export interface PmCliErrorRecoveryPayload {
|
|
2
|
+
attempted_command?: string;
|
|
3
|
+
normalized_args?: string[];
|
|
4
|
+
provided_fields?: string[];
|
|
5
|
+
missing?: string[];
|
|
6
|
+
suggested_retry?: string;
|
|
7
|
+
}
|
|
1
8
|
export interface PmCliErrorContext {
|
|
2
9
|
code?: string;
|
|
3
10
|
type?: string;
|
|
@@ -5,6 +12,7 @@ export interface PmCliErrorContext {
|
|
|
5
12
|
why?: string;
|
|
6
13
|
examples?: string[];
|
|
7
14
|
nextSteps?: string[];
|
|
15
|
+
recovery?: PmCliErrorRecoveryPayload;
|
|
8
16
|
}
|
|
9
17
|
export declare class PmCliError extends Error {
|
|
10
18
|
readonly exitCode: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"/","sources":["core/shared/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"/","sources":["core/shared/errors.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,QAAQ,CAAS;IACjB,OAAO,CAAoB;IAE3C,YAAY,OAAe,EAAE,QAAgB,EAAE,UAA6B,EAAE;QAC5E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF","sourcesContent":["export interface PmCliErrorRecoveryPayload {\n attempted_command?: string;\n normalized_args?: string[];\n provided_fields?: string[];\n missing?: string[];\n suggested_retry?: string;\n}\n\nexport interface PmCliErrorContext {\n code?: string;\n type?: string;\n required?: string;\n why?: string;\n examples?: string[];\n nextSteps?: string[];\n recovery?: PmCliErrorRecoveryPayload;\n}\n\nexport class PmCliError extends Error {\n public readonly exitCode: number;\n public readonly context: PmCliErrorContext;\n\n constructor(message: string, exitCode: number, context: PmCliErrorContext = {}) {\n super(message);\n this.name = \"PmCliError\";\n this.exitCode = exitCode;\n this.context = context;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function levenshteinDistanceWithinLimit(left: string, right: string, limit: number): number | null;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function levenshteinDistanceWithinLimit(left, right, limit) {
|
|
2
|
+
if (left === right) {
|
|
3
|
+
return 0;
|
|
4
|
+
}
|
|
5
|
+
if (Math.abs(left.length - right.length) > limit) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const previous = new Array(right.length + 1);
|
|
9
|
+
const current = new Array(right.length + 1);
|
|
10
|
+
for (let column = 0; column <= right.length; column += 1) {
|
|
11
|
+
previous[column] = column;
|
|
12
|
+
}
|
|
13
|
+
for (let row = 1; row <= left.length; row += 1) {
|
|
14
|
+
current[0] = row;
|
|
15
|
+
let rowMin = current[0];
|
|
16
|
+
for (let column = 1; column <= right.length; column += 1) {
|
|
17
|
+
const cost = left[row - 1] === right[column - 1] ? 0 : 1;
|
|
18
|
+
const substitution = previous[column - 1] + cost;
|
|
19
|
+
const insertion = current[column - 1] + 1;
|
|
20
|
+
const deletion = previous[column] + 1;
|
|
21
|
+
const candidate = Math.min(substitution, insertion, deletion);
|
|
22
|
+
current[column] = candidate;
|
|
23
|
+
if (candidate < rowMin) {
|
|
24
|
+
rowMin = candidate;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (rowMin > limit) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
for (let column = 0; column <= right.length; column += 1) {
|
|
31
|
+
previous[column] = current[column];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const result = previous[right.length];
|
|
35
|
+
return result <= limit ? result : null;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=levenshtein.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levenshtein.js","sourceRoot":"/","sources":["core/shared/levenshtein.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,8BAA8B,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa;IACvF,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QACzD,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5B,CAAC;IACD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACjB,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YACjD,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC9D,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;YAC5B,IAAI,SAAS,GAAG,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YACzD,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC","sourcesContent":["export function levenshteinDistanceWithinLimit(left: string, right: string, limit: number): number | null {\n if (left === right) {\n return 0;\n }\n if (Math.abs(left.length - right.length) > limit) {\n return null;\n }\n const previous = new Array<number>(right.length + 1);\n const current = new Array<number>(right.length + 1);\n for (let column = 0; column <= right.length; column += 1) {\n previous[column] = column;\n }\n for (let row = 1; row <= left.length; row += 1) {\n current[0] = row;\n let rowMin = current[0];\n for (let column = 1; column <= right.length; column += 1) {\n const cost = left[row - 1] === right[column - 1] ? 0 : 1;\n const substitution = previous[column - 1] + cost;\n const insertion = current[column - 1] + 1;\n const deletion = previous[column] + 1;\n const candidate = Math.min(substitution, insertion, deletion);\n current[column] = candidate;\n if (candidate < rowMin) {\n rowMin = candidate;\n }\n }\n if (rowMin > limit) {\n return null;\n }\n for (let column = 0; column <= right.length; column += 1) {\n previous[column] = current[column];\n }\n }\n const result = previous[right.length];\n return result <= limit ? result : null;\n}\n"]}
|
package/dist/core/store/paths.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { statSync } from "node:fs";
|
|
1
2
|
import os from "node:os";
|
|
2
3
|
import path from "node:path";
|
|
3
4
|
import { PM_DIRNAME, SETTINGS_FILENAME, TYPE_TO_FOLDER } from "../shared/constants.js";
|
|
@@ -10,9 +11,41 @@ const ITEM_FORMAT_BY_EXTENSION = {
|
|
|
10
11
|
".toon": "toon",
|
|
11
12
|
};
|
|
12
13
|
export const ITEM_FILE_EXTENSIONS = [".md", ".toon"];
|
|
14
|
+
function pathExists(pathValue) {
|
|
15
|
+
try {
|
|
16
|
+
statSync(pathValue);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function discoverPmRootFromAncestors(cwd) {
|
|
24
|
+
let current = path.resolve(cwd);
|
|
25
|
+
while (true) {
|
|
26
|
+
const candidateRoot = path.join(current, PM_DIRNAME);
|
|
27
|
+
const candidateSettingsPath = path.join(candidateRoot, SETTINGS_FILENAME);
|
|
28
|
+
if (pathExists(candidateSettingsPath)) {
|
|
29
|
+
return candidateRoot;
|
|
30
|
+
}
|
|
31
|
+
const parent = path.dirname(current);
|
|
32
|
+
if (parent === current) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
current = parent;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
13
38
|
export function resolvePmRoot(cwd, cliPath) {
|
|
14
39
|
const envPath = process.env.PM_PATH;
|
|
15
|
-
const
|
|
40
|
+
const explicitPath = cliPath?.trim() || envPath?.trim();
|
|
41
|
+
if (explicitPath) {
|
|
42
|
+
return path.resolve(cwd, explicitPath);
|
|
43
|
+
}
|
|
44
|
+
const discoveredRoot = discoverPmRootFromAncestors(cwd);
|
|
45
|
+
if (discoveredRoot) {
|
|
46
|
+
return discoveredRoot;
|
|
47
|
+
}
|
|
48
|
+
const selected = PM_DIRNAME;
|
|
16
49
|
return path.resolve(cwd, selected);
|
|
17
50
|
}
|
|
18
51
|
export function resolveGlobalPmRoot(cwd) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"/","sources":["core/store/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGvF,MAAM,CAAC,MAAM,6BAA6B,GAAwC;IAChF,aAAa,EAAE,KAAK;IACpB,IAAI,EAAE,OAAO;CACd,CAAC;AAEF,MAAM,wBAAwB,GAAG;IAC/B,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,MAAM;CAC8B,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAiD,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAEnG,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,OAAgB;IACzD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACpC,MAAM,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"/","sources":["core/store/paths.ts"],"names":[],"mappings":"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","sourcesContent":["import { statSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { PM_DIRNAME, SETTINGS_FILENAME, TYPE_TO_FOLDER } from \"../shared/constants.js\";\nimport type { ItemFormat, ItemType } from \"../../types/index.js\";\n\nexport const ITEM_FILE_EXTENSION_BY_FORMAT: Record<ItemFormat, \".md\" | \".toon\"> = {\n json_markdown: \".md\",\n toon: \".toon\",\n};\n\nconst ITEM_FORMAT_BY_EXTENSION = {\n \".md\": \"json_markdown\",\n \".toon\": \"toon\",\n} as const satisfies Record<string, ItemFormat>;\n\nexport const ITEM_FILE_EXTENSIONS: Array<keyof typeof ITEM_FORMAT_BY_EXTENSION> = [\".md\", \".toon\"];\n\nfunction pathExists(pathValue: string): boolean {\n try {\n statSync(pathValue);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction discoverPmRootFromAncestors(cwd: string): string | undefined {\n let current = path.resolve(cwd);\n while (true) {\n const candidateRoot = path.join(current, PM_DIRNAME);\n const candidateSettingsPath = path.join(candidateRoot, SETTINGS_FILENAME);\n if (pathExists(candidateSettingsPath)) {\n return candidateRoot;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nexport function resolvePmRoot(cwd: string, cliPath?: string): string {\n const envPath = process.env.PM_PATH;\n const explicitPath = cliPath?.trim() || envPath?.trim();\n if (explicitPath) {\n return path.resolve(cwd, explicitPath);\n }\n const discoveredRoot = discoverPmRootFromAncestors(cwd);\n if (discoveredRoot) {\n return discoveredRoot;\n }\n const selected = PM_DIRNAME;\n return path.resolve(cwd, selected);\n}\n\nexport function resolveGlobalPmRoot(cwd: string): string {\n const envPath = process.env.PM_GLOBAL_PATH?.trim();\n const selected = envPath && envPath.length > 0 ? envPath : path.join(os.homedir(), \".pm-cli\");\n return path.resolve(cwd, selected);\n}\n\nexport function getSettingsPath(pmRoot: string): string {\n return path.join(pmRoot, SETTINGS_FILENAME);\n}\n\nfunction deriveDefaultTypeFolder(type: string): string {\n const normalized = type\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (normalized.length === 0) {\n return \"items\";\n }\n return normalized.endsWith(\"s\") ? normalized : `${normalized}s`;\n}\n\nexport function getTypeDirPath(pmRoot: string, type: ItemType, typeToFolder: Record<string, string> = TYPE_TO_FOLDER): string {\n const folder = typeToFolder[type] ?? deriveDefaultTypeFolder(type);\n return path.join(pmRoot, folder);\n}\n\nexport function getItemPath(\n pmRoot: string,\n type: ItemType,\n id: string,\n itemFormat: ItemFormat = \"toon\",\n typeToFolder: Record<string, string> = TYPE_TO_FOLDER,\n): string {\n return path.join(getTypeDirPath(pmRoot, type, typeToFolder), `${id}${ITEM_FILE_EXTENSION_BY_FORMAT[itemFormat]}`);\n}\n\nexport function getItemFormatFromPath(itemPath: string): ItemFormat | null {\n const extension = path.extname(itemPath).toLowerCase() as keyof typeof ITEM_FORMAT_BY_EXTENSION;\n return ITEM_FORMAT_BY_EXTENSION[extension] ?? null;\n}\n\nexport function getHistoryPath(pmRoot: string, id: string): string {\n return path.join(pmRoot, \"history\", `${id}.jsonl`);\n}\n\nexport function getLockPath(pmRoot: string, id: string): string {\n return path.join(pmRoot, \"locks\", `${id}.lock`);\n}\n\nexport function getRuntimePath(pmRoot: string): string {\n return path.join(pmRoot, \"runtime\");\n}\n\nexport function getTestRunsPath(pmRoot: string): string {\n return path.join(getRuntimePath(pmRoot), \"test-runs\");\n}\n\nexport function getTestRunsRecordsPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"runs\");\n}\n\nexport function getTestRunRecordPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsRecordsPath(pmRoot), `${runId}.json`);\n}\n\nexport function getTestRunsStdoutPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"stdout\");\n}\n\nexport function getTestRunsStderrPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"stderr\");\n}\n\nexport function getTestRunStdoutPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsStdoutPath(pmRoot), `${runId}.log`);\n}\n\nexport function getTestRunStderrPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsStderrPath(pmRoot), `${runId}.log`);\n}\n\nexport function getTestRunsResultsPath(pmRoot: string): string {\n return path.join(getTestRunsPath(pmRoot), \"results\");\n}\n\nexport function getTestRunResultPath(pmRoot: string, runId: string): string {\n return path.join(getTestRunsResultsPath(pmRoot), `${runId}.json`);\n}\n"]}
|
|
@@ -109,6 +109,45 @@ const governanceSettingsSchema = z
|
|
|
109
109
|
force_required_for_stale_lock: z.boolean().optional(),
|
|
110
110
|
})
|
|
111
111
|
.optional();
|
|
112
|
+
const extensionPolicyOverrideSchema = z.object({
|
|
113
|
+
name: z.string(),
|
|
114
|
+
disabled: z.boolean().optional(),
|
|
115
|
+
require_trusted: z.boolean().optional(),
|
|
116
|
+
require_provenance: z.boolean().optional(),
|
|
117
|
+
sandbox_profile: z.union([z.literal("none"), z.literal("restricted"), z.literal("strict")]).optional(),
|
|
118
|
+
allowed_capabilities: z.array(z.string()).optional(),
|
|
119
|
+
blocked_capabilities: z.array(z.string()).optional(),
|
|
120
|
+
allowed_surfaces: z.array(z.string()).optional(),
|
|
121
|
+
blocked_surfaces: z.array(z.string()).optional(),
|
|
122
|
+
allowed_commands: z.array(z.string()).optional(),
|
|
123
|
+
blocked_commands: z.array(z.string()).optional(),
|
|
124
|
+
allowed_actions: z.array(z.string()).optional(),
|
|
125
|
+
blocked_actions: z.array(z.string()).optional(),
|
|
126
|
+
allowed_services: z.array(z.string()).optional(),
|
|
127
|
+
blocked_services: z.array(z.string()).optional(),
|
|
128
|
+
});
|
|
129
|
+
const extensionPolicySchema = z
|
|
130
|
+
.object({
|
|
131
|
+
mode: z.union([z.literal("off"), z.literal("warn"), z.literal("enforce")]).optional(),
|
|
132
|
+
trust_mode: z.union([z.literal("off"), z.literal("warn"), z.literal("enforce")]).optional(),
|
|
133
|
+
require_provenance: z.boolean().optional(),
|
|
134
|
+
trusted_extensions: z.array(z.string()).optional(),
|
|
135
|
+
default_sandbox_profile: z.union([z.literal("none"), z.literal("restricted"), z.literal("strict")]).optional(),
|
|
136
|
+
allowed_extensions: z.array(z.string()).optional(),
|
|
137
|
+
blocked_extensions: z.array(z.string()).optional(),
|
|
138
|
+
allowed_capabilities: z.array(z.string()).optional(),
|
|
139
|
+
blocked_capabilities: z.array(z.string()).optional(),
|
|
140
|
+
allowed_surfaces: z.array(z.string()).optional(),
|
|
141
|
+
blocked_surfaces: z.array(z.string()).optional(),
|
|
142
|
+
allowed_commands: z.array(z.string()).optional(),
|
|
143
|
+
blocked_commands: z.array(z.string()).optional(),
|
|
144
|
+
allowed_actions: z.array(z.string()).optional(),
|
|
145
|
+
blocked_actions: z.array(z.string()).optional(),
|
|
146
|
+
allowed_services: z.array(z.string()).optional(),
|
|
147
|
+
blocked_services: z.array(z.string()).optional(),
|
|
148
|
+
extension_overrides: z.array(extensionPolicyOverrideSchema).optional(),
|
|
149
|
+
})
|
|
150
|
+
.optional();
|
|
112
151
|
const settingsSchema = z.object({
|
|
113
152
|
version: z.number().int(),
|
|
114
153
|
id_prefix: z.string(),
|
|
@@ -186,6 +225,7 @@ const settingsSchema = z.object({
|
|
|
186
225
|
extensions: z.object({
|
|
187
226
|
enabled: z.array(z.string()),
|
|
188
227
|
disabled: z.array(z.string()),
|
|
228
|
+
policy: extensionPolicySchema,
|
|
189
229
|
}),
|
|
190
230
|
search: z.object({
|
|
191
231
|
score_threshold: z.number(),
|
|
@@ -286,6 +326,123 @@ function hasExplicitItemFormat(raw) {
|
|
|
286
326
|
function normalizeStringList(values) {
|
|
287
327
|
return [...new Set((values ?? []).map((value) => value.trim()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right));
|
|
288
328
|
}
|
|
329
|
+
function normalizeLowerStringList(values) {
|
|
330
|
+
return [...new Set((values ?? []).map((value) => value.trim().toLowerCase()).filter((value) => value.length > 0))].sort((left, right) => left.localeCompare(right));
|
|
331
|
+
}
|
|
332
|
+
function normalizeExtensionPolicyMode(value) {
|
|
333
|
+
if (value === "off" || value === "warn" || value === "enforce") {
|
|
334
|
+
return value;
|
|
335
|
+
}
|
|
336
|
+
return SETTINGS_DEFAULTS.extensions.policy.mode;
|
|
337
|
+
}
|
|
338
|
+
function normalizeExtensionTrustMode(value) {
|
|
339
|
+
if (value === "off" || value === "warn" || value === "enforce") {
|
|
340
|
+
return value;
|
|
341
|
+
}
|
|
342
|
+
return SETTINGS_DEFAULTS.extensions.policy.trust_mode;
|
|
343
|
+
}
|
|
344
|
+
function normalizeExtensionSandboxProfile(value) {
|
|
345
|
+
if (value === "none" || value === "restricted" || value === "strict") {
|
|
346
|
+
return value;
|
|
347
|
+
}
|
|
348
|
+
return SETTINGS_DEFAULTS.extensions.policy.default_sandbox_profile;
|
|
349
|
+
}
|
|
350
|
+
function normalizeExtensionPolicyOverride(override) {
|
|
351
|
+
const name = override.name.trim().toLowerCase();
|
|
352
|
+
if (name.length === 0) {
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
const normalized = {
|
|
356
|
+
name,
|
|
357
|
+
};
|
|
358
|
+
if (override.disabled === true) {
|
|
359
|
+
normalized.disabled = true;
|
|
360
|
+
}
|
|
361
|
+
if (override.require_trusted === true) {
|
|
362
|
+
normalized.require_trusted = true;
|
|
363
|
+
}
|
|
364
|
+
if (override.require_provenance === true) {
|
|
365
|
+
normalized.require_provenance = true;
|
|
366
|
+
}
|
|
367
|
+
if (override.sandbox_profile !== undefined) {
|
|
368
|
+
normalized.sandbox_profile = normalizeExtensionSandboxProfile(override.sandbox_profile);
|
|
369
|
+
}
|
|
370
|
+
const allowedCapabilities = normalizeLowerStringList(override.allowed_capabilities);
|
|
371
|
+
const blockedCapabilities = normalizeLowerStringList(override.blocked_capabilities);
|
|
372
|
+
const allowedSurfaces = normalizeLowerStringList(override.allowed_surfaces);
|
|
373
|
+
const blockedSurfaces = normalizeLowerStringList(override.blocked_surfaces);
|
|
374
|
+
const allowedCommands = normalizeLowerStringList(override.allowed_commands);
|
|
375
|
+
const blockedCommands = normalizeLowerStringList(override.blocked_commands);
|
|
376
|
+
const allowedActions = normalizeLowerStringList(override.allowed_actions);
|
|
377
|
+
const blockedActions = normalizeLowerStringList(override.blocked_actions);
|
|
378
|
+
const allowedServices = normalizeLowerStringList(override.allowed_services);
|
|
379
|
+
const blockedServices = normalizeLowerStringList(override.blocked_services);
|
|
380
|
+
if (allowedCapabilities.length > 0) {
|
|
381
|
+
normalized.allowed_capabilities = allowedCapabilities;
|
|
382
|
+
}
|
|
383
|
+
if (blockedCapabilities.length > 0) {
|
|
384
|
+
normalized.blocked_capabilities = blockedCapabilities;
|
|
385
|
+
}
|
|
386
|
+
if (allowedSurfaces.length > 0) {
|
|
387
|
+
normalized.allowed_surfaces = allowedSurfaces;
|
|
388
|
+
}
|
|
389
|
+
if (blockedSurfaces.length > 0) {
|
|
390
|
+
normalized.blocked_surfaces = blockedSurfaces;
|
|
391
|
+
}
|
|
392
|
+
if (allowedCommands.length > 0) {
|
|
393
|
+
normalized.allowed_commands = allowedCommands;
|
|
394
|
+
}
|
|
395
|
+
if (blockedCommands.length > 0) {
|
|
396
|
+
normalized.blocked_commands = blockedCommands;
|
|
397
|
+
}
|
|
398
|
+
if (allowedActions.length > 0) {
|
|
399
|
+
normalized.allowed_actions = allowedActions;
|
|
400
|
+
}
|
|
401
|
+
if (blockedActions.length > 0) {
|
|
402
|
+
normalized.blocked_actions = blockedActions;
|
|
403
|
+
}
|
|
404
|
+
if (allowedServices.length > 0) {
|
|
405
|
+
normalized.allowed_services = allowedServices;
|
|
406
|
+
}
|
|
407
|
+
if (blockedServices.length > 0) {
|
|
408
|
+
normalized.blocked_services = blockedServices;
|
|
409
|
+
}
|
|
410
|
+
return normalized;
|
|
411
|
+
}
|
|
412
|
+
function normalizeExtensionPolicyOverrides(overrides) {
|
|
413
|
+
const dedupedByName = new Map();
|
|
414
|
+
for (const override of overrides ?? []) {
|
|
415
|
+
const normalized = normalizeExtensionPolicyOverride(override);
|
|
416
|
+
if (!normalized) {
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
dedupedByName.set(normalized.name, normalized);
|
|
420
|
+
}
|
|
421
|
+
return [...dedupedByName.values()].sort((left, right) => left.name.localeCompare(right.name));
|
|
422
|
+
}
|
|
423
|
+
function normalizeExtensionPolicySettings(policy) {
|
|
424
|
+
const defaults = SETTINGS_DEFAULTS.extensions.policy;
|
|
425
|
+
return {
|
|
426
|
+
mode: normalizeExtensionPolicyMode(policy?.mode),
|
|
427
|
+
trust_mode: normalizeExtensionTrustMode(policy?.trust_mode),
|
|
428
|
+
require_provenance: policy?.require_provenance === true,
|
|
429
|
+
trusted_extensions: normalizeLowerStringList(policy?.trusted_extensions ?? defaults.trusted_extensions),
|
|
430
|
+
default_sandbox_profile: normalizeExtensionSandboxProfile(policy?.default_sandbox_profile),
|
|
431
|
+
allowed_extensions: normalizeLowerStringList(policy?.allowed_extensions ?? defaults.allowed_extensions),
|
|
432
|
+
blocked_extensions: normalizeLowerStringList(policy?.blocked_extensions ?? defaults.blocked_extensions),
|
|
433
|
+
allowed_capabilities: normalizeLowerStringList(policy?.allowed_capabilities ?? defaults.allowed_capabilities),
|
|
434
|
+
blocked_capabilities: normalizeLowerStringList(policy?.blocked_capabilities ?? defaults.blocked_capabilities),
|
|
435
|
+
allowed_surfaces: normalizeLowerStringList(policy?.allowed_surfaces ?? defaults.allowed_surfaces),
|
|
436
|
+
blocked_surfaces: normalizeLowerStringList(policy?.blocked_surfaces ?? defaults.blocked_surfaces),
|
|
437
|
+
allowed_commands: normalizeLowerStringList(policy?.allowed_commands ?? defaults.allowed_commands),
|
|
438
|
+
blocked_commands: normalizeLowerStringList(policy?.blocked_commands ?? defaults.blocked_commands),
|
|
439
|
+
allowed_actions: normalizeLowerStringList(policy?.allowed_actions ?? defaults.allowed_actions),
|
|
440
|
+
blocked_actions: normalizeLowerStringList(policy?.blocked_actions ?? defaults.blocked_actions),
|
|
441
|
+
allowed_services: normalizeLowerStringList(policy?.allowed_services ?? defaults.allowed_services),
|
|
442
|
+
blocked_services: normalizeLowerStringList(policy?.blocked_services ?? defaults.blocked_services),
|
|
443
|
+
extension_overrides: normalizeExtensionPolicyOverrides(policy?.extension_overrides ?? defaults.extension_overrides),
|
|
444
|
+
};
|
|
445
|
+
}
|
|
289
446
|
function normalizeValidationMetadataRequiredFields(values) {
|
|
290
447
|
const normalized = [...new Set((values ?? []).map((value) => value.trim().toLowerCase().replaceAll("-", "_")))]
|
|
291
448
|
.filter((value) => value.length > 0)
|
|
@@ -447,6 +604,7 @@ function mergeSettings(raw) {
|
|
|
447
604
|
extensions: {
|
|
448
605
|
enabled: [...settings.extensions.enabled],
|
|
449
606
|
disabled: [...settings.extensions.disabled],
|
|
607
|
+
policy: normalizeExtensionPolicySettings(settings.extensions.policy ?? defaults.extensions.policy),
|
|
450
608
|
},
|
|
451
609
|
search: { ...defaults.search, ...settings.search },
|
|
452
610
|
providers: {
|
|
@@ -484,6 +642,20 @@ export function serializeSettings(settings) {
|
|
|
484
642
|
definitions: normalizeItemTypeDefinitions(settings.item_types?.definitions),
|
|
485
643
|
},
|
|
486
644
|
schema: normalizeRuntimeSchemaSettings(settings.schema),
|
|
645
|
+
context: {
|
|
646
|
+
default_depth: settings.context?.default_depth ?? SETTINGS_DEFAULTS.context.default_depth,
|
|
647
|
+
activity_limit: settings.context?.activity_limit ?? SETTINGS_DEFAULTS.context.activity_limit,
|
|
648
|
+
stale_threshold_days: settings.context?.stale_threshold_days ?? SETTINGS_DEFAULTS.context.stale_threshold_days,
|
|
649
|
+
sections: {
|
|
650
|
+
...SETTINGS_DEFAULTS.context.sections,
|
|
651
|
+
...(settings.context?.sections ?? {}),
|
|
652
|
+
},
|
|
653
|
+
},
|
|
654
|
+
extensions: {
|
|
655
|
+
enabled: normalizeStringList(settings.extensions?.enabled),
|
|
656
|
+
disabled: normalizeStringList(settings.extensions?.disabled),
|
|
657
|
+
policy: normalizeExtensionPolicySettings(settings.extensions?.policy),
|
|
658
|
+
},
|
|
487
659
|
};
|
|
488
660
|
const ordered = orderObject({
|
|
489
661
|
...normalizedSettings,
|
|
@@ -559,7 +731,44 @@ export function serializeSettings(settings) {
|
|
|
559
731
|
"sections",
|
|
560
732
|
]);
|
|
561
733
|
ordered.context.sections = orderObject((ordered.context.sections ?? {}), ["hierarchy", "activity", "progress", "blockers", "files", "workload", "staleness", "tests"]);
|
|
562
|
-
ordered.extensions = orderObject(ordered.extensions, ["enabled", "disabled"]);
|
|
734
|
+
ordered.extensions = orderObject(ordered.extensions, ["enabled", "disabled", "policy"]);
|
|
735
|
+
ordered.extensions.policy = orderObject((ordered.extensions.policy ?? {}), [
|
|
736
|
+
"mode",
|
|
737
|
+
"trust_mode",
|
|
738
|
+
"require_provenance",
|
|
739
|
+
"trusted_extensions",
|
|
740
|
+
"default_sandbox_profile",
|
|
741
|
+
"allowed_extensions",
|
|
742
|
+
"blocked_extensions",
|
|
743
|
+
"allowed_capabilities",
|
|
744
|
+
"blocked_capabilities",
|
|
745
|
+
"allowed_surfaces",
|
|
746
|
+
"blocked_surfaces",
|
|
747
|
+
"allowed_commands",
|
|
748
|
+
"blocked_commands",
|
|
749
|
+
"allowed_actions",
|
|
750
|
+
"blocked_actions",
|
|
751
|
+
"allowed_services",
|
|
752
|
+
"blocked_services",
|
|
753
|
+
"extension_overrides",
|
|
754
|
+
]);
|
|
755
|
+
ordered.extensions.policy.extension_overrides = (ordered.extensions.policy.extension_overrides ?? []).map((entry) => orderObject((entry ?? {}), [
|
|
756
|
+
"name",
|
|
757
|
+
"disabled",
|
|
758
|
+
"require_trusted",
|
|
759
|
+
"require_provenance",
|
|
760
|
+
"sandbox_profile",
|
|
761
|
+
"allowed_capabilities",
|
|
762
|
+
"blocked_capabilities",
|
|
763
|
+
"allowed_surfaces",
|
|
764
|
+
"blocked_surfaces",
|
|
765
|
+
"allowed_commands",
|
|
766
|
+
"blocked_commands",
|
|
767
|
+
"allowed_actions",
|
|
768
|
+
"blocked_actions",
|
|
769
|
+
"allowed_services",
|
|
770
|
+
"blocked_services",
|
|
771
|
+
]));
|
|
563
772
|
ordered.search = orderObject(ordered.search, [
|
|
564
773
|
"score_threshold",
|
|
565
774
|
"hybrid_semantic_weight",
|