@haoyiyin/workflow 0.2.7 → 0.2.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"pi-extension.d.ts","sourceRoot":"","sources":["../../src/pi-extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,GAAG,QAwD/B"}
1
+ {"version":3,"file":"pi-extension.d.ts","sourceRoot":"","sources":["../../src/pi-extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,GAAG,QAwF/B"}
@@ -16,35 +16,72 @@ export default function (pi) {
16
16
  }
17
17
  // Classify intent
18
18
  const intent = classifyIntent(event.text);
19
- // If intent matches a skill, dispatch
20
- if (intent.skill) {
21
- ctx.ui.notify(`[yi-workflow] Dispatching to /skill:${intent.skill} (${intent.reason})`, "info");
22
- // Transform input to skill command
23
- return {
24
- action: "transform",
25
- text: `/skill:${intent.skill} ${event.text}`,
26
- };
19
+ const targetSkill = intent.skill || "quick-task";
20
+ // Determine reason for dispatch
21
+ let reason = intent.reason;
22
+ if (!intent.skill) {
23
+ const needsExternal = /^(what|how|why|when|where|who|search|find|look|weather|time|price|stock|translate)/i.test(event.text);
24
+ if (needsExternal) {
25
+ reason = "External query - needs subagent";
26
+ }
27
+ else {
28
+ reason = "Default dispatch - no direct execution allowed";
29
+ }
27
30
  }
28
- // NO DIRECT EXECUTION: Block all non-skill work
29
- // If no yi-workflow skill matches, check if it's a question that needs external data
30
- const needsExternal = /^(what|how|why|when|where|who|search|find|look|weather|time|price|stock|translate)/i.test(event.text);
31
- if (needsExternal) {
32
- ctx.ui.notify(`[yi-workflow] External query detected - dispatching to quick-task for handling`, "info");
33
- return {
34
- action: "transform",
35
- text: `/skill:quick-task ${event.text}`,
36
- };
37
- }
38
- // Block direct execution with explanation
39
- ctx.ui.notify(`[yi-workflow] ⚠️ THIN DISPATCHER: I cannot execute directly. Please use /skill:name or rephrase your request.`, "warning");
31
+ ctx.ui.notify(`[yi-workflow] Dispatching to /skill:${targetSkill} (${reason})`, "info");
32
+ // Transform to skill command - main agent will receive "/skill:X ..."
33
+ // The before_agent_start hook injects constraints forcing main agent to call skill
40
34
  return {
41
35
  action: "transform",
42
- text: `/skill:quick-task ${event.text}`,
36
+ text: `/skill:${targetSkill} ${event.text}`,
43
37
  };
44
38
  });
45
39
  // Log when session starts
46
40
  pi.on("session_start", async (event, ctx) => {
47
41
  ctx.ui.notify("yi-workflow extension loaded", "info");
48
42
  });
43
+ // CRITICAL: Inject THIN DISPATCHER rules into system prompt
44
+ // This ensures main agent NEVER executes work directly
45
+ pi.on("before_agent_start", async (event, ctx) => {
46
+ const systemPrompt = event.systemPrompt || "";
47
+ const userInput = event.userInput || "";
48
+ // Detect if this input was transformed to a skill command
49
+ const isSkillCommand = userInput.startsWith("/skill:");
50
+ // Prepend THIN DISPATCHER constraints
51
+ const thinDispatcherRules = `
52
+ ╔══════════════════════════════════════════════════════════════════╗
53
+ ║ THIN DISPATCHER PROTOCOL [ABSOLUTE] ║
54
+ ╚══════════════════════════════════════════════════════════════════╝
55
+
56
+ YOU ARE A THIN DISPATCHER. YOUR ONLY JOB IS TO DISPATCH TO SKILLS.
57
+
58
+ ⚠️ ABSOLUTE RULE #1: If user input starts with "/skill:", you MUST call that skill.
59
+ ⚠️ ABSOLUTE RULE #2: You NEVER execute work yourself - only dispatch.
60
+ ⚠️ ABSOLUTE RULE #3: Tools (Read, Edit, Bash, etc.) are FORBIDDEN unless in subagent.
61
+
62
+ FORBIDDEN ACTIONS (VIOLATION = PROTOCOL BREACH):
63
+ - Reading files (use /skill:review-diff)
64
+ - Writing/editing files (use /skill:execute-plan)
65
+ - Running commands (use /skill:quick-task)
66
+ - Writing code directly (use /skill:tdd or /skill:execute-plan)
67
+ - Using any tool directly (use /skill:quick-task to dispatch subagent)
68
+
69
+ CURRENT INPUT: "${userInput}"
70
+ IS_SKILL_COMMAND: ${isSkillCommand ? "YES - MUST CALL SKILL" : "NO"}
71
+
72
+ ${isSkillCommand ? `
73
+ ╔══════════════════════════════════════════════════════════════════╗
74
+ ║ ⚠️ MANDATORY: CALL THE SKILL BELOW ⚠️ ║
75
+ ╚══════════════════════════════════════════════════════════════════╝
76
+ The input starts with "/skill:". You MUST call that skill.
77
+ DO NOT process this input as a regular conversation.
78
+ DO NOT use tools directly.
79
+ CALL THE SKILL: "${userInput.split(" ")[0]}"
80
+ ` : ""}
81
+ `;
82
+ // Prepend to system prompt
83
+ event.systemPrompt = thinDispatcherRules + "\n\n" + systemPrompt;
84
+ return { action: "continue" };
85
+ });
49
86
  }
50
87
  //# sourceMappingURL=pi-extension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi-extension.js","sourceRoot":"","sources":["../../src/pi-extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,6CAA6C;AAC7C,gDAAgD;AAChD,MAAM,CAAC,OAAO,WAAW,EAAO;IAC9B,yCAAyC;IACzC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QAC5C,4CAA4C;QAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAChC,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,sCAAsC;QACtC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,uCAAuC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,EACxE,MAAM,CACP,CAAC;YAEF,mCAAmC;YACnC,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;aAC7C,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,qFAAqF;QACrF,MAAM,aAAa,GAAG,qFAAqF,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7H,IAAI,aAAa,EAAE,CAAC;YAClB,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,gFAAgF,EAChF,MAAM,CACP,CAAC;YACF,OAAO;gBACL,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,qBAAqB,KAAK,CAAC,IAAI,EAAE;aACxC,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,+GAA+G,EAC/G,SAAS,CACV,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,qBAAqB,KAAK,CAAC,IAAI,EAAE;SACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QACpD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"pi-extension.js","sourceRoot":"","sources":["../../src/pi-extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,6CAA6C;AAC7C,gDAAgD;AAChD,MAAM,CAAC,OAAO,WAAW,EAAO;IAC9B,yCAAyC;IACzC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QAC5C,4CAA4C;QAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAChC,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,IAAI,YAAY,CAAC;QAEjD,gCAAgC;QAChC,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,aAAa,GAAG,qFAAqF,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7H,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,GAAG,iCAAiC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,gDAAgD,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,uCAAuC,WAAW,KAAK,MAAM,GAAG,EAChE,MAAM,CACP,CAAC;QAEF,sEAAsE;QACtE,mFAAmF;QACnF,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,UAAU,WAAW,IAAI,KAAK,CAAC,IAAI,EAAE;SAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QACpD,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,uDAAuD;IACvD,EAAE,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAU,EAAE,GAAQ,EAAE,EAAE;QACzD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;QAExC,0DAA0D;QAC1D,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEvD,sCAAsC;QACtC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;kBAkBd,SAAS;oBACP,cAAc,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI;;EAEjE,cAAc,CAAC,CAAC,CAAC;;;;;;;mBAOA,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC,CAAC,CAAC,EAAE;CACL,CAAC;QAEE,2BAA2B;QAC3B,KAAK,CAAC,YAAY,GAAG,mBAAmB,GAAG,MAAM,GAAG,YAAY,CAAC;QAEjE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haoyiyin/workflow",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "type": "module",
5
5
  "description": "Production workflow skills for planning, executing, reviewing, and finishing coding-agent work",
6
6
  "main": "./dist/index.js",
@@ -19,45 +19,29 @@ export default function (pi: any) {
19
19
 
20
20
  // Classify intent
21
21
  const intent = classifyIntent(event.text);
22
+ const targetSkill = intent.skill || "quick-task";
22
23
 
23
- // If intent matches a skill, dispatch
24
- if (intent.skill) {
25
- ctx.ui.notify(
26
- `[yi-workflow] Dispatching to /skill:${intent.skill} (${intent.reason})`,
27
- "info"
28
- );
29
-
30
- // Transform input to skill command
31
- return {
32
- action: "transform",
33
- text: `/skill:${intent.skill} ${event.text}`,
34
- };
24
+ // Determine reason for dispatch
25
+ let reason = intent.reason;
26
+ if (!intent.skill) {
27
+ const needsExternal = /^(what|how|why|when|where|who|search|find|look|weather|time|price|stock|translate)/i.test(event.text);
28
+ if (needsExternal) {
29
+ reason = "External query - needs subagent";
30
+ } else {
31
+ reason = "Default dispatch - no direct execution allowed";
32
+ }
35
33
  }
36
34
 
37
- // NO DIRECT EXECUTION: Block all non-skill work
38
- // If no yi-workflow skill matches, check if it's a question that needs external data
39
- const needsExternal = /^(what|how|why|when|where|who|search|find|look|weather|time|price|stock|translate)/i.test(event.text);
40
-
41
- if (needsExternal) {
42
- ctx.ui.notify(
43
- `[yi-workflow] External query detected - dispatching to quick-task for handling`,
44
- "info"
45
- );
46
- return {
47
- action: "transform",
48
- text: `/skill:quick-task ${event.text}`,
49
- };
50
- }
51
-
52
- // Block direct execution with explanation
53
35
  ctx.ui.notify(
54
- `[yi-workflow] ⚠️ THIN DISPATCHER: I cannot execute directly. Please use /skill:name or rephrase your request.`,
55
- "warning"
36
+ `[yi-workflow] Dispatching to /skill:${targetSkill} (${reason})`,
37
+ "info"
56
38
  );
57
39
 
40
+ // Transform to skill command - main agent will receive "/skill:X ..."
41
+ // The before_agent_start hook injects constraints forcing main agent to call skill
58
42
  return {
59
43
  action: "transform",
60
- text: `/skill:quick-task ${event.text}`,
44
+ text: `/skill:${targetSkill} ${event.text}`,
61
45
  };
62
46
  });
63
47
 
@@ -65,4 +49,52 @@ export default function (pi: any) {
65
49
  pi.on("session_start", async (event: any, ctx: any) => {
66
50
  ctx.ui.notify("yi-workflow extension loaded", "info");
67
51
  });
52
+
53
+ // CRITICAL: Inject THIN DISPATCHER rules into system prompt
54
+ // This ensures main agent NEVER executes work directly
55
+ pi.on("before_agent_start", async (event: any, ctx: any) => {
56
+ const systemPrompt = event.systemPrompt || "";
57
+ const userInput = event.userInput || "";
58
+
59
+ // Detect if this input was transformed to a skill command
60
+ const isSkillCommand = userInput.startsWith("/skill:");
61
+
62
+ // Prepend THIN DISPATCHER constraints
63
+ const thinDispatcherRules = `
64
+ ╔══════════════════════════════════════════════════════════════════╗
65
+ ║ THIN DISPATCHER PROTOCOL [ABSOLUTE] ║
66
+ ╚══════════════════════════════════════════════════════════════════╝
67
+
68
+ YOU ARE A THIN DISPATCHER. YOUR ONLY JOB IS TO DISPATCH TO SKILLS.
69
+
70
+ ⚠️ ABSOLUTE RULE #1: If user input starts with "/skill:", you MUST call that skill.
71
+ ⚠️ ABSOLUTE RULE #2: You NEVER execute work yourself - only dispatch.
72
+ ⚠️ ABSOLUTE RULE #3: Tools (Read, Edit, Bash, etc.) are FORBIDDEN unless in subagent.
73
+
74
+ FORBIDDEN ACTIONS (VIOLATION = PROTOCOL BREACH):
75
+ - Reading files (use /skill:review-diff)
76
+ - Writing/editing files (use /skill:execute-plan)
77
+ - Running commands (use /skill:quick-task)
78
+ - Writing code directly (use /skill:tdd or /skill:execute-plan)
79
+ - Using any tool directly (use /skill:quick-task to dispatch subagent)
80
+
81
+ CURRENT INPUT: "${userInput}"
82
+ IS_SKILL_COMMAND: ${isSkillCommand ? "YES - MUST CALL SKILL" : "NO"}
83
+
84
+ ${isSkillCommand ? `
85
+ ╔══════════════════════════════════════════════════════════════════╗
86
+ ║ ⚠️ MANDATORY: CALL THE SKILL BELOW ⚠️ ║
87
+ ╚══════════════════════════════════════════════════════════════════╝
88
+ The input starts with "/skill:". You MUST call that skill.
89
+ DO NOT process this input as a regular conversation.
90
+ DO NOT use tools directly.
91
+ CALL THE SKILL: "${userInput.split(" ")[0]}"
92
+ ` : ""}
93
+ `;
94
+
95
+ // Prepend to system prompt
96
+ event.systemPrompt = thinDispatcherRules + "\n\n" + systemPrompt;
97
+
98
+ return { action: "continue" };
99
+ });
68
100
  }