@henryqw/pi-prompt-creator 2.0.11 → 3.0.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.
package/README.md CHANGED
@@ -6,6 +6,8 @@ Automatic analysis only prepares a candidate; the extension never saves it witho
6
6
 
7
7
  ## Install
8
8
 
9
+ Requires Pi 1.0.0 or later. Older Pi releases are no longer supported.
10
+
9
11
  ```bash
10
12
  pi install npm:@henryqw/pi-task-models
11
13
  pi install npm:@henryqw/pi-prompt-creator
@@ -37,7 +39,9 @@ The prompt is created at `~/.pi/agent/prompts/<name>.md`, then Pi reloads its re
37
39
 
38
40
  ## Flow
39
41
 
40
- ![Prompt creator lifecycle from conversation to saved prompt](./docs/prompt-lifecycle.svg)
42
+ ![Automatic prompt analysis waits for user display before Main review and approved saving; manual candidates display immediately](./docs/prompt-lifecycle.svg)
43
+
44
+ The diagram shows the automatic path. Manual analysis displays its candidate immediately, without the WAIT stage. Both paths require Main review and your approval before saving.
41
45
 
42
46
  ### Automatic analysis
43
47
 
@@ -1,152 +1,152 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <svg width="960" height="600" viewBox="0 0 960 600" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="prompt-lifecycle-title prompt-lifecycle-desc">
3
- <title id="prompt-lifecycle-title">From conversation to saved prompt</title>
4
- <desc id="prompt-lifecycle-desc">Data flow showing current conversation signals becoming a passive prompt candidate, then a reviewed Markdown prompt saved only after explicit approval.</desc>
2
+ <svg width="1280" height="720" viewBox="0 0 1280 720" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="prompt-lifecycle-title prompt-lifecycle-desc" id="prompt-lifecycle-root">
3
+ <title id="prompt-lifecycle-title">Automatic analysis path to a saved prompt</title>
4
+ <desc id="prompt-lifecycle-desc">Automatic candidates wait for /promptor, while manual candidates display immediately; both require a valid Main review and explicit user approval before saving a new prompt file.</desc>
5
5
  <defs>
6
- <style>@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&amp;family=Geist:wght@400;500;600&amp;family=Geist+Mono:wght@400;500;600&amp;display=swap');</style>
7
- <marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto">
6
+ <style>@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&amp;family=Geist:wght@400;500;600&amp;family=Geist+Mono:wght@400;500;600&amp;family=Noto+Serif:ital@0;1&amp;family=Noto+Sans+KR:wght@400;500;600&amp;family=Noto+Serif+KR:wght@400&amp;family=Noto+Sans+TC:wght@400;500;600&amp;family=Noto+Serif+TC:wght@400&amp;display=swap');
7
+ #prompt-lifecycle-root { --paper: #f0eee9;
8
+ --ink: #101828;
9
+ --muted: #4c5665;
10
+ --sans: 'Geist', system-ui, sans-serif;
11
+ --serif: 'Instrument Serif', serif;
12
+ --mono: 'Geist Mono', ui-monospace, monospace; }
13
+ #prompt-lifecycle-root { color: var(--ink); font-family: var(--sans); }
14
+ #prompt-lifecycle-root .diagram-container { width: 100%; overflow-x: auto; }
15
+ #prompt-lifecycle-root .diagram-container { overflow-x: visible; }</style>
16
+ <marker id="prompt-lifecycle-arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto">
8
17
  <polygon points="0 0, 8 4, 0 8" fill="#4c5665"/>
9
18
  </marker>
10
- <marker id="arrow-accent" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto">
11
- <polygon points="0 0, 8 4, 0 8" fill="#1d4ed8"/>
12
- </marker>
13
- <marker id="arrow-link" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto">
19
+ <marker id="prompt-lifecycle-arrow-accent" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto">
14
20
  <polygon points="0 0, 8 4, 0 8" fill="#1d4ed8"/>
15
21
  </marker>
16
22
  </defs>
17
23
 
18
- <rect width="960" height="600" fill="#f0eee9"/>
24
+ <rect width="1280" height="720" fill="#f0eee9"/>
25
+ <text x="40" y="72" fill="#101828" font-family="'Instrument Serif', serif" font-size="28">Automatic analysis path</text>
19
26
 
20
- <!-- Step headers -->
21
- <g font-family="'Geist Mono', ui-monospace, monospace" text-anchor="middle">
22
- <g fill="#101828">
23
- <rect x="204" y="48" width="32" height="16" rx="8" fill="rgba(16,24,40,0.10)"/>
24
- <text x="220" y="60" font-size="8">01</text>
25
- <text x="220" y="92" fill="#4c5665" font-size="8" font-weight="500" letter-spacing="1.2">INPUT</text>
26
- </g>
27
- <g fill="#101828">
28
- <rect x="324" y="48" width="32" height="16" rx="8" fill="rgba(16,24,40,0.10)"/>
29
- <text x="340" y="60" font-size="8">02</text>
30
- <text x="340" y="92" fill="#4c5665" font-size="8" font-weight="500" letter-spacing="1.2">BOUND</text>
27
+ <!-- Six stages use wider nodes and larger role lanes, not scaled type. -->
28
+ <g font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="500" text-anchor="middle">
29
+ <g fill="#4c5665">
30
+ <rect x="228" y="96" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.10"/>
31
+ <text x="244" y="108">01</text>
32
+ <text x="244" y="128" letter-spacing="1.2">INPUT</text>
33
+ <rect x="404" y="96" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.10"/>
34
+ <text x="420" y="108">02</text>
35
+ <text x="420" y="128" letter-spacing="1.2">BOUND</text>
36
+ <rect x="756" y="96" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.10"/>
37
+ <text x="772" y="108">04</text>
38
+ <text x="772" y="128" letter-spacing="1.2">WAIT</text>
39
+ <rect x="932" y="96" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.10"/>
40
+ <text x="948" y="108">05</text>
41
+ <text x="948" y="128" letter-spacing="1.2">REFINE</text>
42
+ <rect x="1108" y="96" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.10"/>
43
+ <text x="1124" y="108">06</text>
44
+ <text x="1124" y="128" letter-spacing="1.2">SAVE</text>
31
45
  </g>
32
46
  <g fill="#1d4ed8">
33
- <rect x="444" y="48" width="32" height="16" rx="8" fill="rgba(29,78,216,0.14)"/>
34
- <text x="460" y="60" font-size="8">03</text>
35
- <text x="460" y="92" font-size="8" font-weight="500" letter-spacing="1.2">DRAFT</text>
36
- </g>
37
- <g fill="#101828">
38
- <rect x="564" y="48" width="32" height="16" rx="8" fill="rgba(16,24,40,0.10)"/>
39
- <text x="580" y="60" font-size="8">04</text>
40
- <text x="580" y="92" fill="#4c5665" font-size="8" font-weight="500" letter-spacing="1.2">WAIT</text>
41
- </g>
42
- <g fill="#101828">
43
- <rect x="684" y="48" width="32" height="16" rx="8" fill="rgba(16,24,40,0.10)"/>
44
- <text x="700" y="60" font-size="8">05</text>
45
- <text x="700" y="92" fill="#4c5665" font-size="8" font-weight="500" letter-spacing="1.2">REFINE</text>
46
- </g>
47
- <g fill="#101828">
48
- <rect x="804" y="48" width="32" height="16" rx="8" fill="rgba(16,24,40,0.10)"/>
49
- <text x="820" y="60" font-size="8">06</text>
50
- <text x="820" y="92" fill="#4c5665" font-size="8" font-weight="500" letter-spacing="1.2">SAVE</text>
47
+ <rect x="580" y="96" width="32" height="16" rx="2" fill="#1d4ed8" fill-opacity="0.14"/>
48
+ <text x="596" y="108">03</text>
49
+ <text x="596" y="128" letter-spacing="1.2">DRAFT</text>
51
50
  </g>
52
51
  </g>
53
52
 
54
- <!-- Lane structure -->
55
- <rect x="40" y="112" width="880" height="112" fill="rgba(16,24,40,0.018)"/>
56
- <rect x="40" y="336" width="880" height="112" fill="rgba(16,24,40,0.018)"/>
57
- <g fill="none" stroke="rgba(16,24,40,0.14)" stroke-width="0.8">
58
- <line x1="40" y1="112" x2="920" y2="112"/>
59
- <line x1="40" y1="224" x2="920" y2="224"/>
60
- <line x1="40" y1="336" x2="920" y2="336"/>
61
- <line x1="40" y1="448" x2="920" y2="448"/>
62
- <line x1="148" y1="112" x2="148" y2="448"/>
53
+ <!-- Role lanes -->
54
+ <rect x="40" y="140" width="1200" height="144" fill="#101828" fill-opacity="0.018"/>
55
+ <rect x="40" y="428" width="1200" height="144" fill="#101828" fill-opacity="0.018"/>
56
+ <g fill="none" stroke="#101828" stroke-opacity="0.14" stroke-width="0.8">
57
+ <line x1="40" y1="140" x2="1240" y2="140"/>
58
+ <line x1="40" y1="284" x2="1240" y2="284"/>
59
+ <line x1="40" y1="428" x2="1240" y2="428"/>
60
+ <line x1="40" y1="572" x2="1240" y2="572"/>
61
+ <line x1="148" y1="140" x2="148" y2="572"/>
63
62
  </g>
64
63
  <g fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="500" text-anchor="middle" letter-spacing="1.2">
65
- <text x="92" y="172">YOU</text>
66
- <text x="92" y="284">EXTENSION</text>
67
- <text x="92" y="388">ISOLATED</text>
68
- <text x="92" y="400">CHILD</text>
64
+ <text x="92" y="216">YOU</text>
65
+ <text x="92" y="360">EXTENSION</text>
66
+ <text x="92" y="496">ISOLATED</text>
67
+ <text x="92" y="508">CHILD</text>
69
68
  </g>
70
69
 
71
- <!-- Connectors are drawn before nodes -->
72
- <g fill="none" stroke="#4c5665" stroke-width="1" marker-end="url(#arrow)">
73
- <path d="M276 168 H332 Q340 168 340 176 V240"/>
74
- <path d="M516 392 H572 Q580 392 580 384 V320"/>
75
- <path d="M636 280 H692 Q700 280 700 272 V208"/>
76
- <path d="M756 168 H812 Q820 168 820 176 V240"/>
70
+ <!-- Connectors and label masks precede all nodes. -->
71
+ <g fill="none" stroke="#4c5665" stroke-width="1" marker-end="url(#prompt-lifecycle-arrow)">
72
+ <path d="M324 212 H412 Q420 212 420 220 V308"/>
73
+ <path d="M676 500 H764 Q772 500 772 492 V404"/>
74
+ <path d="M852 356 H940 Q948 356 948 348 V260" stroke-dasharray="5,4"/>
75
+ <path d="M1028 212 H1116 Q1124 212 1124 220 V308"/>
77
76
  </g>
78
- <path d="M396 280 H452 Q460 280 460 288 V352" fill="none" stroke="#1d4ed8" stroke-width="1.2" marker-end="url(#arrow-accent)"/>
79
- <rect x="472" y="308" width="64" height="16" rx="4" fill="#f0eee9"/>
80
- <text x="504" y="320" fill="#1d4ed8" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle" letter-spacing="0.8">CONTEXT</text>
77
+ <path d="M500 356 H588 Q596 356 596 364 V452" fill="none" stroke="#1d4ed8" stroke-width="1.2" marker-end="url(#prompt-lifecycle-arrow-accent)"/>
78
+ <rect x="604" y="400" width="72" height="16" rx="2" fill="#f0eee9"/>
79
+ <text x="640" y="412" fill="#1d4ed8" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle" letter-spacing="0.8">CONTEXT</text>
81
80
 
82
- <!-- Nodes -->
81
+ <!-- Nodes: name text remains 12px; technical text remains 8px. -->
83
82
  <g>
84
- <rect x="164" y="128" width="112" height="80" rx="8" fill="#f0eee9"/>
85
- <rect x="164" y="128" width="112" height="80" rx="8" fill="rgba(76,86,101,0.10)" stroke="#6a7282"/>
86
- <rect x="172" y="136" width="32" height="16" rx="4" fill="rgba(76,86,101,0.14)"/>
87
- <text x="188" y="148" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">YOU</text>
88
- <text x="220" y="168" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Conversation</text>
89
- <text x="220" y="184" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">requests · corrections</text>
90
- <text x="220" y="196" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">active branch only</text>
83
+ <rect x="164" y="164" width="160" height="96" rx="8" fill="#f0eee9"/>
84
+ <rect x="164" y="164" width="160" height="96" rx="8" fill="#4c5665" fill-opacity="0.10" stroke="#6a7282"/>
85
+ <rect x="176" y="176" width="32" height="16" rx="2" fill="#4c5665" fill-opacity="0.14"/>
86
+ <text x="192" y="188" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">YOU</text>
87
+ <text x="244" y="212" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Conversation</text>
88
+ <text x="244" y="232" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">requests · corrections</text>
89
+ <text x="244" y="248" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">active branch only</text>
91
90
  </g>
92
-
93
91
  <g>
94
- <rect x="284" y="240" width="112" height="80" rx="8" fill="#f0eee9"/>
95
- <rect x="284" y="240" width="112" height="80" rx="8" fill="#ffffff" stroke="#101828"/>
96
- <rect x="292" y="248" width="32" height="16" rx="4" fill="rgba(16,24,40,0.08)"/>
97
- <text x="308" y="260" fill="#101828" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">EXT</text>
98
- <text x="340" y="280" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Bounded context</text>
99
- <text x="340" y="296" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">summary + messages</text>
100
- <text x="340" y="308" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">≤ 30,000 chars</text>
92
+ <rect x="340" y="308" width="160" height="96" rx="8" fill="#ffffff" stroke="#101828"/>
93
+ <rect x="352" y="320" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.08"/>
94
+ <text x="368" y="332" fill="#101828" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">EXT</text>
95
+ <text x="420" y="356" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Bounded context</text>
96
+ <text x="420" y="376" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">summary + messages</text>
97
+ <text x="420" y="392" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">≤ 30,000 chars</text>
101
98
  </g>
102
-
103
99
  <g>
104
- <rect x="404" y="352" width="112" height="80" rx="8" fill="#f0eee9"/>
105
- <rect x="404" y="352" width="112" height="80" rx="8" fill="rgba(29,78,216,0.08)" stroke="#1d4ed8" stroke-width="1.2"/>
106
- <rect x="412" y="360" width="32" height="16" rx="4" fill="rgba(29,78,216,0.14)"/>
107
- <text x="428" y="372" fill="#1d4ed8" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">CHD</text>
108
- <text x="460" y="392" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">One-turn draft</text>
109
- <text x="460" y="408" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">tool-free · isolated</text>
110
- <text x="460" y="420" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">candidate JSON | null</text>
100
+ <rect x="516" y="452" width="160" height="96" rx="8" fill="#f0eee9"/>
101
+ <rect x="516" y="452" width="160" height="96" rx="8" fill="#1d4ed8" fill-opacity="0.08" stroke="#1d4ed8" stroke-width="1.2"/>
102
+ <rect x="528" y="464" width="32" height="16" rx="2" fill="#1d4ed8" fill-opacity="0.14"/>
103
+ <text x="544" y="476" fill="#1d4ed8" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">CHD</text>
104
+ <text x="596" y="500" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">One-turn draft</text>
105
+ <text x="596" y="520" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">tool-free · isolated</text>
106
+ <text x="596" y="536" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">candidate JSON | null</text>
111
107
  </g>
112
-
113
108
  <g>
114
- <rect x="524" y="240" width="112" height="80" rx="8" fill="#f0eee9"/>
115
- <rect x="524" y="240" width="112" height="80" rx="8" fill="#ffffff" stroke="#101828"/>
116
- <rect x="532" y="248" width="32" height="16" rx="4" fill="rgba(16,24,40,0.08)"/>
117
- <text x="548" y="260" fill="#101828" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">EXT</text>
118
- <text x="580" y="280" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Passive candidate</text>
119
- <text x="580" y="296" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">Prompt ready — /promptor</text>
120
- <text x="580" y="308" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">stays in memory</text>
109
+ <rect x="692" y="308" width="160" height="96" rx="8" fill="#ffffff" stroke="#101828"/>
110
+ <rect x="704" y="320" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.08"/>
111
+ <text x="720" y="332" fill="#101828" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">EXT</text>
112
+ <text x="772" y="356" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Passive candidate</text>
113
+ <text x="772" y="376" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">Prompt ready — /promptor</text>
114
+ <text x="772" y="392" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">stays in memory</text>
121
115
  </g>
122
-
123
116
  <g>
124
- <rect x="644" y="128" width="112" height="80" rx="8" fill="#f0eee9"/>
125
- <rect x="644" y="128" width="112" height="80" rx="8" fill="rgba(76,86,101,0.10)" stroke="#6a7282"/>
126
- <rect x="652" y="136" width="32" height="16" rx="4" fill="rgba(76,86,101,0.14)"/>
127
- <text x="668" y="148" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">YOU</text>
128
- <text x="700" y="168" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Review with Main</text>
129
- <text x="700" y="184" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">show · refine · approve</text>
130
- <text x="700" y="196" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">complete Markdown</text>
117
+ <rect x="868" y="164" width="160" height="96" rx="8" fill="#f0eee9"/>
118
+ <rect x="868" y="164" width="160" height="96" rx="8" fill="#4c5665" fill-opacity="0.10" stroke="#6a7282"/>
119
+ <rect x="880" y="176" width="32" height="16" rx="2" fill="#4c5665" fill-opacity="0.14"/>
120
+ <text x="896" y="188" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">YOU</text>
121
+ <text x="948" y="212" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Review with Main</text>
122
+ <text x="948" y="232" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">show · refine · approve</text>
123
+ <text x="948" y="248" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">complete Markdown reply</text>
131
124
  </g>
132
-
133
125
  <g>
134
- <rect x="764" y="240" width="112" height="80" rx="8" fill="#f0eee9"/>
135
- <rect x="764" y="240" width="112" height="80" rx="8" fill="rgba(16,24,40,0.05)" stroke="#4c5665"/>
136
- <rect x="772" y="248" width="32" height="16" rx="4" fill="rgba(16,24,40,0.10)"/>
137
- <text x="788" y="260" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">FILE</text>
138
- <text x="820" y="280" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Saved prompt</text>
139
- <text x="820" y="296" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">prompts/&lt;name&gt;.md</text>
140
- <text x="820" y="308" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">never overwrites</text>
126
+ <rect x="1044" y="308" width="160" height="96" rx="8" fill="#f0eee9"/>
127
+ <rect x="1044" y="308" width="160" height="96" rx="8" fill="#101828" fill-opacity="0.05" stroke="#4c5665"/>
128
+ <rect x="1056" y="320" width="32" height="16" rx="2" fill="#101828" fill-opacity="0.10"/>
129
+ <text x="1072" y="332" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" font-weight="600" text-anchor="middle">FILE</text>
130
+ <text x="1124" y="356" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12" font-weight="600" text-anchor="middle">Saved prompt</text>
131
+ <text x="1124" y="376" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">/promptor save [name]</text>
132
+ <text x="1124" y="392" fill="#6a7282" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" text-anchor="middle">prompts/&lt;name&gt;.md · new file</text>
141
133
  </g>
142
134
 
143
- <!-- Legend -->
144
- <line x1="40" y1="524" x2="920" y2="524" stroke="rgba(16,24,40,0.14)" stroke-width="0.8"/>
145
- <text x="40" y="556" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8" letter-spacing="1.2">LEGEND</text>
146
- <path d="M144 552 H176" fill="none" stroke="#4c5665" marker-end="url(#arrow)"/>
147
- <text x="188" y="556" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8">CONTROLLED HANDOFF</text>
148
- <path d="M404 552 H436" fill="none" stroke="#1d4ed8" stroke-width="1.2" marker-end="url(#arrow-accent)"/>
149
- <text x="448" y="556" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8">ISOLATED ANALYSIS</text>
150
- <rect x="692" y="544" width="24" height="16" rx="4" fill="rgba(16,24,40,0.05)" stroke="#4c5665"/>
151
- <text x="728" y="556" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8">SAVED AFTER APPROVAL</text>
135
+ <!-- Manual analysis skips WAIT, but does not skip review or approval. -->
136
+ <text x="164" y="608" fill="#101828" font-family="'Geist', system-ui, sans-serif" font-size="12">Manual analysis displays its candidate immediately. Both paths require Main review and your approval before saving.</text>
137
+ <text x="164" y="628" fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8">/promptor dismiss discards a pending automatic candidate. Saving never replaces an existing file.</text>
138
+
139
+ <!-- Horizontal bottom legend; all content stays inside the 40px safe area. -->
140
+ <line x1="40" y1="644" x2="1240" y2="644" stroke="#101828" stroke-opacity="0.14" stroke-width="0.8"/>
141
+ <g fill="#4c5665" font-family="'Geist Mono', ui-monospace, monospace" font-size="8">
142
+ <text x="40" y="672" letter-spacing="1.2">LEGEND</text>
143
+ <path d="M144 668 H176" fill="none" stroke="#4c5665" marker-end="url(#prompt-lifecycle-arrow)"/>
144
+ <text x="188" y="672">CONTROLLED HANDOFF</text>
145
+ <path d="M372 668 H404" fill="none" stroke="#1d4ed8" stroke-width="1.2" marker-end="url(#prompt-lifecycle-arrow-accent)"/>
146
+ <text x="416" y="672">ISOLATED ANALYSIS</text>
147
+ <path d="M596 668 H628" fill="none" stroke="#4c5665" stroke-dasharray="5,4" marker-end="url(#prompt-lifecycle-arrow)"/>
148
+ <text x="640" y="672">WAIT FOR USER DISPLAY</text>
149
+ <rect x="864" y="660" width="24" height="16" rx="2" fill="#101828" fill-opacity="0.05" stroke="#4c5665"/>
150
+ <text x="900" y="672">SAVED AFTER APPROVAL</text>
151
+ </g>
152
152
  </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@henryqw/pi-prompt-creator",
3
- "version": "2.0.11",
3
+ "version": "3.0.2",
4
4
  "description": "Turn current Pi conversation signals into user-approved prompt templates.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -26,7 +26,7 @@
26
26
  "pack:check": "npm pack --dry-run"
27
27
  },
28
28
  "peerDependencies": {
29
- "@earendil-works/pi-coding-agent": ">=0.86.0 <0.100.0 || ^1.0.0"
29
+ "@earendil-works/pi-coding-agent": "^1.0.0"
30
30
  },
31
31
  "repository": {
32
32
  "type": "git",
@@ -45,8 +45,8 @@
45
45
  ]
46
46
  },
47
47
  "dependencies": {
48
- "@henryqw/pi-config-store": "^2.0.0",
49
- "@henryqw/pi-subagent": "^22.0.0 || ^23.0.0 || ^24.0.0 || ^25.0.0",
48
+ "@henryqw/pi-config-store": "^3.0.0",
49
+ "@henryqw/pi-subagent": "^22.0.0 || ^23.0.0 || ^24.0.0 || ^25.0.0 || ^26.0.0",
50
50
  "@henryqw/pi-task-models": "^7.0.0"
51
51
  },
52
52
  "devDependencies": {