evnict-kit 0.2.2 → 0.2.4

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 (80) hide show
  1. package/README.md +39 -2
  2. package/bin/cli.js +7 -1
  3. package/package.json +1 -1
  4. package/scripts/patch-workflows.js +142 -0
  5. package/scripts/postinstall.js +1 -1
  6. package/src/commands/init.js +18 -9
  7. package/src/commands/sync.js +317 -0
  8. package/src/commands/upgrade.js +7 -1
  9. package/src/utils/config.js +2 -2
  10. package/templates/GETTING-STARTED.md +23 -2
  11. package/templates/content/skills/evnict-kit-bug-fix/SKILL.md +1 -1
  12. package/templates/content/skills/evnict-kit-git-worktrees/SKILL.md +0 -2
  13. package/templates/content/skills/evnict-kit-onboard/SKILL.md +0 -1
  14. package/templates/content/skills/evnict-kit-spec/SKILL.md +1 -1
  15. package/templates/content/skills/evnict-kit-wiki/SKILL.md +16 -54
  16. package/templates/content/workflows/evnict-kit-archive-wiki.md +4 -5
  17. package/templates/content/workflows/evnict-kit-attt.md +1 -1
  18. package/templates/content/workflows/evnict-kit-bug-fix.md +1 -1
  19. package/templates/content/workflows/evnict-kit-feature-large.md +2 -2
  20. package/templates/content/workflows/evnict-kit-feature-small.md +1 -1
  21. package/templates/content/workflows/evnict-kit-init-wiki.md +18 -47
  22. package/templates/content/workflows/evnict-kit-wiki-archive-feature.md +2 -3
  23. package/templates/content/workflows/evnict-kit-wiki-query.md +3 -3
  24. package/templates/content/workflows/evnict-kit-wiki-scan-project.md +3 -4
  25. package/templates/skills/evnict-kit-bug-fix/SKILL.md +1 -1
  26. package/templates/skills/evnict-kit-create-component/SKILL.md +23 -0
  27. package/templates/skills/evnict-kit-create-page/SKILL.md +23 -0
  28. package/templates/skills/evnict-kit-frontend-design/SKILL.md +161 -0
  29. package/templates/skills/evnict-kit-spec/SKILL.md +1 -1
  30. package/templates/skills/evnict-kit-wiki/SKILL.md +16 -54
  31. package/templates/wiki/AGENTS.md +280 -0
  32. package/templates/wiki/CLAUDE.md +280 -0
  33. package/templates/wiki/FAQ.md +168 -0
  34. package/templates/wiki/README.md +272 -35
  35. package/templates/wiki/config.example.yaml +145 -17
  36. package/templates/wiki/scripts/run-wiki.sh +17 -0
  37. package/templates/wiki/scripts/setup-scheduler.ps1 +29 -0
  38. package/templates/wiki/skills/llm-wiki/SKILL.md +341 -0
  39. package/templates/wiki/wiki/INDEX.md +9 -0
  40. package/templates/wiki/wiki/INDEX.template.md +29 -0
  41. package/templates/wiki/wiki/LOG.md +3 -0
  42. package/templates/wiki/wiki/LOG.template.md +7 -0
  43. package/templates/wiki/wiki-viewer.html +408 -0
  44. package/templates/workflows/antigravity/evnict-kit-archive-wiki.md +24 -5
  45. package/templates/workflows/antigravity/evnict-kit-attt.md +21 -1
  46. package/templates/workflows/antigravity/evnict-kit-bug-fix.md +24 -1
  47. package/templates/workflows/antigravity/evnict-kit-feature-large.md +26 -2
  48. package/templates/workflows/antigravity/evnict-kit-feature-small.md +24 -1
  49. package/templates/workflows/antigravity/evnict-kit-handoff.md +23 -0
  50. package/templates/workflows/antigravity/evnict-kit-implement.md +23 -0
  51. package/templates/workflows/antigravity/evnict-kit-init-check.md +20 -0
  52. package/templates/workflows/antigravity/evnict-kit-init-context.md +20 -0
  53. package/templates/workflows/antigravity/evnict-kit-init-rules.md +20 -0
  54. package/templates/workflows/antigravity/evnict-kit-init-wiki.md +26 -8
  55. package/templates/workflows/antigravity/evnict-kit-plan.md +24 -0
  56. package/templates/workflows/antigravity/evnict-kit-review.md +20 -0
  57. package/templates/workflows/antigravity/evnict-kit-spec-archive.md +20 -0
  58. package/templates/workflows/antigravity/evnict-kit-wiki-archive-feature.md +22 -3
  59. package/templates/workflows/antigravity/evnict-kit-wiki-query.md +23 -3
  60. package/templates/workflows/antigravity/evnict-kit-wiki-scan-project.md +23 -4
  61. package/templates/workflows/claude/evnict-kit-archive-wiki.md +24 -5
  62. package/templates/workflows/claude/evnict-kit-attt.md +21 -1
  63. package/templates/workflows/claude/evnict-kit-bug-fix.md +24 -1
  64. package/templates/workflows/claude/evnict-kit-feature-large.md +26 -2
  65. package/templates/workflows/claude/evnict-kit-feature-small.md +24 -1
  66. package/templates/workflows/claude/evnict-kit-handoff.md +23 -0
  67. package/templates/workflows/claude/evnict-kit-implement.md +23 -0
  68. package/templates/workflows/claude/evnict-kit-init-check.md +20 -0
  69. package/templates/workflows/claude/evnict-kit-init-context.md +20 -0
  70. package/templates/workflows/claude/evnict-kit-init-rules.md +20 -0
  71. package/templates/workflows/claude/evnict-kit-init-wiki.md +25 -7
  72. package/templates/workflows/claude/evnict-kit-plan.md +24 -0
  73. package/templates/workflows/claude/evnict-kit-review.md +20 -0
  74. package/templates/workflows/claude/evnict-kit-spec-archive.md +20 -0
  75. package/templates/workflows/claude/evnict-kit-wiki-archive-feature.md +22 -3
  76. package/templates/workflows/claude/evnict-kit-wiki-query.md +23 -3
  77. package/templates/workflows/claude/evnict-kit-wiki-scan-project.md +23 -4
  78. package/templates/wiki/package.json +0 -17
  79. package/templates/wiki/raw/notes/.gitkeep +0 -1
  80. package/templates/wiki/scripts/ingest.js +0 -66
@@ -0,0 +1,408 @@
1
+ <!DOCTYPE html>
2
+ <html lang="vi">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
6
+ <title>LLM Wiki Viewer</title>
7
+ <style>
8
+ *{margin:0;padding:0;box-sizing:border-box}
9
+ :root{--bg:#0d1117;--surface:#161b22;--surface2:#21262d;--border:#30363d;--text:#e6edf3;--text2:#8b949e;--accent:#58a6ff;--entity:#3fb950;--concept:#d2a8ff;--source:#f0883e;--synthesis:#f778ba;--red:#f85149}
10
+ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:var(--bg);color:var(--text);overflow-x:hidden;font-size:15px;line-height:1.6}
11
+ a{color:var(--accent);text-decoration:none}
12
+
13
+ /* Nav tabs */
14
+ .nav{position:fixed;bottom:0;left:0;right:0;display:flex;background:var(--surface);border-top:1px solid var(--border);z-index:100;padding-bottom:env(safe-area-inset-bottom)}
15
+ .nav button{flex:1;padding:10px 4px 8px;background:none;border:none;color:var(--text2);font-size:11px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:2px}
16
+ .nav button.active{color:var(--accent)}
17
+ .nav button svg{width:22px;height:22px}
18
+
19
+ /* Panels */
20
+ .panel{display:none;padding:16px;padding-bottom:80px;min-height:100vh}
21
+ .panel.active{display:block}
22
+
23
+ /* Dashboard */
24
+ .dash-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:20px}
25
+ .dash-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:16px;text-align:center}
26
+ .dash-card .num{font-size:32px;font-weight:700;display:block}
27
+ .dash-card .label{font-size:12px;color:var(--text2);text-transform:uppercase;letter-spacing:1px}
28
+ .dash-card.entity .num{color:var(--entity)}
29
+ .dash-card.concept .num{color:var(--concept)}
30
+ .dash-card.source .num{color:var(--source)}
31
+ .dash-card.synthesis .num{color:var(--synthesis)}
32
+ .stat-row{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:14px 16px;margin-bottom:8px;display:flex;justify-content:space-between;align-items:center}
33
+ .stat-row .label{color:var(--text2);font-size:13px}
34
+ .stat-row .val{font-weight:600}
35
+
36
+ /* Page list */
37
+ .search-box{width:100%;padding:12px 16px;background:var(--surface);border:1px solid var(--border);border-radius:10px;color:var(--text);font-size:15px;margin-bottom:16px;outline:none}
38
+ .search-box:focus{border-color:var(--accent)}
39
+ .search-box::placeholder{color:var(--text2)}
40
+ .cat-header{font-size:12px;color:var(--text2);text-transform:uppercase;letter-spacing:1.5px;margin:20px 0 8px;padding-left:4px}
41
+ .page-item{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:12px 16px;margin-bottom:6px;cursor:pointer;transition:border-color .15s}
42
+ .page-item:active{border-color:var(--accent);background:var(--surface2)}
43
+ .page-item .title{font-weight:600;font-size:14px;margin-bottom:2px}
44
+ .page-item .links-count{font-size:12px;color:var(--text2)}
45
+ .tag{display:inline-block;font-size:10px;padding:2px 8px;border-radius:20px;font-weight:600;margin-right:4px}
46
+ .tag.entity{background:rgba(63,185,80,.15);color:var(--entity)}
47
+ .tag.concept{background:rgba(210,168,255,.15);color:var(--concept)}
48
+ .tag.source{background:rgba(240,136,62,.15);color:var(--source)}
49
+ .tag.synthesis{background:rgba(247,120,186,.15);color:var(--synthesis)}
50
+
51
+ /* Page detail */
52
+ .page-detail{display:none;position:fixed;inset:0;background:var(--bg);z-index:200;overflow-y:auto;padding:16px;padding-bottom:80px}
53
+ .page-detail.open{display:block}
54
+ .back-btn{background:var(--surface);border:1px solid var(--border);color:var(--accent);padding:8px 16px;border-radius:8px;font-size:14px;cursor:pointer;margin-bottom:16px;display:inline-flex;align-items:center;gap:6px}
55
+ .page-content{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:20px;line-height:1.7}
56
+ .page-content h1{font-size:22px;margin-bottom:12px;color:var(--text)}
57
+ .page-content h2{font-size:17px;margin:20px 0 8px;color:var(--accent);border-bottom:1px solid var(--border);padding-bottom:4px}
58
+ .page-content h3{font-size:15px;margin:16px 0 6px;color:var(--concept)}
59
+ .page-content p{margin-bottom:10px}
60
+ .page-content ul,.page-content ol{margin:8px 0 12px 20px}
61
+ .page-content li{margin-bottom:4px}
62
+ .page-content code{background:var(--surface2);padding:2px 6px;border-radius:4px;font-size:13px;font-family:'SF Mono',Consolas,monospace}
63
+ .page-content pre{background:var(--surface2);padding:12px;border-radius:8px;overflow-x:auto;margin:10px 0;font-size:13px}
64
+ .page-content pre code{background:none;padding:0}
65
+ .page-content blockquote{border-left:3px solid var(--accent);padding-left:14px;color:var(--text2);margin:10px 0;font-style:italic}
66
+ .page-content table{width:100%;border-collapse:collapse;margin:10px 0;font-size:13px}
67
+ .page-content th{background:var(--surface2);text-align:left;padding:8px;border:1px solid var(--border)}
68
+ .page-content td{padding:8px;border:1px solid var(--border)}
69
+ .page-content strong{color:var(--text)}
70
+ .wiki-link{color:var(--accent);cursor:pointer;text-decoration:underline;text-decoration-style:dotted}
71
+
72
+ /* Graph */
73
+ #graph-canvas{width:100%;border-radius:12px;background:var(--surface);border:1px solid var(--border);touch-action:none}
74
+ .graph-legend{display:flex;flex-wrap:wrap;gap:12px;margin:12px 0;font-size:12px}
75
+ .graph-legend span{display:flex;align-items:center;gap:4px}
76
+ .graph-legend .dot{width:10px;height:10px;border-radius:50%;display:inline-block}
77
+
78
+ /* Header */
79
+ .header{padding:20px 0 12px;margin-bottom:8px}
80
+ .header h1{font-size:22px;font-weight:700}
81
+ .header p{color:var(--text2);font-size:13px}
82
+ </style>
83
+ </head>
84
+ <body>
85
+
86
+ <div id="panel-dash" class="panel active">
87
+ <div class="header">
88
+ <h1>LLM Wiki</h1>
89
+ <p>Knowledge base cá nhân — cập nhật 2026-04-06</p>
90
+ </div>
91
+ <div class="dash-grid">
92
+ <div class="dash-card entity"><span class="num">10</span><span class="label">Entities</span></div>
93
+ <div class="dash-card concept"><span class="num">12</span><span class="label">Concepts</span></div>
94
+ <div class="dash-card source"><span class="num">7</span><span class="label">Sources</span></div>
95
+ <div class="dash-card synthesis"><span class="num">6</span><span class="label">Syntheses</span></div>
96
+ </div>
97
+ <div class="stat-row"><span class="label">Tổng trang wiki</span><span class="val">34</span></div>
98
+ <div class="stat-row"><span class="label">Raw sources</span><span class="val">7 files</span></div>
99
+ <div class="stat-row"><span class="label">Cross-links</span><span class="val" id="link-count">—</span></div>
100
+ <div class="stat-row"><span class="label">Broken links</span><span class="val" style="color:var(--red)" id="broken-count">—</span></div>
101
+ <div class="stat-row"><span class="label">Lần discover cuối</span><span class="val">2026-04-06</span></div>
102
+ <div class="stat-row"><span class="label">Sức khỏe</span><span class="val" style="color:var(--entity)">Tốt</span></div>
103
+
104
+ <h2 style="margin:24px 0 12px;font-size:16px">Syntheses mới nhất</h2>
105
+ <div id="recent-syntheses"></div>
106
+ </div>
107
+
108
+ <div id="panel-pages" class="panel">
109
+ <input class="search-box" placeholder="Tìm kiếm trang wiki..." id="search" autocomplete="off">
110
+ <div id="page-list"></div>
111
+ </div>
112
+
113
+ <div id="panel-graph" class="panel">
114
+ <div class="header">
115
+ <h1>Graph View</h1>
116
+ <p>Nhấn vào node để xem trang</p>
117
+ </div>
118
+ <div class="graph-legend">
119
+ <span><span class="dot" style="background:var(--entity)"></span> Entity</span>
120
+ <span><span class="dot" style="background:var(--concept)"></span> Concept</span>
121
+ <span><span class="dot" style="background:var(--source)"></span> Source</span>
122
+ <span><span class="dot" style="background:var(--synthesis)"></span> Synthesis</span>
123
+ </div>
124
+ <canvas id="graph-canvas"></canvas>
125
+ </div>
126
+
127
+ <div class="page-detail" id="page-detail">
128
+ <button class="back-btn" onclick="closeDetail()">← Quay lại</button>
129
+ <div class="page-content" id="page-content"></div>
130
+ </div>
131
+
132
+ <nav class="nav">
133
+ <button class="active" onclick="showPanel('dash',this)">
134
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
135
+ Tổng quan
136
+ </button>
137
+ <button onclick="showPanel('pages',this)">
138
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14,2 14,8 20,8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
139
+ Trang
140
+ </button>
141
+ <button onclick="showPanel('graph',this)">
142
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="6" cy="6" r="3"/><circle cx="18" cy="18" r="3"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><line x1="8.5" y1="7.5" x2="15.5" y2="16.5"/><line x1="15.5" y1="7.5" x2="8.5" y2="16.5"/></svg>
143
+ Graph
144
+ </button>
145
+ </nav>
146
+
147
+ <script>
148
+ // ========== DATA ==========
149
+ const pages = {
150
+ "agent-skills":{"cat":"concept","title":"Agent Skills — SKILL.md Pattern","links":["claude-code-skills-guide","github-top10-open-source-ai","letta-agent-file","mcp-protocol"]},
151
+ "compounding-knowledge":{"cat":"concept","title":"Compounding Knowledge (Kiến thức tích lũy)","links":["error-compounding","lint-workflow","llm-wiki-pattern","nick-spisak","query-workflow"]},
152
+ "error-compounding":{"cat":"concept","title":"Error Compounding (Lỗi tích lũy)","links":["compounding-knowledge","lint-workflow","llm-wiki-pattern"]},
153
+ "ingest-workflow":{"cat":"concept","title":"Ingest Workflow","links":["andrej-karpathy","compounding-knowledge","lint-workflow","llm-wiki-pattern","nick-spisak","query-workflow","rag-pattern"]},
154
+ "karpathy-loop":{"cat":"concept","title":"The Karpathy Loop","links":["andrej-karpathy","autoresearch","llm-wiki-pattern","rag-pattern"]},
155
+ "lint-workflow":{"cat":"concept","title":"Lint Workflow (Health Check)","links":["compounding-knowledge","error-compounding","ingest-workflow","llm-wiki-pattern","nick-spisak","query-workflow"]},
156
+ "llm-wiki-pattern":{"cat":"concept","title":"LLM Wiki Pattern","links":["andrej-karpathy","compounding-knowledge","ingest-workflow","lint-workflow","nick-spisak","query-workflow","rag-pattern","schema-file"]},
157
+ "local-ai-movement":{"cat":"concept","title":"Local AI Movement","links":["github-top10-open-source-ai","mcp-protocol","ollama","openclaw","top-ai-github-repos-2026"]},
158
+ "mcp-protocol":{"cat":"concept","title":"Model Context Protocol (MCP)","links":["agent-skills","claude-code-skills-guide","github-top10-open-source-ai","letta-agent-file","owl-framework"]},
159
+ "query-workflow":{"cat":"concept","title":"Query Workflow","links":["andrej-karpathy","compounding-knowledge","ingest-workflow","lint-workflow","llm-wiki-pattern","nick-spisak"]},
160
+ "rag-pattern":{"cat":"concept","title":"RAG Pattern","links":["andrej-karpathy","llm-wiki-pattern"]},
161
+ "schema-file":{"cat":"concept","title":"Schema File","links":["andrej-karpathy","llm-wiki-pattern","nick-spisak"]},
162
+ "agent-browser":{"cat":"entity","title":"Agent Browser","links":["llm-wiki-pattern","nick-spisak","obsidian"]},
163
+ "andrej-karpathy":{"cat":"entity","title":"Andrej Karpathy","links":["autoresearch","karpathy-loop","llm-wiki-pattern","nick-spisak","obsidian","rag-pattern"]},
164
+ "autoresearch":{"cat":"entity","title":"Autoresearch","links":["andrej-karpathy","karpathy-autoresearch","karpathy-loop"]},
165
+ "letta-agent-file":{"cat":"entity","title":"Letta — Agent File (.af)","links":["agent-skills","github-top10-open-source-ai","mcp-protocol","owl-framework"]},
166
+ "nick-spisak":{"cat":"entity","title":"Nick Spisak","links":["agent-browser","andrej-karpathy","llm-wiki-pattern"]},
167
+ "obsidian":{"cat":"entity","title":"Obsidian","links":["andrej-karpathy","llm-wiki-pattern","nick-spisak"]},
168
+ "ollama":{"cat":"entity","title":"Ollama","links":["local-ai-movement","mcp-protocol","openclaw","top-ai-github-repos-2026"]},
169
+ "openclaw":{"cat":"entity","title":"OpenClaw","links":["local-ai-movement","mcp-protocol","ollama","top-ai-github-repos-2026"]},
170
+ "owl-framework":{"cat":"entity","title":"OWL Framework","links":["github-top10-open-source-ai","letta-agent-file","local-ai-movement","mcp-protocol"]},
171
+ "peter-steinberger":{"cat":"entity","title":"Peter Steinberger (steipete)","links":["andrej-karpathy","steipete-agent-rules"]},
172
+ "claude-code-skills-guide":{"cat":"source","title":"Claude Code Skills Guide 2026","links":["agent-skills","mcp-protocol"]},
173
+ "github-top10-open-source-ai":{"cat":"source","title":"GitHub Top 10 Open Source AI","links":["letta-agent-file","local-ai-movement","mcp-protocol","owl-framework"]},
174
+ "karpathy-autoresearch":{"cat":"source","title":"Nguồn: Karpathy Autoresearch","links":["andrej-karpathy","autoresearch","karpathy-loop"]},
175
+ "karpathy-llm-wiki":{"cat":"source","title":"Nguồn: Karpathy LLM Wiki","links":["andrej-karpathy","compounding-knowledge","ingest-workflow","lint-workflow","llm-wiki-pattern","obsidian","query-workflow","rag-pattern","schema-file"]},
176
+ "nick-spisak-second-brain":{"cat":"source","title":"Nguồn: Nick Spisak Second Brain","links":["agent-browser","andrej-karpathy","compounding-knowledge","error-compounding","llm-wiki-pattern","nick-spisak","obsidian","schema-file"]},
177
+ "steipete-agent-rules":{"cat":"source","title":"Nguồn: steipete Agent Rules","links":["andrej-karpathy","peter-steinberger"]},
178
+ "top-ai-github-repos-2026":{"cat":"source","title":"Top AI GitHub Repos 2026","links":["local-ai-movement","mcp-protocol","ollama","openclaw"]},
179
+ "ai-tooling-philosophies":{"cat":"synthesis","title":"Triết lý AI Tooling: Karpathy, steipete, Spisak","links":["agent-browser","andrej-karpathy","autoresearch","error-compounding","karpathy-loop","llm-wiki-pattern","nick-spisak","obsidian","peter-steinberger","schema-file"]},
180
+ "claude-code-skills-best-practices":{"cat":"synthesis","title":"Best Practices viết Claude Code Skills","links":["agent-skills","claude-code-skills-guide","mcp-protocol","peter-steinberger","schema-file","steipete-agent-rules"]},
181
+ "local-ai-agent-stack":{"cat":"synthesis","title":"Stack Build AI Agent Local","links":["agent-skills","claude-code-skills-guide","llm-wiki-pattern","local-ai-movement","mcp-protocol","ollama","openclaw"]},
182
+ "mcp-impact-analysis":{"cat":"synthesis","title":"MCP Impact Analysis","links":["agent-skills","claude-code-skills-guide","github-top10-open-source-ai","letta-agent-file","mcp-protocol","owl-framework"]},
183
+ "rag-vs-llm-wiki-vs-local-ai":{"cat":"synthesis","title":"RAG vs LLM Wiki vs Local AI","links":["andrej-karpathy","compounding-knowledge","error-compounding","llm-wiki-pattern","local-ai-movement","mcp-protocol","nick-spisak","rag-pattern","schema-file","top-ai-github-repos-2026"]},
184
+ "top-3-ai-trends-2026":{"cat":"synthesis","title":"Top 3 Xu hướng AI 2026","links":["agent-skills","autoresearch","karpathy-loop","letta-agent-file","local-ai-movement","mcp-protocol","ollama","openclaw","owl-framework","top-ai-github-repos-2026"]}
185
+ };
186
+
187
+ const catColors={"entity":"#3fb950","concept":"#d2a8ff","source":"#f0883e","synthesis":"#f778ba"};
188
+ const catOrder=["synthesis","entity","concept","source"];
189
+ const catLabels={"entity":"Entities","concept":"Concepts","source":"Sources","synthesis":"Syntheses"};
190
+ const allIds=Object.keys(pages);
191
+
192
+ // Count links & broken
193
+ let totalLinks=0,brokenLinks=new Set();
194
+ for(const[id,p]of Object.entries(pages)){
195
+ p.links.forEach(l=>{totalLinks++;if(!pages[l])brokenLinks.add(l)});
196
+ }
197
+ document.getElementById('link-count').textContent=totalLinks;
198
+ document.getElementById('broken-count').textContent=brokenLinks.size;
199
+
200
+ // ========== NAVIGATION ==========
201
+ function showPanel(name,btn){
202
+ document.querySelectorAll('.panel').forEach(p=>p.classList.remove('active'));
203
+ document.getElementById('panel-'+name).classList.add('active');
204
+ document.querySelectorAll('.nav button').forEach(b=>b.classList.remove('active'));
205
+ if(btn)btn.classList.add('active');
206
+ if(name==='graph')setTimeout(drawGraph,100);
207
+ }
208
+
209
+ // ========== DASHBOARD ==========
210
+ (function(){
211
+ const c=document.getElementById('recent-syntheses');
212
+ const syns=allIds.filter(id=>pages[id].cat==='synthesis');
213
+ syns.forEach(id=>{
214
+ const d=document.createElement('div');
215
+ d.className='page-item';
216
+ d.innerHTML=`<span class="tag synthesis">synthesis</span><div class="title">${pages[id].title}</div><div class="links-count">${pages[id].links.length} liên kết</div>`;
217
+ d.onclick=()=>openDetail(id);
218
+ c.appendChild(d);
219
+ });
220
+ })();
221
+
222
+ // ========== PAGE LIST ==========
223
+ function renderPageList(filter=''){
224
+ const c=document.getElementById('page-list');
225
+ c.innerHTML='';
226
+ const q=filter.toLowerCase();
227
+ catOrder.forEach(cat=>{
228
+ const items=allIds.filter(id=>pages[id].cat===cat&&(q===''||pages[id].title.toLowerCase().includes(q)||id.includes(q)));
229
+ if(!items.length)return;
230
+ const h=document.createElement('div');
231
+ h.className='cat-header';
232
+ h.textContent=catLabels[cat]+` (${items.length})`;
233
+ c.appendChild(h);
234
+ items.forEach(id=>{
235
+ const d=document.createElement('div');
236
+ d.className='page-item';
237
+ d.innerHTML=`<span class="tag ${cat}">${cat}</span><div class="title">${pages[id].title}</div><div class="links-count">${pages[id].links.length} liên kết</div>`;
238
+ d.onclick=()=>openDetail(id);
239
+ c.appendChild(d);
240
+ });
241
+ });
242
+ }
243
+ renderPageList();
244
+ document.getElementById('search').addEventListener('input',e=>renderPageList(e.target.value));
245
+
246
+ // ========== PAGE DETAIL ==========
247
+ async function openDetail(id){
248
+ const p=pages[id];
249
+ if(!p)return;
250
+ const catMap={"entity":"entities","concept":"concepts","source":"sources","synthesis":"syntheses"};
251
+ const path=catMap[p.cat]+'/'+id+'.md';
252
+
253
+ // Build content from links & title (since we can't fetch local files from browser)
254
+ let html=`<h1>${p.title}</h1>`;
255
+ html+=`<p><span class="tag ${p.cat}">${p.cat}</span></p>`;
256
+ html+=`<h2>Liên kết (${p.links.length})</h2><ul>`;
257
+ p.links.forEach(l=>{
258
+ const target=pages[l];
259
+ if(target){
260
+ html+=`<li><span class="wiki-link" onclick="openDetail('${l}')">${target.title}</span> <span class="tag ${target.cat}" style="font-size:9px">${target.cat}</span></li>`;
261
+ } else {
262
+ html+=`<li style="color:var(--red)">⚠ ${l} (chưa tồn tại)</li>`;
263
+ }
264
+ });
265
+ html+=`</ul>`;
266
+
267
+ // Incoming links
268
+ const incoming=allIds.filter(oid=>pages[oid].links.includes(id));
269
+ if(incoming.length){
270
+ html+=`<h2>Được liên kết từ (${incoming.length})</h2><ul>`;
271
+ incoming.forEach(oid=>{
272
+ const o=pages[oid];
273
+ html+=`<li><span class="wiki-link" onclick="openDetail('${oid}')">${o.title}</span> <span class="tag ${o.cat}" style="font-size:9px">${o.cat}</span></li>`;
274
+ });
275
+ html+=`</ul>`;
276
+ }
277
+
278
+ html+=`<h2>Đường dẫn file</h2><p><code>wiki/${path}</code></p>`;
279
+
280
+ document.getElementById('page-content').innerHTML=html;
281
+ document.getElementById('page-detail').classList.add('open');
282
+ }
283
+
284
+ function closeDetail(){
285
+ document.getElementById('page-detail').classList.remove('open');
286
+ }
287
+
288
+ // ========== GRAPH VIEW ==========
289
+ function drawGraph(){
290
+ const canvas=document.getElementById('graph-canvas');
291
+ const W=canvas.parentElement.clientWidth-32;
292
+ const H=Math.max(W*1.2,500);
293
+ const dpr=window.devicePixelRatio||1;
294
+ canvas.width=W*dpr;canvas.height=H*dpr;
295
+ canvas.style.width=W+'px';canvas.style.height=H+'px';
296
+ const ctx=canvas.getContext('2d');
297
+ ctx.scale(dpr,dpr);
298
+
299
+ // Layout: force-directed (simple)
300
+ const nodes={};
301
+ const ids=allIds;
302
+ ids.forEach((id,i)=>{
303
+ const angle=(i/ids.length)*Math.PI*2;
304
+ const r=Math.min(W,H)*0.35;
305
+ nodes[id]={
306
+ x:W/2+r*Math.cos(angle)+(Math.random()-.5)*40,
307
+ y:H/2+r*Math.sin(angle)+(Math.random()-.5)*40,
308
+ vx:0,vy:0,
309
+ cat:pages[id].cat,
310
+ title:pages[id].title,
311
+ linkCount:pages[id].links.length
312
+ };
313
+ });
314
+
315
+ // Edges
316
+ const edges=[];
317
+ ids.forEach(id=>{
318
+ pages[id].links.forEach(l=>{
319
+ if(nodes[l])edges.push([id,l]);
320
+ });
321
+ });
322
+
323
+ // Simulate
324
+ for(let iter=0;iter<200;iter++){
325
+ // Repulsion
326
+ for(let i=0;i<ids.length;i++){
327
+ for(let j=i+1;j<ids.length;j++){
328
+ const a=nodes[ids[i]],b=nodes[ids[j]];
329
+ let dx=b.x-a.x,dy=b.y-a.y;
330
+ let d=Math.sqrt(dx*dx+dy*dy)||1;
331
+ let f=800/(d*d);
332
+ a.vx-=dx/d*f;a.vy-=dy/d*f;
333
+ b.vx+=dx/d*f;b.vy+=dy/d*f;
334
+ }
335
+ }
336
+ // Attraction
337
+ edges.forEach(([a,b])=>{
338
+ const na=nodes[a],nb=nodes[b];
339
+ let dx=nb.x-na.x,dy=nb.y-na.y;
340
+ let d=Math.sqrt(dx*dx+dy*dy)||1;
341
+ let f=(d-80)*0.01;
342
+ na.vx+=dx/d*f;na.vy+=dy/d*f;
343
+ nb.vx-=dx/d*f;nb.vy-=dy/d*f;
344
+ });
345
+ // Center gravity
346
+ ids.forEach(id=>{
347
+ const n=nodes[id];
348
+ n.vx+=(W/2-n.x)*0.002;
349
+ n.vy+=(H/2-n.y)*0.002;
350
+ n.vx*=0.85;n.vy*=0.85;
351
+ n.x+=n.vx;n.y+=n.vy;
352
+ n.x=Math.max(30,Math.min(W-30,n.x));
353
+ n.y=Math.max(30,Math.min(H-30,n.y));
354
+ });
355
+ }
356
+
357
+ // Draw edges
358
+ ctx.strokeStyle='rgba(48,54,61,0.6)';
359
+ ctx.lineWidth=0.8;
360
+ edges.forEach(([a,b])=>{
361
+ ctx.beginPath();
362
+ ctx.moveTo(nodes[a].x,nodes[a].y);
363
+ ctx.lineTo(nodes[b].x,nodes[b].y);
364
+ ctx.stroke();
365
+ });
366
+
367
+ // Draw nodes
368
+ const nodePositions=[];
369
+ ids.forEach(id=>{
370
+ const n=nodes[id];
371
+ const r=Math.max(4,Math.min(12,3+n.linkCount*0.8));
372
+ ctx.beginPath();
373
+ ctx.arc(n.x,n.y,r,0,Math.PI*2);
374
+ ctx.fillStyle=catColors[n.cat];
375
+ ctx.fill();
376
+ ctx.strokeStyle=catColors[n.cat];
377
+ ctx.lineWidth=1;
378
+ ctx.stroke();
379
+ nodePositions.push({id,x:n.x,y:n.y,r});
380
+
381
+ // Label for larger nodes
382
+ if(n.linkCount>=3){
383
+ ctx.fillStyle='rgba(230,237,243,0.85)';
384
+ ctx.font='10px -apple-system,sans-serif';
385
+ ctx.textAlign='center';
386
+ let label=id.replace(/-/g,' ');
387
+ if(label.length>18)label=label.substring(0,16)+'…';
388
+ ctx.fillText(label,n.x,n.y-r-4);
389
+ }
390
+ });
391
+
392
+ // Click handler
393
+ canvas.onclick=function(e){
394
+ const rect=canvas.getBoundingClientRect();
395
+ const mx=(e.clientX-rect.left);
396
+ const my=(e.clientY-rect.top);
397
+ for(const np of nodePositions){
398
+ const dx=mx-np.x,dy=my-np.y;
399
+ if(dx*dx+dy*dy<(np.r+8)*(np.r+8)){
400
+ openDetail(np.id);
401
+ return;
402
+ }
403
+ }
404
+ };
405
+ }
406
+ </script>
407
+ </body>
408
+ </html>
@@ -29,9 +29,9 @@ Nếu không tồn tại → DỪNG VÀ BÁO LỖI:
29
29
  ### Check 2: Wiki Software đã setup
30
30
  Agent thực hiện:
31
31
  ```bash
32
- ls {project_name}-wiki/package.json
32
+ ls {project_name}-wiki/CLAUDE.md
33
33
  ```
34
- Nếu không tồn tại file package.json → DỪNG VÀ BÁO LỖI:
34
+ Nếu không tồn tại file CLAUDE.md → DỪNG VÀ BÁO LỖI:
35
35
  *"Thư mục Wiki chưa được khởi tạo thư viện Ingestion. Vui lòng chạy `/evnict-kit:init-wiki` trước."*
36
36
 
37
37
  ### Check 3: Read/Write Permissions
@@ -55,13 +55,12 @@ Gọi skill `evnict-kit-wiki` action=push:
55
55
  - Sinh markdown file với frontmatter chuẩn
56
56
  - Copy vào `{wiki_path}/raw/notes/`
57
57
 
58
- ## Bước 3: Auto-ingest (THAY CHO npm run ingest thủ công)
58
+ ## Bước 3: Auto-ingest (THAY CHO Agent follow SKILL.md to ingest thủ công)
59
59
  Agent TRỰC TIẾP chạy:
60
60
  ```bash
61
- cd {wiki_path} && node scripts/ingest.js
61
+ cd {wiki_path} && Agent follow SKILL.md to ingest
62
62
  ```
63
63
  KHÔNG bắt user switch terminal hay chạy npm thủ công.
64
- Nếu `scripts/ingest.js` không tồn tại → thử `npm run ingest`.
65
64
  Nếu vẫn fail → báo: *"Chạy `/evnict-kit:init-wiki`"*
66
65
 
67
66
  ## Bước 4: Archive spec
@@ -92,6 +91,26 @@ Workflow này là shortcut. Để nạp tri thức chi tiết hơn, dùng:
92
91
 
93
92
  ---
94
93
 
94
+ ---
95
+
96
+ ## ⚠️ NHẮC NHỞ: Tuân thủ Rules & Context
97
+
98
+ > **Agent dùng lâu có thể quên rules.** Trước khi bắt đầu code, tự kiểm tra:
99
+
100
+ ### Quick Check (agent tự đánh giá)
101
+ 1. ✅ Tôi đã đọc `.agent/rules/` trong phiên làm việc này chưa?
102
+ 2. ✅ Tôi đã đọc AGENTS.md (hoặc context file) chưa?
103
+ 3. ✅ Tôi nhớ rõ coding conventions của dự án này không?
104
+
105
+ **→ Nếu BẤT KỲ câu nào = "CHƯA" hoặc "KHÔNG CHẮC":**
106
+ - Đọc lại tất cả files trong `.agent/rules/` (hoặc thư mục rules tương ứng)
107
+ - Đọc lại AGENTS.md (hoặc context file tương ứng)
108
+ - Query wiki nếu có: `grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"`
109
+
110
+ **→ Nếu TẤT CẢ = "RỒI" → tiếp tục workflow, KHÔNG cần đọc lại.**
111
+
112
+ > **NGUYÊN TẮC:** Không chắc convention → ĐỌC LẠI rule file. KHÔNG đoán.
113
+
95
114
  ## Checklist
96
115
  - [ ] Feature summarized
97
116
  - [ ] Wiki pushed
@@ -83,7 +83,7 @@ Gọi skill `evnict-kit-wiki` action=push:
83
83
 
84
84
  Auto-ingest:
85
85
  ```bash
86
- cd {wiki_path} && node scripts/ingest.js
86
+ cd {wiki_path} && Agent follow SKILL.md to ingest
87
87
  ```
88
88
 
89
89
  > **Lưu ý:** Để nạp tri thức chi tiết hơn, dùng:
@@ -92,6 +92,26 @@ cd {wiki_path} && node scripts/ingest.js
92
92
 
93
93
  ---
94
94
 
95
+ ---
96
+
97
+ ## ⚠️ NHẮC NHỞ: Tuân thủ Rules & Context
98
+
99
+ > **Agent dùng lâu có thể quên rules.** Trước khi bắt đầu code, tự kiểm tra:
100
+
101
+ ### Quick Check (agent tự đánh giá)
102
+ 1. ✅ Tôi đã đọc `.agent/rules/` trong phiên làm việc này chưa?
103
+ 2. ✅ Tôi đã đọc AGENTS.md (hoặc context file) chưa?
104
+ 3. ✅ Tôi nhớ rõ coding conventions của dự án này không?
105
+
106
+ **→ Nếu BẤT KỲ câu nào = "CHƯA" hoặc "KHÔNG CHẮC":**
107
+ - Đọc lại tất cả files trong `.agent/rules/` (hoặc thư mục rules tương ứng)
108
+ - Đọc lại AGENTS.md (hoặc context file tương ứng)
109
+ - Query wiki nếu có: `grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"`
110
+
111
+ **→ Nếu TẤT CẢ = "RỒI" → tiếp tục workflow, KHÔNG cần đọc lại.**
112
+
113
+ > **NGUYÊN TẮC:** Không chắc convention → ĐỌC LẠI rule file. KHÔNG đoán.
114
+
95
115
  ## Checklist hoàn thành
96
116
  - [ ] Scan completed (full hoặc module)
97
117
  - [ ] Critical/High issues fixed
@@ -19,7 +19,7 @@ description: Bug fix workflow — query wiki → classify → reproduce → TDD
19
19
  ## Bước 1: Query wiki
20
20
  Kiểm tra bug đã được report/fix trước đó:
21
21
  ```bash
22
- grep -rl "{keyword}" {wiki_path}/processed/ --include="*.md"
22
+ grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"
23
23
  ```
24
24
 
25
25
  ## Bước 2: Classify severity
@@ -94,6 +94,29 @@ Tạo postmortem nếu thay đổi > 20 dòng.
94
94
 
95
95
  ---
96
96
 
97
+ > 🎨 **FE UI Quality:** Khi tạo/sửa UI component, tham khảo skill `evnict-kit-frontend-design`
98
+ > để đảm bảo chất lượng thiết kế cao. Áp dụng Design Thinking (Purpose → Tone → Constraints → Differentiation) trước khi code UI.
99
+
100
+ ---
101
+
102
+ ## ⚠️ NHẮC NHỞ: Tuân thủ Rules & Context
103
+
104
+ > **Agent dùng lâu có thể quên rules.** Trước khi bắt đầu code, tự kiểm tra:
105
+
106
+ ### Quick Check (agent tự đánh giá)
107
+ 1. ✅ Tôi đã đọc `.agent/rules/` trong phiên làm việc này chưa?
108
+ 2. ✅ Tôi đã đọc AGENTS.md (hoặc context file) chưa?
109
+ 3. ✅ Tôi nhớ rõ coding conventions của dự án này không?
110
+
111
+ **→ Nếu BẤT KỲ câu nào = "CHƯA" hoặc "KHÔNG CHẮC":**
112
+ - Đọc lại tất cả files trong `.agent/rules/` (hoặc thư mục rules tương ứng)
113
+ - Đọc lại AGENTS.md (hoặc context file tương ứng)
114
+ - Query wiki nếu có: `grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"`
115
+
116
+ **→ Nếu TẤT CẢ = "RỒI" → tiếp tục workflow, KHÔNG cần đọc lại.**
117
+
118
+ > **NGUYÊN TẮC:** Không chắc convention → ĐỌC LẠI rule file. KHÔNG đoán.
119
+
97
120
  ## Checklist hoàn thành
98
121
  - [ ] Wiki queried
99
122
  - [ ] Severity classified
@@ -44,7 +44,7 @@ TRƯỚC KHI sinh spec, Agent PHẢI áp dụng skill `evnict-kit-brainstorm`:
44
44
  ### Bước 1: Thu thập context
45
45
  1. Đọc `.evnict/config.yaml` → lấy project name, tech stack, wiki path
46
46
  2. **Query wiki** (nếu có) → tìm context liên quan đến chức năng được mô tả:
47
- - Đọc index từ `{wiki_path}/processed/`
47
+ - Đọc index từ `{wiki_path}/wiki/`
48
48
  - Tìm theo keyword/domain/tags từ mô tả feature
49
49
  - Nếu tìm được → đưa vào context khi tạo spec
50
50
  3. Đọc rules hiện tại trong `.agent/rules/` → nắm conventions dự án
@@ -365,7 +365,7 @@ Copy vào `{wiki_path}/raw/notes/{domain}-{slug}.md`
365
365
 
366
366
  ### Bước 3: Trigger ingest
367
367
  ```bash
368
- cd {wiki_path} && npm run ingest
368
+ cd {wiki_path} && Agent follow SKILL.md to ingest
369
369
  ```
370
370
  ⚠️ Nếu ingest chưa setup → nhắc user chạy `/evnict-kit:init-wiki`
371
371
 
@@ -391,3 +391,27 @@ Nếu thay đổi > 20 dòng code → tạo `docs/postmortem/{feature}-{date}.md
391
391
  ✅ Postmortem: docs/postmortem/{feature}-{date}.md
392
392
  ✅ Ingest triggered
393
393
  ```
394
+
395
+ > 🎨 **FE UI Quality:** Khi tạo/sửa UI component, tham khảo skill `evnict-kit-frontend-design`
396
+ > để đảm bảo chất lượng thiết kế cao. Áp dụng Design Thinking (Purpose → Tone → Constraints → Differentiation) trước khi code UI.
397
+
398
+ ---
399
+
400
+ ## ⚠️ NHẮC NHỞ: Tuân thủ Rules & Context
401
+
402
+ > **Agent dùng lâu có thể quên rules.** Trước khi bắt đầu code, tự kiểm tra:
403
+
404
+ ### Quick Check (agent tự đánh giá)
405
+ 1. ✅ Tôi đã đọc `.agent/rules/` trong phiên làm việc này chưa?
406
+ 2. ✅ Tôi đã đọc AGENTS.md (hoặc context file) chưa?
407
+ 3. ✅ Tôi nhớ rõ coding conventions của dự án này không?
408
+
409
+ **→ Nếu BẤT KỲ câu nào = "CHƯA" hoặc "KHÔNG CHẮC":**
410
+ - Đọc lại tất cả files trong `.agent/rules/` (hoặc thư mục rules tương ứng)
411
+ - Đọc lại AGENTS.md (hoặc context file tương ứng)
412
+ - Query wiki nếu có: `grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"`
413
+
414
+ **→ Nếu TẤT CẢ = "RỒI" → tiếp tục workflow, KHÔNG cần đọc lại.**
415
+
416
+ > **NGUYÊN TẮC:** Không chắc convention → ĐỌC LẠI rule file. KHÔNG đoán.
417
+
@@ -19,7 +19,7 @@ description: Feature nhỏ nhanh — skip spec chi tiết, query wiki → plan n
19
19
  ## Bước 1: Query wiki
20
20
  Tìm context liên quan trong wiki:
21
21
  ```bash
22
- grep -rl "{keyword}" {wiki_path}/processed/ --include="*.md"
22
+ grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"
23
23
  ```
24
24
  Đọc kết quả → áp dụng context.
25
25
 
@@ -75,6 +75,29 @@ C) Không — skip
75
75
 
76
76
  ---
77
77
 
78
+ > 🎨 **FE UI Quality:** Khi tạo/sửa UI component, tham khảo skill `evnict-kit-frontend-design`
79
+ > để đảm bảo chất lượng thiết kế cao. Áp dụng Design Thinking (Purpose → Tone → Constraints → Differentiation) trước khi code UI.
80
+
81
+ ---
82
+
83
+ ## ⚠️ NHẮC NHỞ: Tuân thủ Rules & Context
84
+
85
+ > **Agent dùng lâu có thể quên rules.** Trước khi bắt đầu code, tự kiểm tra:
86
+
87
+ ### Quick Check (agent tự đánh giá)
88
+ 1. ✅ Tôi đã đọc `.agent/rules/` trong phiên làm việc này chưa?
89
+ 2. ✅ Tôi đã đọc AGENTS.md (hoặc context file) chưa?
90
+ 3. ✅ Tôi nhớ rõ coding conventions của dự án này không?
91
+
92
+ **→ Nếu BẤT KỲ câu nào = "CHƯA" hoặc "KHÔNG CHẮC":**
93
+ - Đọc lại tất cả files trong `.agent/rules/` (hoặc thư mục rules tương ứng)
94
+ - Đọc lại AGENTS.md (hoặc context file tương ứng)
95
+ - Query wiki nếu có: `grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"`
96
+
97
+ **→ Nếu TẤT CẢ = "RỒI" → tiếp tục workflow, KHÔNG cần đọc lại.**
98
+
99
+ > **NGUYÊN TẮC:** Không chắc convention → ĐỌC LẠI rule file. KHÔNG đoán.
100
+
78
101
  ## Checklist hoàn thành
79
102
  - [ ] Wiki queried
80
103
  - [ ] Plan confirmed
@@ -233,6 +233,29 @@ last_updated: {timestamp}
233
233
 
234
234
  ---
235
235
 
236
+ > 🎨 **FE UI Quality:** Khi tạo/sửa UI component, tham khảo skill `evnict-kit-frontend-design`
237
+ > để đảm bảo chất lượng thiết kế cao. Áp dụng Design Thinking (Purpose → Tone → Constraints → Differentiation) trước khi code UI.
238
+
239
+ ---
240
+
241
+ ## ⚠️ NHẮC NHỞ: Tuân thủ Rules & Context
242
+
243
+ > **Agent dùng lâu có thể quên rules.** Trước khi bắt đầu code, tự kiểm tra:
244
+
245
+ ### Quick Check (agent tự đánh giá)
246
+ 1. ✅ Tôi đã đọc `.agent/rules/` trong phiên làm việc này chưa?
247
+ 2. ✅ Tôi đã đọc AGENTS.md (hoặc context file) chưa?
248
+ 3. ✅ Tôi nhớ rõ coding conventions của dự án này không?
249
+
250
+ **→ Nếu BẤT KỲ câu nào = "CHƯA" hoặc "KHÔNG CHẮC":**
251
+ - Đọc lại tất cả files trong `.agent/rules/` (hoặc thư mục rules tương ứng)
252
+ - Đọc lại AGENTS.md (hoặc context file tương ứng)
253
+ - Query wiki nếu có: `grep -rl "{keyword}" {wiki_path}/wiki/ --include="*.md"`
254
+
255
+ **→ Nếu TẤT CẢ = "RỒI" → tiếp tục workflow, KHÔNG cần đọc lại.**
256
+
257
+ > **NGUYÊN TẮC:** Không chắc convention → ĐỌC LẠI rule file. KHÔNG đoán.
258
+
236
259
  ## Tiêu chí thành công (Definition of Done)
237
260
  1. Handoff entry có ĐỦ 5 sections (tổng quan, API contract, FE tasks, lưu ý, hướng dẫn)
238
261
  2. Entry được APPEND vào `handoff.md` (không tạo file riêng)