بنقرة واحدة
concept-refactor
審計、修復並重構 Semorphe 已有的語言概念實作。 偵測四路完備性缺口、信心等級違規、雙重註冊、死概念, 並自動修復缺失的產出物。用於清理技術債和確保第一性原理合規性。 支援任何語言。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
審計、修復並重構 Semorphe 已有的語言概念實作。 偵測四路完備性缺口、信心等級違規、雙重註冊、死概念, 並自動修復缺失的產出物。用於清理技術債和確保第一性原理合規性。 支援任何語言。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
研究程式語言的函式庫、標準標頭檔或語言特性。從文件和網路資源中探索函式簽名、 常見用法模式,按 Topic 層級樹分類,並依 Semorphe 慣例提出概念命名。 用於新增任何語言的函式庫、標頭檔或語言特性支援時。
為概念探索報告中定義的概念產生 BlockSpec JSON、程式碼產生器、提升器和渲染映射。 產生在 Semorphe 語義樹管線中支援新概念所需的所有產出物。 在 /concept.discover 之後使用,用於建立實作產出物。支援任何語言。
新 Semorphe 概念的最終整合關卡。執行所有驗證步驟 (TypeScript 編譯、單元測試、round-trip 測試、模糊測試), 然後將通過的概念整合到程式碼庫中並完成正確的註冊。 在 /concept.generate 之後作為最終步驟使用。支援任何語言。
為 Semorphe 新增概念的端到端管線。 串接全部 5 個概念 skill:discover → generate → roundtrip → fuzz → integrate。 當你想從「我要支援 <特性>」到完全整合的概念,用一個指令完成時使用。 支援任何語言。
為 Semorphe 的程式碼↔積木管線產生資訊隔離的模糊測試。 使用雙代理架構:Agent A(不知道實作)寫真實程式, Agent B 驗證 round-trip 正確性和編譯器/直譯器輸出等價性。 用於找出實作感知測試會遺漏的邊界案例和 bug。支援任何語言。
對特定程式透過 Semorphe 管線執行目標性 round-trip 測試。 驗證:原始碼 → lift → SemanticTree → generate → 原始碼 → 執行 → 比較 stdout。 用於驗證特定概念、除錯已知失敗或回歸測試。支援任何語言。
| name | concept-refactor |
| description | 審計、修復並重構 Semorphe 已有的語言概念實作。 偵測四路完備性缺口、信心等級違規、雙重註冊、死概念, 並自動修復缺失的產出物。用於清理技術債和確保第一性原理合規性。 支援任何語言。 |
| user-invocable | true |
語言指示:所有輸出文件(報告、摘要、註解)必須使用當前對話的語言撰寫。下方模板僅為結構參考,實際用語應配合使用者的語言設定。
此 skill 必須透過 Skill tool 調用,不可手動替代。
完成時必須輸出完成標記(見最後一節)。
$ARGUMENTS
參數格式:
{lang} audit — 完整審計:四路完備性 + 信心等級 + 雙重註冊 + 渲染一致性{lang} audit completeness — 只審計四路完備性{lang} audit confidence — 只審計信心等級合規性{lang} audit dedup — 只審計雙重註冊{lang} audit render — 只審計渲染一致性{lang} audit i18n — 只審計 i18n 標籤風格一致性{lang} fix {concept} — 診斷並修復單一概念的所有缺失路徑{lang} fix {module} — 診斷並修復整個 STD 模組(如 fix vector、fix cmath){lang} fix all — 診斷並修復該語言所有概念{lang} fix --dry-run — 只診斷不修復,顯示會做什麼{lang} migrate {concept} — 將 hand-written lifter(AST→SemanticNode)遷移至 JSON pattern{lang} migrate all — 遷移所有可遷移的概念(注意:此遷移僅涉及 lift 路徑,extract 路徑已統一由 PatternExtractor 處理){lang} dedup — 清除雙重註冊{lang} render-fix — 修復渲染一致性問題{lang} i18n-fix — 修復 i18n 標籤風格不一致問題{lang} purge-dead — 移除完全無功能的死概念(registered but zero implementation){lang} full — 依序執行 audit → fix all → dedup → migrate all → render-fix → 最終驗證隨著概念數量增長,實作可能出現五類問題:
high,warning 從未使用{type: "..."} 而無完整 args0,導致 PatternExtractor auto-derive 失敗閱讀以下檔案以理解目前實作:
src/core/types.ts — SemanticNode、ConceptIdsrc/core/lift/lifter.ts — 優先權鏈src/core/lift/pattern-lifter.ts — pattern types 和信心等級設定邏輯src/languages/{lang}/core/blocks.json 和 src/languages/{lang}/std/*/blocks.json — BlockSpecsrc/languages/{lang}/core/concepts.json 和 src/languages/{lang}/std/*/concepts.json — 概念註冊src/languages/{lang}/core/generators/ — generator 函式src/languages/{lang}/core/lifters/ — lifter 註冊src/languages/{lang}/lift-patterns.json — JSON patternsrc/interpreter/executors/ — executor 註冊tests/ — 測試檔案對該語言所有已註冊的概念(從 concepts.json 收集),逐一檢查六條路徑:
# 收集所有概念 ID
cat src/languages/{lang}/core/concepts.json src/languages/{lang}/std/*/concepts.json | \
node -e "const j=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8')); j.forEach(c=>console.log(c.conceptId))"
對每個概念 ID,搜尋:
| # | 路徑 | 搜尋位置 | 搜尋方式 |
|---|---|---|---|
| 1 | Lift | lifters/*.ts + lift-patterns.json | grep conceptId 或 createNode('{concept}') |
| 2 | Render | blocks.json (core + std) | grep "conceptId": "{concept}" |
| 3 | Extract | 同上,確認 renderMapping 有 fields/inputs(PatternExtractor auto-derive);動態概念需有 dynamicRules;expression counterpart 需有完整 blockDef args0 | 檢查 BlockSpec 結構 |
| 4 | Generate | generators/*.ts 或 std/*/generators.ts | grep generators.set('{concept}') |
| 5 | Execute | src/interpreter/executors/*.ts | grep register('{concept}') 或 '{concept}' |
| 6 | Test | tests/ | grep '{concept}' 在 .test.ts 檔案中 |
輸出完備性矩陣:
### 四路完備性矩陣
| 概念 | Lift | Render | Extract | Generate | Execute | Test | 完整? |
|------|------|--------|---------|----------|---------|------|--------|
| var_declare | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ 6/6 |
| cpp:cout | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ⚠️ 5/6 |
| cpp:vector_push | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | 💀 0/6 |
### 統計
- 完整(6/6):{N} 個({%})
- 部分(1-5/6):{N} 個({%})
- 死概念(0/6):{N} 個({%})
掃描所有 lifter 和 pattern-lifter 程式碼,檢查:
confidence: 'warning' 使用頻率:搜尋所有 confidence 設定,統計各等級使用次數pattern-lifter.ts 的 composite matcher,檢查結構匹配後是否有語義驗證步驟warningraw_code 降級### 信心等級合規報告
| 檢查項 | 狀態 | 詳情 |
|--------|------|------|
| `warning` 使用 | ❌ 從未使用 | 0 處設定 warning |
| composite 語義驗證 | ❌ 缺失 | pattern-lifter.ts:281 直接設 high |
| 一對多映射 warning | ⚠️ 部分 | call_expression 有 3 個概念但未設 warning |
| raw_code 降級 | ✅ | 所有 lifter 都有降級路徑 |
掃描 lift 註冊來源,建立 {nodeType → [sources]} 映射表:
| 來源 | 位置 | 優先權 |
|---|---|---|
| Hand-written lifter | lifter.register(nodeType, fn) | 最低(PatternLifter 優先)——用於 AST→SemanticNode 的 lift 路徑 |
| JSON pattern | lift-patterns.json 條目 | 中(patternType + priority) |
| BlockSpec astPattern | blocks.json 的 astPattern 欄位 | 最低(-5 penalty) |
| LiftStrategy | extractors/extract-strategies.ts 中的 lift strategies | 用於 AST→SemanticNode 的複雜 lift 邏輯 |
注意:BlockExtractorRegistry 已刪除。Block→SemanticNode 的 extraction 統一由 PatternExtractor 處理(auto-derive from blockDef args + concept children 或 dynamicRules),不再需要 hand-written extractors。此處的「雙重註冊」專指 lift 路徑(AST→SemanticNode)的重複,而非 extract 路徑。
標記:SHADOW(被遮蔽)、FALLBACK(安全網)、CONFLICT(行為不同)。
對每個 BlockSpec,檢查:
掃描所有 BlockSpec 的 message0 和 tooltip 引用的 i18n key,對照 src/i18n/zh-TW/blocks.json 和 src/i18n/en/blocks.json 的翻譯文字,逐一檢查:
按 category 分組掃描——同 category 的積木標籤必須使用一致的句式。
| 檢查項 | 通過條件 | 嚴重度 |
|---|---|---|
| 中文描述式 | 包含動詞,不含括號或原始函式名(如 排序 %1 而非 sort( %1 )) | ⚠️ P1 |
| 英文動詞短語 | 以大寫字母開頭的動詞短語(如 Sort %1 而非 sort( %1 )) | ⚠️ P1 |
| 函式名未當標籤 | message0 翻譯不等於函式呼叫語法(.method() 或 func()) | ⚠️ P1 |
| 語言關鍵字未當標籤 | 標籤不以原始語言關鍵字開頭(C++ 的 const、virtual、auto、typedef、using、override、constexpr;Python 的 def、class、lambda;Java 的 abstract、synchronized 等) | ⚠️ P1 |
| 語法符號未當標籤 | 標籤不含語言特殊語法(C++ 的 static_cast<>(), [&](), ~ ClassName(), operator+;Python 的 @decorator;Java 的 <T> 等) | ⚠️ P1 |
| tooltip 非重複 | tooltip 翻譯與 message0 翻譯不同,且提供額外說明 | ⚠️ P2 |
| 同類風格一致 | 同 category 內所有標籤使用相同句式模式 | ⚠️ P2 |
| i18n key 完整 | 所有 %{BKY_...} key 在兩個語系檔中都有定義 | ❌ P0 |
P1 掃描必須覆蓋的模式(缺一不可):
| 模式 | 正則/搜尋方式 | 說明 |
|---|---|---|
.method() 語法 | \.\w+\( | 如 %1 .push( %2 ), %1 .empty(), %1.append(%2) |
func() 語法 | \w+\(\s*% | 如 abs( %1 ), sizeof( %1 ), len(%1) |
| 語言關鍵字 | 依語言而定(見下方清單) | 關鍵字出現在 MSG0 值中 |
| Lambda/閉包語法 | \[\s*%.*\]\s*\( 或 lambda\s+% | 如 [ %1 ] ( %2 ), lambda %1: %2 |
| 解構子/特殊語法 | ~\s*% 或 @\s*% | 如 ~ %1 (), @%1 |
| 中英完全相同 | zh-TW 值 == en 值 | 表示中文根本沒翻譯 |
各語言關鍵字清單(掃描 MSG0 值時使用):
| 語言 | 關鍵字正則 |
|---|---|
| C/C++ | \b(const|constexpr|auto|typedef|using|virtual|override|operator|namespace|sizeof|static_cast|dynamic_cast|reinterpret_cast|const_cast|new|delete|template)\b |
| Python | \b(def|class|lambda|import|from|with|yield|async|await|global|nonlocal)\b |
| Java | \b(abstract|synchronized|implements|extends|instanceof|throws|volatile|transient|native)\b |
| JavaScript | \b(function|class|async|await|yield|typeof|instanceof|import|export)\b |
新增語言時,將該語言的關鍵字加入此清單。
### i18n 標籤風格報告
| Category | 概念 | 中文 | 英文 | 問題 |
|----------|------|------|------|------|
| math | cpp_abs | `abs( %1 )` | `abs( %1 )` | ⚠️ 函式名當標籤 |
| math | cpp_sqrt | `sqrt( %1 )` | `sqrt( %1 )` | ⚠️ 函式名當標籤 |
| containers | cpp_vector_size | `%1 的大小` | `Size of %1` | ✅ |
### 統計
- P0(key 缺失):{N} 個
- P1(風格違規):{N} 個
- P2(品質建議):{N} 個
- 合格:{N} 個({%})
將報告儲存到 tests/reports/refactor-audit-{lang}-{timestamp}.md。
報告結構:
## 概念審計報告({language})— {date}
### 總覽
- 已註冊概念:{N}
- 四路完整:{N}({%})
- 部分實作:{N}({%})
- 死概念:{N}({%})
- 信心合規:{PASS/FAIL}
- 雙重註冊:{N}
- Render 問題:{N}
- i18n 標籤問題:{N}(P0: {N}, P1: {N}, P2: {N})
### 四路完備性矩陣
{表格}
### 信心等級合規
{報告}
### 雙重註冊
{表格}
### Render 一致性
{表格}
### i18n 標籤風格
{表格}
### 建議修復優先順序
1. {最高優先}
2. ...
對每個目標概念,執行以下診斷和修復流程:
讀取審計結果(或即時掃描),確定缺失的路徑:
概念 {concept_id} 診斷:
Lift: ❌ 缺失 — 無 lifter 註冊
Render: ❌ 缺失 — 無 blocks.json 條目
Extract: ❌ 缺失 — 無 renderMapping
Generate: ✅ 存在 — generators.ts:42
Execute: ❌ 缺失 — 無 executor 註冊
Test: ❌ 缺失 — 無測試檔
需修復:4 條路徑
根據缺失路徑和概念類型,決定修復策略:
| 情境 | 策略 |
|---|---|
| 缺 Lift 但有 Generate | 從 generator 反推 AST 結構,產生 lifter |
| 缺 Render/Extract 但有 Lift | 從 lifter 的 SemanticNode 結構推導 BlockSpec |
| 缺 Generate 但有 Lift | 從 lifter 的輸出結構產生 generator |
| 缺 Execute | 分析概念是否可執行,產生 executor 或 noop |
| 缺 Test | 根據已有的 lift/generate 產生基本測試 |
| 死概念(0/6) | 評估是否該保留——如果有探索報告則產生全部,否則建議 purge |
必須逐概念修復,每修一個就驗證。
對每個缺失路徑:
/concept.generate 的規則npx tsc --noEmit # 型別檢查
npm test # 測試不能破壞
修復產出物的品質要求(與 /concept.generate 相同):
renderMapping(fields + inputs),i18n 使用 %{BKY_...} key,標籤必須符合 /concept.generate 步驟二的 i18n 風格規範(中文描述式、英文動詞短語、函式名不當標籤、tooltip 補充說明、同類一致句式)如果審計發現信心等級問題:
Composite pattern 無語義驗證:在 composite match 成功後加入語義驗證 hook
// 在 pattern match 成功後,驗證子節點概念合理性
if (matchResult.confidence === 'high' && isCompositePattern(pattern)) {
// 檢查子節點概念是否與 pattern 預期一致
matchResult.confidence = semanticValidation(matchResult) ? 'high' : 'warning'
}
一對多映射無 warning:在有多個概念共用同一 AST nodeType 的 lifter 中加入 warning
缺少降級路徑:加入 raw_code fallback
每修復一個概念後:
npx tsc --noEmit — 型別檢查npm test — 全部測試通過## 修復報告({language})— {date}
### 修復摘要
| 概念 | 修復前 | 修復後 | 修復的路徑 |
|------|--------|--------|-----------|
| cpp:cout | 3/6 | 6/6 | +Lift, +Render, +Test |
| cpp:vector_push | 0/6 | 6/6 | +All |
### 統計
- 修復概念數:{N}
- 新增 lifter:{N}
- 新增 BlockSpec:{N}
- 新增 generator:{N}
- 新增 executor:{N}
- 新增測試:{N}
- 信心等級修復:{N}
### 驗證
- TypeScript:✅
- npm test:✅ {N} passed
注意:此遷移僅涉及 lift 路徑(AST→SemanticNode 的 hand-written lifter → JSON pattern)。Extract 路徑(Block→SemanticNode)已統一由 PatternExtractor 處理,無需遷移。extractors/extract-strategies.ts 中的 PatternExtractor extraction strategies 操作的是 BlockState JSON(非 Blockly.Block)。
┌─ 純欄位映射? ──── 是 ──── L1 simple/constrained
│
hand-written lifter ────┤─ 需要 transform?── 是 ──── L2 simple + transform
│
├─ 按 operator 路由? 是 ──── L2 operatorDispatch
│
├─ 左遞迴收集? ──── 是 ──── L2 chain
│
├─ 多條件結構? ──── 是 ──┬── 核心邏輯 < 20 行? ── L3 composite
│ └── 核心邏輯 ≥ 20 行? ── unmovable
│
└─ 跨節點狀態/副作用? 是 ── unmovable
讀取 hand-written lifter 的完整實作,理解輸入、條件分支、輸出。
| 遷移性 | 條件 | 目標 |
|---|---|---|
| L1-ready | 純欄位映射,無條件分支 | simple 或 constrained pattern |
| L2-ready | 需要 transform 但無複雜邏輯 | simple + transform |
| L2-dispatch | 根據 operator 路由 | operatorDispatch pattern |
| L2-chain | 左遞迴鏈式收集 | chain pattern |
| L3-strategy | 多步驟邏輯可用 liftStrategy 封裝 | composite + liftStrategy |
| unmovable | 深度嵌套邏輯、跨節點狀態 | 保留 hand-written |
根據分類在 lift-patterns.json 中新增 pattern。
npx tsc --noEmit && npm test
如果失敗,還原並報告。
對遷移的概念用 Skill tool 調用 /concept.roundtrip {lang} {concept} 確保行為等價。
從審計結果中找出 0/6 完備性的概念——在 concepts.json 中註冊但完全沒有實作。
對每個死概念:
從 concepts.json 中移除。如果 topic tree 中有引用,同步移除。
npx tsc --noEmit && npm test
依序執行:
1. Audit(完整審計) → 產出審計報告(含 i18n 標籤風格)
2. Fix all(修復全部) → 修復所有四路缺口
3. Dedup(去重) → 清除確認等價的雙重註冊
4. Migrate all(遷移) → 遷移所有 L1/L2-ready 概念
5. Render-fix(渲染修復)→ 修復渲染一致性
6. i18n-fix(標籤修復) → 修復 i18n 標籤風格不一致問題
7. Purge dead(清除死概念)→ 移除無法修復的死概念
8. 最終驗證 → npx tsc --noEmit && npm test
每步之間確認測試通過。如果任何步驟失敗,停止並報告。
FALLBACK 而非移除此 skill 完成後,必須輸出以下格式的完成標記:
🏁 SKILL_COMPLETE: concept-refactor | {lang} | {mode} | 修復:{N} | 完備率:{before}% → {after}% | 信心合規:{PASS/FAIL}
如果未輸出此標記,表示 skill 未正確完成。