원클릭으로
concept-generate
為概念探索報告中定義的概念產生 BlockSpec JSON、程式碼產生器、提升器和渲染映射。 產生在 Semorphe 語義樹管線中支援新概念所需的所有產出物。 在 /concept.discover 之後使用,用於建立實作產出物。支援任何語言。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
為概念探索報告中定義的概念產生 BlockSpec JSON、程式碼產生器、提升器和渲染映射。 產生在 Semorphe 語義樹管線中支援新概念所需的所有產出物。 在 /concept.discover 之後使用,用於建立實作產出物。支援任何語言。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
研究程式語言的函式庫、標準標頭檔或語言特性。從文件和網路資源中探索函式簽名、 常見用法模式,按 Topic 層級樹分類,並依 Semorphe 慣例提出概念命名。 用於新增任何語言的函式庫、標頭檔或語言特性支援時。
新 Semorphe 概念的最終整合關卡。執行所有驗證步驟 (TypeScript 編譯、單元測試、round-trip 測試、模糊測試), 然後將通過的概念整合到程式碼庫中並完成正確的註冊。 在 /concept.generate 之後作為最終步驟使用。支援任何語言。
為 Semorphe 新增概念的端到端管線。 串接全部 5 個概念 skill:discover → generate → roundtrip → fuzz → integrate。 當你想從「我要支援 <特性>」到完全整合的概念,用一個指令完成時使用。 支援任何語言。
審計、修復並重構 Semorphe 已有的語言概念實作。 偵測四路完備性缺口、信心等級違規、雙重註冊、死概念, 並自動修復缺失的產出物。用於清理技術債和確保第一性原理合規性。 支援任何語言。
為 Semorphe 的程式碼↔積木管線產生資訊隔離的模糊測試。 使用雙代理架構:Agent A(不知道實作)寫真實程式, Agent B 驗證 round-trip 正確性和編譯器/直譯器輸出等價性。 用於找出實作感知測試會遺漏的邊界案例和 bug。支援任何語言。
對特定程式透過 Semorphe 管線執行目標性 round-trip 測試。 驗證:原始碼 → lift → SemanticTree → generate → 原始碼 → 執行 → 比較 stdout。 用於驗證特定概念、除錯已知失敗或回歸測試。支援任何語言。
SOC 직업 분류 기준
| name | concept-generate |
| description | 為概念探索報告中定義的概念產生 BlockSpec JSON、程式碼產生器、提升器和渲染映射。 產生在 Semorphe 語義樹管線中支援新概念所需的所有產出物。 在 /concept.discover 之後使用,用於建立實作產出物。支援任何語言。 |
| user-invocable | true |
語言指示:所有輸出文件(報告、摘要、註解)必須使用當前對話的語言撰寫。下方模板僅為結構參考,實際用語應配合使用者的語言設定。
此 skill 必須透過 Skill tool 調用,不可手動替代。當由 /concept.pipeline 編排時,pipeline 會使用 Skill tool 調用此 skill。
完成時必須輸出完成標記(見最後一節)。
$ARGUMENTS
參數應為概念探索報告的路徑(來自 /concept.discover),或 {lang} {concept_name} 格式(例如 cpp do_while、python list_comprehension)。
你正在為新的 Semorphe 概念產生完整的實作產出物。每個概念需要 6 個產出物才能端到端運作:
dynamicRulessrc/interpreter/executors/ 中註冊)。可執行概念需實作計算邏輯,宣告性概念(如 #include)需註冊 noop executor。見 docs/technical-experiences.md §20產生前,請先閱讀這些檔案以理解現有模式:
src/core/types.ts — SemanticNode 結構、現有概念docs/first-principles.md — P2(概念代數)的屬性結構規則然後閱讀目標語言的既有實作:
src/languages/{lang}/core/blocks.json — 現有 BlockSpec 範例src/languages/{lang}/std/{module}/blocks.json — 標準庫 BlockSpecsrc/languages/{lang}/core/generators/ — 現有 generator 模式src/languages/{lang}/core/lifters/ — 現有 lifter 模式src/core/projection/pattern-renderer.ts — 渲染映射如何運作如果是全新語言(src/languages/{lang}/ 不存在),先參考現有語言模組(如 src/languages/cpp/)的目錄結構來建立骨架。
從探索報告或使用者輸入中,為每個概念提取(命名慣例見 /concept.discover 階段四):
{lang}:concept)概念所屬層級決定檔案存放位置:核心概念放 src/languages/{lang}/core/blocks.json,STD 模組概念放 src/languages/{lang}/std/{module}/blocks.json。
{
"type": "{prefix}_{concept_name}",
"conceptId": "{concept_name}",
"category": "{category}",
"message0": "{帶 %1 %2 佔位符的積木標籤}",
"args0": [
{ "type": "field_input", "name": "FIELD_NAME", "text": "default" },
{ "type": "input_value", "name": "INPUT_NAME" }
],
"output": null,
"previousStatement": null,
"nextStatement": null,
"colour": "{category_colour}",
"renderMapping": {
"fields": { "FIELD_NAME": "property_name" },
"inputs": { "INPUT_NAME": "child_slot" }
}
// 如果概念有動態結構(repeat inputs、repeat field groups、multi-mode slots、if-elseif chains),
// 在 renderMapping 中加入 dynamicRules:
// "renderMapping": {
// "fields": { ... },
// "inputs": { ... },
// "dynamicRules": [ { "type": "repeat", ... } ]
// }
}
規則:
type 是投影層的積木類型名稱,前綴:u_ 為通用積木,語言特定用語言縮寫(如 c_ for C++、py_ for Python、j_ for Java)conceptId 是語義層的概念識別碼,格式為 snake_case(通用)或 {lang}:snake_case(語言特定)conceptId: "cpp:vector_push" 對應 type: "c_vector_push";conceptId: "sort_range" 對應 type: "u_sort_range"。conceptId 用於語義樹,type 用於 Blockly 積木%{BKY_...} key:message0、tooltip、以及 field_dropdown 的 options 顯示文字,一律使用 %{BKY_KEY_NAME} 格式引用,不可硬編碼任何語言的文字。同時在 src/i18n/zh-TW/blocks.json 和 src/i18n/en/blocks.json 中新增對應的翻譯條目。參考現有 STD 模組(如 vector、cstring)的 i18n 模式。message0 在目標語系中應盡可能易讀i18n 標籤風格規範(強制遵守):
積木標籤的目的是讓學生不看文件就能理解積木的語義。以下規則確保跨概念的一致性:
| 規則 | 正確 ✅ | 錯誤 ❌ | 說明 |
|---|---|---|---|
| 中文用描述式動詞短語 | 排序 %1 | sort( %1 ) | 不抄語法,用語義描述 |
| 英文用動詞開頭短語 | Sort %1 | sort( begin, end ) | 首字母大寫,不加括號 |
| 函式名不直接當標籤 | 取絕對值 %1 | abs( %1 ) | 函式名放 tooltip,標籤用語義 |
| 語言關鍵字不當標籤 | 宣告常數 %1 %2 = %3 | const %1 %2 = %3 | 任何語言的關鍵字(C++ 的 const/auto/virtual;Python 的 def/class/lambda;Java 的 abstract/synchronized 等)都用中文/英文語義描述取代 |
| 語法符號不當標籤 | 靜態轉型為 %1(%2) | static_cast < %1 > ( %2 ) | 語言特殊語法(C++ 的 <>, [](), ~;Python 的 @;Java 的 <T> 等)不可出現在標籤中 |
| 方法呼叫語法不當標籤 | 清空 %1 | %1 .clear() | .method() 語法不可出現,用動詞描述 |
| 容器操作統一格式 | 將 %2 推入 %1 | %1 .push( %2 ) | 動詞在前,物件與參數用自然語序 |
| tooltip 必須補充說明 | tooltip: 對範圍 [begin, end) 進行升序排列 | tooltip: 排序 | tooltip 不可只是重複 message0 |
| 同類概念用相同句式 | 所有數學函式:{動詞} %1 | 取絕對值 %1 vs sqrt( %1 ) | 同 category 的標籤必須風格統一 |
| 型別/參數名不出現在標籤中 | 宣告變數 %1 | int %1 = %2 | 型別資訊放 dropdown 或 tooltip |
常見違規模式速查表(以下模式在標籤中一律禁止,適用所有語言):
| 模式 | 範例 | 應改為 |
|---|---|---|
.method() | %1 .push_back( %2 ), %1.append(%2) | 在 %1 末端加入 %2 |
func() | sizeof( %1 ), abs( %1 ), len(%1) | 取得 %1 的大小, 取絕對值 %1, %1 的長度 |
| 語言關鍵字 | const %1, auto %1, virtual %1, def %1, class %1 | 宣告常數 %1, 自動推斷 %1, 虛擬方法 %1, 定義函式 %1, 定義類別 %1 |
| C++ cast 語法 | static_cast < %1 > ( %2 ) | 靜態轉型為 %1(%2) |
| Lambda/閉包語法 | [ %1 ] ( %2 ), lambda %1: %2 | 匿名函式 擷取 %1 參數 %2 |
| 解構子語法 | ~ %1 () | 解構子 ~%1() |
| 運算子語法 | %1 operator %2 ( %3 ) | 運算子多載 %2 回傳 %1(%3) |
| 裝飾器語法 | @%1 | 套用裝飾器 %1 |
| 泛型語法 | %1<%2> | %1(型別 %2) |
產生 i18n 條目時的檢查清單:
grep i18n JSON),確保新標籤與既有風格一致previousStatement/nextStatementoutput(型別或 null 代表任意)expressionCounterpart 產生兩者。對應 P2 概念角色語境依賴(§2.2)——statement/expression 版本的 extraState 格式必須完全相同。注意:expression counterpart 積木必須有完整的 blockDef(含 args0 定義),不可只寫 {type: "..."},否則 PatternExtractor auto-derive 會失敗blockOverrides(§2.4)在 src/languages/{lang}/core/generators/ 的適當檔案中加入 generator 函式。
generators.set('{concept_name}', (node, ctx) => {
// 提取屬性
const prop = node.properties.prop_name
// 產生子節點
const child = generateExpression(node.children.child_slot?.[0], ctx)
// 回傳格式化的目標語言程式碼
return `${indent(ctx)}${formatted_code}\n`
})
規則:
indent(ctx)generateExpression()generateBody()ctx.style 的格式偏好在 src/languages/{lang}/core/lifters/ 的適當檔案中加入 lifter 註冊。
lifter.register('{tree_sitter_node_type}', (node, context) => {
// 從 AST 節點提取
const prop = node.childForFieldName('field')?.text ?? ''
// 建構語義節點
return createNode('{concept_name}', { prop }, {
child_slot: context.liftChildren(node, 'body_field'),
})
})
Layer 引導:Layer 1 純 JSON(astPattern)、Layer 2 JSON + transform(TransformRegistry)、Layer 3 JSON + strategy(LiftStrategyRegistry)。見 §2.3。
信心等級設定規則(P1 §2.1,強制遵守):
| 信心等級 | 使用時機 | 範例 |
|---|---|---|
high | 結構完全匹配且通過語義驗證的直接映射 | number_literal → number_literal |
warning | 結構匹配但語義可能不準確(一對多映射) | binary_expression 可能是算術/比較/位元運算 |
inferred | 推測性對應(從上下文推斷) | 從使用位置推斷變數型別 |
raw_code | 無法結構化的降級 | 不支援的語法 |
關鍵規則:
high——必須先通過語義驗證(至少驗證子節點概念是否合理)warning——例如 call_expression 可能映射到 func_call、cpp:cout、cpp:sort 等多個概念,在確定具體概念前應設 warningraw_code 而非靜默丟棄規則:
context.liftChildren()node.childForFieldName()?? defaultValue 處理在 src/interpreter/executors/ 的適當檔案中加入 executor 註冊。
可執行概念(如數學運算、I/O、控制流程):
register('{concept_name}', async (node, ctx) => {
// 評估子節點
const arg = await ctx.evaluate((node.children.arg ?? [])[0])
// 執行計算
const result = someComputation(ctx.toNumber(arg))
// 回傳結果
return { type: 'double', value: result }
})
宣告性概念(如 #include、using namespace、註解):
register('{concept_name}', async () => {}) // noop
規則:
src/interpreter/executors/ 中的現有 executor 模式ctx.evaluate(),值轉換使用 ctx.toNumber()/ctx.toBool()RuntimeValue({ type, value })return 或 void)src/interpreter/interpreter.ts 的建構函式中 import 並呼叫 registerXxxExecutors(reg)unknownConceptHandler(見 docs/technical-experiences.md §20)依照 tests/ 中的模式建立測試檔案:
// tests/unit/languages/{lang}/{concept_name}.test.ts
describe('{concept_name}', () => {
it('should lift {描述}', () => {
const code = `{最小範例}`
// ... 提升並驗證語義樹
})
it('should generate {描述}', () => {
const node = createNode('{concept_name}', { ... }, { ... })
// ... 產生並驗證目標語言輸出
})
it('should round-trip {描述}', () => {
const code = `{程式碼}`
// ... lift → generate → 比較
})
})
產生所有產出物後,必須執行四路完備性驗證。這是阻擋性關卡——缺少任何一路就不可繼續。
對目標概念逐一確認以下 6 條路徑全部存在:
| # | 路徑 | 驗證方式 | 缺失後果 |
|---|---|---|---|
| 1 | Lift | lifter 檔案中有 register('{nodeType}', ...) 或 lift-patterns.json 有條目 | ❌ 阻擋 |
| 2 | Render | blocks.json 中有 BlockSpec 條目,且 renderMapping 完整(fields + inputs 覆蓋所有語義屬性) | ❌ 阻擋 |
| 3 | Extract | BlockSpec 的 renderMapping 可被 PatternExtractor 自動反向提取(auto-derive from blockDef args + concept children);若概念有動態結構,renderMapping 須包含 dynamicRules | ❌ 阻擋 |
| 4 | Generate | generator 檔案中有 generators.set('{concept}', ...) | ❌ 阻擋 |
| 5 | Execute | executor 檔案中有 register('{concept}', ...) | ❌ 阻擋 |
| 6 | Test | 測試檔存在且包含 lift、generate、round-trip 三種測試 | ❌ 阻擋 |
# 驗證方式:在各路徑的檔案中搜尋概念名稱
grep -rn "'{concept_name}'" src/languages/{lang}/ src/interpreter/executors/ tests/
如果任何路徑缺失:
完成標記中的 產出物:{N}/6 必須反映此驗證結果。N < 6 時不可輸出 SKILL_COMPLETE 標記。
僅適用於通用概念(conceptId 為 snake_case,無語言前綴):
通用概念必須在所有已支援的語言模組中都有對應實作。檢查 src/languages/ 下有哪些語言模組,對每個已存在的語言模組:
例如,新增通用概念 sort_range 時,若已有 cpp 和 python 模組,則需同時在兩個語言中產生 generator/lifter/block/test。
確認新概念需要在哪些地方註冊:
src/languages/{lang}/toolbox-categories.ts 中的工具箱分類src/languages/{lang}/topics/*.json)中的 levelTree 節點,將概念 ID 加入對應節點的 concepts[]src/core/types.ts 的 UniversalConcept 型別STD 模組結構:STD 模組使用扁平結構——每個模組目錄下直接放 generators.ts、lifters.ts、blocks.json、concepts.json,不再有子目錄。
報告產生了什麼:
## {concept_name} 的產出物({language})
- [ ] BlockSpec:核心 `src/languages/{lang}/core/blocks.json` 或 STD `src/languages/{lang}/std/{module}/blocks.json`
- [ ] Generator:核心 `src/languages/{lang}/core/generators/{file}.ts` 或 STD `src/languages/{lang}/std/{module}/generators.ts`
- [ ] Lifter:核心 `src/languages/{lang}/core/lifters/{file}.ts` 或 STD `src/languages/{lang}/std/{module}/lifters.ts`
- [ ] 渲染映射:嵌入在 BlockSpec 中
- [ ] Executor:`src/interpreter/executors/{file}.ts`(可執行概念需實作邏輯,宣告性概念需 noop)
- [ ] 測試:`tests/unit/languages/{lang}/{concept_name}.test.ts`(含執行測試)
- [ ] 註冊:{加在哪裡}
### 驗證
執行 `npm test` 確認所有測試通過。
執行 `npx tsc --noEmit` 確認無型別錯誤。
此 skill 完成後,必須輸出以下格式的完成標記:
🏁 SKILL_COMPLETE: concept-generate | {lang} | {concept_name} | 產出物:{N}/6 | tsc: PASS/FAIL
如果未輸出此標記,pipeline 不會繼續下一階段。