dowafu 0.3.2 → 0.4.1

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 (35) hide show
  1. package/README.md +9 -5
  2. package/README_zh-tw.md +12 -7
  3. package/dist/audit.js +8 -2
  4. package/dist/messages.js +6 -0
  5. package/dist/report.js +11 -0
  6. package/package.json +1 -2
  7. package/providers.json +12 -10
  8. package/publish/en/.agents/skills/find-holes-external/SKILL.md +0 -450
  9. package/publish/en/.agents/skills/preflight/SKILL.md +0 -137
  10. package/publish/en/.agents/skills/wrap/SKILL.md +0 -64
  11. package/publish/en/.claude/agents/explore-haiku.md +0 -8
  12. package/publish/en/.claude/agents/hole-finder-cost.md +0 -15
  13. package/publish/en/.claude/agents/hole-finder-feasibility.md +0 -15
  14. package/publish/en/.claude/agents/hole-finder-safety.md +0 -15
  15. package/publish/en/.claude/agents/hole-finder.md +0 -14
  16. package/publish/en/.claude/skills/find-holes/SKILL.md +0 -114
  17. package/publish/en/.claude/skills/find-holes-external/SKILL.md +0 -463
  18. package/publish/en/.claude/skills/preflight/SKILL.md +0 -198
  19. package/publish/en/.claude/skills/wrap/SKILL.md +0 -61
  20. package/publish/en/README.md +0 -106
  21. package/publish/en/workflow_spec.md +0 -71
  22. package/publish/zh-tw/.agents/skills/find-holes-external/SKILL.md +0 -593
  23. package/publish/zh-tw/.agents/skills/preflight/SKILL.md +0 -168
  24. package/publish/zh-tw/.agents/skills/wrap/SKILL.md +0 -65
  25. package/publish/zh-tw/.claude/agents/explore-haiku.md +0 -8
  26. package/publish/zh-tw/.claude/agents/hole-finder-cost.md +0 -15
  27. package/publish/zh-tw/.claude/agents/hole-finder-feasibility.md +0 -15
  28. package/publish/zh-tw/.claude/agents/hole-finder-safety.md +0 -15
  29. package/publish/zh-tw/.claude/agents/hole-finder.md +0 -14
  30. package/publish/zh-tw/.claude/skills/find-holes/SKILL.md +0 -140
  31. package/publish/zh-tw/.claude/skills/find-holes-external/SKILL.md +0 -609
  32. package/publish/zh-tw/.claude/skills/preflight/SKILL.md +0 -241
  33. package/publish/zh-tw/.claude/skills/wrap/SKILL.md +0 -62
  34. package/publish/zh-tw/README.md +0 -91
  35. package/publish/zh-tw/workflow_spec.md +0 -65
package/README.md CHANGED
@@ -172,15 +172,19 @@ not work: a reviewer's fixed closing line has to match the template the audit ch
172
172
  against.
173
173
 
174
174
  ```bash
175
+ npx degit eyesofkids/dowafu/publish/en#v0.4.0 .claude-pack # or publish/zh-tw
176
+
177
+ cd .claude-pack
175
178
  TARGET=<your project>
176
- SRC=publish/en # or publish/zh-tw
177
179
  mkdir -p "$TARGET/.claude/skills" "$TARGET/.claude/agents" "$TARGET/.agents/skills"
178
- cp -R "$SRC/.claude/skills/." "$TARGET/.claude/skills/"
179
- cp -R "$SRC/.agents/skills/." "$TARGET/.agents/skills/"
180
- cp "$SRC"/.claude/agents/*.md "$TARGET/.claude/agents/"
181
- cp "$SRC/workflow_spec.md" "$TARGET/"
180
+ cp -R .claude/skills/. "$TARGET/.claude/skills/"
181
+ cp -R .agents/skills/. "$TARGET/.agents/skills/"
182
+ cp .claude/agents/*.md "$TARGET/.claude/agents/"
183
+ cp workflow_spec.md "$TARGET/"
182
184
  ```
183
185
 
186
+ Once fetched, run `dowafu --doctor` to confirm it recognizes all the lenses.
187
+
184
188
  Once the files are in place, have the agent run `preflight` before anything else — it is the check that tells you whether the copy actually took effect in this project's setup.
185
189
 
186
190
  See `publish/en/README.md` — or `publish/zh-tw/README.md` — for the details, each written
package/README_zh-tw.md CHANGED
@@ -9,7 +9,9 @@
9
9
  相容於各種支援標準SKILL的AI Agent程式與VS Code擴充套件包含以下,但還有更多:
10
10
 
11
11
  - Claude Code
12
- - VS Code Codepilot
12
+ - VS Code Copilot(內建)
13
+ - Codex(擴充套件)
14
+ - Google Antigravity IDE
13
15
 
14
16
  **spoke 產出的是意見,不是裁決。** 那些意見要怎麼處理,仍然由你決定。
15
17
 
@@ -173,17 +175,20 @@ tmp/spoke/<ticket-id>/
173
175
  `publish/` 提供兩種語言:`publish/en/` 與 `publish/zh-tw/`。**擇一複製,不可混裝**——審查者的固定收尾句必須與稽核檢查用的範本是同一種語言。
174
176
 
175
177
  ```bash
176
- TARGET=<your project>
177
- SRC=publish/zh-tw # 或 publish/en
178
+ npx degit eyesofkids/dowafu/publish/zh-tw#v0.4.0 .claude-pack # 或 publish/en
178
179
 
180
+ cd .claude-pack
181
+ TARGET=<your project>
179
182
  mkdir -p "$TARGET/.claude/skills" "$TARGET/.claude/agents" "$TARGET/.agents/skills"
180
183
 
181
- cp -R "$SRC/.claude/skills/." "$TARGET/.claude/skills/"
182
- cp -R "$SRC/.agents/skills/." "$TARGET/.agents/skills/"
183
- cp "$SRC"/.claude/agents/*.md "$TARGET/.claude/agents/"
184
- cp "$SRC/workflow_spec.md" "$TARGET/"
184
+ cp -R .claude/skills/. "$TARGET/.claude/skills/"
185
+ cp -R .agents/skills/. "$TARGET/.agents/skills/"
186
+ cp .claude/agents/*.md "$TARGET/.claude/agents/"
187
+ cp workflow_spec.md "$TARGET/"
185
188
  ```
186
189
 
190
+ 抓完跑 `dowafu --doctor` 確認 lens 都認得出來。
191
+
187
192
  詳細內容請參考該語言目錄下的 README:
188
193
 
189
194
  ```text
package/dist/audit.js CHANGED
@@ -56,15 +56,21 @@ function countTemplatePlaceholders(finalText) {
56
56
  const OBSERVATION_PATTERNS = [
57
57
  /^\d+\.\s/, // 頂層有序清單:"1. "(範本原定格式)
58
58
  /^\*\*\d+\.\s/, // 粗體包住編號:"**1. 內容**"(plan_fixes_v1.0.md §1:兩輪各中一次,數不出來時誤判「無法計數」)
59
- /^(?:\*\*)?觀察\s*\d+(?:\.\d+)?(?:\*\*)?[::]/, // 巢狀觀察標記:"**觀察 1.1**:" "觀察 1:"
59
+ // 工單 B2 §五:分隔符原本只認 `.`,`觀察 1-1` 這種連字號分隔過不了;`**` 收尾前也
60
+ // 原本不容許任何字,`**觀察 1-2(問題)**` 這種帶括號註記的過不了。就地放寬兩處,
61
+ // 陣列位置不動——insertion 只在既有第 3 條內擴充,不影響前兩條已經接住的既有九格。
62
+ /^(?:\*\*)?觀察\s*\d+(?:[.-]\d+)?(?:[^\n::]*)?(?:\*\*)?[::]/, // "**觀察 1.1**:"/"觀察 1-1:"/"**觀察 1-2(問題)**:"
60
63
  /^#{2,4}\s*觀察\s*\d+/, // 標題形式:"### 觀察 1"
61
- /^(?:\*\*)?Observation\s*\d+(?:\.\d+)?(?:\*\*)?[::]/i, // 英文模板的巢狀標記
64
+ /^(?:\*\*)?Observation\s*\d+(?:[.-]\d+)?(?:[^\n::]*)?(?:\*\*)?[::]/i, // 英文模板同步放寬,避免中英兩套樣式不對稱
62
65
  /^#{2,4}\s*Observation\s*\d+/i, // 英文模板的標題形式
63
66
  // real-run-i18n-lang(2026-08-12):`deepseek-v4-flash` 的中文格寫成 `## 1. 「比照 tags 路由」…`
64
67
  // ——標題形式但編號後面直接是內容,沒有「觀察」二字,上面兩條標題樣式都認不出來,於是整份
65
68
  // 判「無法計數」。**那是本次唯一一項「中文格看起來比英文格差」的來源,而它與語言無關。**
66
69
  // 放在最後:前面任何一條命中就不會走到這裡,所以不會蓋掉既有判讀。
67
70
  /^#{2,4}\s*\d+[.、]/,
71
+ // 工單 B2 §五:i18n-fh-dsfl-r2 的實際形態——把觀察掛在題號底下,`Q<題號>-<序號>` 開頭,
72
+ // 沒有「觀察」二字、沒有粗體、沒有冒號。新增在陣列最後,不影響前面樣式已接住的判讀。
73
+ /^Q\d+-\d+\s/,
68
74
  ];
69
75
  function countObservations(observationsBody) {
70
76
  if (observationsBody.trim().length === 0)
package/dist/messages.js CHANGED
@@ -167,6 +167,9 @@ const MESSAGES = {
167
167
  tpmPeakLine: (provider, limit, peak) => ` ${provider} tpmLimit ${limit},靜態估算峰值 ${peak}`,
168
168
  tpmPeakCaveat: () => " └ 僅為靜態指標,不預測執行中的 TPM 曲線(429 等待會改變實際並行數)",
169
169
  allowedReadsSummary: (n, outDir) => ` 允許讀取 ${n} 個檔案,輸出至 ${outDir}/`,
170
+ allowedReadsListEntry: (path) => ` ${path}`,
171
+ allowedReadsListFolded: (n) => ` …另 ${n} 個`,
172
+ allowedReadsListEmpty: () => " (允許清單為空)",
170
173
  lensClosingLineZh: (agent) => `ℹ ${agent} 的 lens 收尾句符合中文版固定收尾句`,
171
174
  lensClosingLineEn: (agent) => `ℹ ${agent} 的 lens 收尾句符合英文版固定收尾句`,
172
175
  modelPricing: (input, output, cachedSuffix, asOfSuffix) => ` └ 單價 每 M token:input $${input}/output $${output}${cachedSuffix}${asOfSuffix}`,
@@ -355,6 +358,9 @@ const MESSAGES = {
355
358
  tpmPeakLine: (provider, limit, peak) => ` ${provider} tpmLimit ${limit}, statically estimated peak ${peak}`,
356
359
  tpmPeakCaveat: () => " └ Static indicator only; does not predict the in-flight TPM curve (429 waits change actual concurrency)",
357
360
  allowedReadsSummary: (n, outDir) => ` Allowed reads: ${n} file(s), output to ${outDir}/`,
361
+ allowedReadsListEntry: (path) => ` ${path}`,
362
+ allowedReadsListFolded: (n) => ` …and ${n} more`,
363
+ allowedReadsListEmpty: () => " (Allowlist is empty)",
358
364
  lensClosingLineZh: (agent) => `ℹ ${agent}'s lens closing line matches the Chinese fixed closing line`,
359
365
  lensClosingLineEn: (agent) => `ℹ ${agent}'s lens closing line matches the English fixed closing line`,
360
366
  modelPricing: (input, output, cachedSuffix, asOfSuffix) => ` └ Price per M tokens: input $${input} / output $${output}${cachedSuffix}${asOfSuffix}`,
package/dist/report.js CHANGED
@@ -89,6 +89,17 @@ export function buildReport(ticketId, spokes, estimates, allowlistEstimates, cli
89
89
  `store=${spoke.providerConfig.store === false ? "false" : "n/a"} ` +
90
90
  `est. ${est.toLocaleString()} cap ${cap.toLocaleString()}`);
91
91
  lines.push(` ${formatModelPricing(spoke, lang)}`);
92
+ if (spoke.allowedReadsRelative.length === 0) {
93
+ lines.push(m(lang, "allowedReadsListEmpty"));
94
+ }
95
+ else {
96
+ for (const path of spoke.allowedReadsRelative.slice(0, 8)) {
97
+ lines.push(m(lang, "allowedReadsListEntry", path));
98
+ }
99
+ const remaining = spoke.allowedReadsRelative.length - 8;
100
+ if (remaining > 0)
101
+ lines.push(m(lang, "allowedReadsListFolded", remaining));
102
+ }
92
103
  const closingLineNotice = formatLensClosingLineNotice(spoke, lang);
93
104
  if (closingLineNotice)
94
105
  lines.push(` ${closingLineNotice}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dowafu",
3
- "version": "0.3.2",
3
+ "version": "0.4.1",
4
4
  "description": "Send a section of your design doc to external LLMs for review. They read only the files you whitelist, and nothing is billed until you confirm.",
5
5
  "keywords": [
6
6
  "llm",
@@ -33,7 +33,6 @@
33
33
  "files": [
34
34
  "dist",
35
35
  "providers.json",
36
- "publish",
37
36
  "README_zh-tw.md"
38
37
  ],
39
38
  "scripts": {
package/providers.json CHANGED
@@ -14,11 +14,11 @@
14
14
  "charsPerToken": 1.0,
15
15
  "tpmLimit": 200000,
16
16
  "maxSpokeTokens": null,
17
- "pricingSource": { "url": "https://developers.openai.com/api/docs/pricing", "asOf": "2026-08-09" },
17
+ "pricingSource": { "url": "https://developers.openai.com/api/docs/pricing", "asOf": "2026-08-29", "note": "gpt-5.6-sol 目前為優惠價" },
18
18
  "pricing": {
19
19
  "gpt-5.6-luna": { "inputPerM": 0.20, "cachedInputPerM": 0.02, "outputPerM": 1.20 },
20
20
  "gpt-5.6-terra": { "inputPerM": 2.00, "cachedInputPerM": 0.20, "outputPerM": 12.00 },
21
- "gpt-5.6-sol": { "inputPerM": 5.00, "cachedInputPerM": 0.50, "outputPerM": 30.00 }
21
+ "gpt-5.6-sol": { "inputPerM": 4.00, "cachedInputPerM": 0.40, "outputPerM": 20.00 }
22
22
  }
23
23
  },
24
24
  "deepseek": {
@@ -37,8 +37,8 @@
37
37
  "maxSpokeTokens": null,
38
38
  "pricingSource": {
39
39
  "url": "https://api-docs.deepseek.com/quick_start/pricing/",
40
- "asOf": "2026-08-14",
41
- "note": "本表填的是 2026-08-16 16:00 UTC 起生效的尖峰價。在此之前官方仍收舊價(flash 0.0028/0.14/0.28、pro 0.003625/0.435/0.87),所以生效前本表偏高。離峰(尖峰時段 01:00-04:00 與 06:00-10:00 UTC 以外)為尖峰的一半;本檔一個型號只放得下一組價,取尖峰=取上限。"
40
+ "asOf": "2026-08-29",
41
+ "note": "離峰(尖峰時段 01:00-04:00 與 06:00-10:00 UTC 以外)為尖峰的一半;本檔一個型號只放得下一組價,取尖峰=取上限。"
42
42
  },
43
43
  "pricing": {
44
44
  "deepseek-v4-flash": { "inputPerM": 0.44, "cachedInputPerM": 0.014, "outputPerM": 1.32 },
@@ -55,15 +55,16 @@
55
55
  "allowed": ["minimal", "low", "medium", "high"],
56
56
  "default": "high"
57
57
  },
58
- "models": ["gemini-3.1-flash-lite", "gemini-3.5-flash-lite", "gemini-3.6-flash"],
58
+ "models": ["gemini-3.1-flash-lite", "gemini-3.5-flash-lite", "gemini-3.6-flash", "gemini-3.7-flash"],
59
59
  "charsPerToken": 1.0,
60
60
  "tpmLimit": null,
61
61
  "maxSpokeTokens": null,
62
- "pricingSource": { "url": "https://ai.google.dev/gemini-api/docs/pricing", "asOf": "2026-08-09", "note": "文字/圖片/影片價;音訊另計。output 價含 thinking tokens" },
62
+ "pricingSource": { "url": "https://ai.google.dev/gemini-api/docs/pricing", "asOf": "2026-08-29", "note": "文字/圖片/影片價;音訊另計。output 價含 thinking tokens。gemini-3.6-flash/gemini-3.7-flash 目前為優惠價" },
63
63
  "pricing": {
64
64
  "gemini-3.1-flash-lite": { "inputPerM": 0.25, "cachedInputPerM": 0.025, "outputPerM": 1.50 },
65
65
  "gemini-3.5-flash-lite": { "inputPerM": 0.30, "cachedInputPerM": 0.03, "outputPerM": 2.50 },
66
- "gemini-3.6-flash": { "inputPerM": 1.50, "cachedInputPerM": 0.15, "outputPerM": 7.50 }
66
+ "gemini-3.6-flash": { "inputPerM": 0.75, "cachedInputPerM": 0.075, "outputPerM": 3.75 },
67
+ "gemini-3.7-flash": { "inputPerM": 0.75, "cachedInputPerM": 0.075, "outputPerM": 3.75 }
67
68
  }
68
69
  },
69
70
  "anthropic": {
@@ -76,14 +77,15 @@
76
77
  "allowed": ["low", "medium", "high", "xhigh", "max"],
77
78
  "default": "high"
78
79
  },
79
- "models": ["claude-opus-5", "claude-sonnet-5"],
80
+ "models": ["claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5-20251001"],
80
81
  "charsPerToken": 1.0,
81
82
  "tpmLimit": null,
82
83
  "maxSpokeTokens": null,
83
- "pricingSource": { "url": "https://platform.claude.com/docs/en/about-claude/pricing", "asOf": "2026-08-09", "note": "sonnet-5 為 2026-08-31 前的優惠價,之後為 3.00/15.00" },
84
+ "pricingSource": { "url": "https://platform.claude.com/docs/en/about-claude/pricing", "asOf": "2026-08-29" },
84
85
  "pricing": {
85
86
  "claude-opus-5": { "inputPerM": 5.00, "cachedInputPerM": 0.50, "cacheWritePerM": 6.25, "outputPerM": 25.00 },
86
- "claude-sonnet-5": { "inputPerM": 2.00, "cachedInputPerM": 0.20, "cacheWritePerM": 2.50, "outputPerM": 10.00 }
87
+ "claude-sonnet-5": { "inputPerM": 2.00, "cachedInputPerM": 0.20, "cacheWritePerM": 2.50, "outputPerM": 10.00 },
88
+ "claude-haiku-4-5-20251001": { "inputPerM": 1.00, "cachedInputPerM": 0.10, "cacheWritePerM": 1.25, "outputPerM": 5.00 }
87
89
  }
88
90
  }
89
91
  }