@juicesharp/rpiv-pi 1.18.0 → 1.18.2

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.
@@ -44,6 +44,30 @@ describe("SIBLINGS registry", () => {
44
44
  expect(i18nEntry?.matches.test("@juicesharp/rpiv-i18n")).toBe(true);
45
45
  });
46
46
 
47
+ it("pi-subagents SIBLINGS[0] matches BOTH the @tintinweb/pi-subagents fork and the @gotgenes/pi-subagents fork", () => {
48
+ const subagentsEntry = SIBLINGS[0];
49
+ expect(subagentsEntry).toBeDefined();
50
+ // Upstream fork (default install target via /rpiv-setup)
51
+ expect(subagentsEntry?.matches.test("@tintinweb/pi-subagents")).toBe(true);
52
+ // @gotgenes/pi-subagents — API-compatible fork with the same tool surface
53
+ expect(subagentsEntry?.matches.test("@gotgenes/pi-subagents")).toBe(true);
54
+ });
55
+
56
+ it("pi-subagents SIBLINGS[0] regex is case-insensitive across both fork namespaces", () => {
57
+ const subagentsEntry = SIBLINGS[0];
58
+ expect(subagentsEntry?.matches.test("@TINTINWEB/PI-SUBAGENTS")).toBe(true);
59
+ expect(subagentsEntry?.matches.test("@GOTGENES/PI-SUBAGENTS")).toBe(true);
60
+ });
61
+
62
+ it("pi-subagents SIBLINGS[0] regex does NOT match unrelated @-scoped pi-subagents-* variants", () => {
63
+ const subagentsEntry = SIBLINGS[0];
64
+ // Word-boundary guard: must not over-match a hypothetical future sibling
65
+ // such as `@juicesharp/pi-subagents-utils` (a dash right after the
66
+ // `pi-subagents` token is excluded via `(?![-\w])`).
67
+ expect(subagentsEntry?.matches.test("@tintinweb/pi-subagents-utils")).toBe(false);
68
+ expect(subagentsEntry?.matches.test("@gotgenes/pi-subagents-utils")).toBe(false);
69
+ });
70
+
47
71
  it("every entry has non-empty pkg + provides", () => {
48
72
  for (const s of SIBLINGS) {
49
73
  expect(s.pkg.length).toBeGreaterThan(0);
@@ -22,8 +22,10 @@ export interface SiblingPlugin {
22
22
  export const SIBLINGS: readonly SiblingPlugin[] = [
23
23
  {
24
24
  pkg: "npm:@tintinweb/pi-subagents",
25
- matches: /@tintinweb\/pi-subagents/i,
26
- provides: "Agent / get_subagent_result / steer_subagent tools",
25
+ // Detect both the upstream tintinweb fork and the API-compatible
26
+ // @gotgenes fork; pkg stays upstream so /rpiv-setup installs that.
27
+ matches: /@(tintinweb|gotgenes)\/pi-subagents(?![-\w])/i,
28
+ provides: "Agent / get_subagent_result / steer_subagent tools (tintinweb or gotgenes fork)",
27
29
  },
28
30
  {
29
31
  pkg: "npm:@juicesharp/rpiv-ask-user-question",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juicesharp/rpiv-pi",
3
- "version": "1.18.0",
3
+ "version": "1.18.2",
4
4
  "description": "A skill-based development workflow for Pi Agent. Five skills (research, design, plan, implement, validate) and the shared subagents that compose its ship-loop.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -142,8 +142,7 @@ Use the grounded-questions-one-at-a-time pattern. Use a **❓ Question:** prefix
142
142
 
143
143
  > Use the `ask_user_question` tool with the following question: "Found 2 mapping approaches — which should new code follow?". Header: "Pattern". Options: "Manual mapping (Recommended)" (Used in OrderService (src/services/OrderService.ts:45) — 8 occurrences); "AutoMapper" (Used in UserService (src/services/UserService.ts:12) — 2 occurrences).
144
144
 
145
- - **Free-text with Question: prefix** when the question is open-ended and options can't be predicted (discovery, "what am I missing?", corrections). Example:
146
- "❓ Question: Research's `## Integration Points` shows no background job registration for this area. Is that expected, or is there async processing not surfaced in the inbound/outbound sweep?"
145
+ - **Open-ended** (discovery, "what am I missing?", corrections) still `ask_user_question`; offer your best 1-2 guesses and let "Other" carry the unpredictable answer.
147
146
 
148
147
  **Batching**: When you have 2-4 independent questions (answers don't depend on each other), you MAY batch them in a single `ask_user_question` call. Keep dependent questions sequential.
149
148
 
@@ -143,8 +143,7 @@ Use the grounded-questions-one-at-a-time pattern. Use a **❓ Question:** prefix
143
143
 
144
144
  > Use the `ask_user_question` tool with the following question: "Found 2 mapping approaches — which should new code follow?". Header: "Pattern". Options: "Manual mapping (Recommended)" (Used in OrderService (src/services/OrderService.ts:45) — 8 occurrences); "AutoMapper" (Used in UserService (src/services/UserService.ts:12) — 2 occurrences).
145
145
 
146
- - **Free-text with Question: prefix** when the question is open-ended and options can't be predicted (discovery, "what am I missing?", corrections). Example:
147
- "❓ Question: Integration scanner found no background job registration for this area. Is that expected, or is there async processing I'm not seeing?"
146
+ - **Open-ended** (discovery, "what am I missing?", corrections) still `ask_user_question`; offer your best 1-2 guesses and let "Other" carry the unpredictable answer.
148
147
 
149
148
  **Batching**: When you have 2-4 independent questions (answers don't depend on each other), you MAY batch them in a single `ask_user_question` call. Keep dependent questions sequential.
150
149
 
@@ -147,7 +147,7 @@ Findings go into Precedents & Lessons. Otherwise skip and note "git history unav
147
147
  - **Pattern conflict**: "Found 2 implementations of {X} — which is canonical?" with options citing `file:line` + occurrence count
148
148
  - **Scope boundary**: "Question {N} references files {A,B,C} but analysis shows {D} is the real integration point. Extend scope?" with yes/no + "describe what I missed"
149
149
  - **Priority override**: "Questions Q1 and Q2 have competing implications for {area}. Which is load-bearing?" with options
150
- - **Integration ambiguity**: "Found no connection between {X} and {Y}. Is there an indirect path?" (free-text can't predict the answer)
150
+ - **Integration ambiguity**: "Found no connection between {X} and {Y}. Is there an indirect path?" — `ask_user_question`, "Other" carries the answer
151
151
 
152
152
  **Choosing question format:**
153
153
 
@@ -155,8 +155,7 @@ Findings go into Precedents & Lessons. Otherwise skip and note "git history unav
155
155
 
156
156
  > Use the `ask_user_question` tool with the following question: "Found 2 patterns for retry logic — which is canonical?". Header: "Pattern". Options: "Event-sourced retry (Recommended)" (`src/events/orders.ts:45-67` — 3 hooks, matches precedent commit `abc123`); "Direct retry loop" (`src/services/OrderService.ts:112` — single use, no event traceability).
157
157
 
158
- - **Free-text with Question: prefix** when the question is open-ended and options can't be predicted (discovery, "what am I missing?", corrections). Example:
159
- "❓ Question: `src/events/orders.ts:45-67` has 3 event hooks but no error recovery path. Is there a retry mechanism elsewhere I'm not seeing?"
158
+ - **Open-ended** (discovery, "what am I missing?", corrections) still `ask_user_question`; offer your best 1-2 guesses and let "Other" carry the unpredictable answer.
160
159
 
161
160
  **Anti-pattern** — do NOT dump a verbose paragraph mixing analysis with a trailing question:
162
161
 
@@ -183,7 +182,7 @@ Findings go into Precedents & Lessons. Otherwise skip and note "git history unav
183
182
  Inconsistencies: {count} found ({short names})
184
183
  ```
185
184
 
186
- Wait for the developer's response before proceeding.
185
+ Gate the write with `ask_user_question`. Question: "Scan complete — write the doc, or adjust first?". Header: "Research". Options: "Write the doc (Recommended)"; "Add an area"; "Correct a finding".
187
186
 
188
187
  4. **Incorporate developer input:**
189
188