@pareto4/pp-core 1.8.1 → 1.9.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 (37) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/NOTICE +23 -0
  3. package/README.md +10 -1
  4. package/bin/install.js +34 -1
  5. package/gemini-extension.json +1 -1
  6. package/package.json +8 -3
  7. package/pareto-skills/pp-project-setup/SKILL.md +32 -440
  8. package/pp-core/bin/lib/capability-state.cjs +13 -7
  9. package/pp-core/bin/lib/config.cjs +7 -22
  10. package/pp-core/bin/lib/init.cjs +4 -4
  11. package/pp-core/bin/lib/installer-migration-report.cjs +1 -1
  12. package/pp-core/bin/lib/loop-resolver.cjs +6 -0
  13. package/pp-core/bin/lib/profile-output.cjs +4 -2
  14. package/pp-core/bin/lib/runtime-name-policy.cjs +0 -1
  15. package/pp-core/bin/lib/surface.cjs +2 -2
  16. package/pp-core/bin/shared/config-schema.manifest.json +4 -0
  17. package/pp-core/references/workstream-flag.md +13 -0
  18. package/pp-core/workflows/discovery-sprint.md +409 -16
  19. package/pp-core/workflows/discovery-to-build/steps/architecture-deliverables.md +250 -0
  20. package/pp-core/workflows/discovery-to-build.md +218 -48
  21. package/pp-core/workflows/discuss-phase/modes/chain.md +5 -0
  22. package/pp-core/workflows/discuss-phase.md +4 -0
  23. package/pp-core/workflows/execute-phase.md +4 -0
  24. package/pp-core/workflows/new-milestone.md +4 -0
  25. package/pp-core/workflows/plan-phase.md +4 -0
  26. package/pp-core/workflows/progress.md +4 -0
  27. package/pp-core/workflows/quick.md +4 -0
  28. package/pp-core/workflows/resume-project.md +4 -0
  29. package/pp-core/workflows/ship.md +4 -0
  30. package/pp-core/workflows/transition.md +4 -0
  31. package/pp-core/workflows/validate-phase.md +4 -0
  32. package/scripts/changeset/lint.cjs +20 -5
  33. package/scripts/lint-docs-required.cjs +10 -3
  34. package/scripts/release-channel.cjs +58 -0
  35. package/scripts/release-tarball-smoke.cjs +4 -0
  36. package/scripts/verify-opengsd-sweep.cjs +12 -0
  37. package/scripts/verify-rename-guard.cjs +333 -0
@@ -1825,9 +1825,9 @@ function buildSkillManifest(cwd, skillsDir = null) {
1825
1825
  // Nested layout: <entry>/skills/<stem>/SKILL.md
1826
1826
  // Used by cline, qwen, hermes, augment, trae, antigravity (#69 nested=true).
1827
1827
  // Descend exactly one level into <entry>/skills/ — no deeper recursion.
1828
- // Scope to gsd-ns-* routers only: never vacuum up an unrelated user skill
1829
- // that happens to have its own `skills/` subdirectory.
1830
- if (!entry.name.startsWith('gsd-ns-'))
1828
+ // Scope to pp-ns-* routers (plus legacy gsd-ns-*) only: never vacuum up an
1829
+ // unrelated user skill that happens to have its own `skills/` subdirectory.
1830
+ if (!entry.name.startsWith('pp-ns-') && !entry.name.startsWith('gsd-ns-'))
1831
1831
  continue;
1832
1832
  const nestedSkillsDir = node_path_1.default.join(rootPath, entry.name, 'skills');
1833
1833
  let nestedEntries = [];
@@ -1859,7 +1859,7 @@ function buildSkillManifest(cwd, skillsDir = null) {
1859
1859
  const rootCmp = a.root.localeCompare(b.root);
1860
1860
  return rootCmp !== 0 ? rootCmp : a.name.localeCompare(b.name);
1861
1861
  });
1862
- const gsdSkillsInstalled = skills.some((skill) => skill.name.startsWith('gsd-'));
1862
+ const gsdSkillsInstalled = skills.some((skill) => skill.name.startsWith('pp-') || skill.name.startsWith('gsd-'));
1863
1863
  return {
1864
1864
  skills,
1865
1865
  roots,
@@ -151,7 +151,7 @@ function classifyPromptUserAction(action) {
151
151
  if (/^pp-core\/sdk\/(dist|src)\//.test(relPath)) {
152
152
  return { category: 'stale-sdk-build-artifact', choice: 'remove' };
153
153
  }
154
- if (/^skills\/gsd-[^/]+\/SKILL\.md$/.test(relPath)) {
154
+ if (/^skills\/(?:pp|gsd)-[^/]+\/SKILL\.md$/.test(relPath)) {
155
155
  return { category: 'user-facing-skill', choice: 'keep' };
156
156
  }
157
157
  // #3610 / #3628: bundled GSD hooks shipped under `hooks/`. The whitelist
@@ -461,6 +461,12 @@ function cmdLoopRenderHooks(cwd, point, raw, options = {}) {
461
461
  if (state.warnings && state.warnings.length > 0) {
462
462
  envelope.warnings = state.warnings;
463
463
  }
464
+ // No rawValue third argument, so --raw emits the JSON envelope rather than
465
+ // plain text. This is deliberate and load-bearing: 23 workflow call sites do
466
+ // `HOOKS_JSON=$(pp_run loop render-hooks <point> --raw)` and read `activeHooks`
467
+ // off the parsed envelope. Callers who want the human-readable text read the
468
+ // envelope's `rendered` field. Same convention as the deliberate
469
+ // `output(result, raw, undefined)` sites in src/check-command-router.cts.
464
470
  coreOutput(envelope, raw);
465
471
  }
466
472
  module.exports = {
@@ -441,8 +441,10 @@ function generateSkillsSection(cwd) {
441
441
  for (const entry of entries) {
442
442
  if (!entry.isDirectory())
443
443
  continue;
444
- // Skip GSD's own installed skills — only surface project-specific skills
445
- if (entry.name.startsWith('gsd-'))
444
+ // Skip pp-core's own installed skills (current 'pp-' naming plus legacy
445
+ // 'gsd-' directories, backward compatibility retained) — only surface
446
+ // project-specific skills.
447
+ if (entry.name.startsWith('pp-') || entry.name.startsWith('gsd-'))
446
448
  continue;
447
449
  const skillMdPath = node_path_1.default.join(absDir, entry.name, 'SKILL.md');
448
450
  if (!node_fs_1.default.existsSync(skillMdPath))
@@ -43,7 +43,6 @@ function normalizeRuntimeToken(value) {
43
43
  function loadAliasManifest() {
44
44
  const manifestCandidates = [
45
45
  node_path_1.default.resolve(__dirname, '..', 'shared', 'runtime-aliases.manifest.json'),
46
- node_path_1.default.resolve(__dirname, '../../../sdk/shared/runtime-aliases.manifest.json'),
47
46
  ];
48
47
  for (const manifestPath of manifestCandidates) {
49
48
  try {
@@ -439,11 +439,11 @@ function _syncGsdDir(stagedDir, destDir, kind, manifest) {
439
439
  }
440
440
  // Prune stale GSD-owned files not in the staged set, preserving user-owned files
441
441
  // (mirrors install's prefix-scoped _removeGsdEntries):
442
- // - agents: only gsd-* are GSD-owned
442
+ // - agents: only `${kindPrefix}`-prefixed (plus legacy gsd-*) are GSD-owned
443
443
  // - flat command dirs: only `${kindPrefix}`-prefixed are GSD-owned
444
444
  // - namespaced command dirs: the whole dir is GSD-owned
445
445
  for (const file of node_fs_1.default.readdirSync(destDir).filter(f => f.endsWith('.md'))) {
446
- if (kindName === 'agents' && !file.startsWith('gsd-'))
446
+ if (kindName === 'agents' && !(kindPrefix && file.startsWith(kindPrefix)) && !file.startsWith('gsd-'))
447
447
  continue;
448
448
  if (kindName === 'commands' && !namespacedByDir && kindPrefix && !file.startsWith(kindPrefix))
449
449
  continue;
@@ -10,6 +10,10 @@
10
10
  "brave_search",
11
11
  "firecrawl",
12
12
  "exa_search",
13
+ "tavily_search",
14
+ "ref_search",
15
+ "perplexity",
16
+ "jina",
13
17
  "workflow.plan_check",
14
18
  "workflow.verifier",
15
19
  "workflow.auto_advance",
@@ -68,6 +68,19 @@ All workflow routing commands include `${GSD_WS}` which:
68
68
  This ensures workstream scope chains automatically through the workflow:
69
69
  `new-milestone → discuss-phase → plan-phase → execute-phase → transition`
70
70
 
71
+ ### Substitution rule (user-facing output and Skill/Task args)
72
+
73
+ Outside executed bash blocks, `${GSD_WS}` / `{GSD_WS}` is a placeholder, not a
74
+ shell variable — nothing expands it automatically. When a workflow emits a
75
+ routing or "Next:" command, or passes args to `Skill()`/`Task()`, Claude must
76
+ substitute the placeholder itself:
77
+
78
+ - Workstream active → replace with `--ws <name>`
79
+ - Flat mode → remove the placeholder entirely (and any doubled whitespace)
80
+
81
+ Never print the literal token `${GSD_WS}` in a user-facing command — a pasted
82
+ command containing it breaks in the shell.
83
+
71
84
  ## Directory Structure
72
85
 
73
86
  ```