create-principles-disciple 1.132.2 → 1.132.4

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.
Files changed (229) hide show
  1. package/codex-adapter/dist/codec/index.d.ts +6 -0
  2. package/codex-adapter/dist/codec/index.js +5 -0
  3. package/codex-adapter/dist/codec/input-decoder.d.ts +13 -0
  4. package/codex-adapter/dist/codec/input-decoder.js +103 -0
  5. package/codex-adapter/dist/codec/output-encoder.d.ts +32 -0
  6. package/codex-adapter/dist/codec/output-encoder.js +51 -0
  7. package/codex-adapter/dist/host-adapter.d.ts +30 -0
  8. package/codex-adapter/dist/host-adapter.js +28 -0
  9. package/codex-adapter/dist/index.d.ts +25 -0
  10. package/codex-adapter/dist/index.js +19 -0
  11. package/codex-adapter/dist/ingestion/admission.d.ts +54 -0
  12. package/codex-adapter/dist/ingestion/admission.js +137 -0
  13. package/codex-adapter/dist/ingestion/catch-up.d.ts +41 -0
  14. package/codex-adapter/dist/ingestion/catch-up.js +94 -0
  15. package/codex-adapter/dist/ingestion/codex-home.d.ts +19 -0
  16. package/codex-adapter/dist/ingestion/codex-home.js +43 -0
  17. package/codex-adapter/dist/ingestion/codex-version.d.ts +30 -0
  18. package/codex-adapter/dist/ingestion/codex-version.js +53 -0
  19. package/codex-adapter/dist/ingestion/ingestion-fields.d.ts +17 -0
  20. package/codex-adapter/dist/ingestion/ingestion-fields.js +28 -0
  21. package/codex-adapter/dist/ingestion/ingestion.d.ts +71 -0
  22. package/codex-adapter/dist/ingestion/ingestion.js +248 -0
  23. package/codex-adapter/dist/ingestion/transcript-decoder.d.ts +72 -0
  24. package/codex-adapter/dist/ingestion/transcript-decoder.js +485 -0
  25. package/codex-adapter/dist/ingestion/transcript-locate.d.ts +13 -0
  26. package/codex-adapter/dist/ingestion/transcript-locate.js +75 -0
  27. package/codex-adapter/dist/ingestion/transcript-path.d.ts +25 -0
  28. package/codex-adapter/dist/ingestion/transcript-path.js +87 -0
  29. package/codex-adapter/dist/pd-hook.d.ts +9 -0
  30. package/codex-adapter/dist/pd-hook.js +159 -0
  31. package/codex-adapter/dist/tool-semantics.d.ts +20 -0
  32. package/codex-adapter/dist/tool-semantics.js +27 -0
  33. package/codex-adapter/dist/worker/workspace-worker.d.ts +59 -0
  34. package/codex-adapter/dist/worker/workspace-worker.js +270 -0
  35. package/codex-adapter/package.json +52 -0
  36. package/console/dist/server/routes/update.js +187 -19
  37. package/console/dist/server/update/mutation-controller.d.ts +18 -0
  38. package/console/dist/server/update/mutation-controller.js +29 -0
  39. package/console/dist/server/utils/installed-layout.d.ts +1 -0
  40. package/console/dist/server/utils/installed-layout.js +2 -0
  41. package/console/package.json +1 -0
  42. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +15 -0
  43. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  44. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts +2 -0
  45. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.d.ts.map +1 -0
  46. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js +71 -0
  47. package/core/dist/runtime-v2/adapter/__tests__/pd-stream-simple.test.js.map +1 -0
  48. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts +2 -0
  49. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.d.ts.map +1 -0
  50. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js +219 -0
  51. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-http-transport.test.js.map +1 -0
  52. package/core/dist/runtime-v2/adapter/artificer-l2-adapter.d.ts.map +1 -1
  53. package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js +2 -3
  54. package/core/dist/runtime-v2/adapter/artificer-l2-adapter.js.map +1 -1
  55. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts +12 -1
  56. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts.map +1 -1
  57. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js +15 -2
  58. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js.map +1 -1
  59. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts +50 -0
  60. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.d.ts.map +1 -0
  61. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js +93 -0
  62. package/core/dist/runtime-v2/adapter/pi-ai-http-transport.js.map +1 -0
  63. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  64. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +5 -0
  65. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  66. package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js +152 -0
  67. package/core/dist/runtime-v2/internalization/__tests__/owner-decision.test.js.map +1 -1
  68. package/core/dist/runtime-v2/internalization/owner-review.d.ts +7 -1
  69. package/core/dist/runtime-v2/internalization/owner-review.d.ts.map +1 -1
  70. package/core/dist/runtime-v2/internalization/owner-review.js +22 -3
  71. package/core/dist/runtime-v2/internalization/owner-review.js.map +1 -1
  72. package/core/package.json +3 -2
  73. package/dist/installer.d.ts +32 -0
  74. package/dist/installer.d.ts.map +1 -1
  75. package/dist/installer.js +198 -2
  76. package/dist/installer.js.map +1 -1
  77. package/dist/installers/codex-host-installer.d.ts.map +1 -1
  78. package/dist/installers/codex-host-installer.js +5 -3
  79. package/dist/installers/codex-host-installer.js.map +1 -1
  80. package/dist/update/release-manager-authority.d.ts +69 -0
  81. package/dist/update/release-manager-authority.d.ts.map +1 -0
  82. package/dist/update/release-manager-authority.js +125 -0
  83. package/dist/update/release-manager-authority.js.map +1 -0
  84. package/dist/utils/workspace-divergence.d.ts +36 -0
  85. package/dist/utils/workspace-divergence.d.ts.map +1 -0
  86. package/dist/utils/workspace-divergence.js +87 -0
  87. package/dist/utils/workspace-divergence.js.map +1 -0
  88. package/install-layout/dist/index.d.ts +5 -0
  89. package/install-layout/dist/index.js +1 -0
  90. package/install-layout/package.json +1 -1
  91. package/package.json +4 -2
  92. package/plugin/dist/bundle.js +870 -734
  93. package/plugin/dist/governance-audit.js +381 -247
  94. package/plugin/dist/openclaw-sdk.d.ts +3 -0
  95. package/plugin/dist/rulehost-evidence.js +420 -286
  96. package/plugin/dist/service/subagent-workflow/types.d.ts +2 -2
  97. package/plugin/dist/utils/retry.d.ts +1 -1
  98. package/plugin/dist/utils/workspace-resolver.d.ts +35 -4
  99. package/plugin/openclaw.plugin.json +1 -1
  100. package/plugin/package.json +1 -1
  101. package/release-manager/dist/i18n.d.ts +6 -0
  102. package/release-manager/dist/i18n.d.ts.map +1 -0
  103. package/release-manager/dist/i18n.js +234 -0
  104. package/release-manager/dist/i18n.js.map +1 -0
  105. package/release-manager/dist/index.d.ts +7 -0
  106. package/release-manager/dist/index.d.ts.map +1 -0
  107. package/release-manager/dist/index.js +474 -0
  108. package/release-manager/dist/index.js.map +1 -0
  109. package/release-manager/dist/installer.d.ts +217 -0
  110. package/release-manager/dist/installer.d.ts.map +1 -0
  111. package/release-manager/dist/installer.js +2451 -0
  112. package/release-manager/dist/installer.js.map +1 -0
  113. package/release-manager/dist/installers/codex-host-installer.d.ts +29 -0
  114. package/release-manager/dist/installers/codex-host-installer.d.ts.map +1 -0
  115. package/release-manager/dist/installers/codex-host-installer.js +496 -0
  116. package/release-manager/dist/installers/codex-host-installer.js.map +1 -0
  117. package/release-manager/dist/installers/index.d.ts +40 -0
  118. package/release-manager/dist/installers/index.d.ts.map +1 -0
  119. package/release-manager/dist/installers/index.js +35 -0
  120. package/release-manager/dist/installers/index.js.map +1 -0
  121. package/release-manager/dist/installers/openclaw-host-installer.d.ts +18 -0
  122. package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +1 -0
  123. package/release-manager/dist/installers/openclaw-host-installer.js +414 -0
  124. package/release-manager/dist/installers/openclaw-host-installer.js.map +1 -0
  125. package/release-manager/dist/mvp-config.d.ts +197 -0
  126. package/release-manager/dist/mvp-config.d.ts.map +1 -0
  127. package/release-manager/dist/mvp-config.js +509 -0
  128. package/release-manager/dist/mvp-config.js.map +1 -0
  129. package/release-manager/dist/prompts.d.ts +30 -0
  130. package/release-manager/dist/prompts.d.ts.map +1 -0
  131. package/release-manager/dist/prompts.js +231 -0
  132. package/release-manager/dist/prompts.js.map +1 -0
  133. package/release-manager/dist/skill-language.d.ts +32 -0
  134. package/release-manager/dist/skill-language.d.ts.map +1 -0
  135. package/release-manager/dist/skill-language.js +107 -0
  136. package/release-manager/dist/skill-language.js.map +1 -0
  137. package/release-manager/dist/uninstaller.d.ts +55 -0
  138. package/release-manager/dist/uninstaller.d.ts.map +1 -0
  139. package/release-manager/dist/uninstaller.js +409 -0
  140. package/release-manager/dist/uninstaller.js.map +1 -0
  141. package/release-manager/dist/update/atomic-file.d.ts +35 -0
  142. package/release-manager/dist/update/atomic-file.d.ts.map +1 -0
  143. package/release-manager/dist/update/atomic-file.js +120 -0
  144. package/release-manager/dist/update/atomic-file.js.map +1 -0
  145. package/release-manager/dist/update/bootstrap-protocol.d.ts +55 -0
  146. package/release-manager/dist/update/bootstrap-protocol.d.ts.map +1 -0
  147. package/release-manager/dist/update/bootstrap-protocol.js +132 -0
  148. package/release-manager/dist/update/bootstrap-protocol.js.map +1 -0
  149. package/release-manager/dist/update/channel-metadata.d.ts +28 -0
  150. package/release-manager/dist/update/channel-metadata.d.ts.map +1 -0
  151. package/release-manager/dist/update/channel-metadata.js +90 -0
  152. package/release-manager/dist/update/channel-metadata.js.map +1 -0
  153. package/release-manager/dist/update/channel-promotion.d.ts +39 -0
  154. package/release-manager/dist/update/channel-promotion.d.ts.map +1 -0
  155. package/release-manager/dist/update/channel-promotion.js +55 -0
  156. package/release-manager/dist/update/channel-promotion.js.map +1 -0
  157. package/release-manager/dist/update/data-compatibility.d.ts +35 -0
  158. package/release-manager/dist/update/data-compatibility.d.ts.map +1 -0
  159. package/release-manager/dist/update/data-compatibility.js +45 -0
  160. package/release-manager/dist/update/data-compatibility.js.map +1 -0
  161. package/release-manager/dist/update/install-layout.d.ts +59 -0
  162. package/release-manager/dist/update/install-layout.d.ts.map +1 -0
  163. package/release-manager/dist/update/install-layout.js +127 -0
  164. package/release-manager/dist/update/install-layout.js.map +1 -0
  165. package/release-manager/dist/update/legacy-migration.d.ts +56 -0
  166. package/release-manager/dist/update/legacy-migration.d.ts.map +1 -0
  167. package/release-manager/dist/update/legacy-migration.js +254 -0
  168. package/release-manager/dist/update/legacy-migration.js.map +1 -0
  169. package/release-manager/dist/update/product-identity.d.ts +50 -0
  170. package/release-manager/dist/update/product-identity.d.ts.map +1 -0
  171. package/release-manager/dist/update/product-identity.js +63 -0
  172. package/release-manager/dist/update/product-identity.js.map +1 -0
  173. package/release-manager/dist/update/release-asset-manifest.d.ts +31 -0
  174. package/release-manager/dist/update/release-asset-manifest.d.ts.map +1 -0
  175. package/release-manager/dist/update/release-asset-manifest.js +161 -0
  176. package/release-manager/dist/update/release-asset-manifest.js.map +1 -0
  177. package/release-manager/dist/update/release-identity.d.ts +33 -0
  178. package/release-manager/dist/update/release-identity.d.ts.map +1 -0
  179. package/release-manager/dist/update/release-identity.js +108 -0
  180. package/release-manager/dist/update/release-identity.js.map +1 -0
  181. package/release-manager/dist/update/release-manager-authority.d.ts +69 -0
  182. package/release-manager/dist/update/release-manager-authority.d.ts.map +1 -0
  183. package/release-manager/dist/update/release-manager-authority.js +125 -0
  184. package/release-manager/dist/update/release-manager-authority.js.map +1 -0
  185. package/release-manager/dist/update/release-manager.d.ts +96 -0
  186. package/release-manager/dist/update/release-manager.d.ts.map +1 -0
  187. package/release-manager/dist/update/release-manager.js +253 -0
  188. package/release-manager/dist/update/release-manager.js.map +1 -0
  189. package/release-manager/dist/update/release-metadata.d.ts +57 -0
  190. package/release-manager/dist/update/release-metadata.d.ts.map +1 -0
  191. package/release-manager/dist/update/release-metadata.js +200 -0
  192. package/release-manager/dist/update/release-metadata.js.map +1 -0
  193. package/release-manager/dist/update/release-policy.d.ts +51 -0
  194. package/release-manager/dist/update/release-policy.d.ts.map +1 -0
  195. package/release-manager/dist/update/release-policy.js +103 -0
  196. package/release-manager/dist/update/release-policy.js.map +1 -0
  197. package/release-manager/dist/update/rollback-policy.d.ts +56 -0
  198. package/release-manager/dist/update/rollback-policy.d.ts.map +1 -0
  199. package/release-manager/dist/update/rollback-policy.js +61 -0
  200. package/release-manager/dist/update/rollback-policy.js.map +1 -0
  201. package/release-manager/dist/update/transaction-journal.d.ts +131 -0
  202. package/release-manager/dist/update/transaction-journal.d.ts.map +1 -0
  203. package/release-manager/dist/update/transaction-journal.js +346 -0
  204. package/release-manager/dist/update/transaction-journal.js.map +1 -0
  205. package/release-manager/dist/update/trust-metadata.d.ts +55 -0
  206. package/release-manager/dist/update/trust-metadata.d.ts.map +1 -0
  207. package/release-manager/dist/update/trust-metadata.js +170 -0
  208. package/release-manager/dist/update/trust-metadata.js.map +1 -0
  209. package/release-manager/dist/update/update-history.d.ts +46 -0
  210. package/release-manager/dist/update/update-history.d.ts.map +1 -0
  211. package/release-manager/dist/update/update-history.js +123 -0
  212. package/release-manager/dist/update/update-history.js.map +1 -0
  213. package/release-manager/dist/utils/config-file-io.d.ts +26 -0
  214. package/release-manager/dist/utils/config-file-io.d.ts.map +1 -0
  215. package/release-manager/dist/utils/config-file-io.js +128 -0
  216. package/release-manager/dist/utils/config-file-io.js.map +1 -0
  217. package/release-manager/dist/utils/env.d.ts +60 -0
  218. package/release-manager/dist/utils/env.d.ts.map +1 -0
  219. package/release-manager/dist/utils/env.js +308 -0
  220. package/release-manager/dist/utils/env.js.map +1 -0
  221. package/release-manager/dist/utils/logger.d.ts +15 -0
  222. package/release-manager/dist/utils/logger.d.ts.map +1 -0
  223. package/release-manager/dist/utils/logger.js +30 -0
  224. package/release-manager/dist/utils/logger.js.map +1 -0
  225. package/release-manager/dist/utils/workspace-divergence.d.ts +36 -0
  226. package/release-manager/dist/utils/workspace-divergence.d.ts.map +1 -0
  227. package/release-manager/dist/utils/workspace-divergence.js +87 -0
  228. package/release-manager/dist/utils/workspace-divergence.js.map +1 -0
  229. package/release-manager/package.json +79 -0
package/dist/installer.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { existsSync, readdirSync, statSync, readFileSync, writeFileSync, mkdirSync, rmSync, copyFileSync, cpSync, renameSync, chmodSync, symlinkSync } from 'fs';
2
2
  import { createHash, randomUUID } from 'node:crypto';
3
+ import { pathToFileURL } from 'node:url';
3
4
  import fse from 'fs-extra';
4
5
  import * as path from 'path';
5
6
  import * as http from 'http';
@@ -12,6 +13,7 @@ import { t } from './i18n.js';
12
13
  import { generateConfigYamlContent, ExistingConfigVerifyInfraError, validateExistingConfigYamlForPreserve, getConfigYamlPath, readEnabledChannelsFromConfigYaml, getOpenClawDir, getPdDir, getPdRuntimeDir, getInstallManifestPath, getPdRuntimeBackupsDir, getPluginExtDir, getInstalledPluginDir, getInstalledLayoutPackageDir, getPdBackupsDir, getInstalledPdCliDir, getInstalledBinDir, getInstalledConsoleDir, isWindows, } from './mvp-config.js';
13
14
  import { getHostInstallers } from './installers/index.js';
14
15
  import { mergeInstallManifestWorkspaces, parseInstallManifest } from '@principles/install-layout';
16
+ import { detectOpenClawMainWorkspaceDivergence } from './utils/workspace-divergence.js';
15
17
  import { applySkillLanguageSelection } from './skill-language.js';
16
18
  import { parseReleaseAssetIdentity, parseReleaseAssetManifest, ReleaseAssetManifestError, verifyReleaseAssetManifestAsync, verifyReleaseAssetTarget, } from './update/release-asset-manifest.js';
17
19
  import { appendJournalTransition } from './update/transaction-journal.js';
@@ -253,6 +255,90 @@ function legacyNpmInstallEnabled() {
253
255
  const value = process.env.PD_ALLOW_LEGACY_NPM_INSTALL;
254
256
  return value === '1' || value === 'true';
255
257
  }
258
+ const NPM_DISTRIBUTED_COMPONENTS = [
259
+ ['Core', 'core'],
260
+ ['Host runtime', 'host-runtime'],
261
+ ['Codex adapter', 'codex-adapter'],
262
+ ['Plugin', 'plugin'],
263
+ ['PD CLI', 'pd-cli'],
264
+ ['Console', 'console'],
265
+ ['Install layout', 'install-layout'],
266
+ ];
267
+ // Components whose install step demands MORE than the generic
268
+ // package.json+dist shape check — the per-component extra files are
269
+ // preflighted here so the form-gate refusal is exact (a truncated package
270
+ // must fail BEFORE any mutation, matching the per-component install
271
+ // requirements instead of discovering them mid-deployment).
272
+ const NPM_DISTRIBUTED_REQUIRED_FILES = {
273
+ 'release-manager': ['package.json', path.join('dist', 'update', 'release-manager-authority.js')],
274
+ console: ['package.json', path.join('dist', 'server.js'), path.join('dist', 'web', 'index.html')],
275
+ };
276
+ function releaseAssetPresent(pluginDir) {
277
+ return existsSync(path.join(pluginDir, '_release', 'asset.json'));
278
+ }
279
+ /**
280
+ * Form-gate for the npm-distributed package shape: every bundled component
281
+ * directory must carry its required files. Returns the missing items
282
+ * (empty = complete) so the refusal can name them (rc-3: fail loud with
283
+ * specifics, not a generic "invalid asset"). release-manager and console
284
+ * are checked against their ACTUAL install-time requirements — they are
285
+ * consumed unconditionally during deployment, so a package missing them
286
+ * must be refused before the backup step, not mid-copy (review blocker,
287
+ * PR #1525).
288
+ */
289
+ function missingNpmDistributedComponents(pluginDir) {
290
+ const missing = [];
291
+ // Components with exact install-time file demands replace the generic
292
+ // package.json+dist check (console appears in both lists — the exact list
293
+ // subsumes the generic one, so dedupe to avoid reporting each miss twice).
294
+ const exactShapeComponents = new Set(Object.keys(NPM_DISTRIBUTED_REQUIRED_FILES));
295
+ const componentDirs = [
296
+ ...NPM_DISTRIBUTED_COMPONENTS.map(([, directory]) => directory).filter((directory) => !exactShapeComponents.has(directory)),
297
+ ...exactShapeComponents,
298
+ ];
299
+ for (const componentDirectory of componentDirs) {
300
+ const componentDir = path.join(pluginDir, componentDirectory);
301
+ const requiredFiles = NPM_DISTRIBUTED_REQUIRED_FILES[componentDirectory]
302
+ ?? ['package.json', componentDirectory === 'plugin' ? '' : 'dist'];
303
+ for (const requiredFile of requiredFiles) {
304
+ if (!existsSync(path.join(componentDir, requiredFile))) {
305
+ missing.push(`${componentDirectory}/${requiredFile}`);
306
+ }
307
+ }
308
+ }
309
+ return missing;
310
+ }
311
+ /**
312
+ * Decide which payload shape this package instance carries and whether
313
+ * registry dependency resolution (npm install) is required. Env override
314
+ * first (explicit operator intent), then the physical shape: a present
315
+ * `_release/asset.json` always takes the self-contained path (a present
316
+ * but CORRUPT asset still fails hard inside the preflight — never
317
+ * silently falling back to registry resolution); a package without the
318
+ * release asset but with complete component trees is the npm-distributed
319
+ * shape and resolves dependencies from the registry.
320
+ */
321
+ export function decideInstallPayloadMode(pluginDir) {
322
+ if (legacyNpmInstallEnabled())
323
+ return 'npm-distributed';
324
+ if (releaseAssetPresent(pluginDir))
325
+ return 'self-contained';
326
+ return 'npm-distributed';
327
+ }
328
+ // Per-run payload mode, set by install() alongside activeHostTarget (same
329
+ // module-level idiom) — prepareComponentDependencies' call sites are the
330
+ // per-component wrappers, which have no natural parameter path from install().
331
+ let activePayloadMode = 'self-contained';
332
+ /**
333
+ * Whether registry dependency resolution (npm install / global root
334
+ * discovery) may run: true for the npm-distributed payload shape and the
335
+ * PD_ALLOW_LEGACY_NPM_INSTALL recovery path. Host installers consume this
336
+ * gate instead of re-reading the env (their concern is payload shape, not
337
+ * the specific env var).
338
+ */
339
+ export function isNpmDependencyResolutionEnabled() {
340
+ return activePayloadMode === 'npm-distributed';
341
+ }
256
342
  /**
257
343
  * Supported release assets are self-contained: installation validates the
258
344
  * copied component and never resolves dependencies or runs lifecycle scripts.
@@ -363,7 +449,7 @@ export async function preflightSelfContainedReleaseAsset(assetDir) {
363
449
  }
364
450
  }
365
451
  async function prepareComponentDependencies(cwd, componentName) {
366
- if (!legacyNpmInstallEnabled()) {
452
+ if (activePayloadMode === 'self-contained') {
367
453
  await prepareBundledComponentDependencies(cwd, componentName);
368
454
  return;
369
455
  }
@@ -1123,6 +1209,58 @@ function verifyPdCliShim() {
1123
1209
  })();
1124
1210
  return { localOk, globalOk, localPath: localShim, localError };
1125
1211
  }
1212
+ /**
1213
+ * PRI-672: the ReleaseManager authority module ships as the release-manager/
1214
+ * payload component (package name create-principles-disciple). Installed to
1215
+ * ~/.pd/runtime so the console's rewritten `create-principles-disciple`
1216
+ * dependency resolves; installConsole creates the resolution link.
1217
+ */
1218
+ function getInstalledReleaseManagerDir() {
1219
+ return path.join(getPdRuntimeDir(), 'release-manager');
1220
+ }
1221
+ function installBundledReleaseManagerPackage(pluginDir) {
1222
+ const source = path.join(pluginDir, 'release-manager');
1223
+ const destination = getInstalledReleaseManagerDir();
1224
+ if (!existsSync(path.join(source, 'package.json')) || !existsSync(path.join(source, 'dist', 'update', 'release-manager-authority.js'))) {
1225
+ throw new Error('Bundled release-manager component is incomplete (missing package.json or dist/update/release-manager-authority.js). Re-run the installer with a current package.');
1226
+ }
1227
+ rmSync(destination, { recursive: true, force: true });
1228
+ cpSync(source, destination, { recursive: true });
1229
+ }
1230
+ /**
1231
+ * PR #1525 review: the npm-distributed payload ships release-manager/ as
1232
+ * package.json + dist only — no node_modules. Without its own dependencies
1233
+ * (tuf-js / @tufjs/models) the authority module's static import chain
1234
+ * (release-manager → trust-metadata → tuf-js) cannot resolve, and the gap
1235
+ * would only surface later as `installer_missing` in the console. The
1236
+ * self-contained payload ships the bundle-time npm ci node_modules, so
1237
+ * registry resolution runs for the npm-distributed shape only.
1238
+ */
1239
+ async function installReleaseManagerDependencies() {
1240
+ if (!isNpmDependencyResolutionEnabled())
1241
+ return;
1242
+ await runNpmInstall(getInstalledReleaseManagerDir(), 'ReleaseManager');
1243
+ }
1244
+ /**
1245
+ * PR #1525 review smoke: import the REAL authority module from the installed
1246
+ * tree so a dependency gap fails the install loudly here with a structured
1247
+ * message instead of surfacing as `installer_missing` at console runtime.
1248
+ * Mode-independent — the self-contained payload's shipped node_modules is
1249
+ * proven the same way.
1250
+ */
1251
+ async function verifyReleaseManagerAuthorityImports() {
1252
+ const authorityPath = path.join(getInstalledReleaseManagerDir(), 'dist', 'update', 'release-manager-authority.js');
1253
+ if (!existsSync(authorityPath)) {
1254
+ throw new Error('Installed release-manager authority module not found — installation is incomplete.');
1255
+ }
1256
+ try {
1257
+ await import(pathToFileURL(authorityPath).href);
1258
+ }
1259
+ catch (error) {
1260
+ const detail = error instanceof Error ? error.message : String(error);
1261
+ throw new Error(`ReleaseManager authority module failed to load — its runtime dependencies are incomplete. Re-run the installer to repair the installation. (${detail})`, { cause: error });
1262
+ }
1263
+ }
1126
1264
  function installConsole(consoleDir) {
1127
1265
  const consoleSrc = path.join(consoleDir, 'console');
1128
1266
  const consoleDest = getInstalledConsoleDir();
@@ -1149,6 +1287,19 @@ function installConsole(consoleDir) {
1149
1287
  symlinkSync(path.relative(path.dirname(pluginLinkPath), installedPluginDir()), pluginLinkPath, 'dir');
1150
1288
  }
1151
1289
  }
1290
+ // PRI-672: console resolves its create-principles-disciple dependency (the
1291
+ // ReleaseManager authority module, rewritten to file:../release-manager by
1292
+ // bundle-plugin.mjs) through this link into ~/.pd/runtime.
1293
+ const releaseManagerLinkPath = path.join(consoleDest, 'node_modules', 'create-principles-disciple');
1294
+ if (!existsSync(releaseManagerLinkPath)) {
1295
+ mkdirSync(path.dirname(releaseManagerLinkPath), { recursive: true });
1296
+ if (isWindows()) {
1297
+ symlinkSync(getInstalledReleaseManagerDir(), releaseManagerLinkPath, 'junction');
1298
+ }
1299
+ else {
1300
+ symlinkSync(path.relative(path.dirname(releaseManagerLinkPath), getInstalledReleaseManagerDir()), releaseManagerLinkPath, 'dir');
1301
+ }
1302
+ }
1152
1303
  }
1153
1304
  function getInstalledCoreDir() {
1154
1305
  return path.join(getPdRuntimeDir(), 'core');
@@ -1747,7 +1898,12 @@ export async function install(options, pluginDir, mode = {}) {
1747
1898
  const quiet = mode.quiet === true;
1748
1899
  const nonInteractive = mode.nonInteractive ?? quiet;
1749
1900
  activeHostTarget = options.host;
1750
- if (!legacyNpmInstallEnabled()) {
1901
+ // Decide the payload shape once: self-contained (release asset) or
1902
+ // npm-distributed (registry-resolved dependencies). A present `_release`
1903
+ // asset keeps the hard preflight; the npm-distributed shape must pass
1904
+ // the component form-gate or fail loud naming what is missing.
1905
+ activePayloadMode = decideInstallPayloadMode(pluginDir);
1906
+ if (activePayloadMode === 'self-contained') {
1751
1907
  try {
1752
1908
  await preflightSelfContainedReleaseAsset(pluginDir);
1753
1909
  }
@@ -1777,6 +1933,26 @@ export async function install(options, pluginDir, mode = {}) {
1777
1933
  };
1778
1934
  }
1779
1935
  }
1936
+ else {
1937
+ if (!quiet)
1938
+ logger.warn('npm-distributed package detected — resolving component dependencies from the npm registry.');
1939
+ const missing = missingNpmDistributedComponents(pluginDir);
1940
+ if (missing.length > 0) {
1941
+ return {
1942
+ success: false,
1943
+ workspaceDir: options.workspaceDir,
1944
+ configYamlPath: getConfigYamlPath(options.workspaceDir),
1945
+ templatesCount: 0,
1946
+ components: { plugin: 'skipped', cli: 'skipped', console: 'skipped' },
1947
+ verification: { features: 'skipped', storyA: 'skipped' },
1948
+ enabledChannels: options.channels,
1949
+ nextAction: 'The package is incomplete — reinstall it: npm cache clear --force && npx create-principles-disciple@latest. No changes were made.',
1950
+ reason: `npm_bundle_incomplete: missing ${missing.join(', ')}`,
1951
+ component: 'Release asset',
1952
+ error: `Bundled components incomplete (missing ${missing.join(', ')}) — the npm package is corrupted or truncated. No changes were made.`,
1953
+ };
1954
+ }
1955
+ }
1780
1956
  // Gateway lock pre-flight: a running gateway holds native-module file handles
1781
1957
  // that make the backup rename fail with EPERM. Decide stop/abort/proceed
1782
1958
  // BEFORE mutating anything (cli-5: abort/stop-failed paths must not mutate).
@@ -1922,6 +2098,12 @@ export async function install(options, pluginDir, mode = {}) {
1922
2098
  installBundledCodexAdapter(pluginDir);
1923
2099
  stepIndex++;
1924
2100
  installBundledLayoutPackage(pluginDir);
2101
+ if (spinner)
2102
+ updateProgress(spinner, stepIndex, 'Installing release-manager authority module...');
2103
+ installBundledReleaseManagerPackage(pluginDir);
2104
+ await installReleaseManagerDependencies();
2105
+ await verifyReleaseManagerAuthorityImports();
2106
+ stepIndex++;
1925
2107
  if (spinner)
1926
2108
  updateProgress(spinner, stepIndex, 'Installing plugin...');
1927
2109
  await installPluginToStaging(pluginDir, options.language);
@@ -2012,6 +2194,20 @@ export async function install(options, pluginDir, mode = {}) {
2012
2194
  updateProgress(spinner, stepIndex, 'Creating config...');
2013
2195
  await createConfigFile(options.workspaceDir, options.channels);
2014
2196
  stepIndex++;
2197
+ // PRI-686 Fix C: after pinning PD canonical, check OpenClaw's resolved
2198
+ // main-agent workspace against it. Read-only; a divergence means PD
2199
+ // commands and hooks would write to two different state trees.
2200
+ try {
2201
+ const divergence = detectOpenClawMainWorkspaceDivergence(options.workspaceDir);
2202
+ if (divergence.divergent) {
2203
+ logger.warn(`Workspace divergence detected: ${divergence.detail}. ` +
2204
+ `${divergence.nextAction} ` +
2205
+ `Until fixed, OpenClaw sessions in "${divergence.openclawMainWorkspace}" may be unable to record pain signals (needs_evidence).`);
2206
+ }
2207
+ }
2208
+ catch (e) {
2209
+ logger.warn(`OpenClaw workspace divergence check failed (non-fatal): ${e instanceof Error ? e.message : String(e)}`);
2210
+ }
2015
2211
  if (spinner)
2016
2212
  updateProgress(spinner, stepIndex, 'Initializing PD databases...');
2017
2213
  try {