@pareto4/pp-core 1.13.0 → 1.18.0

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 (204) hide show
  1. package/.claude-plugin/plugin.json +3 -3
  2. package/README.md +31 -12
  3. package/agents/pp-code-fixer.md +0 -11
  4. package/agents/pp-code-reviewer.md +1 -77
  5. package/agents/pp-debug-session-manager.md +9 -6
  6. package/agents/pp-executor.md +12 -29
  7. package/agents/pp-plan-checker.md +4 -4
  8. package/agents/pp-planner.md +34 -20
  9. package/agents/pp-vault-reviewer.md +100 -23
  10. package/agents/pp-verifier.md +1 -3
  11. package/bin/install.js +10 -3
  12. package/commands/pp-execute-phase.md +1 -3
  13. package/commands/pp-ns-manage.md +1 -1
  14. package/commands/pp-ns-review.md +1 -1
  15. package/commands/pp-plan-phase.md +1 -2
  16. package/commands/pp-vault-promote.md +7 -8
  17. package/commands/pp-vault-review.md +6 -5
  18. package/commands/pp-verify-work.md +1 -2
  19. package/gemini-extension.json +1 -1
  20. package/hooks/dist/pp-check-update.js +0 -0
  21. package/hooks/dist/pp-cursor-session-start.js +1 -1
  22. package/hooks/dist/pp-statusline.js +1 -1
  23. package/hooks/dist/pp-update-banner.js +0 -0
  24. package/hooks/pp-check-update.js +0 -0
  25. package/hooks/pp-cursor-session-start.js +1 -1
  26. package/hooks/pp-statusline.js +1 -1
  27. package/hooks/pp-update-banner.js +0 -0
  28. package/package.json +10 -18
  29. package/pareto-skills/_shared/create-project-board.sh +0 -0
  30. package/pareto-skills/pp-project-setup/SKILL.md +1 -1
  31. package/pp-core/bin/check-latest-version.cjs +0 -0
  32. package/pp-core/bin/detect-build-commands.sh +2 -2
  33. package/pp-core/bin/lib/capability-activation.cjs +83 -9
  34. package/pp-core/bin/lib/capability-registry.cjs +201 -229
  35. package/pp-core/bin/lib/capability-state.cjs +93 -1
  36. package/pp-core/bin/lib/capability-writer.cjs +3 -3
  37. package/pp-core/bin/lib/check-command-router.cjs +1906 -1514
  38. package/pp-core/bin/lib/clusters.cjs +3 -0
  39. package/pp-core/bin/lib/command-aliases.cjs +0 -35
  40. package/pp-core/bin/lib/commands.cjs +9 -4
  41. package/pp-core/bin/lib/compose-bindings.cjs +251 -88
  42. package/pp-core/bin/lib/config-loader.cjs +7 -103
  43. package/pp-core/bin/lib/config-schema.cjs +1 -1
  44. package/pp-core/bin/lib/config.cjs +151 -62
  45. package/pp-core/bin/lib/decisions.cjs +4 -4
  46. package/pp-core/bin/lib/discovery-vault-check.cjs +246 -0
  47. package/pp-core/bin/lib/frontmatter.cjs +1 -38
  48. package/pp-core/bin/lib/git-base-branch.cjs +11 -12
  49. package/pp-core/bin/lib/git-provider.cjs +9 -10
  50. package/pp-core/bin/lib/init-command-router.cjs +5 -8
  51. package/pp-core/bin/lib/init-contract.cjs +620 -738
  52. package/pp-core/bin/lib/init-interactive.cjs +62 -4
  53. package/pp-core/bin/lib/init.cjs +24 -51
  54. package/pp-core/bin/lib/install-profiles.cjs +1 -1
  55. package/pp-core/bin/lib/io.cjs +4 -2
  56. package/pp-core/bin/lib/loop-resolver.cjs +165 -129
  57. package/pp-core/bin/lib/org-profile.cjs +402 -161
  58. package/pp-core/bin/lib/package-identity.cjs +3 -3
  59. package/pp-core/bin/lib/phase-command-router.cjs +1 -29
  60. package/pp-core/bin/lib/phase-scope.cjs +1 -1
  61. package/pp-core/bin/lib/phase.cjs +11 -253
  62. package/pp-core/bin/lib/platform-bindings.cjs +40 -19
  63. package/pp-core/bin/lib/profile-output.cjs +1 -1
  64. package/pp-core/bin/lib/shell-command-projection.cjs +104 -1
  65. package/pp-core/bin/lib/state.cjs +11 -85
  66. package/pp-core/bin/lib/template.cjs +1 -1
  67. package/pp-core/bin/lib/vault-command-router.cjs +1682 -477
  68. package/pp-core/bin/lib/vault-coordinates.cjs +16 -7
  69. package/pp-core/bin/lib/vault-index.cjs +656 -0
  70. package/pp-core/bin/lib/vault-seal.cjs +1851 -0
  71. package/pp-core/bin/lib/vault-standards-promote.cjs +577 -0
  72. package/pp-core/bin/lib/vault-standards-review.cjs +293 -0
  73. package/pp-core/bin/lib/vault-standards.cjs +1504 -0
  74. package/pp-core/bin/lib/vault-trace.cjs +155 -2778
  75. package/pp-core/bin/lib/vault-update.cjs +10 -59
  76. package/pp-core/bin/lib/vault.cjs +2570 -950
  77. package/pp-core/bin/lib/verify.cjs +0 -11
  78. package/pp-core/bin/portable-timeout.sh +1 -1
  79. package/pp-core/bin/pp-tools.cjs +157 -54
  80. package/pp-core/bin/shared/config-defaults.manifest.json +0 -7
  81. package/pp-core/bin/shared/config-schema.manifest.json +0 -3
  82. package/pp-core/bin/shared/model-catalog.json +2 -2
  83. package/pp-core/bin/verify-reapply-patches.cjs +0 -0
  84. package/pp-core/org-profile.json +26 -0
  85. package/pp-core/references/autonomous-best-effort.md +8 -7
  86. package/pp-core/references/loop-hook-dispatch.md +0 -25
  87. package/pp-core/references/planner-gap-closure.md +0 -1
  88. package/pp-core/references/planner-tdd.md +0 -1
  89. package/pp-core/references/planner-vault-standards.md +311 -0
  90. package/pp-core/references/planning-config.md +0 -8
  91. package/pp-core/references/tdd.md +0 -1
  92. package/pp-core/templates/README.md +1 -0
  93. package/pp-core/templates/VAULT-REVIEW.md +56 -0
  94. package/pp-core/templates/phase-prompt.md +2 -6
  95. package/pp-core/workflows/_runtime-launcher.snippet.sh +0 -0
  96. package/pp-core/workflows/add-tests.md +55 -4
  97. package/pp-core/workflows/audit-fix.md +63 -2
  98. package/pp-core/workflows/audit-milestone.md +1 -1
  99. package/pp-core/workflows/autonomous.md +85 -11
  100. package/pp-core/workflows/check-todos.md +13 -2
  101. package/pp-core/workflows/code-review-fix.md +59 -3
  102. package/pp-core/workflows/code-review.md +10 -57
  103. package/pp-core/workflows/complete-milestone.md +1 -1
  104. package/pp-core/workflows/debug.md +54 -4
  105. package/pp-core/workflows/discovery-sprint/prefill.md +19 -7
  106. package/pp-core/workflows/discovery-sprint/prototype.md +46 -49
  107. package/pp-core/workflows/discovery-sprint/session-13-gates.md +2 -0
  108. package/pp-core/workflows/discovery-sprint/sessions/01-kick-off.md +1 -3
  109. package/pp-core/workflows/discovery-sprint/sessions/02-as-is.md +1 -3
  110. package/pp-core/workflows/discovery-sprint/sessions/03-to-be.md +1 -3
  111. package/pp-core/workflows/discovery-sprint/sessions/04-ux-design.md +20 -24
  112. package/pp-core/workflows/discovery-sprint/sessions/05-architecture.md +1 -3
  113. package/pp-core/workflows/discovery-sprint/sessions/06-security.md +1 -3
  114. package/pp-core/workflows/discovery-sprint/sessions/07-identity.md +1 -3
  115. package/pp-core/workflows/discovery-sprint/sessions/08-integration.md +1 -3
  116. package/pp-core/workflows/discovery-sprint/sessions/09-qa.md +1 -3
  117. package/pp-core/workflows/discovery-sprint/sessions/10-infrastructure.md +1 -6
  118. package/pp-core/workflows/discovery-sprint/sessions/11-roadmap.md +1 -3
  119. package/pp-core/workflows/discovery-sprint/sessions/12-delivery-model.md +1 -3
  120. package/pp-core/workflows/discovery-sprint/sessions/13-wrap-up.md +1 -3
  121. package/pp-core/workflows/discovery-sprint/templates/context-template.md +1 -1
  122. package/pp-core/workflows/discovery-sprint/vault-context.md +207 -0
  123. package/pp-core/workflows/discovery-sprint.md +7 -3
  124. package/pp-core/workflows/discovery-to-build/steps/architecture-deliverables.md +4 -4
  125. package/pp-core/workflows/discovery-to-build/templates/pp-handoff.md +43 -1
  126. package/pp-core/workflows/discovery-to-build.md +10 -2
  127. package/pp-core/workflows/discuss-phase.md +3 -10
  128. package/pp-core/workflows/execute-phase/steps/check-query-gate.md +327 -0
  129. package/pp-core/workflows/execute-phase/steps/client-context-gate.md +3 -2
  130. package/pp-core/workflows/execute-phase/steps/cross-ai-delegation.md +1 -1
  131. package/pp-core/workflows/execute-phase/steps/execute-pre-dispatch.md +78 -0
  132. package/pp-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  133. package/pp-core/workflows/execute-phase/steps/post-merge-gate.md +6 -8
  134. package/pp-core/workflows/execute-phase/steps/vault-fetch.md +115 -14
  135. package/pp-core/workflows/execute-phase/steps/vault-load-gate.md +219 -20
  136. package/pp-core/workflows/execute-phase/steps/verify-post-gate.md +147 -0
  137. package/pp-core/workflows/execute-phase.md +152 -128
  138. package/pp-core/workflows/execute-plan.md +54 -6
  139. package/pp-core/workflows/fast.md +53 -4
  140. package/pp-core/workflows/help/modes/full.md +3 -3
  141. package/pp-core/workflows/init/steps/client-context-capture.md +101 -0
  142. package/pp-core/workflows/init/steps/gitlab-provisioning.md +130 -0
  143. package/pp-core/workflows/init/steps/project-md-deferral-narration.md +66 -0
  144. package/pp-core/workflows/init/steps/reachability-outcome.md +70 -0
  145. package/pp-core/workflows/init.md +232 -272
  146. package/pp-core/workflows/new-project.md +31 -23
  147. package/pp-core/workflows/plan-phase.md +98 -45
  148. package/pp-core/workflows/quick.md +117 -3
  149. package/pp-core/workflows/secure-phase.md +1 -1
  150. package/pp-core/workflows/ship.md +57 -28
  151. package/pp-core/workflows/undo.md +1 -1
  152. package/pp-core/workflows/update.md +3 -3
  153. package/pp-core/workflows/validate-phase.md +58 -3
  154. package/pp-core/workflows/vault-review.md +161 -23
  155. package/pp-core/workflows/vault-write-back.md +73 -110
  156. package/pp-core/workflows/verify-work.md +12 -14
  157. package/scripts/changeset/cli.cjs +6 -5
  158. package/scripts/changeset/lint.cjs +0 -0
  159. package/scripts/changeset/new.cjs +33 -50
  160. package/scripts/dev-env.cjs +25 -85
  161. package/scripts/gen-capability-registry.cjs +120 -13
  162. package/scripts/lib/allowlist-ratchet.cjs +1 -103
  163. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -2
  164. package/scripts/lint-docs-required.cjs +0 -0
  165. package/scripts/lint-pr-check-project-dir.cjs +1 -3
  166. package/scripts/lint-test-file-count.allowlist.json +3 -19
  167. package/scripts/lint-test-file-count.cjs +5 -6
  168. package/scripts/prompt-injection-scan.sh +19 -17
  169. package/scripts/release-channel.cjs +0 -0
  170. package/scripts/sync-manifest-versions.cjs +5 -4
  171. package/scripts/sync-rulesets.sh +1 -1
  172. package/scripts/update-size-baseline.cjs +30 -274
  173. package/scripts/verify-opengsd-sweep.cjs +3 -5
  174. package/scripts/workflow-size.cjs +9 -61
  175. package/pp-core/bin/lib/dispatch-plan.cjs +0 -483
  176. package/pp-core/bin/lib/install-run.cjs +0 -536
  177. package/pp-core/bin/lib/loop-gates.cjs +0 -213
  178. package/pp-core/bin/lib/phase-manifest.cjs +0 -527
  179. package/pp-core/bin/lib/phase-tier.cjs +0 -480
  180. package/pp-core/bin/lib/plan-graph.cjs +0 -368
  181. package/pp-core/bin/lib/practices-review-check.cjs +0 -938
  182. package/pp-core/bin/lib/vault-audit.cjs +0 -2070
  183. package/pp-core/bin/lib/vault-practices.cjs +0 -1990
  184. package/pp-core/bin/lib/vault-review.cjs +0 -2359
  185. package/pp-core/bin/lib/vault-write-back.cjs +0 -877
  186. package/pp-core/references/executor-vault-trace.md +0 -47
  187. package/pp-core/references/planner-plan-graph.md +0 -66
  188. package/pp-core/references/planner-vault-practices.md +0 -112
  189. package/pp-core/templates/practices/README.md +0 -251
  190. package/pp-core/templates/practices/error-handling.md +0 -18
  191. package/pp-core/templates/practices/minimal-comments.md +0 -14
  192. package/pp-core/templates/practices/naming-convention.md +0 -18
  193. package/pp-core/templates/practices/practice-template.md +0 -23
  194. package/pp-core/workflows/discovery-sprint/vault-fetch.md +0 -37
  195. package/pp-core/workflows/execute-phase/steps/checkpoint-handling.md +0 -45
  196. package/pp-core/workflows/execute-phase/steps/install-run.md +0 -29
  197. package/pp-core/workflows/execute-phase/steps/phase-close-rebaseline.md +0 -23
  198. package/pp-core/workflows/execute-phase/steps/serial-group-dispatch.md +0 -73
  199. package/pp-core/workflows/execute-phase/steps/vault-door-gate.md +0 -19
  200. package/pp-core/workflows/plan-phase/steps/phase-tier.md +0 -43
  201. package/scripts/lib/size-budget.cjs +0 -311
  202. package/scripts/lint-neutrality-names.cjs +0 -694
  203. package/scripts/lint-org-coordinates.allowlist.json +0 -35
  204. package/scripts/lint-org-coordinates.cjs +0 -426
@@ -13,11 +13,19 @@ const node_path_1 = __importDefault(require("node:path"));
13
13
  // eslint-disable-next-line @typescript-eslint/no-require-imports
14
14
  const planningWorkspaceMod = require("./planning-workspace.cjs");
15
15
  const { planningDir, planningRoot } = planningWorkspaceMod;
16
+ /**
17
+ * Segments that must never be walked or matched, on either key form.
18
+ * Extracted so the nested walk and the flat fallback cannot drift into
19
+ * disagreeing about what a pollution attempt looks like.
20
+ */
21
+ function _isRejectedKeySegment(seg) {
22
+ return seg === '__proto__' || seg === 'constructor' || seg === 'prototype';
23
+ }
16
24
  function _getNestedConfigValue(config, dotKey) {
17
25
  const segments = dotKey.split('.');
18
26
  let current = config;
19
27
  for (const seg of segments) {
20
- if (seg === '__proto__' || seg === 'constructor' || seg === 'prototype') {
28
+ if (_isRejectedKeySegment(seg)) {
21
29
  return { found: false, value: undefined };
22
30
  }
23
31
  if (typeof current !== 'object' || current === null) {
@@ -31,6 +39,65 @@ function _getNestedConfigValue(config, dotKey) {
31
39
  }
32
40
  return { found: true, value: current };
33
41
  }
42
+ /**
43
+ * GATE-05: look the WHOLE dotted string up as a single own property.
44
+ *
45
+ * An operator hand-pasting a gate key into a config.json they did not write
46
+ * writes `{"vault.required": true}` at least as often as the three-line nested
47
+ * form. Before this existed, that flat shape resolved nowhere — the nested walk
48
+ * looked up `config['vault']`, found nothing, and the key silently fell through
49
+ * to its default. For an enforcement gate that is a fail-open with no error
50
+ * message, which is exactly the failure GATE-05 exists to close.
51
+ *
52
+ * Performs NO traversal: one own-property check on a string already in hand.
53
+ * The rejected-segment guard is applied to every segment of the dotted string
54
+ * anyway (T-02-13) so the flat path can never become the bypass the nested
55
+ * path already closes, and `hasOwnProperty` is required (T-02-14) so an
56
+ * inherited property is never mistaken for configuration.
57
+ *
58
+ * A flat own property valued `undefined` is reported NOT-found on purpose: it
59
+ * cannot come from JSON, and treating it as configured would let a
60
+ * programmatically built object shadow the schema default with nothing.
61
+ */
62
+ function _getFlatConfigValue(config, dotKey) {
63
+ for (const seg of dotKey.split('.')) {
64
+ if (_isRejectedKeySegment(seg))
65
+ return { found: false, value: undefined };
66
+ }
67
+ if (typeof config !== 'object' || config === null) {
68
+ return { found: false, value: undefined };
69
+ }
70
+ if (!Object.prototype.hasOwnProperty.call(config, dotKey)) {
71
+ return { found: false, value: undefined };
72
+ }
73
+ const value = config[dotKey];
74
+ if (value === undefined)
75
+ return { found: false, value: undefined };
76
+ return { found: true, value };
77
+ }
78
+ /**
79
+ * GATE-05: resolve a dotted key in EITHER form against one config object.
80
+ *
81
+ * PRECEDENCE — nested first, flat only as a fallback. This ordering is the
82
+ * decision, not an implementation detail: when both forms are present for the
83
+ * same key the NESTED form wins. Chosen because every shipped example and every
84
+ * project configured to date is nested, so a nested-first fallback cannot move
85
+ * the resolution of any key that resolves today — the flat form resolves
86
+ * nowhere at present, so adding it below the nested walk is strictly additive.
87
+ * A flat-first ordering would silently change behaviour for any project that
88
+ * later adds a flat key alongside a nested one. Pinned by the
89
+ * "both forms present … NESTED wins" tests in
90
+ * tests/capability-precedence-parity.test.cjs; invert this and they go red.
91
+ *
92
+ * Called from the leaf of every precedence level, so levels 1-3 inherit the
93
+ * fallback without any change to the four-level walk itself.
94
+ */
95
+ function getConfigValueEitherForm(config, dotKey) {
96
+ const nested = _getNestedConfigValue(config, dotKey);
97
+ if (nested.found)
98
+ return nested;
99
+ return _getFlatConfigValue(config, dotKey);
100
+ }
34
101
  const _warnedRawConfigPaths = new Set();
35
102
  function _readRawConfigKey(filePath, dotKey) {
36
103
  try {
@@ -49,7 +116,9 @@ function _readRawConfigKey(filePath, dotKey) {
49
116
  }
50
117
  return { found: false, value: undefined };
51
118
  }
52
- return _getNestedConfigValue(parsed, dotKey);
119
+ // GATE-05: levels 2 and 3 read raw config.json files — the surface an
120
+ // operator hand-edits — so they need both key forms, nested first.
121
+ return getConfigValueEitherForm(parsed, dotKey);
53
122
  }
54
123
  catch {
55
124
  return { found: false, value: undefined };
@@ -58,11 +127,11 @@ function _readRawConfigKey(filePath, dotKey) {
58
127
  /**
59
128
  * The raw config files levels 2 and 3 read, in read order: the active
60
129
  * `planningDir(cwd)/config.json`, then the root `planningRoot(cwd)/config.json`
61
- * when it is a different file. Exported so `unreadableConfigFiles`
62
- * (src/config-loader.cts) parses every file the hook resolver reads — this list
63
- * beside `configFilesFor`, the loader's — without restating either. Both levels
64
- * skip an unparseable file with a stderr warning and read on, which is the
65
- * swallow a gate-governing caller must refuse.
130
+ * when it is a different file (16-04, D-28). Exported so the door-admission
131
+ * verdict (`vaultAdmissionVerdict` in src/vault.cts) parses every file the gate
132
+ * reads — this list beside `configFilesFor`, the loader's — without restating
133
+ * either. Both levels skip an unparseable file with a stderr warning and read
134
+ * on, which is the swallow the verdict exists to refuse.
66
135
  */
67
136
  function activationConfigFilesFor(cwd) {
68
137
  const wsConfigPath = node_path_1.default.join(planningDir(cwd), 'config.json');
@@ -84,8 +153,8 @@ function activationConfigFilesFor(cwd) {
84
153
  */
85
154
  function resolveConfigKey(dotKey, opts) {
86
155
  const { config, cwd, registry } = opts;
87
- // Level 1: loadConfig result
88
- const fromConfig = _getNestedConfigValue(config, dotKey);
156
+ // Level 1: loadConfig result (GATE-05: nested form first, flat form as fallback)
157
+ const fromConfig = getConfigValueEitherForm(config, dotKey);
89
158
  if (fromConfig.found)
90
159
  return { found: true, value: fromConfig.value };
91
160
  // Level 2 + 3: raw config.json files (only when cwd is available)
@@ -116,6 +185,11 @@ function _resolveActivationValue(dotKey, config, cwd, registry) {
116
185
  }
117
186
  module.exports = {
118
187
  _getNestedConfigValue,
188
+ // GATE-05: exported so src/config.cts's cmdConfigGet reuses this exact flat
189
+ // lookup rather than growing a second, driftable copy of the rule.
190
+ _getFlatConfigValue,
191
+ _isRejectedKeySegment,
192
+ getConfigValueEitherForm,
119
193
  _readRawConfigKey,
120
194
  _resolveActivationValue,
121
195
  resolveConfigKey,