@haoyiyin/workflow 0.2.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 (223) hide show
  1. package/README.md +168 -0
  2. package/SETUP.md +71 -0
  3. package/SKILL.md +68 -0
  4. package/USAGE.md +152 -0
  5. package/dist/bin/yi-workflow.d.ts +3 -0
  6. package/dist/bin/yi-workflow.d.ts.map +1 -0
  7. package/dist/bin/yi-workflow.js +39 -0
  8. package/dist/bin/yi-workflow.js.map +1 -0
  9. package/dist/src/agents/contracts.d.ts +120 -0
  10. package/dist/src/agents/contracts.d.ts.map +1 -0
  11. package/dist/src/agents/contracts.js +431 -0
  12. package/dist/src/agents/contracts.js.map +1 -0
  13. package/dist/src/agents/dispatcher-enhanced.d.ts +68 -0
  14. package/dist/src/agents/dispatcher-enhanced.d.ts.map +1 -0
  15. package/dist/src/agents/dispatcher-enhanced.js +290 -0
  16. package/dist/src/agents/dispatcher-enhanced.js.map +1 -0
  17. package/dist/src/agents/dispatcher.d.ts +107 -0
  18. package/dist/src/agents/dispatcher.d.ts.map +1 -0
  19. package/dist/src/agents/dispatcher.js +454 -0
  20. package/dist/src/agents/dispatcher.js.map +1 -0
  21. package/dist/src/agents/index.d.ts +11 -0
  22. package/dist/src/agents/index.d.ts.map +1 -0
  23. package/dist/src/agents/index.js +10 -0
  24. package/dist/src/agents/index.js.map +1 -0
  25. package/dist/src/agents/resilience.d.ts +86 -0
  26. package/dist/src/agents/resilience.d.ts.map +1 -0
  27. package/dist/src/agents/resilience.js +183 -0
  28. package/dist/src/agents/resilience.js.map +1 -0
  29. package/dist/src/agents/token-budget.d.ts +47 -0
  30. package/dist/src/agents/token-budget.d.ts.map +1 -0
  31. package/dist/src/agents/token-budget.js +63 -0
  32. package/dist/src/agents/token-budget.js.map +1 -0
  33. package/dist/src/agents/types.d.ts +59 -0
  34. package/dist/src/agents/types.d.ts.map +1 -0
  35. package/dist/src/agents/types.js +5 -0
  36. package/dist/src/agents/types.js.map +1 -0
  37. package/dist/src/guard/main-agent.d.ts +72 -0
  38. package/dist/src/guard/main-agent.d.ts.map +1 -0
  39. package/dist/src/guard/main-agent.js +184 -0
  40. package/dist/src/guard/main-agent.js.map +1 -0
  41. package/dist/src/hooks/builtin/index.d.ts +9 -0
  42. package/dist/src/hooks/builtin/index.d.ts.map +1 -0
  43. package/dist/src/hooks/builtin/index.js +9 -0
  44. package/dist/src/hooks/builtin/index.js.map +1 -0
  45. package/dist/src/hooks/builtin/on-error.d.ts +7 -0
  46. package/dist/src/hooks/builtin/on-error.d.ts.map +1 -0
  47. package/dist/src/hooks/builtin/on-error.js +15 -0
  48. package/dist/src/hooks/builtin/on-error.js.map +1 -0
  49. package/dist/src/hooks/builtin/post-execute.d.ts +7 -0
  50. package/dist/src/hooks/builtin/post-execute.d.ts.map +1 -0
  51. package/dist/src/hooks/builtin/post-execute.js +30 -0
  52. package/dist/src/hooks/builtin/post-execute.js.map +1 -0
  53. package/dist/src/hooks/builtin/post-plan.d.ts +7 -0
  54. package/dist/src/hooks/builtin/post-plan.d.ts.map +1 -0
  55. package/dist/src/hooks/builtin/post-plan.js +15 -0
  56. package/dist/src/hooks/builtin/post-plan.js.map +1 -0
  57. package/dist/src/hooks/builtin/pre-execute.d.ts +7 -0
  58. package/dist/src/hooks/builtin/pre-execute.d.ts.map +1 -0
  59. package/dist/src/hooks/builtin/pre-execute.js +22 -0
  60. package/dist/src/hooks/builtin/pre-execute.js.map +1 -0
  61. package/dist/src/hooks/builtin/pre-plan.d.ts +7 -0
  62. package/dist/src/hooks/builtin/pre-plan.d.ts.map +1 -0
  63. package/dist/src/hooks/builtin/pre-plan.js +19 -0
  64. package/dist/src/hooks/builtin/pre-plan.js.map +1 -0
  65. package/dist/src/hooks/index.d.ts +8 -0
  66. package/dist/src/hooks/index.d.ts.map +1 -0
  67. package/dist/src/hooks/index.js +4 -0
  68. package/dist/src/hooks/index.js.map +1 -0
  69. package/dist/src/hooks/loader.d.ts +16 -0
  70. package/dist/src/hooks/loader.d.ts.map +1 -0
  71. package/dist/src/hooks/loader.js +77 -0
  72. package/dist/src/hooks/loader.js.map +1 -0
  73. package/dist/src/hooks/manager.d.ts +20 -0
  74. package/dist/src/hooks/manager.d.ts.map +1 -0
  75. package/dist/src/hooks/manager.js +76 -0
  76. package/dist/src/hooks/manager.js.map +1 -0
  77. package/dist/src/hooks/types-enhanced.d.ts +30 -0
  78. package/dist/src/hooks/types-enhanced.d.ts.map +1 -0
  79. package/dist/src/hooks/types-enhanced.js +22 -0
  80. package/dist/src/hooks/types-enhanced.js.map +1 -0
  81. package/dist/src/hooks/types.d.ts +27 -0
  82. package/dist/src/hooks/types.d.ts.map +1 -0
  83. package/dist/src/hooks/types.js +2 -0
  84. package/dist/src/hooks/types.js.map +1 -0
  85. package/dist/src/index.d.ts +43 -0
  86. package/dist/src/index.d.ts.map +1 -0
  87. package/dist/src/index.js +41 -0
  88. package/dist/src/index.js.map +1 -0
  89. package/dist/src/persistence/index.d.ts +7 -0
  90. package/dist/src/persistence/index.d.ts.map +1 -0
  91. package/dist/src/persistence/index.js +6 -0
  92. package/dist/src/persistence/index.js.map +1 -0
  93. package/dist/src/persistence/plan-md.d.ts +11 -0
  94. package/dist/src/persistence/plan-md.d.ts.map +1 -0
  95. package/dist/src/persistence/plan-md.js +125 -0
  96. package/dist/src/persistence/plan-md.js.map +1 -0
  97. package/dist/src/persistence/state-md.d.ts +17 -0
  98. package/dist/src/persistence/state-md.d.ts.map +1 -0
  99. package/dist/src/persistence/state-md.js +143 -0
  100. package/dist/src/persistence/state-md.js.map +1 -0
  101. package/dist/src/persistence/types.d.ts +85 -0
  102. package/dist/src/persistence/types.d.ts.map +1 -0
  103. package/dist/src/persistence/types.js +5 -0
  104. package/dist/src/persistence/types.js.map +1 -0
  105. package/dist/src/router/classifier.d.ts +108 -0
  106. package/dist/src/router/classifier.d.ts.map +1 -0
  107. package/dist/src/router/classifier.js +476 -0
  108. package/dist/src/router/classifier.js.map +1 -0
  109. package/dist/src/router/guard.d.ts +128 -0
  110. package/dist/src/router/guard.d.ts.map +1 -0
  111. package/dist/src/router/guard.js +370 -0
  112. package/dist/src/router/guard.js.map +1 -0
  113. package/dist/src/router/index.d.ts +10 -0
  114. package/dist/src/router/index.d.ts.map +1 -0
  115. package/dist/src/router/index.js +8 -0
  116. package/dist/src/router/index.js.map +1 -0
  117. package/dist/src/router/router.d.ts +58 -0
  118. package/dist/src/router/router.d.ts.map +1 -0
  119. package/dist/src/router/router.js +78 -0
  120. package/dist/src/router/router.js.map +1 -0
  121. package/dist/src/router/types.d.ts +100 -0
  122. package/dist/src/router/types.d.ts.map +1 -0
  123. package/dist/src/router/types.js +24 -0
  124. package/dist/src/router/types.js.map +1 -0
  125. package/dist/src/skills/agents-md/index.d.ts +9 -0
  126. package/dist/src/skills/agents-md/index.d.ts.map +1 -0
  127. package/dist/src/skills/agents-md/index.js +28 -0
  128. package/dist/src/skills/agents-md/index.js.map +1 -0
  129. package/dist/src/skills/execute-plan/index.d.ts +141 -0
  130. package/dist/src/skills/execute-plan/index.d.ts.map +1 -0
  131. package/dist/src/skills/execute-plan/index.js +784 -0
  132. package/dist/src/skills/execute-plan/index.js.map +1 -0
  133. package/dist/src/skills/index.d.ts +14 -0
  134. package/dist/src/skills/index.d.ts.map +1 -0
  135. package/dist/src/skills/index.js +10 -0
  136. package/dist/src/skills/index.js.map +1 -0
  137. package/dist/src/skills/quick-task/index.d.ts +75 -0
  138. package/dist/src/skills/quick-task/index.d.ts.map +1 -0
  139. package/dist/src/skills/quick-task/index.js +284 -0
  140. package/dist/src/skills/quick-task/index.js.map +1 -0
  141. package/dist/src/skills/registry.d.ts +15 -0
  142. package/dist/src/skills/registry.d.ts.map +1 -0
  143. package/dist/src/skills/registry.js +44 -0
  144. package/dist/src/skills/registry.js.map +1 -0
  145. package/dist/src/skills/review-diff/index.d.ts +96 -0
  146. package/dist/src/skills/review-diff/index.d.ts.map +1 -0
  147. package/dist/src/skills/review-diff/index.js +316 -0
  148. package/dist/src/skills/review-diff/index.js.map +1 -0
  149. package/dist/src/skills/skill.d.ts +24 -0
  150. package/dist/src/skills/skill.d.ts.map +1 -0
  151. package/dist/src/skills/skill.js +39 -0
  152. package/dist/src/skills/skill.js.map +1 -0
  153. package/dist/src/skills/systematic-debugging/index.d.ts +90 -0
  154. package/dist/src/skills/systematic-debugging/index.d.ts.map +1 -0
  155. package/dist/src/skills/systematic-debugging/index.js +305 -0
  156. package/dist/src/skills/systematic-debugging/index.js.map +1 -0
  157. package/dist/src/skills/tdd/index.d.ts +103 -0
  158. package/dist/src/skills/tdd/index.d.ts.map +1 -0
  159. package/dist/src/skills/tdd/index.js +338 -0
  160. package/dist/src/skills/tdd/index.js.map +1 -0
  161. package/dist/src/skills/to-plan/index-enhanced.d.ts +100 -0
  162. package/dist/src/skills/to-plan/index-enhanced.d.ts.map +1 -0
  163. package/dist/src/skills/to-plan/index-enhanced.js +452 -0
  164. package/dist/src/skills/to-plan/index-enhanced.js.map +1 -0
  165. package/dist/src/skills/to-plan/index.d.ts +131 -0
  166. package/dist/src/skills/to-plan/index.d.ts.map +1 -0
  167. package/dist/src/skills/to-plan/index.js +460 -0
  168. package/dist/src/skills/to-plan/index.js.map +1 -0
  169. package/dist/src/skills/types.d.ts +44 -0
  170. package/dist/src/skills/types.d.ts.map +1 -0
  171. package/dist/src/skills/types.js +2 -0
  172. package/dist/src/skills/types.js.map +1 -0
  173. package/dist/src/state/cleanup.d.ts +22 -0
  174. package/dist/src/state/cleanup.d.ts.map +1 -0
  175. package/dist/src/state/cleanup.js +87 -0
  176. package/dist/src/state/cleanup.js.map +1 -0
  177. package/dist/src/state/index.d.ts +9 -0
  178. package/dist/src/state/index.d.ts.map +1 -0
  179. package/dist/src/state/index.js +5 -0
  180. package/dist/src/state/index.js.map +1 -0
  181. package/dist/src/state/manager.d.ts +15 -0
  182. package/dist/src/state/manager.d.ts.map +1 -0
  183. package/dist/src/state/manager.js +73 -0
  184. package/dist/src/state/manager.js.map +1 -0
  185. package/dist/src/state/persistence.d.ts +13 -0
  186. package/dist/src/state/persistence.d.ts.map +1 -0
  187. package/dist/src/state/persistence.js +68 -0
  188. package/dist/src/state/persistence.js.map +1 -0
  189. package/dist/src/state/types.d.ts +26 -0
  190. package/dist/src/state/types.d.ts.map +1 -0
  191. package/dist/src/state/types.js +2 -0
  192. package/dist/src/state/types.js.map +1 -0
  193. package/dist/src/state/validator.d.ts +12 -0
  194. package/dist/src/state/validator.d.ts.map +1 -0
  195. package/dist/src/state/validator.js +56 -0
  196. package/dist/src/state/validator.js.map +1 -0
  197. package/dist/src/types.d.ts +83 -0
  198. package/dist/src/types.d.ts.map +1 -0
  199. package/dist/src/types.js +5 -0
  200. package/dist/src/types.js.map +1 -0
  201. package/dist/src/utils/compress.d.ts +37 -0
  202. package/dist/src/utils/compress.d.ts.map +1 -0
  203. package/dist/src/utils/compress.js +298 -0
  204. package/dist/src/utils/compress.js.map +1 -0
  205. package/dist/src/utils/git.d.ts +9 -0
  206. package/dist/src/utils/git.d.ts.map +1 -0
  207. package/dist/src/utils/git.js +81 -0
  208. package/dist/src/utils/git.js.map +1 -0
  209. package/dist/src/utils/index.d.ts +7 -0
  210. package/dist/src/utils/index.d.ts.map +1 -0
  211. package/dist/src/utils/index.js +7 -0
  212. package/dist/src/utils/index.js.map +1 -0
  213. package/dist/src/utils/logger.d.ts +6 -0
  214. package/dist/src/utils/logger.d.ts.map +1 -0
  215. package/dist/src/utils/logger.js +19 -0
  216. package/dist/src/utils/logger.js.map +1 -0
  217. package/dist/src/utils/paths.d.ts +12 -0
  218. package/dist/src/utils/paths.d.ts.map +1 -0
  219. package/dist/src/utils/paths.js +44 -0
  220. package/dist/src/utils/paths.js.map +1 -0
  221. package/package.json +76 -0
  222. package/scripts/postinstall.js +69 -0
  223. package/yi-workflow.js +17 -0
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Text Compression Utility - Compresses verbose output to terse prose
3
+ *
4
+ * Pure text transformation. No subagent dispatch needed.
5
+ * Use case: Take verbose AI output and compress it to essential facts.
6
+ *
7
+ * Pattern: Input text → Compression rules → Terse output
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Compression rules (pure functions, immutable)
11
+ // ---------------------------------------------------------------------------
12
+ /** Words and phrases that can be removed without losing meaning */
13
+ const FILLER_PATTERNS = [
14
+ { pattern: /\b(?:basically|essentially|fundamentally)\b/gi, replacement: '' },
15
+ { pattern: /\b(?:actually|literally|virtually)\b/gi, replacement: '' },
16
+ { pattern: /\b(?:obviously|clearly|evidently)\b/gi, replacement: '' },
17
+ { pattern: /\b(?:interestingly|notably|importantly)\b/gi, replacement: '' },
18
+ { pattern: /\b(?:I think|I believe|in my opinion|it seems that|it appears that)\b/gi, replacement: '' },
19
+ { pattern: /\b(?:as mentioned|as noted|as discussed|as previously stated)\b/gi, replacement: '' },
20
+ { pattern: /\b(?:it is worth noting that|it should be noted that|note that)\b/gi, replacement: '' },
21
+ { pattern: /\b(?:in order to)\b/gi, replacement: 'to' },
22
+ { pattern: /\b(?:due to the fact that)\b/gi, replacement: 'because' },
23
+ { pattern: /\b(?:at this point in time)\b/gi, replacement: 'now' },
24
+ { pattern: /\b(?:in the event that)\b/gi, replacement: 'if' },
25
+ { pattern: /\b(?:a number of)\b/gi, replacement: 'several' },
26
+ { pattern: /\b(?:the majority of)\b/gi, replacement: 'most' },
27
+ { pattern: /\b(?:a large number of)\b/gi, replacement: 'many' },
28
+ { pattern: /\b(?:in the near future)\b/gi, replacement: 'soon' },
29
+ { pattern: /\b(?:has the ability to)\b/gi, replacement: 'can' },
30
+ { pattern: /\b(?:is able to)\b/gi, replacement: 'can' },
31
+ { pattern: /\b(?:is capable of)\b/gi, replacement: 'can' },
32
+ { pattern: /\b(?:make a decision)\b/gi, replacement: 'decide' },
33
+ { pattern: /\b(?:take into account)\b/gi, replacement: 'consider' },
34
+ { pattern: /\b(?:with regard to|in regard to|with respect to)\b/gi, replacement: 'about' },
35
+ { pattern: /\b(?:in the process of)\b/gi, replacement: '' },
36
+ { pattern: /\b(?:please note that)\b/gi, replacement: '' },
37
+ { pattern: /\b(?:I would like to|I want to|I will now|let me)\b/gi, replacement: '' },
38
+ { pattern: /\b(?:here is|here are|below is|below are)\b/gi, replacement: '' },
39
+ { pattern: /\b(?:the following(?: is| are)?)\b/gi, replacement: '' },
40
+ ];
41
+ /** Section headers that can be collapsed */
42
+ const SECTION_PATTERNS = [
43
+ /^#{1,4}\s+Introduction\b/gim,
44
+ /^#{1,4}\s+Overview\b/gim,
45
+ /^#{1,4}\s+Background\b/gim,
46
+ /^#{1,4}\s+Context\b/gim,
47
+ /^#{1,4}\s+Disclaimer\b/gim,
48
+ /^#{1,4}\s+Note\b/gim,
49
+ /^#{1,4}\s+Notes?\b/gim,
50
+ /^#{1,4}\s+Additional Information\b/gim,
51
+ ];
52
+ /** Lines that are purely transitional and can be removed */
53
+ const TRANSITION_PATTERNS = [
54
+ /^(?:Now|Next|Then|Finally|Firstly|Secondly|Thirdly|Lastly),\s*.+$/gim,
55
+ /^(?:Moving on|Let'?s move on|Let'?s continue).+$/gim,
56
+ /^(?:To summarize|In summary|To conclude|In conclusion|Wrapping up).*$/gim,
57
+ /^(?:Without further ado|As you can see).*$/gim,
58
+ ];
59
+ // ---------------------------------------------------------------------------
60
+ // Core compression functions (pure, immutable)
61
+ // ---------------------------------------------------------------------------
62
+ /**
63
+ * Apply all filler-word replacements to the text.
64
+ * Each rule is applied sequentially on the accumulated result (immutable pattern).
65
+ */
66
+ function removeFillerWords(text) {
67
+ let result = text;
68
+ for (const { pattern, replacement } of FILLER_PATTERNS) {
69
+ result = result.replace(pattern, replacement);
70
+ }
71
+ return result;
72
+ }
73
+ /**
74
+ * Remove known section headers that add no information.
75
+ */
76
+ function removeBoilerplateSections(text) {
77
+ let result = text;
78
+ for (const pattern of SECTION_PATTERNS) {
79
+ // Remove the header line and the following paragraph until next header or blank line
80
+ result = result.replace(new RegExp(`${pattern.source}\\n*(?:[^#\\n]\\n*)*`, 'gim'), '');
81
+ }
82
+ return result;
83
+ }
84
+ /**
85
+ * Remove transitional sentences that don't carry content.
86
+ */
87
+ function removeTransitions(text) {
88
+ let result = text;
89
+ for (const pattern of TRANSITION_PATTERNS) {
90
+ result = result.replace(pattern, '');
91
+ }
92
+ return result;
93
+ }
94
+ /**
95
+ * Collapse multiple blank lines into a single blank line.
96
+ */
97
+ function collapseWhitespace(text) {
98
+ return text
99
+ .replace(/\n{3,}/g, '\n\n')
100
+ .replace(/[ \t]+/g, ' ')
101
+ .replace(/^[ \t]+/gm, '')
102
+ .replace(/[ \t]+$/gm, '')
103
+ .trim();
104
+ }
105
+ /**
106
+ * Collapse repeated sentences (simple cosine of word overlap).
107
+ */
108
+ function deduplicateSentences(text) {
109
+ const sentences = text.match(/[^.!?\n]+[.!?]?/g) ?? [];
110
+ if (sentences.length <= 1)
111
+ return text;
112
+ const seen = new Set();
113
+ const kept = [];
114
+ for (const sentence of sentences) {
115
+ // Normalize for comparison: lowercase, strip punctuation, sort words
116
+ const normalized = sentence
117
+ .toLowerCase()
118
+ .replace(/[^a-z0-9\s]/g, '')
119
+ .trim()
120
+ .split(/\s+/)
121
+ .filter((w) => w.length > 2)
122
+ .sort()
123
+ .join(' ');
124
+ if (normalized.length < 10) {
125
+ kept.push(sentence);
126
+ continue;
127
+ }
128
+ if (seen.has(normalized))
129
+ continue;
130
+ // Check for near-duplicates (Jaccard similarity)
131
+ let isDuplicate = false;
132
+ const words = new Set(normalized.split(' '));
133
+ for (const existing of seen) {
134
+ const existingWords = new Set(existing.split(' '));
135
+ const intersection = [...words].filter((w) => existingWords.has(w)).length;
136
+ const union = new Set([...words, ...existingWords]).size;
137
+ if (union > 0 && intersection / union > 0.7) {
138
+ isDuplicate = true;
139
+ break;
140
+ }
141
+ }
142
+ if (!isDuplicate) {
143
+ seen.add(normalized);
144
+ kept.push(sentence);
145
+ }
146
+ }
147
+ return kept.join(' ');
148
+ }
149
+ /**
150
+ * Extract the key sentences: first sentence, sentences with numbers/data,
151
+ * sentences with key action verbs.
152
+ */
153
+ function extractKeySentences(text) {
154
+ const sentences = text.match(/[^.!?\n]+[.!?]?/g) ?? [];
155
+ if (sentences.length <= 3)
156
+ return text;
157
+ const scored = sentences.map((s, i) => {
158
+ let score = 0;
159
+ // First sentence is important
160
+ if (i === 0)
161
+ score += 3;
162
+ // Sentences with data/numbers
163
+ if (/\d/.test(s))
164
+ score += 2;
165
+ // Sentences with code indicators
166
+ if (/[`'']|```|function|class|import|export|const|let|var/.test(s))
167
+ score += 2;
168
+ // Sentences with action verbs
169
+ if (/\b(must|should|need|require|fix|change|update|create|delete|remove|add)\b/i.test(s))
170
+ score += 2;
171
+ // Short sentences (likely statements of fact)
172
+ if (s.length < 80)
173
+ score += 1;
174
+ // Last sentence (conclusion)
175
+ if (i === sentences.length - 1)
176
+ score += 2;
177
+ return { sentence: s, score };
178
+ });
179
+ // Keep top-scoring sentences (at least 2, at most 60% of original)
180
+ const keepCount = Math.max(2, Math.ceil(sentences.length * 0.6));
181
+ const sorted = [...scored].sort((a, b) => b.score - a.score);
182
+ const kept = sorted.slice(0, keepCount);
183
+ // Restore original order
184
+ const keptSet = new Set(kept.map((k) => k.sentence));
185
+ return sentences.filter((s) => keptSet.has(s)).join(' ');
186
+ }
187
+ /**
188
+ * Convert prose to bullet points by splitting on sentence boundaries
189
+ * and prefixing each meaningful chunk with "-".
190
+ */
191
+ function toBullets(text) {
192
+ const sentences = text.match(/[^.!?\n]+[.!?]?/g) ?? [];
193
+ if (sentences.length <= 1)
194
+ return text;
195
+ return sentences
196
+ .map((s) => s.trim())
197
+ .filter((s) => s.length > 5)
198
+ .map((s) => `- ${s}`)
199
+ .join('\n');
200
+ }
201
+ /**
202
+ * Convert text to a single line by replacing all newlines with spaces.
203
+ */
204
+ function toOneLine(text) {
205
+ return text.replace(/\n+/g, ' ').replace(/\s{2,}/g, ' ').trim();
206
+ }
207
+ /**
208
+ * Truncate text to maxLength characters, preserving word boundaries.
209
+ */
210
+ function truncateToMaxLength(text, maxLength) {
211
+ if (text.length <= maxLength)
212
+ return text;
213
+ const truncated = text.slice(0, maxLength);
214
+ const lastSpace = truncated.lastIndexOf(' ');
215
+ if (lastSpace > maxLength * 0.8) {
216
+ return truncated.slice(0, lastSpace) + '...';
217
+ }
218
+ return truncated + '...';
219
+ }
220
+ /**
221
+ * Count the number of sections (markdown headers) in the text.
222
+ */
223
+ function countSections(text) {
224
+ const matches = text.match(/^#{1,4}\s+.+$/gm);
225
+ return matches ? matches.length : 0;
226
+ }
227
+ // ---------------------------------------------------------------------------
228
+ // Main compression pipeline
229
+ // ---------------------------------------------------------------------------
230
+ /**
231
+ * Compress verbose text through a pipeline of transformations.
232
+ * All steps are pure functions that return new strings (immutable pattern).
233
+ */
234
+ export function compressText(text, options) {
235
+ const originalLength = text.length;
236
+ const sectionsBefore = countSections(text);
237
+ // Stage 1: Remove filler words and verbose phrases
238
+ let result = removeFillerWords(text);
239
+ // Stage 2: Remove boilerplate sections
240
+ result = removeBoilerplateSections(result);
241
+ // Stage 3: Remove transitional fluff
242
+ result = removeTransitions(result);
243
+ // Stage 4: Deduplicate near-identical sentences
244
+ result = deduplicateSentences(result);
245
+ // Stage 5: Extract key sentences when text is lengthy
246
+ if (result.length > 500) {
247
+ result = extractKeySentences(result);
248
+ }
249
+ // Stage 6: Apply style formatting
250
+ switch (options.style) {
251
+ case 'bullets':
252
+ result = toBullets(result);
253
+ break;
254
+ case 'oneline':
255
+ result = toOneLine(result);
256
+ break;
257
+ case 'terse':
258
+ // Terse is the default prose after all prior stages
259
+ break;
260
+ }
261
+ // Stage 7: Collapse whitespace
262
+ result = collapseWhitespace(result);
263
+ // Stage 8: Truncate if needed
264
+ if (options.maxLength && result.length > options.maxLength) {
265
+ result = truncateToMaxLength(result, options.maxLength);
266
+ }
267
+ const sectionsAfter = countSections(result);
268
+ const compressedLength = result.length;
269
+ const compressionRatio = originalLength > 0
270
+ ? Math.round(((originalLength - compressedLength) / originalLength) * 100) / 100
271
+ : 0;
272
+ return {
273
+ compressed: result,
274
+ originalLength,
275
+ compressedLength,
276
+ compressionRatio,
277
+ sectionsRemoved: Math.max(0, sectionsBefore - sectionsAfter),
278
+ };
279
+ }
280
+ /**
281
+ * Convenience function for terse compression
282
+ */
283
+ export function compressTerse(text, maxLength) {
284
+ return compressText(text, { style: 'terse', maxLength }).compressed;
285
+ }
286
+ /**
287
+ * Convenience function for bullet compression
288
+ */
289
+ export function compressBullets(text, maxLength) {
290
+ return compressText(text, { style: 'bullets', maxLength }).compressed;
291
+ }
292
+ /**
293
+ * Convenience function for one-line compression
294
+ */
295
+ export function compressOneLine(text, maxLength) {
296
+ return compressText(text, { style: 'oneline', maxLength }).compressed;
297
+ }
298
+ //# sourceMappingURL=compress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../../../src/utils/compress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function getCurrentBranch(cwd: string): string;
2
+ export declare function getBaseBranch(cwd: string): string | null;
3
+ export declare function isWorktree(cwd: string): boolean;
4
+ export declare function getWorktreePath(cwd: string): string | null;
5
+ export declare function hasUncommittedChanges(cwd: string): boolean;
6
+ export declare function commitChanges(cwd: string, message: string): void;
7
+ export declare function mergeBranch(cwd: string, branch: string, base: string): void;
8
+ export declare function deleteBranch(cwd: string, branch: string): void;
9
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../../src/utils/git.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASpD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcxD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAU/C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW1D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG3E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9D"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Git utility functions
3
+ */
4
+ import { execSync } from 'child_process';
5
+ export function getCurrentBranch(cwd) {
6
+ try {
7
+ return execSync('git rev-parse --abbrev-ref HEAD', {
8
+ cwd,
9
+ encoding: 'utf-8',
10
+ }).trim();
11
+ }
12
+ catch {
13
+ throw new Error('Not a git repository');
14
+ }
15
+ }
16
+ export function getBaseBranch(cwd) {
17
+ try {
18
+ // Try main first
19
+ execSync('git rev-parse --verify main', { cwd });
20
+ return 'main';
21
+ }
22
+ catch {
23
+ try {
24
+ // Fallback to master
25
+ execSync('git rev-parse --verify master', { cwd });
26
+ return 'master';
27
+ }
28
+ catch {
29
+ return null;
30
+ }
31
+ }
32
+ }
33
+ export function isWorktree(cwd) {
34
+ try {
35
+ const gitDir = execSync('git rev-parse --git-dir', {
36
+ cwd,
37
+ encoding: 'utf-8',
38
+ }).trim();
39
+ return gitDir.includes('.git/worktrees');
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ export function getWorktreePath(cwd) {
46
+ if (!isWorktree(cwd))
47
+ return null;
48
+ try {
49
+ return execSync('git rev-parse --show-toplevel', {
50
+ cwd,
51
+ encoding: 'utf-8',
52
+ }).trim();
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ export function hasUncommittedChanges(cwd) {
59
+ try {
60
+ const status = execSync('git status --porcelain', {
61
+ cwd,
62
+ encoding: 'utf-8',
63
+ });
64
+ return status.trim().length > 0;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ export function commitChanges(cwd, message) {
71
+ execSync('git add -A', { cwd });
72
+ execSync(`git commit -m "${message}"`, { cwd });
73
+ }
74
+ export function mergeBranch(cwd, branch, base) {
75
+ execSync(`git checkout ${base}`, { cwd });
76
+ execSync(`git merge ${branch}`, { cwd });
77
+ }
78
+ export function deleteBranch(cwd, branch) {
79
+ execSync(`git branch -D ${branch}`, { cwd });
80
+ }
81
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,iCAAiC,EAAE;YACjD,GAAG;YACH,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,iBAAiB;QACjB,QAAQ,CAAC,6BAA6B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;QAChD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,qBAAqB;YACrB,QAAQ,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YAClD,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,yBAAyB,EAAE;YACjD,GAAG;YACH,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAA;QACT,OAAO,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IAEjC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,+BAA+B,EAAE;YAC/C,GAAG;YACH,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,wBAAwB,EAAE;YAChD,GAAG;YACH,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,OAAe;IACxD,QAAQ,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/B,QAAQ,CAAC,kBAAkB,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAc,EAAE,IAAY;IACnE,QAAQ,CAAC,gBAAgB,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACzC,QAAQ,CAAC,aAAa,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,MAAc;IACtD,QAAQ,CAAC,iBAAiB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Utilities index
3
+ */
4
+ export * from './logger.js';
5
+ export * from './paths.js';
6
+ export * from './git.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Utilities index
3
+ */
4
+ export * from './logger.js';
5
+ export * from './paths.js';
6
+ export * from './git.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Logger utility for yi-workflow
3
+ */
4
+ import type { Logger } from '../types.js';
5
+ export declare function createLogger(verbose?: boolean): Logger;
6
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,wBAAgB,YAAY,CAAC,OAAO,UAAQ,GAAG,MAAM,CAiBpD"}
@@ -0,0 +1,19 @@
1
+ export function createLogger(verbose = false) {
2
+ return {
3
+ info: (message, ...args) => {
4
+ console.log(`[INFO] ${message}`, ...args);
5
+ },
6
+ warn: (message, ...args) => {
7
+ console.warn(`[WARN] ${message}`, ...args);
8
+ },
9
+ error: (message, ...args) => {
10
+ console.error(`[ERROR] ${message}`, ...args);
11
+ },
12
+ debug: (message, ...args) => {
13
+ if (verbose) {
14
+ console.log(`[DEBUG] ${message}`, ...args);
15
+ }
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,YAAY,CAAC,OAAO,GAAG,KAAK;IAC1C,OAAO;QACL,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;YAC5C,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;QAC3C,CAAC;QACD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;YAC5C,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;QAC5C,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;YAC7C,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAe,EAAE,EAAE;YAC7C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare function getPackageRoot(): string;
2
+ export declare function getConfigPath(): string;
3
+ export declare function getCachePath(): string;
4
+ export declare function getPiPath(cwd: string): string;
5
+ export declare function getPlansPath(cwd: string): string;
6
+ export declare function getStatePath(cwd: string): string;
7
+ export declare function getActivePlansPath(cwd: string): string;
8
+ export declare function getArchivePlansPath(cwd: string): string;
9
+ export declare function getActiveStatePath(cwd: string): string;
10
+ export declare function getArchiveStatePath(cwd: string): string;
11
+ export declare function generatePlanFileName(topic: string): string;
12
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1D"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Path management utilities
3
+ */
4
+ import { join, dirname, resolve } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { homedir } from 'os';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ export function getPackageRoot() {
10
+ return resolve(__dirname, '../..');
11
+ }
12
+ export function getConfigPath() {
13
+ return join(homedir(), '.config', 'yi-workflow', 'config.json');
14
+ }
15
+ export function getCachePath() {
16
+ return join(homedir(), '.cache', 'yi-workflow');
17
+ }
18
+ export function getPiPath(cwd) {
19
+ return join(cwd, '.pi');
20
+ }
21
+ export function getPlansPath(cwd) {
22
+ return join(cwd, '.pi', 'plans');
23
+ }
24
+ export function getStatePath(cwd) {
25
+ return join(cwd, '.pi', 'yi-workflow', 'state');
26
+ }
27
+ export function getActivePlansPath(cwd) {
28
+ return join(getPlansPath(cwd), 'active');
29
+ }
30
+ export function getArchivePlansPath(cwd) {
31
+ return join(getPlansPath(cwd), 'archive');
32
+ }
33
+ export function getActiveStatePath(cwd) {
34
+ return join(getStatePath(cwd), 'active');
35
+ }
36
+ export function getArchiveStatePath(cwd) {
37
+ return join(getStatePath(cwd), 'archive');
38
+ }
39
+ export function generatePlanFileName(topic) {
40
+ const date = new Date().toISOString().split('T')[0];
41
+ const sanitized = topic.toLowerCase().replace(/[^a-z0-9]+/g, '-');
42
+ return `${date}-${sanitized}-implementation-plan.md`;
43
+ }
44
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IACjE,OAAO,GAAG,IAAI,IAAI,SAAS,yBAAyB,CAAA;AACtD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@haoyiyin/workflow",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "description": "Production workflow skills for planning, executing, reviewing, and finishing coding-agent work",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "yi-workflow": "./dist/bin/yi-workflow.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "clean": "rm -rf dist",
15
+ "prepublishOnly": "npm run clean && npm run build",
16
+ "postinstall": "node scripts/postinstall.js",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest",
19
+ "test:coverage": "vitest run --coverage"
20
+ },
21
+ "keywords": [
22
+ "claude-code",
23
+ "workflow",
24
+ "pi",
25
+ "skills",
26
+ "hooks",
27
+ "planning",
28
+ "execution"
29
+ ],
30
+ "author": "yi",
31
+ "license": "MIT",
32
+ "files": [
33
+ "dist/",
34
+ "scripts/",
35
+ "yi-workflow.js",
36
+ "README.md",
37
+ "SETUP.md",
38
+ "USAGE.md",
39
+ "SKILL.md"
40
+ ],
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "dependencies": {
45
+ "chalk": "^5.3.0",
46
+ "commander": "^11.0.0",
47
+ "nanoid": "^5.0.0",
48
+ "zod": "^3.22.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^20.0.0",
52
+ "typescript": "^5.9.3",
53
+ "vitest": "^1.0.0"
54
+ },
55
+ "pi": {
56
+ "extensions": ["./dist/pi-extension.js"],
57
+ "skills": [
58
+ "./dist/skills/to-plan/SKILL.md",
59
+ "./dist/skills/execute-plan/SKILL.md",
60
+ "./dist/skills/quick-task/SKILL.md",
61
+ "./dist/skills/review-diff/SKILL.md",
62
+ "./dist/skills/tdd/SKILL.md",
63
+ "./dist/skills/systematic-debugging/SKILL.md",
64
+ "./dist/skills/agents-md/SKILL.md"
65
+ ],
66
+ "prompts": ["./dist/prompts"],
67
+ "config": {
68
+ "planPath": ".pi/plans",
69
+ "statePath": ".pi/yi-workflow/state",
70
+ "autoCleanup": true,
71
+ "autoMerge": true,
72
+ "defaultModel": "haiku",
73
+ "maxConcurrent": 4
74
+ }
75
+ }
76
+ }