@unbrained/pm-cli 2026.5.27 → 2026.5.28
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 +10 -0
- package/dist/cli/commands/close.d.ts +3 -0
- package/dist/cli/commands/close.js +24 -2
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/extension/scaffold.js +54 -21
- package/dist/cli/commands/extension/scaffold.js.map +1 -1
- package/dist/cli/commands/list.js +2 -3
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +5 -0
- package/dist/cli/commands/plan.js +56 -8
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/search.js +2 -6
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/test.js +3 -3
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update.js +23 -4
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.js +32 -12
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/register-mutation.js +51 -4
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/core/shared/levenshtein.js +23 -7
- package/dist/core/shared/levenshtein.js.map +1 -1
- package/dist/sdk/cli-contracts.js +9 -2
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
// Optimal String Alignment (OSA) Damerau–Levenshtein: counts a single adjacent
|
|
2
|
+
// transposition as one edit (e.g. "titel" vs "title", "lst" vs "lts" -> "list")
|
|
3
|
+
// so flag/command typo suggestions catch transpositions at the same maxDistance
|
|
4
|
+
// budget plain Levenshtein uses for substitutions. pm-fl0c #6 (2026-05-28):
|
|
5
|
+
// fixed because plain Levenshtein scored "titel"->"title" at 2, defeating the
|
|
6
|
+
// length-5 maxDistance=1 ceiling in suggestNearestLongFlags.
|
|
1
7
|
|
|
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]="
|
|
8
|
+
!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]="6f3e0977-8505-552c-b2ff-862f2a5d5a91")}catch(e){}}();
|
|
3
9
|
export function levenshteinDistanceWithinLimit(left, right, limit) {
|
|
4
10
|
if (left === right) {
|
|
5
11
|
return 0;
|
|
@@ -7,9 +13,12 @@ export function levenshteinDistanceWithinLimit(left, right, limit) {
|
|
|
7
13
|
if (Math.abs(left.length - right.length) > limit) {
|
|
8
14
|
return null;
|
|
9
15
|
}
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
16
|
+
const width = right.length + 1;
|
|
17
|
+
const beforePrevious = new Array(width);
|
|
18
|
+
const previous = new Array(width);
|
|
19
|
+
const current = new Array(width);
|
|
20
|
+
for (let column = 0; column < width; column += 1) {
|
|
21
|
+
beforePrevious[column] = 0;
|
|
13
22
|
previous[column] = column;
|
|
14
23
|
}
|
|
15
24
|
for (let row = 1; row <= left.length; row += 1) {
|
|
@@ -20,7 +29,13 @@ export function levenshteinDistanceWithinLimit(left, right, limit) {
|
|
|
20
29
|
const substitution = previous[column - 1] + cost;
|
|
21
30
|
const insertion = current[column - 1] + 1;
|
|
22
31
|
const deletion = previous[column] + 1;
|
|
23
|
-
|
|
32
|
+
let candidate = Math.min(substitution, insertion, deletion);
|
|
33
|
+
if (row > 1 &&
|
|
34
|
+
column > 1 &&
|
|
35
|
+
left[row - 1] === right[column - 2] &&
|
|
36
|
+
left[row - 2] === right[column - 1]) {
|
|
37
|
+
candidate = Math.min(candidate, beforePrevious[column - 2] + 1);
|
|
38
|
+
}
|
|
24
39
|
current[column] = candidate;
|
|
25
40
|
if (candidate < rowMin) {
|
|
26
41
|
rowMin = candidate;
|
|
@@ -29,7 +44,8 @@ export function levenshteinDistanceWithinLimit(left, right, limit) {
|
|
|
29
44
|
if (rowMin > limit) {
|
|
30
45
|
return null;
|
|
31
46
|
}
|
|
32
|
-
for (let column = 0; column
|
|
47
|
+
for (let column = 0; column < width; column += 1) {
|
|
48
|
+
beforePrevious[column] = previous[column];
|
|
33
49
|
previous[column] = current[column];
|
|
34
50
|
}
|
|
35
51
|
}
|
|
@@ -37,4 +53,4 @@ export function levenshteinDistanceWithinLimit(left, right, limit) {
|
|
|
37
53
|
return result <= limit ? result : null;
|
|
38
54
|
}
|
|
39
55
|
//# sourceMappingURL=levenshtein.js.map
|
|
40
|
-
//# debugId=
|
|
56
|
+
//# debugId=6f3e0977-8505-552c-b2ff-862f2a5d5a91
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"levenshtein.js","sources":["core/shared/levenshtein.ts"],"sourceRoot":"/","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"levenshtein.js","sources":["core/shared/levenshtein.ts"],"sourceRoot":"/","sourcesContent":["// Optimal String Alignment (OSA) Damerau–Levenshtein: counts a single adjacent\n// transposition as one edit (e.g. \"titel\" vs \"title\", \"lst\" vs \"lts\" -> \"list\")\n// so flag/command typo suggestions catch transpositions at the same maxDistance\n// budget plain Levenshtein uses for substitutions. pm-fl0c #6 (2026-05-28):\n// fixed because plain Levenshtein scored \"titel\"->\"title\" at 2, defeating the\n// length-5 maxDistance=1 ceiling in suggestNearestLongFlags.\nexport 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 width = right.length + 1;\n const beforePrevious = new Array<number>(width);\n const previous = new Array<number>(width);\n const current = new Array<number>(width);\n for (let column = 0; column < width; column += 1) {\n beforePrevious[column] = 0;\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 let candidate = Math.min(substitution, insertion, deletion);\n if (\n row > 1 &&\n column > 1 &&\n left[row - 1] === right[column - 2] &&\n left[row - 2] === right[column - 1]\n ) {\n candidate = Math.min(candidate, beforePrevious[column - 2] + 1);\n }\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 < width; column += 1) {\n beforePrevious[column] = previous[column];\n previous[column] = current[column];\n }\n }\n const result = previous[right.length];\n return result <= limit ? result : null;\n}\n"],"names":[],"mappings":"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","debugId":"6f3e0977-8505-552c-b2ff-862f2a5d5a91"}
|
|
@@ -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]="9aa93ff6-c3b0-5b97-b9ab-d31f0d1ba656")}catch(e){}}();
|
|
3
3
|
export { ACTIVITY_COMMANDER_STRING_OPTION_CONTRACTS, CALENDAR_COMMANDER_STRING_OPTION_CONTRACTS, CONTEXT_COMMANDER_STRING_OPTION_CONTRACTS, LIST_COMMANDER_STRING_OPTION_CONTRACTS, SEARCH_COMMANDER_STRING_OPTION_CONTRACTS, readFirstStringFromCommanderOptions, readStringArrayFromCommanderOptions, } from "./cli-contracts/commander-types.js";
|
|
4
4
|
export { CREATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS, CREATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS, CREATE_COMMANDER_STRING_OPTION_CONTRACTS, UPDATE_COMMANDER_OPTION_REGISTRATION_CONTRACTS, UPDATE_COMMANDER_REPEATABLE_OPTION_CONTRACTS, UPDATE_COMMANDER_STRING_OPTION_CONTRACTS, } from "./cli-contracts/commander-mutation-options.js";
|
|
5
5
|
// PM_* enum/guard contracts and the bulk tool-parameter property/metadata data
|
|
@@ -361,6 +361,13 @@ export const CLOSE_FLAG_CONTRACTS = [
|
|
|
361
361
|
{ flag: "--author" },
|
|
362
362
|
{ flag: "--message" },
|
|
363
363
|
{ flag: "--validate-close" },
|
|
364
|
+
// pm-fl0c #11 (2026-05-28) + Codex P2 follow-up: inline closure-validation
|
|
365
|
+
// fields. Surface them through the contract so `pm contracts --command
|
|
366
|
+
// close`, the JSON help payload, and bootstrap flag normalization /
|
|
367
|
+
// suggestions all stay consistent with the commander registration.
|
|
368
|
+
{ flag: "--resolution" },
|
|
369
|
+
{ flag: "--expected-result", aliases: ["--expected_result"] },
|
|
370
|
+
{ flag: "--actual-result", aliases: ["--actual_result"] },
|
|
364
371
|
{ flag: "--force" },
|
|
365
372
|
];
|
|
366
373
|
export const APPEND_FLAG_CONTRACTS = [
|
|
@@ -1607,4 +1614,4 @@ function buildProviderCompatibleToolSchema() {
|
|
|
1607
1614
|
}
|
|
1608
1615
|
export const PM_PROVIDER_TOOL_PARAMETERS_SCHEMA = buildProviderCompatibleToolSchema();
|
|
1609
1616
|
//# sourceMappingURL=cli-contracts.js.map
|
|
1610
|
-
//# debugId=
|
|
1617
|
+
//# debugId=9aa93ff6-c3b0-5b97-b9ab-d31f0d1ba656
|