@mjasnikovs/pi-task 0.24.2 → 0.24.4

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
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- ![Local models drift. pi-task doesn't trust one prompt. Your ask runs through five fixed phases refine, research, grill, compose, critique and what comes out is a spec.](https://raw.githubusercontent.com/mjasnikovs/pi-task/main/assets/hero.svg)
3
+ ![pi-task Deterministic AI Workflows. Every request runs a fixed pipeline: refine to clarify and structure it, research to gather information in parallel, grill to cross-examine the findings, compose to write the implementation spec, critique to check it for quality and completeness.](https://raw.githubusercontent.com/mjasnikovs/pi-task/main/assets/hero.svg)
4
4
 
5
5
  # pi-task
6
6
 
Binary file
@@ -0,0 +1,39 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 600" width="960" height="600" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, 'Liberation Sans', Arial, sans-serif" role="img" aria-label="pi-task — Deterministic AI Workflows. Five fixed phases: refine, research, grill, compose, critique.">
2
+ <defs>
3
+ <clipPath id="frame"><rect x="0" y="0" width="960" height="600"/></clipPath>
4
+ <linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
5
+ <stop offset="0" stop-color="#0d1117"/><stop offset="1" stop-color="#010409"/>
6
+ </linearGradient>
7
+ <linearGradient id="hl" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0" stop-color="#b183f9"/><stop offset="1" stop-color="#8957e5"/>
9
+ </linearGradient>
10
+ </defs>
11
+ <rect width="960" height="600" fill="url(#bg)"/><g clip-path="url(#frame)" fill="none" stroke="#a371f7" stroke-linecap="round" stroke-linejoin="round" opacity="0.26"><path d="M224.4 600.0L252.1 539.1L270.6 559.4L302.9 486.3L326.0 506.6L356.1 451.8L383.8 470.1L411.5 423.4L432.3 437.6L455.4 397.0L473.9 439.6L492.4 421.4L520.1 478.2L543.2 462.0L577.8 516.8L603.2 500.5L631.0 553.3L654.1 537.1L686.4 600.0" stroke-width="1.4" opacity="0.16"/><path d="M666.6 600.0L692.7 547.5L710.2 565.0L740.7 502.0L762.4 519.5L790.7 472.3L816.9 488.0L843.0 447.8L862.6 460.0L884.4 425.0L901.8 461.8L919.2 446.0L945.4 495.0L967.2 481.0L999.8 528.3L1023.8 514.3L1049.9 559.8L1071.7 545.8L1102.2 600.0" stroke-width="1.4" opacity="0.16"/><path d="M660.0 250.0L330.0 600M660.0 250.0L412.5 600M660.0 250.0L495.0 600M660.0 250.0L577.5 600M660.0 250.0L660.0 600M660.0 250.0L742.5 600M660.0 250.0L825.0 600M660.0 250.0L907.5 600M660.0 250.0L990.0 600" stroke-width="1" opacity="0.1"/><path d="M369.6 495.0L369.6 600M396.0 530.0L396.0 600M442.2 404.0L442.2 600M475.2 439.0L475.2 600M518.1 344.5L518.1 600M557.7 376.0L557.7 600M597.3 295.5L597.3 600M627.0 320.0L627.0 600M660.0 250.0L660.0 600M686.4 323.5L686.4 600M712.8 292.0L712.8 600M752.4 390.0L752.4 600M785.4 362.0L785.4 600M834.9 456.5L834.9 600M871.2 428.5L871.2 600M910.8 519.5L910.8 600M943.8 491.5L943.8 600" stroke-width="1" opacity="0.13"/><path d="M330.0 600.0L369.6 495.0L396.0 530.0L442.2 404.0L475.2 439.0L518.1 344.5L557.7 376.0L597.3 295.5L627.0 320.0L660.0 250.0L686.4 323.5L712.8 292.0L752.4 390.0L785.4 362.0L834.9 456.5L871.2 428.5L910.8 519.5L943.8 491.5L990.0 600.0" stroke-width="2.2" opacity="0.55"/><path d="M330.0 600.0L396.0 530.0L475.2 439.0L557.7 376.0L627.0 320.0L660.0 250.0" stroke-width="1.8" stroke-dasharray="7 6" opacity="0.75"/><circle cx="330.0" cy="600.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="396.0" cy="530.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="475.2" cy="439.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="557.7" cy="376.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="627.0" cy="320.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="660.0" cy="250.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/></g>
12
+ <g transform="translate(44,28) scale(0.95)" fill="none" stroke="#a371f7" stroke-width="2.21" stroke-linecap="round" stroke-linejoin="round">
13
+ <path d="M30.18 4.98A20 20 0 1 0 41.66 14.61"/>
14
+ <path d="M13.5 17H34.5M19.5 17V32M28.5 17V32"/>
15
+ </g>
16
+ <text x="98" y="62" font-size="36" font-weight="700" fill="#e6edf3" letter-spacing="-0.5">pi-task</text>
17
+ <text x="44" y="258" font-size="104" font-weight="700" fill="#e6edf3" letter-spacing="-4">Deterministic</text>
18
+ <text x="44" y="372" font-size="104" font-weight="700" fill="url(#hl)" letter-spacing="-4">AI Workflows.</text>
19
+ <rect x="44" y="404" width="104" height="7" rx="3.5" fill="#8957e5"/>
20
+ <rect x="98.2" y="452" width="66" height="66" rx="14.5" fill="#1e1633" stroke="#a371f7" stroke-opacity="0.28" stroke-width="1.2"/>
21
+ <g transform="translate(113.8,467.6) scale(1.45)" fill="none" stroke="#a371f7" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/><path d="M9 13h6M9 17h4"/></g>
22
+ <text x="131.2" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">REFINE</text>
23
+ <path d="M208.4 485h20M222.4 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
24
+ <rect x="272.6" y="452" width="66" height="66" rx="14.5" fill="#0d2440" stroke="#58a6ff" stroke-opacity="0.28" stroke-width="1.2"/>
25
+ <g transform="translate(288.2,467.6) scale(1.45)" fill="none" stroke="#58a6ff" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="M20.5 20.5 16 16"/></g>
26
+ <text x="305.6" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">RESEARCH</text>
27
+ <path d="M382.8 485h20M396.8 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
28
+ <rect x="447.0" y="452" width="66" height="66" rx="14.5" fill="#33172a" stroke="#f778ba" stroke-opacity="0.28" stroke-width="1.2"/>
29
+ <g transform="translate(462.6,467.6) scale(1.45)" fill="none" stroke="#f778ba" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 11.5a8.5 8.5 0 0 1-8.5 8.5 8.4 8.4 0 0 1-3.8-.9L3.5 21l1.9-4.7a8.4 8.4 0 0 1-.9-3.8 8.5 8.5 0 0 1 8.5-8.5 8.5 8.5 0 0 1 7.5 7.5z"/><path d="M9.6 9.4a2.6 2.6 0 0 1 5 .9c0 1.7-2.5 2.6-2.5 2.6"/><path d="M12 16.4h.01"/></g>
30
+ <text x="480.0" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">GRILL</text>
31
+ <path d="M557.2 485h20M571.2 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
32
+ <rect x="621.4" y="452" width="66" height="66" rx="14.5" fill="#0f2a1b" stroke="#3fb950" stroke-opacity="0.28" stroke-width="1.2"/>
33
+ <g transform="translate(637.0,467.6) scale(1.45)" fill="none" stroke="#3fb950" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M12.5 20.5H21"/><path d="M16.7 3.6a2.1 2.1 0 0 1 3 3L7.5 18.8 3.5 20l1.2-4z"/></g>
34
+ <text x="654.4" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">COMPOSE</text>
35
+ <path d="M731.6 485h20M745.6 480l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
36
+ <rect x="795.8" y="452" width="66" height="66" rx="14.5" fill="#2d2410" stroke="#d29922" stroke-opacity="0.28" stroke-width="1.2"/>
37
+ <g transform="translate(811.4,467.6) scale(1.45)" fill="none" stroke="#d29922" stroke-width="1.31" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21.5s7.5-3.8 7.5-9.5V5.2L12 2.5 4.5 5.2V12c0 5.7 7.5 9.5 7.5 9.5z"/></g>
38
+ <text x="828.8" y="543" text-anchor="middle" font-size="18" font-weight="700" fill="#8b949e" letter-spacing="0.6">CRITIQUE</text>
39
+ </svg>
package/assets/hero.png CHANGED
Binary file
package/assets/hero.svg CHANGED
@@ -1,92 +1,57 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 600" width="960" height="600" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif" role="img" aria-label="pi-task. Local models drift. pi-task doesn't trust one prompt. Your ask runs through five fixed phases refine, research, grill, compose, critique and what comes out is a spec.">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 600" width="960" height="600" font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, 'Liberation Sans', Arial, sans-serif" role="img" aria-label="pi-task Deterministic AI Workflows. Every request runs a fixed pipeline: refine to clarify and structure it, research to gather information in parallel, grill to cross-examine the findings, compose to write the implementation spec, critique to check it for quality and completeness.">
2
2
  <defs>
3
- <clipPath id="frame"><rect x="6" y="6" width="948" height="588" rx="18"/></clipPath>
4
- <style>
5
- .code { font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; }
6
- .ic { fill:none; stroke-width:2.25; stroke-linecap:round; stroke-linejoin:round; }
7
- .icf { stroke:none; }
8
- .ph { font-size:18px; fill:#c9d1d9; }
9
- .arw { fill:none; stroke:#6e7681; stroke-width:2.07; stroke-linecap:round; stroke-linejoin:round; }
10
- </style>
11
- </defs>
12
-
13
- <rect x="6" y="6" width="948" height="588" rx="18" fill="#0d1117" stroke="#30363d" stroke-width="1.5"/>
14
-
15
- <!-- ── watermark ── -->
16
- <defs>
17
- <linearGradient id="mtFade" gradientUnits="userSpaceOnUse" x1="6" y1="0" x2="688" y2="0">
18
- <stop offset="0" stop-color="#fff" stop-opacity="1"/>
19
- <stop offset="0.55" stop-color="#fff" stop-opacity="0.9"/>
20
- <stop offset="1" stop-color="#fff" stop-opacity="0"/>
3
+ <clipPath id="frame"><rect x="0" y="0" width="960" height="600"/></clipPath>
4
+ <linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
5
+ <stop offset="0" stop-color="#0d1117"/><stop offset="1" stop-color="#010409"/>
6
+ </linearGradient>
7
+ <linearGradient id="hl" x1="0" y1="0" x2="1" y2="0">
8
+ <stop offset="0" stop-color="#b183f9"/><stop offset="1" stop-color="#8957e5"/>
21
9
  </linearGradient>
22
- <mask id="mtMask"><rect x="0" y="0" width="960" height="600" fill="url(#mtFade)"/></mask>
23
10
  </defs>
24
- <g clip-path="url(#frame)" mask="url(#mtMask)" fill="none" stroke="#a371f7" stroke-linecap="round" stroke-linejoin="round">
25
- <path d="M6.0 594.0L75.6 530.2L139.4 550.5L203.2 486.7L275.7 518.6L342.4 449.0L412.0 501.2L484.5 460.6L559.9 521.5L629.5 486.7L687.5 594.0" stroke-width="1.5" opacity="0.12"/>
26
- <path d="M264.1 330.1L6.0 594.0M264.1 330.1L130.7 594.0M264.1 330.1L255.4 594.0M264.1 330.1L380.1 594.0M264.1 330.1L504.8 594.0M264.1 330.1L629.5 594.0" stroke-width="1" opacity="0.08"/>
27
- <path d="M56.8 538.9L56.8 594.0M95.9 556.3L95.9 594.0M148.1 475.1L148.1 594.0M191.6 495.4L191.6 594.0M226.4 405.5L226.4 594.0M264.1 330.1L264.1 594.0M290.2 382.3L290.2 594.0M316.3 364.9L316.3 594.0M351.1 443.2L351.1 594.0M385.9 422.9L385.9 594.0M423.6 489.6L423.6 594.0M458.4 469.3L458.4 594.0M499.0 530.2L499.0 594.0M539.6 515.7L539.6 594.0M586.0 567.9L586.0 594.0" stroke-width="1" opacity="0.07"/>
28
- <path d="M6.0 594.0L56.8 538.9L95.9 556.3L148.1 475.1L191.6 495.4L226.4 405.5L264.1 330.1L290.2 382.3L316.3 364.9L351.1 443.2L385.9 422.9L423.6 489.6L458.4 469.3L499.0 530.2L539.6 515.7L586.0 567.9L629.5 594.0" stroke-width="2" opacity="0.30"/>
29
- <circle cx="6.0" cy="594.0" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
30
- <circle cx="148.1" cy="475.1" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
31
- <circle cx="264.1" cy="330.1" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
32
- <circle cx="351.1" cy="443.2" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
33
- <circle cx="458.4" cy="469.3" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
34
- <circle cx="586.0" cy="567.9" r="2.6" fill="#a371f7" stroke="none" opacity="0.34"/>
35
- </g>
36
-
37
- <!-- ── logo lockup · π in a broken circle, drawn as paths (no font dependency) ── -->
38
- <g transform="translate(371,59) scale(1.2500)" fill="none" stroke="#a371f7" stroke-width="2.40" stroke-linecap="round" stroke-linejoin="round">
11
+ <rect width="960" height="600" fill="url(#bg)"/><g clip-path="url(#frame)" fill="none" stroke="#a371f7" stroke-linecap="round" stroke-linejoin="round" opacity="0.5"><path d="M137.6 600.0L164.5 560.3L182.4 573.6L213.8 525.9L236.2 539.2L265.3 503.5L292.2 515.4L319.0 485.0L339.2 494.2L361.6 467.8L379.5 495.5L397.4 483.6L424.3 520.7L446.7 510.1L480.3 545.8L505.0 535.2L531.8 569.6L554.2 559.0L585.6 600.0" stroke-width="1.4" opacity="0.16"/><path d="M566.4 600.0L591.7 565.8L608.6 577.2L638.2 536.2L659.3 547.6L686.8 516.8L712.1 527.0L737.5 500.8L756.5 508.8L777.6 486.0L794.5 509.9L811.4 499.7L836.7 531.6L857.9 522.5L889.5 553.3L912.8 544.1L938.1 573.8L959.2 564.7L988.8 600.0" stroke-width="1.4" opacity="0.16"/><path d="M560.0 372.0L240.0 600M560.0 372.0L320.0 600M560.0 372.0L400.0 600M560.0 372.0L480.0 600M560.0 372.0L560.0 600M560.0 372.0L640.0 600M560.0 372.0L720.0 600M560.0 372.0L800.0 600M560.0 372.0L880.0 600" stroke-width="1" opacity="0.1"/><path d="M278.4 531.6L278.4 600M304.0 554.4L304.0 600M348.8 472.3L348.8 600M380.8 495.1L380.8 600M422.4 433.6L422.4 600M460.8 454.1L460.8 600M499.2 401.6L499.2 600M528.0 417.6L528.0 600M560.0 372.0L560.0 600M585.6 419.9L585.6 600M611.2 399.4L611.2 600M649.6 463.2L649.6 600M681.6 445.0L681.6 600M729.6 506.5L729.6 600M764.8 488.3L764.8 600M803.2 547.6L803.2 600M835.2 529.3L835.2 600" stroke-width="1" opacity="0.13"/><path d="M240.0 600.0L278.4 531.6L304.0 554.4L348.8 472.3L380.8 495.1L422.4 433.6L460.8 454.1L499.2 401.6L528.0 417.6L560.0 372.0L585.6 419.9L611.2 399.4L649.6 463.2L681.6 445.0L729.6 506.5L764.8 488.3L803.2 547.6L835.2 529.3L880.0 600.0" stroke-width="2.2" opacity="0.55"/><path d="M240.0 600.0L304.0 554.4L380.8 495.1L460.8 454.1L528.0 417.6L560.0 372.0" stroke-width="1.8" stroke-dasharray="7 6" opacity="0.75"/><circle cx="240.0" cy="600.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="304.0" cy="554.4" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="380.8" cy="495.1" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="460.8" cy="454.1" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="528.0" cy="417.6" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><circle cx="560.0" cy="372.0" r="3" fill="#a371f7" stroke="none" opacity="0.9"/><path d="M560.0 372.0L560.0 324.0" stroke-width="2.6" opacity="0.95"/><path d="M560.0 324.0h44l-10 13h-34z" fill="#8957e5" stroke="none"/><text x="575.0" y="335.0" font-size="15" font-weight="700" fill="#fff" stroke="none">&#960;</text></g>
12
+ <g transform="translate(44,34) scale(0.82)" fill="none" stroke="#a371f7" stroke-width="2.56" stroke-linecap="round" stroke-linejoin="round">
39
13
  <path d="M30.18 4.98A20 20 0 1 0 41.66 14.61"/>
40
14
  <path d="M13.5 17H34.5M19.5 17V32M28.5 17V32"/>
41
15
  </g>
42
- <text x="449" y="99" font-size="44" font-weight="700" fill="#e6edf3">pi-task</text>
43
-
44
- <!-- ── headline ── -->
45
- <text x="480" y="224" text-anchor="middle" font-size="82" font-weight="700" fill="#6e7681">Local models drift.</text>
46
- <text x="480" y="319" text-anchor="middle" font-size="82" font-weight="700" fill="#e6edf3">pi-task doesn&#39;t trust</text>
47
- <text x="480" y="414" text-anchor="middle" font-size="82" font-weight="700" fill="#e6edf3">one prompt.</text>
48
-
49
- <!-- ── phase strip ── -->
50
- <rect x="65" y="473" width="831" height="61" rx="30.5" fill="#161b22" fill-opacity="0.92" stroke="#30363d" stroke-width="1.5"/>
51
- <g transform="translate(108,492.5) scale(0.9167)" stroke="#58a6ff">
52
- <circle class="ic" cx="12" cy="12" r="10"/>
53
- <path class="ic" d="M22 12h-4M6 12H2M12 6V2M12 22v-4"/>
54
- <circle class="icf" cx="12" cy="12" r="2.4" fill="#58a6ff"/>
55
- </g>
56
- <text x="139" y="509.8" class="ph">refine</text>
57
- <path class="arw" d="M195 503.5h17.2M206.6 496.8l6.7 6.7-6.7 6.7"/>
58
- <g transform="translate(229,492.5) scale(0.9167)" stroke="#39c5cf">
59
- <path class="ic" d="M9.56 9.83 15.44 6.67M10.1 12h4.79M9.56 14.17 15.44 17.33"/>
60
- <circle class="icf" cx="5.5" cy="12" r="2.4" fill="#39c5cf"/>
61
- <circle class="icf" cx="19.5" cy="4.5" r="2.1" fill="#39c5cf"/>
62
- <circle class="icf" cx="19.5" cy="12" r="2.1" fill="#39c5cf"/>
63
- <circle class="icf" cx="19.5" cy="19.5" r="2.1" fill="#39c5cf"/>
64
- </g>
65
- <text x="260" y="509.8" class="ph">research</text>
66
- <path class="arw" d="M341 503.5h17.2M352.6 496.8l6.7 6.7-6.7 6.7"/>
67
- <g transform="translate(375,492.5) scale(0.9167)" stroke="#d29922">
68
- <path class="ic" d="M7.6 8.4a4.5 4.5 0 1 1 5.9 4.3c-.9.35-1.5 1.2-1.5 2.2v.6"/>
69
- <circle class="icf" cx="12" cy="19.8" r="1.5" fill="#d29922"/>
70
- </g>
71
- <text x="406" y="509.8" class="ph">grill</text>
72
- <path class="arw" d="M446 503.5h17.2M457.6 496.8l6.7 6.7-6.7 6.7"/>
73
- <g transform="translate(480,492.5) scale(0.9167)" stroke="#3fb950">
74
- <path class="ic" d="M12 2.5 22 7.5 12 12.5 2 7.5 12 2.5z"/>
75
- <path class="ic" d="M2 16.5 12 21.5 22 16.5"/>
76
- </g>
77
- <text x="511" y="509.8" class="ph">compose</text>
78
- <path class="arw" d="M597 503.5h17.2M608.5 496.8l6.7 6.7-6.7 6.7"/>
79
- <g transform="translate(631,492.5) scale(0.9167)" stroke="#a371f7">
80
- <path class="ic" d="M20.5 15a9 9 0 1 1-2.1-9.4L23 10"/>
81
- <path class="ic" d="M23 4v6h-6"/>
82
- </g>
83
- <text x="662" y="509.8" class="ph">critique</text>
84
- <path class="arw" d="M732 503.5h17.2M743.5 496.8l6.7 6.7-6.7 6.7"/>
85
- <g transform="translate(766,492.5) scale(0.9167)" stroke="#3fb950">
86
- <path class="ic" d="M14 2.5H6.5a2 2 0 0 0-2 2v15a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8z"/>
87
- <path class="ic" d="M14 2.5V8h5.5"/>
88
- <path class="ic" d="M8.5 13.5h7M8.5 17.5h7"/>
89
- </g>
90
- <text x="797" y="509.8" class="ph" font-weight="600" fill="#3fb950">a spec</text>
91
-
16
+ <text x="90" y="63" font-size="30" font-weight="700" fill="#e6edf3" letter-spacing="-0.5">pi-task</text>
17
+ <text x="44" y="212" font-size="62" font-weight="700" fill="#e6edf3" letter-spacing="-2">Deterministic</text>
18
+ <text x="44" y="280" font-size="62" font-weight="700" fill="url(#hl)" letter-spacing="-2">AI Workflows.</text>
19
+ <rect x="44" y="312" width="72" height="4" rx="2" fill="#8957e5"/>
20
+ <text x="44" y="356" font-size="17" fill="#8b949e">pi-task orchestrates every request</text>
21
+ <text x="44" y="381" font-size="17" fill="#8b949e">through a fixed pipeline to produce</text>
22
+ <text x="44" y="406" font-size="17" fill="#8b949e">implementation specs you can trust.</text>
23
+ <rect x="470.0" y="132" width="74" height="74" rx="16.3" fill="#1e1633" stroke="#a371f7" stroke-opacity="0.28" stroke-width="1.2"/>
24
+ <g transform="translate(489.0,151.0) scale(1.5)" fill="none" stroke="#a371f7" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/><path d="M9 13h6M9 17h4"/></g>
25
+ <text x="507.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">REFINE</text>
26
+ <text x="507.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Clarify and</text>
27
+ <text x="507.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">structure the</text>
28
+ <text x="507.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">request</text>
29
+ <path d="M546.5 169h14M554.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
30
+ <rect x="563.0" y="132" width="74" height="74" rx="16.3" fill="#0d2440" stroke="#58a6ff" stroke-opacity="0.28" stroke-width="1.2"/>
31
+ <g transform="translate(582.0,151.0) scale(1.5)" fill="none" stroke="#58a6ff" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><path d="M20.5 20.5 16 16"/></g>
32
+ <text x="600.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">RESEARCH</text>
33
+ <text x="600.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Parallel research</text>
34
+ <text x="600.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">agents gather</text>
35
+ <text x="600.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">information</text>
36
+ <path d="M639.5 169h14M647.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
37
+ <rect x="656.0" y="132" width="74" height="74" rx="16.3" fill="#33172a" stroke="#f778ba" stroke-opacity="0.28" stroke-width="1.2"/>
38
+ <g transform="translate(675.0,151.0) scale(1.5)" fill="none" stroke="#f778ba" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M20.5 11.5a8.5 8.5 0 0 1-8.5 8.5 8.4 8.4 0 0 1-3.8-.9L3.5 21l1.9-4.7a8.4 8.4 0 0 1-.9-3.8 8.5 8.5 0 0 1 8.5-8.5 8.5 8.5 0 0 1 7.5 7.5z"/><path d="M9.6 9.4a2.6 2.6 0 0 1 5 .9c0 1.7-2.5 2.6-2.5 2.6"/><path d="M12 16.4h.01"/></g>
39
+ <text x="693.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">GRILL</text>
40
+ <text x="693.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Cross-examine</text>
41
+ <text x="693.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">findings to</text>
42
+ <text x="693.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">surface gaps</text>
43
+ <path d="M732.5 169h14M740.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
44
+ <rect x="749.0" y="132" width="74" height="74" rx="16.3" fill="#0f2a1b" stroke="#3fb950" stroke-opacity="0.28" stroke-width="1.2"/>
45
+ <g transform="translate(768.0,151.0) scale(1.5)" fill="none" stroke="#3fb950" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M12.5 20.5H21"/><path d="M16.7 3.6a2.1 2.1 0 0 1 3 3L7.5 18.8 3.5 20l1.2-4z"/></g>
46
+ <text x="786.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">COMPOSE</text>
47
+ <text x="786.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Create detailed</text>
48
+ <text x="786.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">implementation</text>
49
+ <text x="786.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">spec</text>
50
+ <path d="M825.5 169h14M833.5 164l6 5-6 5" fill="none" stroke="#6e7681" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/>
51
+ <rect x="842.0" y="132" width="74" height="74" rx="16.3" fill="#2d2410" stroke="#d29922" stroke-opacity="0.28" stroke-width="1.2"/>
52
+ <g transform="translate(861.0,151.0) scale(1.5)" fill="none" stroke="#d29922" stroke-width="1.27" stroke-linecap="round" stroke-linejoin="round"><path d="M12 21.5s7.5-3.8 7.5-9.5V5.2L12 2.5 4.5 5.2V12c0 5.7 7.5 9.5 7.5 9.5z"/></g>
53
+ <text x="879.0" y="227" text-anchor="middle" font-size="11.5" font-weight="700" fill="#e6edf3" letter-spacing="0.4">CRITIQUE</text>
54
+ <text x="879.0" y="245" text-anchor="middle" font-size="9.5" fill="#8b949e">Self-critique for</text>
55
+ <text x="879.0" y="257" text-anchor="middle" font-size="9.5" fill="#8b949e">quality and</text>
56
+ <text x="879.0" y="269" text-anchor="middle" font-size="9.5" fill="#8b949e">completeness</text>
92
57
  </svg>
@@ -96,8 +96,14 @@ export declare class CommandWatchdog {
96
96
  private fire;
97
97
  }
98
98
  /**
99
- * Real-clock schedule/cancel, unref'd so a pending watchdog timer can never
100
- * itself keep the process alive on exit. Shared by both adapters; tests
101
- * substitute a fake scheduler instead.
99
+ * Real-clock schedule/cancel. Shared by both adapters; tests substitute a fake
100
+ * scheduler instead.
101
+ *
102
+ * REF'd, for the same measured reason as the stream watchdog's poll (see
103
+ * realStreamTimerDeps): under Bun on windows an unref'd timer never fires once
104
+ * nothing ref'd is pending, and a child sitting in a hung command is exactly
105
+ * that state — so the unref disabled the guard in the one case it exists for.
106
+ * The timer is cleared when the tool ends and in runWorker's `finally`, so it
107
+ * cannot outlive the call it watches.
102
108
  */
103
109
  export declare const realTimerDeps: Pick<WatchdogDeps, 'schedule' | 'cancel'>;
@@ -141,18 +141,17 @@ export class CommandWatchdog {
141
141
  }
142
142
  }
143
143
  /**
144
- * Real-clock schedule/cancel, unref'd so a pending watchdog timer can never
145
- * itself keep the process alive on exit. Shared by both adapters; tests
146
- * substitute a fake scheduler instead.
144
+ * Real-clock schedule/cancel. Shared by both adapters; tests substitute a fake
145
+ * scheduler instead.
146
+ *
147
+ * REF'd, for the same measured reason as the stream watchdog's poll (see
148
+ * realStreamTimerDeps): under Bun on windows an unref'd timer never fires once
149
+ * nothing ref'd is pending, and a child sitting in a hung command is exactly
150
+ * that state — so the unref disabled the guard in the one case it exists for.
151
+ * The timer is cleared when the tool ends and in runWorker's `finally`, so it
152
+ * cannot outlive the call it watches.
147
153
  */
148
154
  export const realTimerDeps = {
149
- schedule: (fn, ms) => {
150
- const handle = setTimeout(fn, ms);
151
- if (typeof handle.unref === 'function') {
152
- ;
153
- handle.unref();
154
- }
155
- return handle;
156
- },
155
+ schedule: (fn, ms) => setTimeout(fn, ms),
157
156
  cancel: handle => clearTimeout(handle)
158
157
  };
@@ -103,9 +103,23 @@ export declare class StreamWatchdog {
103
103
  check(): void;
104
104
  }
105
105
  /**
106
- * Real-clock poll deps, unref'd so a pending watchdog poll can never itself keep
107
- * the process alive on exit. `schedule` returns a repeating interval the
108
- * machine cancels it on stop/fire.
106
+ * Real-clock poll deps. `schedule` returns a repeating interval the machine
107
+ * cancels it on stop/fire, and runChild's cleanup() stops the watchdog on every
108
+ * settle path (close, error, abort), so it cannot outlive the child it watches.
109
+ *
110
+ * The poll is REF'd, deliberately. It used to be unref'd, on the reasoning that a
111
+ * pending watchdog poll should never keep the process alive at exit — but under
112
+ * Bun on WINDOWS an unref'd timer does not fire at all once nothing ref'd is
113
+ * pending. Measured on a windows-latest runner (bun 1.3.14): an unref'd interval
114
+ * with nothing else pending never fired in 20s, while the identical ref'd one
115
+ * fired at 101ms; on linux both fire at 100ms.
116
+ *
117
+ * That state — no ref'd work outstanding — is EXACTLY the state this watchdog
118
+ * exists to police: a child whose model stream has gone silent. So the unref
119
+ * disabled the guard precisely when it was needed, and every stream-stall
120
+ * integration test hung forever on windows (CI runs 30476786365, 30477802633,
121
+ * 30478455402 — it hangs at v0.24.1 too, so this predates that release).
122
+ * A poll that can delay exit by one interval is the cheaper failure.
109
123
  */
110
124
  export declare const realStreamTimerDeps: Pick<StreamWatchdogDeps, 'now' | 'schedule' | 'cancel'>;
111
125
  /**
@@ -148,20 +148,27 @@ export class StreamWatchdog {
148
148
  }
149
149
  }
150
150
  /**
151
- * Real-clock poll deps, unref'd so a pending watchdog poll can never itself keep
152
- * the process alive on exit. `schedule` returns a repeating interval the
153
- * machine cancels it on stop/fire.
151
+ * Real-clock poll deps. `schedule` returns a repeating interval the machine
152
+ * cancels it on stop/fire, and runChild's cleanup() stops the watchdog on every
153
+ * settle path (close, error, abort), so it cannot outlive the child it watches.
154
+ *
155
+ * The poll is REF'd, deliberately. It used to be unref'd, on the reasoning that a
156
+ * pending watchdog poll should never keep the process alive at exit — but under
157
+ * Bun on WINDOWS an unref'd timer does not fire at all once nothing ref'd is
158
+ * pending. Measured on a windows-latest runner (bun 1.3.14): an unref'd interval
159
+ * with nothing else pending never fired in 20s, while the identical ref'd one
160
+ * fired at 101ms; on linux both fire at 100ms.
161
+ *
162
+ * That state — no ref'd work outstanding — is EXACTLY the state this watchdog
163
+ * exists to police: a child whose model stream has gone silent. So the unref
164
+ * disabled the guard precisely when it was needed, and every stream-stall
165
+ * integration test hung forever on windows (CI runs 30476786365, 30477802633,
166
+ * 30478455402 — it hangs at v0.24.1 too, so this predates that release).
167
+ * A poll that can delay exit by one interval is the cheaper failure.
154
168
  */
155
169
  export const realStreamTimerDeps = {
156
170
  now: () => Date.now(),
157
- schedule: (fn, ms) => {
158
- const handle = setInterval(fn, ms);
159
- if (typeof handle.unref === 'function') {
160
- ;
161
- handle.unref();
162
- }
163
- return handle;
164
- },
171
+ schedule: (fn, ms) => setInterval(fn, ms),
165
172
  cancel: handle => clearInterval(handle)
166
173
  };
167
174
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mjasnikovs/pi-task",
3
- "version": "0.24.2",
3
+ "version": "0.24.4",
4
4
  "description": "Deterministic task planning and spec-orchestration for local models — crash-safe /task pipelines with verify/enforce gates, a real-time remote web view, and web/docs/fetch/worker subagent tools.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -85,6 +85,6 @@
85
85
  "extensions": [
86
86
  "dist/index.js"
87
87
  ],
88
- "image": "https://raw.githubusercontent.com/mjasnikovs/pi-task/main/assets/hero.png"
88
+ "image": "https://raw.githubusercontent.com/mjasnikovs/pi-task/main/assets/card.png"
89
89
  }
90
90
  }