@pareto4/pp-core 1.5.4 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/agents/pp-code-fixer.md +3 -3
- package/bin/install.js +0 -6
- package/commands/pp-init.md +36 -0
- package/commands/pp-ns-project.md +2 -1
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/pp-core/bin/lib/agent-install-check.cjs +1 -1
- package/pp-core/bin/lib/audit-command-router.cjs +3 -3
- package/pp-core/bin/lib/audit.cjs +1 -1
- package/pp-core/bin/lib/capability-activation.cjs +1 -1
- package/pp-core/bin/lib/capability-registry.cjs +138 -5
- package/pp-core/bin/lib/capability-state.cjs +1 -1
- package/pp-core/bin/lib/capability-writer.cjs +1 -1
- package/pp-core/bin/lib/check-command-router.cjs +190 -8
- package/pp-core/bin/lib/cjs-command-router-adapter.cjs +1 -1
- package/pp-core/bin/lib/clusters.cjs +1 -0
- package/pp-core/bin/lib/code-review-flags.cjs +1 -1
- package/pp-core/bin/lib/command-aliases.cjs +7 -0
- package/pp-core/bin/lib/config-loader.cjs +1 -1
- package/pp-core/bin/lib/config.cjs +1 -1
- package/pp-core/bin/lib/context-utilization.cjs +1 -1
- package/pp-core/bin/lib/docs.cjs +1 -1
- package/pp-core/bin/lib/frontmatter.cjs +1 -1
- package/pp-core/bin/lib/git-base-branch.cjs +2 -2
- package/pp-core/bin/lib/graphify-command-router.cjs +4 -4
- package/pp-core/bin/lib/graphify.cjs +1 -1
- package/pp-core/bin/lib/gsd2-import.cjs +1 -1
- package/pp-core/bin/lib/init-command-router.cjs +1 -1
- package/pp-core/bin/lib/init.cjs +1 -1
- package/pp-core/bin/lib/intel-command-router.cjs +5 -5
- package/pp-core/bin/lib/intel.cjs +1 -1
- package/pp-core/bin/lib/io.cjs +4 -2
- package/pp-core/bin/lib/loop-resolver.cjs +1 -1
- package/pp-core/bin/lib/phase-command-router.cjs +1 -1
- package/pp-core/bin/lib/phases-command-router.cjs +1 -1
- package/pp-core/bin/lib/plan-drift-guard.cjs +1 -1
- package/pp-core/bin/lib/platform-bindings.cjs +336 -0
- package/pp-core/bin/lib/profile-output.cjs +216 -1
- package/pp-core/bin/lib/prohibition-enforcement.cjs +2 -2
- package/pp-core/bin/lib/roadmap-command-router.cjs +2 -2
- package/pp-core/bin/lib/roadmap-parser.cjs +1 -1
- package/pp-core/bin/lib/state-command-router.cjs +1 -1
- package/pp-core/bin/lib/state.cjs +2 -2
- package/pp-core/bin/lib/validate-command-router.cjs +1 -1
- package/pp-core/bin/lib/verify-command-router.cjs +1 -1
- package/pp-core/bin/lib/verify.cjs +1 -1
- package/pp-core/bin/lib/worktree-base-ref.cjs +2 -2
- package/pp-core/bin/lib/worktree-safety.cjs +1 -1
- package/pp-core/bin/pp-tools.cjs +61 -24
- package/pp-core/workflows/discovery-sprint.md +27 -10
- package/pp-core/workflows/execute-phase/steps/client-context-gate.md +37 -0
- package/pp-core/workflows/execute-phase.md +4 -0
- package/pp-core/workflows/init.md +530 -0
- package/pp-core/workflows/new-project.md +54 -1
- package/pp-core/workflows/ship.md +24 -1
- package/pp-core/workflows/verify-work.md +1 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +1 -0
- package/assets/gsd-logo-2000-transparent.png +0 -0
- package/assets/gsd-logo-2000-transparent.svg +0 -17
- package/assets/gsd-logo-2000.png +0 -0
- package/assets/gsd-logo-2000.svg +0 -21
package/agents/pp-code-fixer.md
CHANGED
|
@@ -271,7 +271,7 @@ wt=$(mktemp -d "/tmp/sv-${padded_phase}-reviewfix-XXXXXX")
|
|
|
271
271
|
# failed before the agent could do any work). The temp branch shares
|
|
272
272
|
# history with $branch up to the moment of creation, so commits made
|
|
273
273
|
# inside the worktree fast-forward $branch on cleanup.
|
|
274
|
-
reviewfix_branch="
|
|
274
|
+
reviewfix_branch="pp-reviewfix/${padded_phase}-$$"
|
|
275
275
|
git worktree add -b "$reviewfix_branch" "$wt" "$branch"
|
|
276
276
|
|
|
277
277
|
# Write the recovery sentinel ONLY AFTER `git worktree add` succeeds.
|
|
@@ -297,7 +297,7 @@ Concrete steps:
|
|
|
297
297
|
2. Resolve the current branch: `branch=$(git branch --show-current)`. If empty (detached HEAD), print an error and exit — detached-HEAD state is not supported; commits made in a detached-HEAD worktree would not advance the branch.
|
|
298
298
|
3. **Recovery check (#2839, #2990):** If `${phase_dir}/.review-fix-recovery-pending.json` already exists, a prior run was interrupted. Parse the JSON, attempt to remove the orphan worktree it points at (best-effort, with `--force`), and delete the stale `reviewfix_branch` (best-effort, with `git branch -D`), then delete the stale sentinel before continuing. This makes a re-run of `/pp:code-review --fix` self-healing.
|
|
299
299
|
4. Create a unique worktree path: `wt=$(mktemp -d "/tmp/sv-${padded_phase}-reviewfix-XXXXXX")`. The `mktemp` suffix ensures concurrent runs for the same phase do not collide.
|
|
300
|
-
5. Run `git worktree add -b "$reviewfix_branch" "$wt" "$branch"` — this creates a NEW branch (`
|
|
300
|
+
5. Run `git worktree add -b "$reviewfix_branch" "$wt" "$branch"` — this creates a NEW branch (`pp-reviewfix/${padded_phase}-$$`) starting from the current branch tip and attaches the worktree to that new branch. Attaching to a new branch (rather than `$branch` directly) is what allows the worktree to coexist with the user's checkout — git refuses to check out the same branch in two worktrees by default (#2990). Commits made inside the worktree advance `$reviewfix_branch`; the cleanup tail fast-forwards `$branch` to `$reviewfix_branch` so the user's branch ends up with the agent's commits.
|
|
301
301
|
6. **Write the recovery sentinel** at `${phase_dir}/.review-fix-recovery-pending.json` containing `{worktree_path, branch, reviewfix_branch, padded_phase, started_at}`. Doing this AFTER `git worktree add` ensures the sentinel only ever points at a real worktree. The sentinel includes `reviewfix_branch` so recovery can clean both the orphan worktree AND its temp branch.
|
|
302
302
|
7. All subsequent file reads, edits, and commits happen inside `$wt` (which is on `$reviewfix_branch`, not `$branch`).
|
|
303
303
|
|
|
@@ -454,7 +454,7 @@ For each finding in sorted order:
|
|
|
454
454
|
|
|
455
455
|
**If verification passed:**
|
|
456
456
|
|
|
457
|
-
Use `
|
|
457
|
+
Use `pp_run query commit` with conventional format (message first, then every staged file path):
|
|
458
458
|
```bash
|
|
459
459
|
_PP_SHIM_NAME="pp-tools.cjs"; _PP_RUNTIME_ROOT="${RUNTIME_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"; PP_TOOLS="${_PP_RUNTIME_ROOT}/pp-core/bin/${_PP_SHIM_NAME}"; if [ -f "$PP_TOOLS" ]; then pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${_PP_RUNTIME_ROOT}/.claude/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${_PP_RUNTIME_ROOT}/.claude/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${_PP_RUNTIME_ROOT}/.codex/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${_PP_RUNTIME_ROOT}/.codex/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif command -v pp-tools >/dev/null 2>&1; then PP_TOOLS="$(command -v pp-tools)"; pp_run() { "$PP_TOOLS" "$@"; }; elif [ -f "$HOME/.claude/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="$HOME/.claude/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${HERMES_HOME:-$HOME/.hermes}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${HERMES_HOME:-$HOME/.hermes}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CURSOR_CONFIG_DIR:-$HOME/.cursor}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CURSOR_CONFIG_DIR:-$HOME/.cursor}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CODEX_HOME:-$HOME/.codex}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CODEX_HOME:-$HOME/.codex}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${GEMINI_CONFIG_DIR:-$HOME/.gemini}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${GEMINI_CONFIG_DIR:-$HOME/.gemini}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${COPILOT_CONFIG_DIR:-$HOME/.copilot}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${COPILOT_CONFIG_DIR:-$HOME/.copilot}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${WINDSURF_CONFIG_DIR:-$HOME/.codeium/windsurf}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${AUGMENT_CONFIG_DIR:-$HOME/.augment}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${AUGMENT_CONFIG_DIR:-$HOME/.augment}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${TRAE_CONFIG_DIR:-$HOME/.trae}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${TRAE_CONFIG_DIR:-$HOME/.trae}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${QWEN_CONFIG_DIR:-$HOME/.qwen}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${QWEN_CONFIG_DIR:-$HOME/.qwen}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CODEBUDDY_CONFIG_DIR:-$HOME/.codebuddy}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${CLINE_CONFIG_DIR:-$HOME/.cline}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${CLINE_CONFIG_DIR:-$HOME/.cline}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${GROK_AGENTS_HOME:-$HOME/.agents}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${GROK_AGENTS_HOME:-$HOME/.agents}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${ANTIGRAVITY_CONFIG_DIR:-$HOME/.gemini/antigravity}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${OPENCODE_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; elif [ -f "${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/pp-core/bin/${_PP_SHIM_NAME}" ]; then PP_TOOLS="${KILO_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/kilo}/pp-core/bin/${_PP_SHIM_NAME}"; pp_run() { node "$PP_TOOLS" "$@"; }; else echo "ERROR: pp-tools.cjs not found at $PP_TOOLS and pp-tools is not on PATH. Run: npx -y @pareto4/pp-core@latest --claude --local" >&2; exit 1; fi; if [ -n "${CLAUDE_ENV_FILE:-}" ] && [ -n "${PP_TOOLS:-}" ]; then printf "export PATH='%s':\"\$PATH\"\n" "${PP_TOOLS%/*}" >> "$CLAUDE_ENV_FILE" 2>/dev/null || true; fi
|
|
460
460
|
pp_run query commit \
|
package/bin/install.js
CHANGED
|
@@ -11504,8 +11504,6 @@ function finishInstall(settingsPath, settings, statuslineCommand, shouldInstallS
|
|
|
11504
11504
|
if (runtime === 'claude' && isGlobal) {
|
|
11505
11505
|
console.log(`
|
|
11506
11506
|
${green}Done!${reset} Restart ${program}, then in any directory either type ${cyan}${command}${reset} or ask Claude to run the ${cyan}pp-new-project${reset} skill.
|
|
11507
|
-
|
|
11508
|
-
${cyan}Join the community:${reset} https://discord.gg/mYgfVNfA2r
|
|
11509
11507
|
`);
|
|
11510
11508
|
return;
|
|
11511
11509
|
}
|
|
@@ -11514,16 +11512,12 @@ function finishInstall(settingsPath, settings, statuslineCommand, shouldInstallS
|
|
|
11514
11512
|
const agentPath = configDir ? path.join(configDir, 'agents', 'gsd.yaml') : 'agents/gsd.yaml';
|
|
11515
11513
|
console.log(`
|
|
11516
11514
|
${green}Done!${reset} Start ${program} with ${cyan}kimi --agent-file ${agentPath}${reset}, then run ${cyan}${command}${reset}.
|
|
11517
|
-
|
|
11518
|
-
${cyan}Join the community:${reset} https://discord.gg/mYgfVNfA2r
|
|
11519
11515
|
`);
|
|
11520
11516
|
return;
|
|
11521
11517
|
}
|
|
11522
11518
|
|
|
11523
11519
|
console.log(`
|
|
11524
11520
|
${green}Done!${reset} Open a blank directory in ${program} and run ${cyan}${command}${reset}.
|
|
11525
|
-
|
|
11526
|
-
${cyan}Join the community:${reset} https://discord.gg/mYgfVNfA2r
|
|
11527
11521
|
`);
|
|
11528
11522
|
}
|
|
11529
11523
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pp:init
|
|
3
|
+
description: Initialize a project — git init, remote wiring, minimal metadata, then hand off
|
|
4
|
+
argument-hint: "[--text]"
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- Read
|
|
7
|
+
- Bash
|
|
8
|
+
- Write
|
|
9
|
+
- AskUserQuestion
|
|
10
|
+
requires: [config]
|
|
11
|
+
---
|
|
12
|
+
<runtime_note>
|
|
13
|
+
**Copilot (VS Code):** Use `vscode_askquestions` wherever this workflow calls `AskUserQuestion`. They are equivalent — `vscode_askquestions` is the VS Code Copilot implementation of the same interactive question API.
|
|
14
|
+
</runtime_note>
|
|
15
|
+
|
|
16
|
+
<objective>
|
|
17
|
+
Universal project entry point. Takes any directory — empty or with existing code — from zero
|
|
18
|
+
to: git-initialized, minimal identity captured, remote wired, and handed off to the next
|
|
19
|
+
workflow.
|
|
20
|
+
|
|
21
|
+
Works for every project regardless of provider. The gated GitLab provisioning path
|
|
22
|
+
(Pareto satellite repos with `.platform-bindings.json`) is added in Plan 02 and slots
|
|
23
|
+
into the structural anchor already present in the workflow.
|
|
24
|
+
|
|
25
|
+
**After this command:** You will be asked whether to continue with `/pp-discovery`
|
|
26
|
+
(client/Pareto projects) or `/pp-new-project` (greenfield planning).
|
|
27
|
+
</objective>
|
|
28
|
+
|
|
29
|
+
<execution_context>
|
|
30
|
+
@~/.claude/pp-core/workflows/init.md
|
|
31
|
+
</execution_context>
|
|
32
|
+
|
|
33
|
+
<process>
|
|
34
|
+
Execute end-to-end.
|
|
35
|
+
Preserve all workflow gates: confirmation, commits, routing.
|
|
36
|
+
</process>
|
|
@@ -5,7 +5,7 @@ argument-hint: ""
|
|
|
5
5
|
allowed-tools:
|
|
6
6
|
- Read
|
|
7
7
|
- Skill
|
|
8
|
-
requires: [new-project, new-milestone, complete-milestone, audit-milestone, milestone-summary, import, ingest-docs, profile-user, review-backlog]
|
|
8
|
+
requires: [init, new-project, new-milestone, complete-milestone, audit-milestone, milestone-summary, import, ingest-docs, profile-user, review-backlog]
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
Route to the appropriate project / milestone skill based on the user's intent.
|
|
@@ -14,6 +14,7 @@ inline as part of `pp-audit-milestone`'s output.
|
|
|
14
14
|
|
|
15
15
|
| User wants | Invoke |
|
|
16
16
|
|---|---|
|
|
17
|
+
| Initialize a project (canonical front door) | pp-init |
|
|
17
18
|
| Start a new project | pp-new-project |
|
|
18
19
|
| Create a new milestone | pp-new-milestone |
|
|
19
20
|
| Complete the current milestone | pp-complete-milestone |
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pp-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "PP Core — a meta-prompting, context engineering, and spec-driven development system for AI coding agents. Loads pp-core's operating context into every Gemini CLI session.",
|
|
5
5
|
"contextFileName": "GEMINI.md"
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pareto4/pp-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "Pareto pp-core — The Pareto Project's AI-assisted engineering framework: meta-prompting, context engineering, and spec-driven development for AI coding agents.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"pp-core": "bin/install.js",
|
|
@@ -25,7 +25,7 @@ const runtime_homes_cjs_1 = require("./runtime-homes.cjs");
|
|
|
25
25
|
* 1. GSD_AGENTS_DIR env var (explicit override, any runtime)
|
|
26
26
|
* 2. For claude runtime: __dirname-relative path (agents/ sibling of gsd-core/)
|
|
27
27
|
* This is correct for both repo runs and real installs (the runtime config dir's
|
|
28
|
-
* agents/ folder) because
|
|
28
|
+
* agents/ folder) because pp-tools.cjs lives inside gsd-core/bin/ in both cases.
|
|
29
29
|
* 3. For non-claude runtimes: getGlobalConfigDir(runtime)/agents
|
|
30
30
|
*
|
|
31
31
|
* @param runtime - the active runtime name; defaults to GSD_RUNTIME env, then 'claude'
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
|
-
* Audit command routers — CLI dispatchers for `
|
|
4
|
-
* `
|
|
3
|
+
* Audit command routers — CLI dispatchers for `pp-tools audit-uat` and
|
|
4
|
+
* `pp-tools audit-open`.
|
|
5
5
|
*
|
|
6
6
|
* ADR-959 (phase 4d-impl-3): audit command family cutover.
|
|
7
7
|
* Extracted from the hardcoded `case 'audit-uat':` and `case 'audit-open':`
|
|
8
|
-
* arms in
|
|
8
|
+
* arms in pp-tools.cjs. Behaviour is preserved byte-for-behaviour from the
|
|
9
9
|
* prior inline cases; the dispatch path now flows:
|
|
10
10
|
* default → dispatchCapabilityCommand →
|
|
11
11
|
* require(audit-command-router.cjs) → routeAuditUat | routeAuditOpen.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Scans all .planning/ artifact categories for items with open/unresolved state.
|
|
6
6
|
* Returns structured JSON for workflow consumption.
|
|
7
|
-
* Called by:
|
|
7
|
+
* Called by: pp-tools.cjs audit-open
|
|
8
8
|
* Used by: /gsd:complete-milestone pre-close gate
|
|
9
9
|
*
|
|
10
10
|
* ADR-457 build-at-publish: the hand-written bin/lib/audit.cjs collapsed
|
|
@@ -43,7 +43,7 @@ function _readRawConfigKey(filePath, dotKey) {
|
|
|
43
43
|
if (!_warnedRawConfigPaths.has(filePath)) {
|
|
44
44
|
_warnedRawConfigPaths.add(filePath);
|
|
45
45
|
try {
|
|
46
|
-
process.stderr.write(`
|
|
46
|
+
process.stderr.write(`pp-tools: warning: failed to parse ${filePath} as JSON — skipping for activation resolution\n`);
|
|
47
47
|
}
|
|
48
48
|
catch { /* stderr might be closed */ }
|
|
49
49
|
}
|
|
@@ -115,7 +115,7 @@ const capabilities = {
|
|
|
115
115
|
"id": "audit",
|
|
116
116
|
"role": "feature",
|
|
117
117
|
"title": "Audit",
|
|
118
|
-
"description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `
|
|
118
|
+
"description": "Open-artifact audit and UAT-gap audit for milestone close gates; exposes `pp-tools audit-uat` (cross-phase UAT outstanding items) and `pp-tools audit-open` (structured open-artifact scan across debug, tasks, threads, todos, seeds, UAT, verification, context-questions).",
|
|
119
119
|
"tier": "full",
|
|
120
120
|
"requires": [],
|
|
121
121
|
"runtimeCompat": {
|
|
@@ -858,7 +858,7 @@ const capabilities = {
|
|
|
858
858
|
"id": "intel",
|
|
859
859
|
"role": "feature",
|
|
860
860
|
"title": "Codebase intelligence",
|
|
861
|
-
"description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `
|
|
861
|
+
"description": "Code-intelligence store for codebase querying, diff, snapshot, and API-surface extraction; exposes `pp-tools intel` subcommands (query, status, update, diff, snapshot, patch-meta, validate, extract-exports, api-surface) and backs `/pp-map-codebase` and `pp-intel-updater`.",
|
|
862
862
|
"tier": "full",
|
|
863
863
|
"requires": [],
|
|
864
864
|
"runtimeCompat": {
|
|
@@ -1307,6 +1307,77 @@ const capabilities = {
|
|
|
1307
1307
|
"extendedHookEvents": []
|
|
1308
1308
|
}
|
|
1309
1309
|
},
|
|
1310
|
+
"pareto-stack": {
|
|
1311
|
+
"id": "pareto-stack",
|
|
1312
|
+
"role": "feature",
|
|
1313
|
+
"title": "Pareto Stack drift gate",
|
|
1314
|
+
"description": "Ship-time platform drift detection for Pareto-managed stacks. Inert unless pareto.enabled is true and .platform-bindings.json is present. Classifies version gaps by severity: any major-version gap classifies as major; breaking is reserved and aliased to major for now. A blocking gate halts on block status; a non-blocking gate carries below-threshold warn advisories. Syncs board state via pareto-sync-board at ship:post.",
|
|
1315
|
+
"tier": "full",
|
|
1316
|
+
"requires": [],
|
|
1317
|
+
"runtimeCompat": {
|
|
1318
|
+
"supported": [
|
|
1319
|
+
"*"
|
|
1320
|
+
],
|
|
1321
|
+
"unsupported": []
|
|
1322
|
+
},
|
|
1323
|
+
"skills": [
|
|
1324
|
+
"pareto-sync-board"
|
|
1325
|
+
],
|
|
1326
|
+
"agents": [],
|
|
1327
|
+
"activationKey": "pareto.enabled",
|
|
1328
|
+
"config": {
|
|
1329
|
+
"pareto.enabled": {
|
|
1330
|
+
"type": "boolean",
|
|
1331
|
+
"default": false,
|
|
1332
|
+
"description": "Enable the Pareto stack capability. When false, all gates and steps are inert."
|
|
1333
|
+
},
|
|
1334
|
+
"pareto.drift_block_on": {
|
|
1335
|
+
"type": "enum",
|
|
1336
|
+
"values": [
|
|
1337
|
+
"breaking",
|
|
1338
|
+
"major",
|
|
1339
|
+
"minor",
|
|
1340
|
+
"none"
|
|
1341
|
+
],
|
|
1342
|
+
"default": "major",
|
|
1343
|
+
"description": "Minimum drift severity that blocks the ship gate. breaking is reserved and aliased to major."
|
|
1344
|
+
}
|
|
1345
|
+
},
|
|
1346
|
+
"hooks": [],
|
|
1347
|
+
"steps": [
|
|
1348
|
+
{
|
|
1349
|
+
"point": "ship:post",
|
|
1350
|
+
"ref": {
|
|
1351
|
+
"skill": "pareto-sync-board"
|
|
1352
|
+
},
|
|
1353
|
+
"produces": [],
|
|
1354
|
+
"consumes": [],
|
|
1355
|
+
"when": "pareto.enabled",
|
|
1356
|
+
"onError": "skip"
|
|
1357
|
+
}
|
|
1358
|
+
],
|
|
1359
|
+
"contributions": [],
|
|
1360
|
+
"gates": [
|
|
1361
|
+
{
|
|
1362
|
+
"point": "ship:pre",
|
|
1363
|
+
"check": {
|
|
1364
|
+
"query": "ship.platform-drift"
|
|
1365
|
+
},
|
|
1366
|
+
"when": "pareto.enabled",
|
|
1367
|
+
"blocking": true,
|
|
1368
|
+
"onError": "skip"
|
|
1369
|
+
},
|
|
1370
|
+
{
|
|
1371
|
+
"point": "ship:pre",
|
|
1372
|
+
"check": {
|
|
1373
|
+
"query": "ship.platform-drift"
|
|
1374
|
+
},
|
|
1375
|
+
"when": "pareto.enabled",
|
|
1376
|
+
"blocking": false,
|
|
1377
|
+
"onError": "skip"
|
|
1378
|
+
}
|
|
1379
|
+
]
|
|
1380
|
+
},
|
|
1310
1381
|
"pattern-mapper": {
|
|
1311
1382
|
"id": "pattern-mapper",
|
|
1312
1383
|
"role": "feature",
|
|
@@ -1361,7 +1432,7 @@ const capabilities = {
|
|
|
1361
1432
|
"id": "profile-pipeline",
|
|
1362
1433
|
"role": "feature",
|
|
1363
1434
|
"title": "Developer profiling pipeline",
|
|
1364
|
-
"description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `
|
|
1435
|
+
"description": "Developer behavioral profiling from Claude Code session history; scans session JSONL files, extracts and samples user messages, and generates profile artifacts (USER-PROFILE.md, dev-preferences.md, CLAUDE.md sections). Exposes eight `pp-tools` commands: scan-sessions, extract-messages, profile-sample (pipeline phase) and write-profile, profile-questionnaire, generate-dev-preferences, generate-claude-profile, generate-claude-md (output phase). Backs the /pp-profile-user skill and pp-user-profiler agent.",
|
|
1365
1436
|
"tier": "full",
|
|
1366
1437
|
"requires": [],
|
|
1367
1438
|
"runtimeCompat": {
|
|
@@ -1561,7 +1632,7 @@ const capabilities = {
|
|
|
1561
1632
|
"into": "planner",
|
|
1562
1633
|
"fragment": {
|
|
1563
1634
|
"path": "fragments/plan-pre.md",
|
|
1564
|
-
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope and injects a mandatory `[BLOCKING]` schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(
|
|
1635
|
+
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope and injects a mandatory `[BLOCKING]` schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(pp_run query roadmap.get-phase \"${PHASE}\" --pick section 2>/dev/null)\n```\n\nScan `PHASE_SECTION`, `CONTEXT.md` (if loaded), and `RESEARCH.md` (if exists) for file paths matching these ORM patterns:\n\n| ORM | File Patterns |\n|-----|--------------|\n| Payload CMS | `src/collections/**/*.ts`, `src/globals/**/*.ts` |\n| Prisma | `prisma/schema.prisma`, `prisma/schema/*.prisma` |\n| Drizzle | `drizzle/schema.ts`, `src/db/schema.ts`, `drizzle/*.ts` |\n| Supabase | `supabase/migrations/*.sql` |\n| TypeORM | `src/entities/**/*.ts`, `src/migrations/**/*.ts` |\n\nAlso check if any existing PLAN.md files for this phase already reference these file patterns in `files_modified`.\n\n**If schema-relevant files detected:**\n\nSet `SCHEMA_PUSH_REQUIRED=true` and `SCHEMA_ORM={detected_orm}`.\n\nDetermine the push command for the detected ORM:\n\n| ORM | Push Command | Non-TTY Workaround |\n|-----|-------------|-------------------|\n| Payload CMS | `npx payload migrate` | `CI=true PAYLOAD_MIGRATING=true npx payload migrate` |\n| Prisma | `npx prisma db push` | `npx prisma db push --accept-data-loss` (if destructive) |\n| Drizzle | `npx drizzle-kit push` | `npx drizzle-kit push` |\n| Supabase | `supabase db push` | Set `SUPABASE_ACCESS_TOKEN` env var |\n| TypeORM | `npx typeorm migration:run` | `npx typeorm migration:run -d src/data-source.ts` |\n\nInject the following into the planner prompt (step 8) as an additional constraint:\n\n```markdown\n<schema_push_requirement>\n**[BLOCKING] Schema Push Required**\n\nThis phase modifies schema-relevant files ({detected_files}). The planner MUST include\na `[BLOCKING]` task that runs the database schema push command AFTER all schema file\nmodifications are complete but BEFORE verification.\n\n- ORM detected: {SCHEMA_ORM}\n- Push command: {push_command}\n- Non-TTY workaround: {env_hint}\n- If push requires interactive prompts that cannot be suppressed, flag the task for\n manual intervention with `autonomous: false`\n\nThis task is mandatory — the phase CANNOT pass verification without it. Build and\ntype checks will pass without the push (types come from config, not the live database),\ncreating a false-positive verification state.\n</schema_push_requirement>\n```\n\nDisplay: `Schema files detected ({SCHEMA_ORM}) — [BLOCKING] push task will be injected into plans`\n\n**If no schema-relevant files detected:** Skip silently.\n"
|
|
1565
1636
|
},
|
|
1566
1637
|
"produces": [],
|
|
1567
1638
|
"consumes": [
|
|
@@ -1915,6 +1986,7 @@ const bySkill = {
|
|
|
1915
1986
|
"mempalace-recall": "mempalace",
|
|
1916
1987
|
"mempalace-capture": "mempalace",
|
|
1917
1988
|
"validate-phase": "nyquist",
|
|
1989
|
+
"pareto-sync-board": "pareto-stack",
|
|
1918
1990
|
"profile-user": "profile-pipeline",
|
|
1919
1991
|
"secure-phase": "security",
|
|
1920
1992
|
"ui-phase": "ui",
|
|
@@ -2083,7 +2155,7 @@ const byLoopPoint = {
|
|
|
2083
2155
|
"into": "planner",
|
|
2084
2156
|
"fragment": {
|
|
2085
2157
|
"path": "fragments/plan-pre.md",
|
|
2086
|
-
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope and injects a mandatory `[BLOCKING]` schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(
|
|
2158
|
+
"inline": "# Schema Push Detection Gate\n\n> Detects schema-relevant files in the phase scope and injects a mandatory `[BLOCKING]` schema push task into the plan. Prevents false-positive verification where build/types pass because TypeScript types come from config, not the live database.\n\nCheck if any files in the phase scope match schema patterns:\n\n```bash\nPHASE_SECTION=$(pp_run query roadmap.get-phase \"${PHASE}\" --pick section 2>/dev/null)\n```\n\nScan `PHASE_SECTION`, `CONTEXT.md` (if loaded), and `RESEARCH.md` (if exists) for file paths matching these ORM patterns:\n\n| ORM | File Patterns |\n|-----|--------------|\n| Payload CMS | `src/collections/**/*.ts`, `src/globals/**/*.ts` |\n| Prisma | `prisma/schema.prisma`, `prisma/schema/*.prisma` |\n| Drizzle | `drizzle/schema.ts`, `src/db/schema.ts`, `drizzle/*.ts` |\n| Supabase | `supabase/migrations/*.sql` |\n| TypeORM | `src/entities/**/*.ts`, `src/migrations/**/*.ts` |\n\nAlso check if any existing PLAN.md files for this phase already reference these file patterns in `files_modified`.\n\n**If schema-relevant files detected:**\n\nSet `SCHEMA_PUSH_REQUIRED=true` and `SCHEMA_ORM={detected_orm}`.\n\nDetermine the push command for the detected ORM:\n\n| ORM | Push Command | Non-TTY Workaround |\n|-----|-------------|-------------------|\n| Payload CMS | `npx payload migrate` | `CI=true PAYLOAD_MIGRATING=true npx payload migrate` |\n| Prisma | `npx prisma db push` | `npx prisma db push --accept-data-loss` (if destructive) |\n| Drizzle | `npx drizzle-kit push` | `npx drizzle-kit push` |\n| Supabase | `supabase db push` | Set `SUPABASE_ACCESS_TOKEN` env var |\n| TypeORM | `npx typeorm migration:run` | `npx typeorm migration:run -d src/data-source.ts` |\n\nInject the following into the planner prompt (step 8) as an additional constraint:\n\n```markdown\n<schema_push_requirement>\n**[BLOCKING] Schema Push Required**\n\nThis phase modifies schema-relevant files ({detected_files}). The planner MUST include\na `[BLOCKING]` task that runs the database schema push command AFTER all schema file\nmodifications are complete but BEFORE verification.\n\n- ORM detected: {SCHEMA_ORM}\n- Push command: {push_command}\n- Non-TTY workaround: {env_hint}\n- If push requires interactive prompts that cannot be suppressed, flag the task for\n manual intervention with `autonomous: false`\n\nThis task is mandatory — the phase CANNOT pass verification without it. Build and\ntype checks will pass without the push (types come from config, not the live database),\ncreating a false-positive verification state.\n</schema_push_requirement>\n```\n\nDisplay: `Schema files detected ({SCHEMA_ORM}) — [BLOCKING] push task will be injected into plans`\n\n**If no schema-relevant files detected:** Skip silently.\n"
|
|
2087
2159
|
},
|
|
2088
2160
|
"produces": [],
|
|
2089
2161
|
"consumes": [
|
|
@@ -2330,6 +2402,26 @@ const byLoopPoint = {
|
|
|
2330
2402
|
"steps": [],
|
|
2331
2403
|
"contributions": [],
|
|
2332
2404
|
"gates": [
|
|
2405
|
+
{
|
|
2406
|
+
"capId": "pareto-stack",
|
|
2407
|
+
"point": "ship:pre",
|
|
2408
|
+
"check": {
|
|
2409
|
+
"query": "ship.platform-drift"
|
|
2410
|
+
},
|
|
2411
|
+
"when": "pareto.enabled",
|
|
2412
|
+
"blocking": true,
|
|
2413
|
+
"onError": "skip"
|
|
2414
|
+
},
|
|
2415
|
+
{
|
|
2416
|
+
"capId": "pareto-stack",
|
|
2417
|
+
"point": "ship:pre",
|
|
2418
|
+
"check": {
|
|
2419
|
+
"query": "ship.platform-drift"
|
|
2420
|
+
},
|
|
2421
|
+
"when": "pareto.enabled",
|
|
2422
|
+
"blocking": false,
|
|
2423
|
+
"onError": "skip"
|
|
2424
|
+
},
|
|
2333
2425
|
{
|
|
2334
2426
|
"capId": "security",
|
|
2335
2427
|
"point": "ship:pre",
|
|
@@ -2361,6 +2453,17 @@ const byLoopPoint = {
|
|
|
2361
2453
|
],
|
|
2362
2454
|
"when": "mempalace.enabled",
|
|
2363
2455
|
"onError": "skip"
|
|
2456
|
+
},
|
|
2457
|
+
{
|
|
2458
|
+
"capId": "pareto-stack",
|
|
2459
|
+
"point": "ship:post",
|
|
2460
|
+
"ref": {
|
|
2461
|
+
"skill": "pareto-sync-board"
|
|
2462
|
+
},
|
|
2463
|
+
"produces": [],
|
|
2464
|
+
"consumes": [],
|
|
2465
|
+
"when": "pareto.enabled",
|
|
2466
|
+
"onError": "skip"
|
|
2364
2467
|
}
|
|
2365
2468
|
],
|
|
2366
2469
|
"contributions": [],
|
|
@@ -2389,6 +2492,8 @@ const configKeys = {
|
|
|
2389
2492
|
"mempalace.diary_journal": "mempalace",
|
|
2390
2493
|
"mempalace.auto_capture_hooks": "mempalace",
|
|
2391
2494
|
"workflow.nyquist_validation": "nyquist",
|
|
2495
|
+
"pareto.enabled": "pareto-stack",
|
|
2496
|
+
"pareto.drift_block_on": "pareto-stack",
|
|
2392
2497
|
"workflow.pattern_mapper": "pattern-mapper",
|
|
2393
2498
|
"profile-pipeline.enabled": "profile-pipeline",
|
|
2394
2499
|
"workflow.research": "research",
|
|
@@ -2537,6 +2642,24 @@ const configSchema = {
|
|
|
2537
2642
|
"default": true,
|
|
2538
2643
|
"description": "Enable Nyquist validation coverage auditing."
|
|
2539
2644
|
},
|
|
2645
|
+
"pareto.enabled": {
|
|
2646
|
+
"owner": "pareto-stack",
|
|
2647
|
+
"type": "boolean",
|
|
2648
|
+
"default": false,
|
|
2649
|
+
"description": "Enable the Pareto stack capability. When false, all gates and steps are inert."
|
|
2650
|
+
},
|
|
2651
|
+
"pareto.drift_block_on": {
|
|
2652
|
+
"owner": "pareto-stack",
|
|
2653
|
+
"type": "enum",
|
|
2654
|
+
"default": "major",
|
|
2655
|
+
"description": "Minimum drift severity that blocks the ship gate. breaking is reserved and aliased to major.",
|
|
2656
|
+
"values": [
|
|
2657
|
+
"breaking",
|
|
2658
|
+
"major",
|
|
2659
|
+
"minor",
|
|
2660
|
+
"none"
|
|
2661
|
+
]
|
|
2662
|
+
},
|
|
2540
2663
|
"workflow.pattern_mapper": {
|
|
2541
2664
|
"owner": "pattern-mapper",
|
|
2542
2665
|
"type": "boolean",
|
|
@@ -3588,6 +3711,9 @@ const capabilityClusters = {
|
|
|
3588
3711
|
"nyquist": [
|
|
3589
3712
|
"validate-phase"
|
|
3590
3713
|
],
|
|
3714
|
+
"pareto-stack": [
|
|
3715
|
+
"pareto-sync-board"
|
|
3716
|
+
],
|
|
3591
3717
|
"profile-pipeline": [
|
|
3592
3718
|
"profile-user"
|
|
3593
3719
|
],
|
|
@@ -3637,6 +3763,12 @@ const profileMembership = {
|
|
|
3637
3763
|
"full"
|
|
3638
3764
|
]
|
|
3639
3765
|
},
|
|
3766
|
+
"pareto-stack": {
|
|
3767
|
+
"tier": "full",
|
|
3768
|
+
"profiles": [
|
|
3769
|
+
"full"
|
|
3770
|
+
]
|
|
3771
|
+
},
|
|
3640
3772
|
"profile-pipeline": {
|
|
3641
3773
|
"tier": "full",
|
|
3642
3774
|
"profiles": [
|
|
@@ -3681,6 +3813,7 @@ const _requiresGraph = {
|
|
|
3681
3813
|
"mempalace": [],
|
|
3682
3814
|
"nyquist": [],
|
|
3683
3815
|
"opencode": [],
|
|
3816
|
+
"pareto-stack": [],
|
|
3684
3817
|
"pattern-mapper": [
|
|
3685
3818
|
"research"
|
|
3686
3819
|
],
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Unified capability-state resolver that composes the three toggle systems
|
|
6
6
|
* (install profile, runtime surface, config activation) into one per-capability
|
|
7
7
|
* view. The loop resolver consumes this state so workflow dispatch and the
|
|
8
|
-
* `
|
|
8
|
+
* `pp-tools capability state` diagnostic share the same enablement answer.
|
|
9
9
|
*
|
|
10
10
|
* Exports (three things, mirroring loop-resolver):
|
|
11
11
|
* resolveCapabilityState({ registry, installedSkills, surfacedSkills, config, cwd })
|
|
@@ -299,7 +299,7 @@ function setCapabilityState(cwd, runtimeConfigDir, desired, opts) {
|
|
|
299
299
|
};
|
|
300
300
|
}
|
|
301
301
|
/**
|
|
302
|
-
* CLI command entry point for `
|
|
302
|
+
* CLI command entry point for `pp-tools capability set`.
|
|
303
303
|
*
|
|
304
304
|
* Builds one DesiredCapability from the provided options, calls setCapabilityState,
|
|
305
305
|
* then prints the result. When raw=true emits JSON; else emits a human summary.
|