@handsupmin/gc-tree 1.0.1 → 1.1.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.es.md +12 -9
- package/README.ja.md +12 -9
- package/README.ko.md +12 -9
- package/README.md +12 -9
- package/README.zh.md +12 -9
- package/dist/src/onboarding-protocol.js +2 -0
- package/dist/src/resolve.js +12 -2
- package/dist/src/scaffold.js +1 -0
- package/docs/principles.es.md +9 -0
- package/docs/principles.ja.md +9 -0
- package/docs/principles.ko.md +9 -0
- package/docs/principles.md +9 -0
- package/docs/principles.zh.md +9 -0
- package/package.json +6 -2
- package/skills/onboard/SKILL.md +2 -0
package/README.es.md
CHANGED
|
@@ -137,15 +137,18 @@ En el momento en que tienes múltiples repos, proyectos o workstreams:
|
|
|
137
137
|
|
|
138
138
|
## Rendimiento validado
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
| Métrica
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
140
|
+
Evaluación con dos fixtures — **DEV** es visible para el bucle de tuning, **HOLDOUT** se reserva para reporte honesto (dominios distintos, negativos difíciles, paráfrasis, consultas mixtas español + inglés). 38 casos etiquetados en 8 categorías: exact-keyword, paraphrase, glossary, mixed-language, same-domain distractor, same-domain negative, cross-branch negative.
|
|
141
|
+
|
|
142
|
+
| Métrica | DEV | HOLDOUT |
|
|
143
|
+
| -------------------------------------------------- | ------------ | ------------ |
|
|
144
|
+
| recall@1 | **100.0%** | **85.7%** |
|
|
145
|
+
| recall@3 | **100.0%** | **92.9%** |
|
|
146
|
+
| MRR | **100.0%** | **89.3%** |
|
|
147
|
+
| Consultas irrelevantes → vacío (neg. precision) | **100.0%** | **100.0%** |
|
|
148
|
+
| Tokens inyectados por consulta vs. contexto total | **~7%** | **~13%** |
|
|
149
|
+
| Consultas con scripts mixtos (varios idiomas) | ✅ | ✅ |
|
|
150
|
+
|
|
151
|
+
Brecha de generalización (DEV − HOLDOUT) = **10.0 pts**. El fixture HOLDOUT se reserva solo para reporte — el bucle de autoresearch nunca se ajusta contra él. Reproducible con `npm run eval:ranked`; reglas de scoring en [`tests/eval/RUBRIC.md`](https://github.com/handsupmin/gc-tree/blob/main/tests/eval/RUBRIC.md).
|
|
149
152
|
|
|
150
153
|
---
|
|
151
154
|
|
package/README.ja.md
CHANGED
|
@@ -137,15 +137,18 @@ AI ツールに渡るのは正しいコンテキスト——ナレッジベー
|
|
|
137
137
|
|
|
138
138
|
## 検証済みのパフォーマンス
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
| 指標
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
140
|
+
二つの fixture による評価 — **DEV** はチューニングループから見える、**HOLDOUT** は誠実な報告用に分離(異なるドメイン、ハードネガティブ、言い換え、日英混合クエリを含む)。8 カテゴリ 38 ラベル付きケース: exact-keyword、paraphrase、glossary、mixed-language、same-domain distractor、same-domain negative、cross-branch negative。
|
|
141
|
+
|
|
142
|
+
| 指標 | DEV | HOLDOUT |
|
|
143
|
+
| ----------------------------------------------- | ------------ | ------------ |
|
|
144
|
+
| recall@1 | **100.0%** | **85.7%** |
|
|
145
|
+
| recall@3 | **100.0%** | **92.9%** |
|
|
146
|
+
| MRR | **100.0%** | **89.3%** |
|
|
147
|
+
| 無関係クエリ → 空(negative precision) | **100.0%** | **100.0%** |
|
|
148
|
+
| クエリあたりの注入トークン割合(全体比) | **約 7%** | **約 13%** |
|
|
149
|
+
| 混合スクリプトクエリ(日本語 + 英語) | ✅ | ✅ |
|
|
150
|
+
|
|
151
|
+
汎化ギャップ(DEV − HOLDOUT)= **10.0 pt**。HOLDOUT fixture は報告専用 — autoresearch ループは決してこれに対してチューニングしません。`npm run eval:ranked` で再現可能。スコアリング規則は [`tests/eval/RUBRIC.md`](https://github.com/handsupmin/gc-tree/blob/main/tests/eval/RUBRIC.md) を参照。
|
|
149
152
|
|
|
150
153
|
---
|
|
151
154
|
|
package/README.ko.md
CHANGED
|
@@ -137,15 +137,18 @@ AI 도구가 올바른 컨텍스트를 가져옵니다. 지식 베이스 전체
|
|
|
137
137
|
|
|
138
138
|
## 검증된 성능
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
| 지표 |
|
|
143
|
-
| ----------------------------------------------- |
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
140
|
+
두 fixture 평가 — **DEV**는 튜닝 루프에 보이고, **HOLDOUT**은 정직한 보고용으로 분리 (다른 도메인, hard negative, 의역, 한국어+영어 혼합 쿼리 포함). 8개 카테고리 38개 라벨 케이스: exact-keyword, paraphrase, glossary, mixed-language, same-domain distractor, same-domain negative, cross-branch negative.
|
|
141
|
+
|
|
142
|
+
| 지표 | DEV | HOLDOUT |
|
|
143
|
+
| ----------------------------------------------- | ------------ | ------------ |
|
|
144
|
+
| recall@1 | **100.0%** | **85.7%** |
|
|
145
|
+
| recall@3 | **100.0%** | **92.9%** |
|
|
146
|
+
| MRR | **100.0%** | **89.3%** |
|
|
147
|
+
| 무관 쿼리 → 빈 결과 (negative precision) | **100.0%** | **100.0%** |
|
|
148
|
+
| 쿼리당 주입 토큰 비율 (전체 컨텍스트 대비) | **~7%** | **~13%** |
|
|
149
|
+
| 혼합 스크립트 쿼리 (한국어 + 영어) | ✅ | ✅ |
|
|
150
|
+
|
|
151
|
+
일반화 갭 (DEV − HOLDOUT) = **10.0 pt**. HOLDOUT fixture는 보고 전용 — autoresearch 루프가 절대 튜닝하지 않습니다. `npm run eval:ranked`로 재현 가능. 점수 규칙은 [`tests/eval/RUBRIC.md`](https://github.com/handsupmin/gc-tree/blob/main/tests/eval/RUBRIC.md) 참조.
|
|
149
152
|
|
|
150
153
|
---
|
|
151
154
|
|
package/README.md
CHANGED
|
@@ -137,15 +137,18 @@ The moment you have multiple repos, projects, or workstreams:
|
|
|
137
137
|
|
|
138
138
|
## Validated performance
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
| Metric
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
140
|
+
Two-fixture eval — **DEV** is visible to the tuning loop, **HOLDOUT** is reserved for honest reporting (different domains, hard negatives, paraphrase, mixed Korean+English queries). 38 labeled cases across 8 categories: exact-keyword, paraphrase, glossary, mixed-language, same-domain distractor, same-domain negative, cross-branch negative.
|
|
141
|
+
|
|
142
|
+
| Metric | DEV | HOLDOUT |
|
|
143
|
+
| ----------------------------------------------- | ------------ | ------------ |
|
|
144
|
+
| recall@1 | **100.0%** | **85.7%** |
|
|
145
|
+
| recall@3 | **100.0%** | **92.9%** |
|
|
146
|
+
| MRR | **100.0%** | **89.3%** |
|
|
147
|
+
| Negative precision (irrelevant queries → empty) | **100.0%** | **100.0%** |
|
|
148
|
+
| Tokens injected per query vs. total context | **~7%** | **~13%** |
|
|
149
|
+
| Mixed-script queries (Korean + English) | ✅ | ✅ |
|
|
150
|
+
|
|
151
|
+
Generalization gap (DEV − HOLDOUT) = **10.0 pts**. The HOLDOUT fixture is reserved for reporting only — the autoresearch loop never tunes against it. Reproduce with `npm run eval:ranked`; see [`tests/eval/RUBRIC.md`](https://github.com/handsupmin/gc-tree/blob/main/tests/eval/RUBRIC.md) for the scoring rules.
|
|
149
152
|
|
|
150
153
|
---
|
|
151
154
|
|
package/README.zh.md
CHANGED
|
@@ -137,15 +137,18 @@ AI 工具拿到的是正确的上下文——不是整个知识库,而是恰
|
|
|
137
137
|
|
|
138
138
|
## 经过验证的性能
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
| 指标
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
140
|
+
双 fixture 评测 — **DEV** 对调优循环可见,**HOLDOUT** 仅用于诚实报告(不同领域、硬负例、释义、中英文混合查询)。8 个类别共 38 条带标签用例:exact-keyword、paraphrase、glossary、mixed-language、same-domain distractor、same-domain negative、cross-branch negative。
|
|
141
|
+
|
|
142
|
+
| 指标 | DEV | HOLDOUT |
|
|
143
|
+
| ------------------------------------------ | ------------ | ------------ |
|
|
144
|
+
| recall@1 | **100.0%** | **85.7%** |
|
|
145
|
+
| recall@3 | **100.0%** | **92.9%** |
|
|
146
|
+
| MRR | **100.0%** | **89.3%** |
|
|
147
|
+
| 无关查询 → 空(negative precision) | **100.0%** | **100.0%** |
|
|
148
|
+
| 每次查询注入的 token 占总上下文比例 | **约 7%** | **约 13%** |
|
|
149
|
+
| 混合脚本查询(中文 + 英文) | ✅ | ✅ |
|
|
150
|
+
|
|
151
|
+
泛化差(DEV − HOLDOUT)= **10.0 pt**。HOLDOUT fixture 仅用于报告 — autoresearch 循环绝不会对它进行调优。运行 `npm run eval:ranked` 复现;评分规则见 [`tests/eval/RUBRIC.md`](https://github.com/handsupmin/gc-tree/blob/main/tests/eval/RUBRIC.md)。
|
|
149
152
|
|
|
150
153
|
---
|
|
151
154
|
|
|
@@ -34,6 +34,8 @@ export function onboardingProtocolLines() {
|
|
|
34
34
|
'Prefer category directories such as `docs/role/`, `docs/repos/`, `docs/domain/`, `docs/workflows/`, `docs/conventions/`, and `docs/infra/` whenever that split fits the material.',
|
|
35
35
|
'Prefer one concept, one repository, one workflow, or one convention per file when possible.',
|
|
36
36
|
'Index entries are the search surface — maximize keyword density. For each doc, generate index entries from: primary concept names, aliases, repo nicknames, workflow names, field names, command names, acronyms, related terms a developer might search for, and any term that would make someone want to open this doc. Do NOT be conservative — more keywords means more chances of being found.',
|
|
37
|
+
'**Bilingual index for retrieval**: gc-tree retrieval is token-overlap based and cannot translate at query time. Whenever the workflow language is not English, every doc\'s `## Index Entries` MUST include BOTH the workflow language AND English for every technical term, concept, repo nickname, workflow name, and glossary acronym. The same rule applies in reverse: if the workflow language is English but the team uses non-English domain terms (Korean, Japanese, Chinese product names, etc.), include those non-English forms too. Example for a Korean workflow language: a `netcode` doc must list `client-server authoritative model`, `authoritative server`, AND `클라이언트-서버 권위 모델`, `권위 서버`. Acronyms (JWT, EMPI, VCF, FHIR) stay in original form in both languages. Doc body and `## Summary` stay primarily in the workflow language; bilingual coverage lives in the index.',
|
|
38
|
+
'`## Summary` should keep canonical proper-noun technical terms in their original language (Stripe, MLflow, BAM, VCF, JWT, FHIR, Kubernetes, etc.) so token retrieval still hits when the user queries in English. Add the workflow-language paraphrase next to the term when the meaning is non-obvious — e.g. "JWT 토큰 무효화 (token invalidation)".',
|
|
37
39
|
'The index format groups keywords under their path: top-level `- docs/path.md` with indented ` - keyword` lines under it. This keeps the index compact while allowing many keywords per doc.',
|
|
38
40
|
'Split glossary docs when a concept is likely to be searched directly, needs more than a short definition, or carries workflow/constraint details; keep only low-value leftover terms in a shared glossary.',
|
|
39
41
|
'The `## Summary` section of every doc must be actionable, not descriptive — write the actual patterns, commands, or constraints a developer needs, not a sentence about what the doc covers. Bad: "이 문서는 updateCollection 패턴을 설명합니다." Good: "updateCollection: { ...dto } spread 필수. return plainToInstance(Res, result satisfies Res). 새 필드 추가 = DTO → 서비스 → 컨트롤러 순서." The summary is injected into the AI context before every task — if it reads like a table of contents entry, it is useless.',
|
package/dist/src/resolve.js
CHANGED
|
@@ -33,10 +33,20 @@ function countTokenMatches(text, tokens) {
|
|
|
33
33
|
const haystack = String(text || '').toLowerCase();
|
|
34
34
|
return tokens.reduce((sum, token) => {
|
|
35
35
|
try {
|
|
36
|
-
|
|
36
|
+
if (makeTokenRegex(token).test(haystack))
|
|
37
|
+
return sum + 1;
|
|
38
|
+
// Prefix-stem fallback for long ASCII tokens. Conservative: token must be
|
|
39
|
+
// >=9 chars and the prefix is 7 chars, so words like "Suspense" (8 chars)
|
|
40
|
+
// are skipped and cannot collide with unrelated stems like "suspension".
|
|
41
|
+
// Catches persists/persistence, reconciled/reconciliation, replicated/replication.
|
|
42
|
+
if (token.length >= 9 && /^[a-z]+$/.test(token)) {
|
|
43
|
+
const stem = token.slice(0, 7);
|
|
44
|
+
if (new RegExp(`\\b${stem}[a-z]*\\b`).test(haystack))
|
|
45
|
+
return sum + 1;
|
|
46
|
+
}
|
|
47
|
+
return sum;
|
|
37
48
|
}
|
|
38
49
|
catch {
|
|
39
|
-
// Regex construction failed (e.g. special chars in token) — fall back to substring
|
|
40
50
|
return sum + (haystack.includes(token) ? 1 : 0);
|
|
41
51
|
}
|
|
42
52
|
}, 0);
|
package/dist/src/scaffold.js
CHANGED
|
@@ -117,6 +117,7 @@ function renderUpdateProtocol() {
|
|
|
117
117
|
' - `docs/role/<name>.md` — team member roles, responsibilities',
|
|
118
118
|
'4. Write a `## Summary` that is actionable: actual patterns/commands/constraints a developer needs — not a sentence about what the doc covers.',
|
|
119
119
|
'5. Include a `## Index Entries` section in each doc\'s content with many keywords: aliases, related terms, command names, field names, workflow names, acronyms. More entries = more chances of being found by `gctree resolve`. Fewer than 5 entries almost always means more are needed.',
|
|
120
|
+
'5a. **Bilingual index entries**: when the workflow language is not English, every doc\'s `## Index Entries` MUST contain BOTH the workflow language AND English forms for every technical term, repo name, workflow name, and concept. gc-tree retrieval is token-overlap based and cannot translate at query time, so a Korean-language doc that omits English aliases will silently miss any English query (and vice versa). Acronyms (JWT, EMPI, VCF) stay in original form in both. Body and `## Summary` stay in the workflow language; bilingual coverage lives in the index.',
|
|
120
121
|
'6. Create a temporary JSON file with the updated `docs[]` and run `gctree __apply-update --input <temp-file>`.',
|
|
121
122
|
'7. Run `gctree verify-onboarding --branch <gc-branch>` and inspect the output:',
|
|
122
123
|
' - Check that every updated doc appears in the verified doc list.',
|
package/docs/principles.es.md
CHANGED
|
@@ -77,3 +77,12 @@ En la práctica, esto significa que se inyecta aproximadamente el 4 % del contex
|
|
|
77
77
|
`gctree` almacena el contexto en archivos markdown simples que cualquier herramienta puede leer.
|
|
78
78
|
Claude Code y Codex usan el mismo almacén subyacente. `gctree init` instala la superficie global de hooks orientada al proveedor, y `gctree scaffold` es la ruta de override local para un repositorio o workspace concreto.
|
|
79
79
|
Agregar soporte para un nuevo proveedor significa escribir una nueva plantilla de scaffold — sin cambios en la lógica central de almacenamiento ni de resolve.
|
|
80
|
+
|
|
81
|
+
## 9. Entradas de índice bilingües cuando el idioma del flujo no es inglés
|
|
82
|
+
|
|
83
|
+
`gctree resolve` se basa en superposición de tokens — no traduce en el momento de la consulta.
|
|
84
|
+
Un documento escrito solo en español (o coreano, japonés, chino) nunca coincidirá con una consulta en inglés, y viceversa.
|
|
85
|
+
|
|
86
|
+
Para evitarlo, los flujos de onboarding y de actualización durable exigen **`## Index Entries` bilingües siempre que el idioma del flujo no sea inglés**. Cada término técnico, nombre de repositorio, nombre de workflow y concepto aparece tanto en el idioma del flujo como en inglés. Las siglas (JWT, EMPI, VCF, FHIR) se mantienen en su forma original en ambas listas.
|
|
87
|
+
|
|
88
|
+
El cuerpo del documento y `## Summary` se mantienen en el idioma del flujo por legibilidad; la cobertura bilingüe vive en el índice, donde la recuperación la necesita. `## Summary` conserva los términos técnicos de nombre propio (Stripe, MLflow, JWT, FHIR, Kubernetes) en su idioma original y agrega una paráfrasis en el idioma del flujo solo cuando el significado no es obvio — p. ej. `invalidación de token JWT (token invalidation)`.
|
package/docs/principles.ja.md
CHANGED
|
@@ -77,3 +77,12 @@ gc-branch がマシン上のすべてのリポジトリに黙って影響して
|
|
|
77
77
|
`gctree` はコンテキストをプレーンなマークダウンファイルとして保存するため、どのツールでも読み込めます。
|
|
78
78
|
Claude Code と Codex はどちらも同じ基盤ストアを使います。`gctree init` はグローバルなプロバイダーフック面をインストールし、`gctree scaffold` は1つのリポジトリやワークスペース向けのローカル override 経路です。
|
|
79
79
|
新しいプロバイダーのサポートを追加するには、新しい scaffold テンプレートを書くだけです。コアのストレージや resolve ロジックに変更は不要です。
|
|
80
|
+
|
|
81
|
+
## 9. ワークフロー言語が英語でない場合、インデックスエントリは二言語で
|
|
82
|
+
|
|
83
|
+
`gctree resolve` はトークン重なりベース — クエリ時に翻訳は行いません。
|
|
84
|
+
日本語のみで書かれたドキュメントは英語クエリで決してヒットせず、その逆も同様です。
|
|
85
|
+
|
|
86
|
+
この制約を防ぐため、オンボーディングと durable アップデートのフローは **ワークフロー言語が英語でない場合に `## Index Entries` を二言語で** 必須としています。すべての技術用語、リポジトリ名、ワークフロー名、概念を、ワークフロー言語と英語の両方で列挙します。略語(JWT、EMPI、VCF、FHIR)は両方とも原形のままです。
|
|
87
|
+
|
|
88
|
+
ドキュメント本文と `## Summary` は可読性のためワークフロー言語を維持し、二言語カバレッジは検索が行われるインデックスにだけ置きます。`## Summary` は固有名詞の技術用語(Stripe、MLflow、JWT、FHIR、Kubernetes)を原語のまま残し、意味が自明でない場合にのみワークフロー言語の言い換えを併記します。例: `JWT トークン無効化 (token invalidation)`。
|
package/docs/principles.ko.md
CHANGED
|
@@ -77,3 +77,12 @@ gc-branch에 이미 컨텍스트가 있다면, 올바른 경로는 다음 중
|
|
|
77
77
|
`gctree`는 어떤 도구든 읽을 수 있는 일반 마크다운 파일에 컨텍스트를 저장합니다.
|
|
78
78
|
Claude Code와 Codex 모두 동일한 기반 저장소를 사용합니다. `gctree init`은 전역 프로바이더 훅 표면을 설치하고, `gctree scaffold`는 한 저장소나 워크스페이스를 위한 로컬 override 경로입니다.
|
|
79
79
|
새로운 프로바이더 지원 추가는 새 scaffold 템플릿을 작성하는 것을 의미합니다 — 핵심 저장소나 resolve 로직은 변경이 필요 없습니다.
|
|
80
|
+
|
|
81
|
+
## 9. 워크플로 언어가 영어가 아니라면 인덱스 항목은 이중 언어로
|
|
82
|
+
|
|
83
|
+
`gctree resolve`는 토큰 오버랩 기반입니다 — 쿼리 시점에 번역하지 않습니다.
|
|
84
|
+
한국어로만 작성된 문서는 영어 쿼리에 절대 매칭되지 않으며, 그 반대도 마찬가지입니다.
|
|
85
|
+
|
|
86
|
+
이 한계를 막기 위해 온보딩과 durable 업데이트 플로우는 **워크플로 언어가 영어가 아닐 경우 `## Index Entries`를 이중 언어로** 강제합니다. 모든 기술 용어, 레포 이름, 워크플로 이름, 개념을 워크플로 언어와 영어 양쪽 모두로 나열합니다. 약어(JWT, EMPI, VCF, FHIR)는 양쪽 모두 원형 그대로 둡니다.
|
|
87
|
+
|
|
88
|
+
문서 본문과 `## Summary`는 가독성을 위해 워크플로 언어를 유지하고, 이중 언어 커버리지는 인덱스 — 검색이 일어나는 곳 — 에만 둡니다. `## Summary`는 고유 명사 기술 용어(Stripe, MLflow, JWT, FHIR, Kubernetes)를 원어 그대로 유지하고, 의미가 불명확한 경우에만 워크플로 언어 보조 표현을 병기합니다. 예: `JWT 토큰 무효화 (token invalidation)`.
|
package/docs/principles.md
CHANGED
|
@@ -77,3 +77,12 @@ In practice this means roughly 4% of total stored context is injected per query.
|
|
|
77
77
|
`gctree` stores context in plain markdown files that any tool can read.
|
|
78
78
|
Claude Code and Codex both use the same underlying store. `gctree init` installs the global provider-facing hook surface, and `gctree scaffold` is the local override path for one repository or workspace.
|
|
79
79
|
Adding support for a new provider means writing a new scaffold template — no changes to the core storage or resolve logic.
|
|
80
|
+
|
|
81
|
+
## 9. Bilingual index entries when the workflow language is not English
|
|
82
|
+
|
|
83
|
+
`gctree resolve` is token-overlap based — it does not translate at query time.
|
|
84
|
+
A doc written purely in Korean (or Japanese, Chinese, Spanish, etc.) will silently miss any English query, and vice versa.
|
|
85
|
+
|
|
86
|
+
The onboarding and durable-update flows enforce **bilingual `## Index Entries`** whenever the workflow language is not English. Every technical term, repo name, workflow name, and concept appears in BOTH the workflow language and English. Acronyms (JWT, EMPI, VCF, FHIR) stay in their original form in both lists.
|
|
87
|
+
|
|
88
|
+
Doc body and `## Summary` stay in the workflow language for readability; bilingual coverage lives in the index, where retrieval needs it. `## Summary` preserves canonical proper-noun technical terms (Stripe, MLflow, JWT, FHIR, Kubernetes) in their original language and adds a workflow-language paraphrase only when the meaning is non-obvious — e.g. `JWT 토큰 무효화 (token invalidation)`.
|
package/docs/principles.zh.md
CHANGED
|
@@ -77,3 +77,12 @@ Onboarding 仅适用于空的 gc-branch。
|
|
|
77
77
|
`gctree` 将上下文存储在任何工具都能读取的纯 Markdown 文件中。
|
|
78
78
|
Claude Code 和 Codex 使用同一个底层存储。`gctree init` 安装全局 provider hook 表面,`gctree scaffold` 则是针对单个仓库或工作区的本地 override 路径。
|
|
79
79
|
添加对新提供商的支持,意味着编写一个新的 scaffold 模板——无需对核心存储或 resolve 逻辑做任何修改。
|
|
80
|
+
|
|
81
|
+
## 9. 工作流语言不是英文时,索引条目必须双语
|
|
82
|
+
|
|
83
|
+
`gctree resolve` 基于 token 重叠匹配——查询时不做翻译。
|
|
84
|
+
仅用中文撰写的文档不会匹配任何英文查询,反之亦然。
|
|
85
|
+
|
|
86
|
+
为防止这种漏检,onboarding 和 durable 更新流程在 **工作流语言不是英文时强制 `## Index Entries` 双语**。每个技术术语、仓库名、工作流名和概念都同时列出工作流语言和英文。缩写(JWT、EMPI、VCF、FHIR)在两侧都保持原形。
|
|
87
|
+
|
|
88
|
+
文档正文和 `## Summary` 保持工作流语言以便阅读;双语覆盖只放在检索发生的索引中。`## Summary` 保留专有名词技术术语(Stripe、MLflow、JWT、FHIR、Kubernetes)的原文形式,仅在含义不明显时附上工作流语言的同义表达。例如:`JWT 令牌失效 (token invalidation)`。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@handsupmin/gc-tree",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Global Context Tree, a lightweight branch-aware global context orchestrator for AI coding tools",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -26,8 +26,12 @@
|
|
|
26
26
|
"eval:multi-repo": "node --import tsx tests/eval/multi-repo.ts",
|
|
27
27
|
"eval:multi-repo:verbose": "node --import tsx tests/eval/multi-repo.ts --verbose",
|
|
28
28
|
"eval:autoresearch": "node --import tsx tests/eval/autoresearch.ts",
|
|
29
|
+
"eval:autoresearch:strict": "node --import tsx tests/eval/autoresearch.ts --strict",
|
|
29
30
|
"eval:multilingual": "node --import tsx tests/eval/multilingual.ts",
|
|
30
|
-
"eval:multilingual:verbose": "node --import tsx tests/eval/multilingual.ts --verbose"
|
|
31
|
+
"eval:multilingual:verbose": "node --import tsx tests/eval/multilingual.ts --verbose",
|
|
32
|
+
"eval:ranked": "node --import tsx tests/eval/ranked.ts",
|
|
33
|
+
"eval:ranked:verbose": "node --import tsx tests/eval/ranked.ts --verbose",
|
|
34
|
+
"eval:ranked:variance": "node --import tsx tests/eval/ranked.ts --runs 3"
|
|
31
35
|
},
|
|
32
36
|
"engines": {
|
|
33
37
|
"node": ">=20"
|
package/skills/onboard/SKILL.md
CHANGED
|
@@ -44,6 +44,8 @@ Use this when a user wants to create global context for a product, company, or w
|
|
|
44
44
|
- prefer category directories like `docs/role/`, `docs/repos/`, `docs/domain/`, `docs/workflows/`, `docs/conventions/`, and `docs/infra/`
|
|
45
45
|
- prefer one concept, one repository, one workflow, or one convention per file when possible
|
|
46
46
|
- treat `index.md` as the search surface — maximize keyword density; for each doc generate entries from: primary names, aliases, nicknames, field names, command names, acronyms, related terms a developer might search for; do NOT be conservative — more keywords = more chances of being found; fewer than 5 index entries per doc almost certainly means more are needed
|
|
47
|
+
- **bilingual index entries**: gc-tree retrieval is token-overlap based and cannot translate at query time. When the workflow language is not English, every doc's `## Index Entries` MUST include BOTH the workflow-language form AND the English form for every technical term, concept, repo nickname, workflow name, and glossary term. Same rule in reverse if the workflow language is English but team uses non-English domain terms. Acronyms (JWT, EMPI, VCF, FHIR) stay in original form in both lists. Doc body and `## Summary` remain in the workflow language; the bilingual coverage lives in the index. Example for Korean workflow language: a netcode doc must list both `authoritative server`, `client-server authoritative model` AND `권위 서버`, `클라이언트-서버 권위 모델`
|
|
48
|
+
- in `## Summary`, keep canonical proper-noun technical terms in their original language (Stripe, MLflow, JWT, FHIR, Kubernetes, BAM, VCF) so English token queries still hit; add a workflow-language paraphrase next to any term whose meaning is non-obvious — e.g. "JWT 토큰 무효화 (token invalidation)"
|
|
47
49
|
- generate index entries automatically from primary concept names, aliases, repository nicknames, and workflow labels when those are clear
|
|
48
50
|
- split glossary docs when a concept is likely to be searched directly, needs more than a short definition, or carries workflow/constraint details; keep only low-value leftover terms in a shared glossary
|
|
49
51
|
- index format: top-level `- docs/path.md` with indented ` - keyword` lines under it — groups all keywords per doc, eliminates path duplication
|