@unbrained/pm-cli 2026.5.18 → 2026.5.24
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 +60 -0
- package/README.md +2 -1
- package/dist/cli/commander-usage.js +16 -2
- package/dist/cli/commander-usage.js.map +1 -1
- package/dist/cli/commands/annotation-command.d.ts +49 -0
- package/dist/cli/commands/annotation-command.js +135 -0
- package/dist/cli/commands/annotation-command.js.map +1 -0
- package/dist/cli/commands/append.js +3 -7
- package/dist/cli/commands/append.js.map +1 -1
- package/dist/cli/commands/calendar.js +3 -6
- package/dist/cli/commands/calendar.js.map +1 -1
- package/dist/cli/commands/claim.js +12 -22
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/close.js +61 -9
- package/dist/cli/commands/close.js.map +1 -1
- package/dist/cli/commands/comments.d.ts +5 -0
- package/dist/cli/commands/comments.js +27 -117
- package/dist/cli/commands/comments.js.map +1 -1
- package/dist/cli/commands/completion.js +102 -15
- package/dist/cli/commands/completion.js.map +1 -1
- package/dist/cli/commands/context.js +4 -10
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/contracts.js +168 -36
- package/dist/cli/commands/contracts.js.map +1 -1
- package/dist/cli/commands/create.js +49 -44
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/dedupe-audit.js +7 -4
- package/dist/cli/commands/dedupe-audit.js.map +1 -1
- package/dist/cli/commands/delete.d.ts +3 -0
- package/dist/cli/commands/delete.js +9 -8
- package/dist/cli/commands/delete.js.map +1 -1
- package/dist/cli/commands/docs.d.ts +1 -0
- package/dist/cli/commands/docs.js +4 -8
- package/dist/cli/commands/docs.js.map +1 -1
- package/dist/cli/commands/event-validation-messages.d.ts +3 -0
- package/dist/cli/commands/event-validation-messages.js +44 -0
- package/dist/cli/commands/event-validation-messages.js.map +1 -0
- package/dist/cli/commands/extension.d.ts +1 -0
- package/dist/cli/commands/extension.js +138 -21
- package/dist/cli/commands/extension.js.map +1 -1
- package/dist/cli/commands/files.js +6 -13
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/gc.js +17 -4
- package/dist/cli/commands/gc.js.map +1 -1
- package/dist/cli/commands/get.d.ts +3 -2
- package/dist/cli/commands/get.js +50 -8
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/health.d.ts +10 -0
- package/dist/cli/commands/health.js +254 -75
- package/dist/cli/commands/health.js.map +1 -1
- package/dist/cli/commands/history-redact.d.ts +8 -0
- package/dist/cli/commands/history-redact.js +14 -97
- package/dist/cli/commands/history-redact.js.map +1 -1
- package/dist/cli/commands/history-repair.d.ts +33 -0
- package/dist/cli/commands/history-repair.js +166 -0
- package/dist/cli/commands/history-repair.js.map +1 -0
- package/dist/cli/commands/history.d.ts +4 -4
- package/dist/cli/commands/history.js +10 -88
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/index.d.ts +3 -1
- package/dist/cli/commands/index.js +5 -3
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +28 -0
- package/dist/cli/commands/init.js +23 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/learnings.js +20 -119
- package/dist/cli/commands/learnings.js.map +1 -1
- package/dist/cli/commands/linked-test-entry.d.ts +3 -0
- package/dist/cli/commands/linked-test-entry.js +62 -0
- package/dist/cli/commands/linked-test-entry.js.map +1 -0
- package/dist/cli/commands/list.js +32 -22
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/notes.js +20 -119
- package/dist/cli/commands/notes.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +3 -0
- package/dist/cli/commands/plan.js +184 -22
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/restore.js +7 -50
- package/dist/cli/commands/restore.js.map +1 -1
- package/dist/cli/commands/schema.d.ts +31 -0
- package/dist/cli/commands/schema.js +98 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/search.js +151 -40
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/templates.d.ts +4 -0
- package/dist/cli/commands/templates.js +89 -17
- package/dist/cli/commands/templates.js.map +1 -1
- package/dist/cli/commands/test-all.js +4 -8
- package/dist/cli/commands/test-all.js.map +1 -1
- package/dist/cli/commands/test.d.ts +1 -0
- package/dist/cli/commands/test.js +7 -10
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/commands/update-many.js +4 -8
- package/dist/cli/commands/update-many.js.map +1 -1
- package/dist/cli/commands/update.js +109 -51
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +3 -1
- package/dist/cli/commands/validate.js +23 -71
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/error-guidance.js +96 -6
- package/dist/cli/error-guidance.js.map +1 -1
- package/dist/cli/extension-command-help.d.ts +0 -1
- package/dist/cli/extension-command-help.js +2 -13
- package/dist/cli/extension-command-help.js.map +1 -1
- package/dist/cli/extension-command-options.d.ts +1 -0
- package/dist/cli/extension-command-options.js +106 -7
- package/dist/cli/extension-command-options.js.map +1 -1
- package/dist/cli/help-content.d.ts +0 -1
- package/dist/cli/help-content.js +13 -9
- package/dist/cli/help-content.js.map +1 -1
- package/dist/cli/help-json-payload.d.ts +1 -0
- package/dist/cli/help-json-payload.js +33 -3
- package/dist/cli/help-json-payload.js.map +1 -1
- package/dist/cli/main.js +35 -29
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/register-list-query.d.ts +1 -1
- package/dist/cli/register-list-query.js +40 -17
- package/dist/cli/register-list-query.js.map +1 -1
- package/dist/cli/register-mutation.d.ts +1 -1
- package/dist/cli/register-mutation.js +232 -64
- package/dist/cli/register-mutation.js.map +1 -1
- package/dist/cli/register-operations.js +16 -11
- package/dist/cli/register-operations.js.map +1 -1
- package/dist/cli/register-setup.js +26 -14
- package/dist/cli/register-setup.js.map +1 -1
- package/dist/cli/registration-helpers.d.ts +0 -2
- package/dist/cli/registration-helpers.js +13 -40
- package/dist/cli/registration-helpers.js.map +1 -1
- package/dist/cli.js +23 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/extensions/index.d.ts +0 -1
- package/dist/core/extensions/index.js +2 -14
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.js +3 -9
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/fs/path-utils.d.ts +1 -0
- package/dist/core/fs/path-utils.js +12 -0
- package/dist/core/fs/path-utils.js.map +1 -0
- package/dist/core/history/drift-scan.d.ts +11 -0
- package/dist/core/history/drift-scan.js +67 -0
- package/dist/core/history/drift-scan.js.map +1 -0
- package/dist/core/history/replay.d.ts +82 -0
- package/dist/core/history/replay.js +249 -0
- package/dist/core/history/replay.js.map +1 -0
- package/dist/core/item/item-format.js +11 -8
- package/dist/core/item/item-format.js.map +1 -1
- package/dist/core/item/item-type-definition.d.ts +52 -0
- package/dist/core/item/item-type-definition.js +123 -0
- package/dist/core/item/item-type-definition.js.map +1 -0
- package/dist/core/item/parse.js +3 -2
- package/dist/core/item/parse.js.map +1 -1
- package/dist/core/item/priority.d.ts +23 -0
- package/dist/core/item/priority.js +55 -0
- package/dist/core/item/priority.js.map +1 -0
- package/dist/core/item/status.d.ts +14 -1
- package/dist/core/item/status.js +22 -2
- package/dist/core/item/status.js.map +1 -1
- package/dist/core/item/toon-decode.d.ts +19 -0
- package/dist/core/item/toon-decode.js +69 -0
- package/dist/core/item/toon-decode.js.map +1 -0
- package/dist/core/item/type-registry.js +13 -84
- package/dist/core/item/type-registry.js.map +1 -1
- package/dist/core/packages/manifest.js +3 -9
- package/dist/core/packages/manifest.js.map +1 -1
- package/dist/core/schema/item-types-file.d.ts +85 -0
- package/dist/core/schema/item-types-file.js +243 -0
- package/dist/core/schema/item-types-file.js.map +1 -0
- package/dist/core/schema/runtime-schema.d.ts +2 -1
- package/dist/core/schema/runtime-schema.js +11 -9
- package/dist/core/schema/runtime-schema.js.map +1 -1
- package/dist/core/search/semantic-defaults.js +3 -3
- package/dist/core/search/semantic-defaults.js.map +1 -1
- package/dist/core/shared/author.d.ts +1 -0
- package/dist/core/shared/author.js +9 -0
- package/dist/core/shared/author.js.map +1 -0
- package/dist/core/shared/lazy-module.d.ts +1 -0
- package/dist/core/shared/lazy-module.js +11 -0
- package/dist/core/shared/lazy-module.js.map +1 -0
- package/dist/core/shared/option-alias-visibility.d.ts +44 -0
- package/dist/core/shared/option-alias-visibility.js +76 -0
- package/dist/core/shared/option-alias-visibility.js.map +1 -0
- package/dist/core/shared/text-normalization.d.ts +0 -1
- package/dist/core/shared/text-normalization.js +2 -5
- package/dist/core/shared/text-normalization.js.map +1 -1
- package/dist/core/store/item-store.d.ts +2 -0
- package/dist/core/store/item-store.js +70 -39
- package/dist/core/store/item-store.js.map +1 -1
- package/dist/core/store/settings-validator.d.ts +106 -0
- package/dist/core/store/settings-validator.js +279 -0
- package/dist/core/store/settings-validator.js.map +1 -0
- package/dist/core/store/settings.js +6 -343
- package/dist/core/store/settings.js.map +1 -1
- package/dist/core/telemetry/runtime.js +5 -3
- package/dist/core/telemetry/runtime.js.map +1 -1
- package/dist/mcp/server.js +64 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/sdk/cli-contracts.d.ts +9 -2
- package/dist/sdk/cli-contracts.js +204 -13
- package/dist/sdk/cli-contracts.js.map +1 -1
- package/dist/sdk/runtime.d.ts +25 -1
- package/dist/sdk/runtime.js +46 -3
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.js +10 -2
- package/dist/types.js.map +1 -1
- package/docs/AGENT_GUIDE.md +7 -1
- package/docs/ARCHITECTURE.md +1 -1
- package/docs/COMMANDS.md +39 -6
- package/docs/CONFIGURATION.md +1 -1
- package/docs/RELEASING.md +11 -7
- package/docs/SDK.md +11 -2
- package/package.json +12 -11
- package/packages/pm-calendar/README.md +3 -1
- package/packages/pm-calendar/extensions/calendar/index.js +21 -2
- package/packages/pm-calendar/extensions/calendar/index.ts +21 -2
- package/packages/pm-search-advanced/README.md +8 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.js +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/index.ts +74 -0
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.js +67 -9
- package/packages/pm-search-advanced/extensions/search-advanced/runtime.ts +67 -9
- package/packages/pm-templates/extensions/templates/runtime.js +11 -202
- package/packages/pm-templates/extensions/templates/runtime.ts +38 -230
- package/dist/core/output/command-aware.d.ts +0 -1
- package/dist/core/output/command-aware.js +0 -397
- package/dist/core/output/command-aware.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-defaults.js","sources":["core/search/semantic-defaults.ts"],"sourceRoot":"/","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport type { PmSettings } from \"../../types/index.js\";\nimport { toNonEmptyString } from \"../shared/primitives.js\";\n\nconst DISABLE_AUTO_DEFAULTS_ENV = \"PM_DISABLE_OLLAMA_AUTO_DEFAULTS\";\nconst OLLAMA_MODEL_ENV = \"PM_OLLAMA_MODEL\";\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\nconst DEFAULT_OLLAMA_MODEL = \"qwen3-embedding:0.6b\";\nconst DEFAULT_LANCEDB_PATH = \".agents/pm/search/lancedb/\";\nconst OLLAMA_VERSION_TIMEOUT_MS = 1_500;\nconst OLLAMA_LIST_TIMEOUT_MS = 2_500;\nconst QWEN_EMBEDDING_MODEL_PATTERN = /qwen.*(?:embed|embedding)|(?:embed|embedding).*qwen/i;\nconst EMBEDDING_MODEL_PATTERN = /embed|embedding/i;\n\nexport interface SemanticRuntimeDefaultsResolution {\n settings: PmSettings;\n auto_ollama_defaults_applied: boolean;\n}\n\nconst toOptionalNonEmptyString = toNonEmptyString;\n\nfunction isAutoDefaultsDisabled(): boolean {\n const raw = toOptionalNonEmptyString(process.env[DISABLE_AUTO_DEFAULTS_ENV]);\n if (!raw) {\n return false;\n }\n const normalized = raw.toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\nfunction hasAnyExplicitSemanticConfiguration(settings: PmSettings): boolean {\n const candidateValues: Array<unknown> = [\n settings.search?.provider,\n settings.vector_store?.adapter,\n settings.providers?.openai?.base_url,\n settings.providers?.openai?.model,\n settings.providers?.openai?.api_key,\n settings.providers?.ollama?.base_url,\n settings.providers?.ollama?.model,\n settings.vector_store?.qdrant?.url,\n settings.vector_store?.qdrant?.api_key,\n settings.vector_store?.lancedb?.path,\n ];\n return candidateValues.some((entry) => toOptionalNonEmptyString(entry) !== null);\n}\n\nfunction isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_VERSION_TIMEOUT_MS,\n });\n if (result.error) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction parseOllamaModelList(output: string): string | null {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n const models = lines\n .map((line) => line.split(/\\s+/)[0]?.trim())\n .filter((entry): entry is string => Boolean(entry && entry.length > 0))\n .filter((entry) => entry.toUpperCase() !== \"NAME\");\n if (models.length === 0) {\n return null;\n }\n const preferredQwenEmbeddingModel = models.find((entry) => QWEN_EMBEDDING_MODEL_PATTERN.test(entry));\n if (preferredQwenEmbeddingModel) {\n return preferredQwenEmbeddingModel;\n }\n const embeddingModel = models.find((entry) => EMBEDDING_MODEL_PATTERN.test(entry));\n return embeddingModel ??
|
|
1
|
+
{"version":3,"file":"semantic-defaults.js","sources":["core/search/semantic-defaults.ts"],"sourceRoot":"/","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport type { PmSettings } from \"../../types/index.js\";\nimport { toNonEmptyString } from \"../shared/primitives.js\";\n\nconst DISABLE_AUTO_DEFAULTS_ENV = \"PM_DISABLE_OLLAMA_AUTO_DEFAULTS\";\nconst OLLAMA_MODEL_ENV = \"PM_OLLAMA_MODEL\";\nconst DEFAULT_OLLAMA_BASE_URL = \"http://localhost:11434\";\nconst DEFAULT_OLLAMA_MODEL = \"qwen3-embedding:0.6b\";\nconst DEFAULT_LANCEDB_PATH = \".agents/pm/search/lancedb/\";\nconst OLLAMA_VERSION_TIMEOUT_MS = 1_500;\nconst OLLAMA_LIST_TIMEOUT_MS = 2_500;\nconst QWEN_EMBEDDING_MODEL_PATTERN = /qwen.*(?:embed|embedding)|(?:embed|embedding).*qwen/i;\nconst EMBEDDING_MODEL_PATTERN = /embed|embedding/i;\n\nexport interface SemanticRuntimeDefaultsResolution {\n settings: PmSettings;\n auto_ollama_defaults_applied: boolean;\n}\n\nconst toOptionalNonEmptyString = toNonEmptyString;\n\nfunction isAutoDefaultsDisabled(): boolean {\n const raw = toOptionalNonEmptyString(process.env[DISABLE_AUTO_DEFAULTS_ENV]);\n if (!raw) {\n return false;\n }\n const normalized = raw.toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\";\n}\n\nfunction hasAnyExplicitSemanticConfiguration(settings: PmSettings): boolean {\n const candidateValues: Array<unknown> = [\n settings.search?.provider,\n settings.vector_store?.adapter,\n settings.providers?.openai?.base_url,\n settings.providers?.openai?.model,\n settings.providers?.openai?.api_key,\n settings.providers?.ollama?.base_url,\n settings.providers?.ollama?.model,\n settings.vector_store?.qdrant?.url,\n settings.vector_store?.qdrant?.api_key,\n settings.vector_store?.lancedb?.path,\n ];\n return candidateValues.some((entry) => toOptionalNonEmptyString(entry) !== null);\n}\n\nfunction isOllamaInstalled(): boolean {\n const result = spawnSync(\"ollama\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_VERSION_TIMEOUT_MS,\n });\n if (result.error) {\n return false;\n }\n return result.status === 0;\n}\n\nfunction parseOllamaModelList(output: string): string | null {\n const lines = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n const models = lines\n .map((line) => line.split(/\\s+/)[0]?.trim())\n .filter((entry): entry is string => Boolean(entry && entry.length > 0))\n .filter((entry) => entry.toUpperCase() !== \"NAME\");\n if (models.length === 0) {\n return null;\n }\n const preferredQwenEmbeddingModel = models.find((entry) => QWEN_EMBEDDING_MODEL_PATTERN.test(entry));\n if (preferredQwenEmbeddingModel) {\n return preferredQwenEmbeddingModel;\n }\n const embeddingModel = models.find((entry) => EMBEDDING_MODEL_PATTERN.test(entry));\n return embeddingModel ?? null;\n}\n\nfunction resolveAutoOllamaModel(settings: PmSettings): string {\n const settingsModel = toOptionalNonEmptyString(settings.providers?.ollama?.model);\n if (settingsModel) {\n return settingsModel;\n }\n const envModel = toOptionalNonEmptyString(process.env[OLLAMA_MODEL_ENV]);\n if (envModel) {\n return envModel;\n }\n const listed = spawnSync(\"ollama\", [\"list\"], {\n encoding: \"utf8\",\n timeout: OLLAMA_LIST_TIMEOUT_MS,\n });\n if (!listed.error && listed.status === 0) {\n const listedModel = parseOllamaModelList(typeof listed.stdout === \"string\" ? listed.stdout : \"\");\n if (listedModel) {\n return listedModel;\n }\n }\n return DEFAULT_OLLAMA_MODEL;\n}\n\nexport function resolveSettingsWithSemanticRuntimeDefaults(settings: PmSettings): SemanticRuntimeDefaultsResolution {\n if (isAutoDefaultsDisabled()) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n if (hasAnyExplicitSemanticConfiguration(settings)) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n if (!isOllamaInstalled()) {\n return {\n settings,\n auto_ollama_defaults_applied: false,\n };\n }\n\n const nextSettings = structuredClone(settings);\n const resolvedModel = resolveAutoOllamaModel(nextSettings);\n nextSettings.providers.ollama.base_url = DEFAULT_OLLAMA_BASE_URL;\n nextSettings.providers.ollama.model = resolvedModel;\n nextSettings.vector_store.lancedb.path = DEFAULT_LANCEDB_PATH;\n if (!toOptionalNonEmptyString(nextSettings.search.embedding_model)) {\n nextSettings.search.embedding_model = resolvedModel;\n }\n return {\n settings: nextSettings,\n auto_ollama_defaults_applied: true,\n };\n}\n"],"names":[],"mappings":"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","debugId":"816e2cb5-1f71-5e76-83f6-e6d5ed77941f"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveAuthor(candidate: string | undefined, fallback: string): string;
|
|
@@ -0,0 +1,9 @@
|
|
|
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]="19131b8d-d294-5557-93b2-87e2f08b7417")}catch(e){}}();
|
|
3
|
+
export function resolveAuthor(candidate, fallback) {
|
|
4
|
+
const resolved = candidate ?? process.env.PM_AUTHOR ?? fallback;
|
|
5
|
+
const trimmed = resolved.trim();
|
|
6
|
+
return trimmed || "unknown";
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=author.js.map
|
|
9
|
+
//# debugId=19131b8d-d294-5557-93b2-87e2f08b7417
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"author.js","sources":["core/shared/author.ts"],"sourceRoot":"/","sourcesContent":["export function resolveAuthor(candidate: string | undefined, fallback: string): string {\n const resolved = candidate ?? process.env.PM_AUTHOR ?? fallback;\n const trimmed = resolved.trim();\n return trimmed || \"unknown\";\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,aAAa,CAAC,SAA6B,EAAE,QAAgB;IAC3E,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAC;IAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC","debugId":"19131b8d-d294-5557-93b2-87e2f08b7417"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createLazyModule<T>(importer: () => Promise<T>): () => Promise<T>;
|
|
@@ -0,0 +1,11 @@
|
|
|
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]="8a197e16-769b-582e-833f-997a66d98407")}catch(e){}}();
|
|
3
|
+
export function createLazyModule(importer) {
|
|
4
|
+
let promise = null;
|
|
5
|
+
return () => {
|
|
6
|
+
promise ??= importer();
|
|
7
|
+
return promise;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=lazy-module.js.map
|
|
11
|
+
//# debugId=8a197e16-769b-582e-833f-997a66d98407
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-module.js","sources":["core/shared/lazy-module.ts"],"sourceRoot":"/","sourcesContent":["export function createLazyModule<T>(importer: () => Promise<T>): () => Promise<T> {\n let promise: Promise<T> | null = null;\n return () => {\n promise ??= importer();\n return promise;\n };\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,gBAAgB,CAAI,QAA0B;IAC5D,IAAI,OAAO,GAAsB,IAAI,CAAC;IACtC,OAAO,GAAG,EAAE;QACV,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC","debugId":"8a197e16-769b-582e-833f-997a66d98407"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for deciding whether a CLI option alias is a pure snake_case
|
|
3
|
+
* underscore-duplicate of an existing kebab-case flag.
|
|
4
|
+
*
|
|
5
|
+
* Mutation commands historically register every `--foo-bar` flag together with
|
|
6
|
+
* a `--foo_bar` alias so agents are never blocked by a snake/kebab mismatch.
|
|
7
|
+
* Those underscore duplicates roughly double the option list of every
|
|
8
|
+
* `--help` and waste agent context. We keep them functional as parse-time
|
|
9
|
+
* aliases but hide them from the rendered `--help` text.
|
|
10
|
+
*
|
|
11
|
+
* The rule is intentionally narrow: an alias is hidden ONLY when its long flag
|
|
12
|
+
* is exactly the underscore form of an existing kebab flag (for example
|
|
13
|
+
* `--create_mode` is the `-`→`_` form of `--create-mode`). Semantically-distinct
|
|
14
|
+
* aliases (for example `--fail-on-warn` for `--strict-exit`, `--local` for
|
|
15
|
+
* `--project`, `--ac` for `--acceptance-criteria`) are NOT snake duplicates and
|
|
16
|
+
* stay visible.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Extract every long flag (for example `--create-mode`) from a commander flag
|
|
20
|
+
* spec that may include short aliases and a value placeholder. A spec can list
|
|
21
|
+
* more than one long flag, for example `"--estimate, --estimated-minutes
|
|
22
|
+
* <value>"` → `["--estimate", "--estimated-minutes"]`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractLongFlags(flagSpec: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Extract the first long flag from a commander flag spec, or null when none is
|
|
27
|
+
* present.
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractLongFlag(flagSpec: string): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Returns true when `aliasFlagSpec` differs from `canonicalFlagSpec` ONLY by
|
|
32
|
+
* substituting one or more interior hyphens with underscores — i.e. it is a
|
|
33
|
+
* pure snake_case underscore-duplicate of the canonical kebab flag.
|
|
34
|
+
*
|
|
35
|
+
* Examples that match (alias hidden):
|
|
36
|
+
* --create-mode <- --create_mode
|
|
37
|
+
* --filter-assignee-filter <- --filter-assignee_filter
|
|
38
|
+
*
|
|
39
|
+
* Examples that do NOT match (alias stays visible):
|
|
40
|
+
* --acceptance-criteria <- --ac (different identifier)
|
|
41
|
+
* --order <- --rank (different identifier)
|
|
42
|
+
* --strict-exit <- --fail-on-warn (semantically distinct)
|
|
43
|
+
*/
|
|
44
|
+
export declare function isPureSnakeCaseAlias(canonicalFlagSpec: string, aliasFlagSpec: string): boolean;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for deciding whether a CLI option alias is a pure snake_case
|
|
3
|
+
* underscore-duplicate of an existing kebab-case flag.
|
|
4
|
+
*
|
|
5
|
+
* Mutation commands historically register every `--foo-bar` flag together with
|
|
6
|
+
* a `--foo_bar` alias so agents are never blocked by a snake/kebab mismatch.
|
|
7
|
+
* Those underscore duplicates roughly double the option list of every
|
|
8
|
+
* `--help` and waste agent context. We keep them functional as parse-time
|
|
9
|
+
* aliases but hide them from the rendered `--help` text.
|
|
10
|
+
*
|
|
11
|
+
* The rule is intentionally narrow: an alias is hidden ONLY when its long flag
|
|
12
|
+
* is exactly the underscore form of an existing kebab flag (for example
|
|
13
|
+
* `--create_mode` is the `-`→`_` form of `--create-mode`). Semantically-distinct
|
|
14
|
+
* aliases (for example `--fail-on-warn` for `--strict-exit`, `--local` for
|
|
15
|
+
* `--project`, `--ac` for `--acceptance-criteria`) are NOT snake duplicates and
|
|
16
|
+
* stay visible.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Extract every long flag (for example `--create-mode`) from a commander flag
|
|
20
|
+
* spec that may include short aliases and a value placeholder. A spec can list
|
|
21
|
+
* more than one long flag, for example `"--estimate, --estimated-minutes
|
|
22
|
+
* <value>"` → `["--estimate", "--estimated-minutes"]`.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
!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]="9682a7a8-88b3-512a-9c6b-d2dfbe6bc2fb")}catch(e){}}();
|
|
26
|
+
export function extractLongFlags(flagSpec) {
|
|
27
|
+
return flagSpec
|
|
28
|
+
.split(/[\s,|]+/)
|
|
29
|
+
.map((token) => token.trim())
|
|
30
|
+
.filter((token) => token.startsWith("--"));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Extract the first long flag from a commander flag spec, or null when none is
|
|
34
|
+
* present.
|
|
35
|
+
*/
|
|
36
|
+
export function extractLongFlag(flagSpec) {
|
|
37
|
+
return extractLongFlags(flagSpec)[0] ?? null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns true when `aliasFlagSpec` differs from `canonicalFlagSpec` ONLY by
|
|
41
|
+
* substituting one or more interior hyphens with underscores — i.e. it is a
|
|
42
|
+
* pure snake_case underscore-duplicate of the canonical kebab flag.
|
|
43
|
+
*
|
|
44
|
+
* Examples that match (alias hidden):
|
|
45
|
+
* --create-mode <- --create_mode
|
|
46
|
+
* --filter-assignee-filter <- --filter-assignee_filter
|
|
47
|
+
*
|
|
48
|
+
* Examples that do NOT match (alias stays visible):
|
|
49
|
+
* --acceptance-criteria <- --ac (different identifier)
|
|
50
|
+
* --order <- --rank (different identifier)
|
|
51
|
+
* --strict-exit <- --fail-on-warn (semantically distinct)
|
|
52
|
+
*/
|
|
53
|
+
export function isPureSnakeCaseAlias(canonicalFlagSpec, aliasFlagSpec) {
|
|
54
|
+
const aliasLong = extractLongFlag(aliasFlagSpec);
|
|
55
|
+
if (aliasLong === null) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const normalize = (long) => long.slice(2).replaceAll("-", "_");
|
|
59
|
+
// The canonical spec may declare multiple long flags (e.g.
|
|
60
|
+
// "--estimate, --estimated-minutes <value>"); the alias is hidden when it is
|
|
61
|
+
// the underscore form of ANY of them.
|
|
62
|
+
return extractLongFlags(canonicalFlagSpec).some((canonicalLong) => {
|
|
63
|
+
if (!canonicalLong.slice(2).includes("-")) {
|
|
64
|
+
// No interior hyphen to convert, so there is no kebab form to snake-duplicate.
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (aliasLong === canonicalLong) {
|
|
68
|
+
// Identical flags are not aliases of one another.
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Reachable from the canonical purely by hyphen→underscore substitution.
|
|
72
|
+
return normalize(aliasLong) === normalize(canonicalLong);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=option-alias-visibility.js.map
|
|
76
|
+
//# debugId=9682a7a8-88b3-512a-9c6b-d2dfbe6bc2fb
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-alias-visibility.js","sources":["core/shared/option-alias-visibility.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Helpers for deciding whether a CLI option alias is a pure snake_case\n * underscore-duplicate of an existing kebab-case flag.\n *\n * Mutation commands historically register every `--foo-bar` flag together with\n * a `--foo_bar` alias so agents are never blocked by a snake/kebab mismatch.\n * Those underscore duplicates roughly double the option list of every\n * `--help` and waste agent context. We keep them functional as parse-time\n * aliases but hide them from the rendered `--help` text.\n *\n * The rule is intentionally narrow: an alias is hidden ONLY when its long flag\n * is exactly the underscore form of an existing kebab flag (for example\n * `--create_mode` is the `-`→`_` form of `--create-mode`). Semantically-distinct\n * aliases (for example `--fail-on-warn` for `--strict-exit`, `--local` for\n * `--project`, `--ac` for `--acceptance-criteria`) are NOT snake duplicates and\n * stay visible.\n */\n\n/**\n * Extract every long flag (for example `--create-mode`) from a commander flag\n * spec that may include short aliases and a value placeholder. A spec can list\n * more than one long flag, for example `\"--estimate, --estimated-minutes\n * <value>\"` → `[\"--estimate\", \"--estimated-minutes\"]`.\n */\nexport function extractLongFlags(flagSpec: string): string[] {\n return flagSpec\n .split(/[\\s,|]+/)\n .map((token) => token.trim())\n .filter((token) => token.startsWith(\"--\"));\n}\n\n/**\n * Extract the first long flag from a commander flag spec, or null when none is\n * present.\n */\nexport function extractLongFlag(flagSpec: string): string | null {\n return extractLongFlags(flagSpec)[0] ?? null;\n}\n\n/**\n * Returns true when `aliasFlagSpec` differs from `canonicalFlagSpec` ONLY by\n * substituting one or more interior hyphens with underscores — i.e. it is a\n * pure snake_case underscore-duplicate of the canonical kebab flag.\n *\n * Examples that match (alias hidden):\n * --create-mode <- --create_mode\n * --filter-assignee-filter <- --filter-assignee_filter\n *\n * Examples that do NOT match (alias stays visible):\n * --acceptance-criteria <- --ac (different identifier)\n * --order <- --rank (different identifier)\n * --strict-exit <- --fail-on-warn (semantically distinct)\n */\nexport function isPureSnakeCaseAlias(canonicalFlagSpec: string, aliasFlagSpec: string): boolean {\n const aliasLong = extractLongFlag(aliasFlagSpec);\n if (aliasLong === null) {\n return false;\n }\n const normalize = (long: string): string => long.slice(2).replaceAll(\"-\", \"_\");\n // The canonical spec may declare multiple long flags (e.g.\n // \"--estimate, --estimated-minutes <value>\"); the alias is hidden when it is\n // the underscore form of ANY of them.\n return extractLongFlags(canonicalFlagSpec).some((canonicalLong) => {\n if (!canonicalLong.slice(2).includes(\"-\")) {\n // No interior hyphen to convert, so there is no kebab form to snake-duplicate.\n return false;\n }\n if (aliasLong === canonicalLong) {\n // Identical flags are not aliases of one another.\n return false;\n }\n // Reachable from the canonical purely by hyphen→underscore substitution.\n return normalize(aliasLong) === normalize(canonicalLong);\n });\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;GAKG;;;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ;SACZ,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,iBAAyB,EAAE,aAAqB;IACnF,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/E,2DAA2D;IAC3D,6EAA6E;IAC7E,sCAAsC;IACtC,OAAO,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;QAChE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,+EAA+E;YAC/E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;YAChC,kDAAkD;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,yEAAyE;QACzE,OAAO,SAAS,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC","debugId":"9682a7a8-88b3-512a-9c6b-d2dfbe6bc2fb"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export declare function normalizeLowercaseWhitespace(value: string): string;
|
|
2
2
|
export declare function tokenizeAlphaNumeric(value: string): string[];
|
|
3
|
-
export declare function uniqueTokens(value: string): string[];
|
|
4
3
|
export declare function jaccardSimilarity(leftTokens: string[], rightTokens: string[]): number;
|
|
@@ -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]="1109b938-c421-5517-9671-2cebd7e10309")}catch(e){}}();
|
|
3
3
|
export function normalizeLowercaseWhitespace(value) {
|
|
4
4
|
return value
|
|
5
5
|
.trim()
|
|
@@ -11,9 +11,6 @@ export function tokenizeAlphaNumeric(value) {
|
|
|
11
11
|
.split(/[^a-z0-9]+/)
|
|
12
12
|
.filter((token) => token.length > 0);
|
|
13
13
|
}
|
|
14
|
-
export function uniqueTokens(value) {
|
|
15
|
-
return [...new Set(tokenizeAlphaNumeric(value))];
|
|
16
|
-
}
|
|
17
14
|
export function jaccardSimilarity(leftTokens, rightTokens) {
|
|
18
15
|
if (leftTokens.length === 0 && rightTokens.length === 0) {
|
|
19
16
|
return 1;
|
|
@@ -33,4 +30,4 @@ export function jaccardSimilarity(leftTokens, rightTokens) {
|
|
|
33
30
|
return union === 0 ? 0 : intersection / union;
|
|
34
31
|
}
|
|
35
32
|
//# sourceMappingURL=text-normalization.js.map
|
|
36
|
-
//# debugId=
|
|
33
|
+
//# debugId=1109b938-c421-5517-9671-2cebd7e10309
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-normalization.js","sources":["core/shared/text-normalization.ts"],"sourceRoot":"/","sourcesContent":["export function normalizeLowercaseWhitespace(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\nexport function tokenizeAlphaNumeric(value: string): string[] {\n return normalizeLowercaseWhitespace(value)\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\nexport function
|
|
1
|
+
{"version":3,"file":"text-normalization.js","sources":["core/shared/text-normalization.ts"],"sourceRoot":"/","sourcesContent":["export function normalizeLowercaseWhitespace(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\nexport function tokenizeAlphaNumeric(value: string): string[] {\n return normalizeLowercaseWhitespace(value)\n .split(/[^a-z0-9]+/)\n .filter((token) => token.length > 0);\n}\n\nexport function jaccardSimilarity(leftTokens: string[], rightTokens: string[]): number {\n if (leftTokens.length === 0 && rightTokens.length === 0) {\n return 1;\n }\n if (leftTokens.length === 0 || rightTokens.length === 0) {\n return 0;\n }\n const leftSet = new Set(leftTokens);\n const rightSet = new Set(rightTokens);\n let intersection = 0;\n for (const token of leftSet) {\n if (rightSet.has(token)) {\n intersection += 1;\n }\n }\n const union = new Set([...leftSet, ...rightSet]).size;\n return union === 0 ? 0 : intersection / union;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,4BAA4B,CAAC,KAAK,CAAC;SACvC,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAoB,EAAE,WAAqB;IAC3E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;AAChD,CAAC","debugId":"1109b938-c421-5517-9671-2cebd7e10309"}
|
|
@@ -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]="2b2ff59e-d0db-53b1-b67f-a7dcc221ff00")}catch(e){}}();
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { getActiveExtensionRegistrations, runActiveOnReadHooks, runActiveOnWriteHooks, runActiveServiceOverride, } from "../extensions/index.js";
|
|
@@ -217,38 +217,72 @@ export async function buildItemNotFoundError(pmRoot, badId, idPrefix, typeToFold
|
|
|
217
217
|
}
|
|
218
218
|
return new PmCliError(`Item ${badId} not found`, EXIT_CODE.NOT_FOUND, { nextSteps });
|
|
219
219
|
}
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
function bypassesAssigneeConflict(op, bypassAssigneeConflict) {
|
|
221
|
+
return (op === "claim" ||
|
|
222
|
+
(bypassAssigneeConflict === true &&
|
|
223
|
+
(op === "comment_add" ||
|
|
224
|
+
op === "note_add" ||
|
|
225
|
+
op === "learning_add" ||
|
|
226
|
+
op === "release" ||
|
|
227
|
+
op === "update" ||
|
|
228
|
+
op === "update_audit")));
|
|
229
|
+
}
|
|
230
|
+
async function prepareLockedItem(params) {
|
|
231
|
+
const typeToFolder = params.typeToFolder ??
|
|
232
|
+
resolveItemTypeRegistry(params.settings, getActiveExtensionRegistrations())
|
|
233
|
+
.type_to_folder;
|
|
222
234
|
const located = await locateItem(params.pmRoot, params.id, params.settings.id_prefix, params.settings.item_format, typeToFolder);
|
|
223
235
|
if (!located) {
|
|
224
236
|
throw await buildItemNotFoundError(params.pmRoot, params.id, params.settings.id_prefix, typeToFolder);
|
|
225
237
|
}
|
|
226
238
|
const releaseLock = await acquireLock(params.pmRoot, located.id, params.settings.locks.ttl_seconds, params.author, Boolean(params.force), params.settings.governance.force_required_for_stale_lock);
|
|
227
239
|
try {
|
|
228
|
-
const
|
|
240
|
+
const warnings = [];
|
|
229
241
|
const { raw: originalRaw, document } = await readLocatedItem(located, {
|
|
230
242
|
schema: params.settings.schema,
|
|
231
|
-
warnings
|
|
243
|
+
warnings,
|
|
232
244
|
});
|
|
233
245
|
const assigned = document.metadata.assignee?.trim();
|
|
234
246
|
const governance = resolveGovernanceKnobs(params.settings);
|
|
235
|
-
const
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
params.op === "release" ||
|
|
240
|
-
params.op === "update" ||
|
|
241
|
-
params.op === "update_audit") &&
|
|
242
|
-
params.bypassAssigneeConflict === true);
|
|
243
|
-
const hasOwnershipConflict = assigned && assigned !== params.author && !params.force && !bypassAssigneeConflict;
|
|
247
|
+
const hasOwnershipConflict = assigned &&
|
|
248
|
+
assigned !== params.author &&
|
|
249
|
+
!params.force &&
|
|
250
|
+
!bypassesAssigneeConflict(params.op, params.bypassAssigneeConflict);
|
|
244
251
|
if (hasOwnershipConflict) {
|
|
245
252
|
if (governance.ownership_enforcement === "strict") {
|
|
246
253
|
throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
|
|
247
254
|
}
|
|
248
255
|
if (governance.ownership_enforcement === "warn") {
|
|
249
|
-
|
|
256
|
+
warnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
|
|
250
257
|
}
|
|
251
258
|
}
|
|
259
|
+
return {
|
|
260
|
+
typeToFolder,
|
|
261
|
+
located,
|
|
262
|
+
originalRaw,
|
|
263
|
+
document,
|
|
264
|
+
warnings,
|
|
265
|
+
releaseLock,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
await releaseLock();
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
export async function mutateItem(params) {
|
|
274
|
+
const prepared = await prepareLockedItem({
|
|
275
|
+
pmRoot: params.pmRoot,
|
|
276
|
+
settings: params.settings,
|
|
277
|
+
id: params.id,
|
|
278
|
+
op: params.op,
|
|
279
|
+
author: params.author,
|
|
280
|
+
force: params.force,
|
|
281
|
+
bypassAssigneeConflict: params.bypassAssigneeConflict,
|
|
282
|
+
typeToFolder: params.typeToFolder,
|
|
283
|
+
});
|
|
284
|
+
const { typeToFolder, located, originalRaw, document, warnings: parseWarnings, releaseLock, } = prepared;
|
|
285
|
+
try {
|
|
252
286
|
const historyPolicy = await enforceHistoryStreamPolicyForItem({
|
|
253
287
|
pmRoot: params.pmRoot,
|
|
254
288
|
settings: params.settings,
|
|
@@ -282,7 +316,9 @@ export async function mutateItem(params) {
|
|
|
282
316
|
let effectiveTargetItemPath = targetItemPath;
|
|
283
317
|
let effectiveSerializedAfter = serializedAfter;
|
|
284
318
|
let skipItemWrite = false;
|
|
285
|
-
if (serviceWriteOverride.handled &&
|
|
319
|
+
if (serviceWriteOverride.handled &&
|
|
320
|
+
typeof serviceWriteOverride.result === "object" &&
|
|
321
|
+
serviceWriteOverride.result !== null) {
|
|
286
322
|
const overrideRecord = serviceWriteOverride.result;
|
|
287
323
|
if (typeof overrideRecord.target_item_path === "string" && overrideRecord.target_item_path.trim().length > 0) {
|
|
288
324
|
effectiveTargetItemPath = overrideRecord.target_item_path;
|
|
@@ -351,29 +387,16 @@ export async function mutateItem(params) {
|
|
|
351
387
|
}
|
|
352
388
|
}
|
|
353
389
|
export async function deleteItem(params) {
|
|
354
|
-
const
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
390
|
+
const prepared = await prepareLockedItem({
|
|
391
|
+
pmRoot: params.pmRoot,
|
|
392
|
+
settings: params.settings,
|
|
393
|
+
id: params.id,
|
|
394
|
+
op: "delete",
|
|
395
|
+
author: params.author,
|
|
396
|
+
force: params.force,
|
|
397
|
+
});
|
|
398
|
+
const { located, originalRaw, document, warnings: parseWarnings, releaseLock } = prepared;
|
|
360
399
|
try {
|
|
361
|
-
const parseWarnings = [];
|
|
362
|
-
const { raw: originalRaw, document } = await readLocatedItem(located, {
|
|
363
|
-
schema: params.settings.schema,
|
|
364
|
-
warnings: parseWarnings,
|
|
365
|
-
});
|
|
366
|
-
const assigned = document.metadata.assignee?.trim();
|
|
367
|
-
const governance = resolveGovernanceKnobs(params.settings);
|
|
368
|
-
const hasOwnershipConflict = assigned && assigned !== params.author && !params.force;
|
|
369
|
-
if (hasOwnershipConflict) {
|
|
370
|
-
if (governance.ownership_enforcement === "strict") {
|
|
371
|
-
throw new PmCliError(`Item ${located.id} is assigned to ${assigned}. Use --force to override.`, EXIT_CODE.CONFLICT);
|
|
372
|
-
}
|
|
373
|
-
if (governance.ownership_enforcement === "warn") {
|
|
374
|
-
parseWarnings.push(`ownership_warning:assignee_conflict:${located.id}:${assigned}`);
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
400
|
const historyPolicy = await enforceHistoryStreamPolicyForItem({
|
|
378
401
|
pmRoot: params.pmRoot,
|
|
379
402
|
settings: params.settings,
|
|
@@ -413,6 +436,14 @@ export async function deleteItem(params) {
|
|
|
413
436
|
skipDelete = true;
|
|
414
437
|
}
|
|
415
438
|
}
|
|
439
|
+
if (params.dryRun === true) {
|
|
440
|
+
return {
|
|
441
|
+
item: beforeDocument.metadata,
|
|
442
|
+
changedFields: ["deleted"],
|
|
443
|
+
targetPath: effectiveItemPath,
|
|
444
|
+
warnings: [...parseWarnings, ...historyPolicy.warnings, ...serviceDeleteOverride.warnings],
|
|
445
|
+
};
|
|
446
|
+
}
|
|
416
447
|
if (!skipDelete) {
|
|
417
448
|
await fs.rm(effectiveItemPath);
|
|
418
449
|
}
|
|
@@ -448,4 +479,4 @@ export async function deleteItem(params) {
|
|
|
448
479
|
}
|
|
449
480
|
}
|
|
450
481
|
//# sourceMappingURL=item-store.js.map
|
|
451
|
-
//# debugId=
|
|
482
|
+
//# debugId=2b2ff59e-d0db-53b1-b67f-a7dcc221ff00
|