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.
- package/README.md +9 -5
- package/README_zh-tw.md +12 -7
- package/dist/audit.js +8 -2
- package/dist/messages.js +6 -0
- package/dist/report.js +11 -0
- package/package.json +1 -2
- package/providers.json +12 -10
- package/publish/en/.agents/skills/find-holes-external/SKILL.md +0 -450
- package/publish/en/.agents/skills/preflight/SKILL.md +0 -137
- package/publish/en/.agents/skills/wrap/SKILL.md +0 -64
- package/publish/en/.claude/agents/explore-haiku.md +0 -8
- package/publish/en/.claude/agents/hole-finder-cost.md +0 -15
- package/publish/en/.claude/agents/hole-finder-feasibility.md +0 -15
- package/publish/en/.claude/agents/hole-finder-safety.md +0 -15
- package/publish/en/.claude/agents/hole-finder.md +0 -14
- package/publish/en/.claude/skills/find-holes/SKILL.md +0 -114
- package/publish/en/.claude/skills/find-holes-external/SKILL.md +0 -463
- package/publish/en/.claude/skills/preflight/SKILL.md +0 -198
- package/publish/en/.claude/skills/wrap/SKILL.md +0 -61
- package/publish/en/README.md +0 -106
- package/publish/en/workflow_spec.md +0 -71
- package/publish/zh-tw/.agents/skills/find-holes-external/SKILL.md +0 -593
- package/publish/zh-tw/.agents/skills/preflight/SKILL.md +0 -168
- package/publish/zh-tw/.agents/skills/wrap/SKILL.md +0 -65
- package/publish/zh-tw/.claude/agents/explore-haiku.md +0 -8
- package/publish/zh-tw/.claude/agents/hole-finder-cost.md +0 -15
- package/publish/zh-tw/.claude/agents/hole-finder-feasibility.md +0 -15
- package/publish/zh-tw/.claude/agents/hole-finder-safety.md +0 -15
- package/publish/zh-tw/.claude/agents/hole-finder.md +0 -14
- package/publish/zh-tw/.claude/skills/find-holes/SKILL.md +0 -140
- package/publish/zh-tw/.claude/skills/find-holes-external/SKILL.md +0 -609
- package/publish/zh-tw/.claude/skills/preflight/SKILL.md +0 -241
- package/publish/zh-tw/.claude/skills/wrap/SKILL.md +0 -62
- package/publish/zh-tw/README.md +0 -91
- 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
|
|
179
|
-
cp -R
|
|
180
|
-
cp
|
|
181
|
-
cp
|
|
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
|
|
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
|
-
|
|
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
|
|
182
|
-
cp -R
|
|
183
|
-
cp
|
|
184
|
-
cp
|
|
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
|
-
|
|
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+(
|
|
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
|
+
"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-
|
|
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":
|
|
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-
|
|
41
|
-
"note": "
|
|
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-
|
|
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":
|
|
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-
|
|
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
|
}
|