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.
- package/README.md +39 -2
- package/bin/cli.js +7 -1
- package/package.json +1 -1
- package/scripts/patch-workflows.js +142 -0
- package/scripts/postinstall.js +1 -1
- package/src/commands/init.js +18 -9
- package/src/commands/sync.js +317 -0
- package/src/commands/upgrade.js +7 -1
- package/src/utils/config.js +2 -2
- package/templates/GETTING-STARTED.md +23 -2
- package/templates/content/skills/evnict-kit-bug-fix/SKILL.md +1 -1
- package/templates/content/skills/evnict-kit-git-worktrees/SKILL.md +0 -2
- package/templates/content/skills/evnict-kit-onboard/SKILL.md +0 -1
- package/templates/content/skills/evnict-kit-spec/SKILL.md +1 -1
- package/templates/content/skills/evnict-kit-wiki/SKILL.md +16 -54
- package/templates/content/workflows/evnict-kit-archive-wiki.md +4 -5
- package/templates/content/workflows/evnict-kit-attt.md +1 -1
- package/templates/content/workflows/evnict-kit-bug-fix.md +1 -1
- package/templates/content/workflows/evnict-kit-feature-large.md +2 -2
- package/templates/content/workflows/evnict-kit-feature-small.md +1 -1
- package/templates/content/workflows/evnict-kit-init-wiki.md +18 -47
- package/templates/content/workflows/evnict-kit-wiki-archive-feature.md +2 -3
- package/templates/content/workflows/evnict-kit-wiki-query.md +3 -3
- package/templates/content/workflows/evnict-kit-wiki-scan-project.md +3 -4
- package/templates/skills/evnict-kit-bug-fix/SKILL.md +1 -1
- package/templates/skills/evnict-kit-create-component/SKILL.md +23 -0
- package/templates/skills/evnict-kit-create-page/SKILL.md +23 -0
- package/templates/skills/evnict-kit-frontend-design/SKILL.md +161 -0
- package/templates/skills/evnict-kit-spec/SKILL.md +1 -1
- package/templates/skills/evnict-kit-wiki/SKILL.md +16 -54
- package/templates/wiki/AGENTS.md +280 -0
- package/templates/wiki/CLAUDE.md +280 -0
- package/templates/wiki/FAQ.md +168 -0
- package/templates/wiki/README.md +272 -35
- package/templates/wiki/config.example.yaml +145 -17
- package/templates/wiki/scripts/run-wiki.sh +17 -0
- package/templates/wiki/scripts/setup-scheduler.ps1 +29 -0
- package/templates/wiki/skills/llm-wiki/SKILL.md +341 -0
- package/templates/wiki/wiki/INDEX.md +9 -0
- package/templates/wiki/wiki/INDEX.template.md +29 -0
- package/templates/wiki/wiki/LOG.md +3 -0
- package/templates/wiki/wiki/LOG.template.md +7 -0
- package/templates/wiki/wiki-viewer.html +408 -0
- package/templates/workflows/antigravity/evnict-kit-archive-wiki.md +24 -5
- package/templates/workflows/antigravity/evnict-kit-attt.md +21 -1
- package/templates/workflows/antigravity/evnict-kit-bug-fix.md +24 -1
- package/templates/workflows/antigravity/evnict-kit-feature-large.md +26 -2
- package/templates/workflows/antigravity/evnict-kit-feature-small.md +24 -1
- package/templates/workflows/antigravity/evnict-kit-handoff.md +23 -0
- package/templates/workflows/antigravity/evnict-kit-implement.md +23 -0
- package/templates/workflows/antigravity/evnict-kit-init-check.md +20 -0
- package/templates/workflows/antigravity/evnict-kit-init-context.md +20 -0
- package/templates/workflows/antigravity/evnict-kit-init-rules.md +20 -0
- package/templates/workflows/antigravity/evnict-kit-init-wiki.md +26 -8
- package/templates/workflows/antigravity/evnict-kit-plan.md +24 -0
- package/templates/workflows/antigravity/evnict-kit-review.md +20 -0
- package/templates/workflows/antigravity/evnict-kit-spec-archive.md +20 -0
- package/templates/workflows/antigravity/evnict-kit-wiki-archive-feature.md +22 -3
- package/templates/workflows/antigravity/evnict-kit-wiki-query.md +23 -3
- package/templates/workflows/antigravity/evnict-kit-wiki-scan-project.md +23 -4
- package/templates/workflows/claude/evnict-kit-archive-wiki.md +24 -5
- package/templates/workflows/claude/evnict-kit-attt.md +21 -1
- package/templates/workflows/claude/evnict-kit-bug-fix.md +24 -1
- package/templates/workflows/claude/evnict-kit-feature-large.md +26 -2
- package/templates/workflows/claude/evnict-kit-feature-small.md +24 -1
- package/templates/workflows/claude/evnict-kit-handoff.md +23 -0
- package/templates/workflows/claude/evnict-kit-implement.md +23 -0
- package/templates/workflows/claude/evnict-kit-init-check.md +20 -0
- package/templates/workflows/claude/evnict-kit-init-context.md +20 -0
- package/templates/workflows/claude/evnict-kit-init-rules.md +20 -0
- package/templates/workflows/claude/evnict-kit-init-wiki.md +25 -7
- package/templates/workflows/claude/evnict-kit-plan.md +24 -0
- package/templates/workflows/claude/evnict-kit-review.md +20 -0
- package/templates/workflows/claude/evnict-kit-spec-archive.md +20 -0
- package/templates/workflows/claude/evnict-kit-wiki-archive-feature.md +22 -3
- package/templates/workflows/claude/evnict-kit-wiki-query.md +23 -3
- package/templates/workflows/claude/evnict-kit-wiki-scan-project.md +23 -4
- package/templates/wiki/package.json +0 -17
- package/templates/wiki/raw/notes/.gitkeep +0 -1
- 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/
|
|
32
|
+
ls {project_name}-wiki/CLAUDE.md
|
|
33
33
|
```
|
|
34
|
-
Nếu không tồn tại file
|
|
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
|
|
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} &&
|
|
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} &&
|
|
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}/
|
|
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}/
|
|
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} &&
|
|
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}/
|
|
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)
|