stellavault 0.1.0 โ 0.2.0
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/.github/workflows/pages.yml +37 -0
- package/package.json +1 -1
- package/packages/cli/bin/ekh.js +2 -2
- package/packages/cli/dist/commands/federate-cmd.d.ts.map +1 -1
- package/packages/cli/dist/commands/federate-cmd.js +61 -31
- package/packages/cli/dist/commands/federate-cmd.js.map +1 -1
- package/packages/cli/src/commands/federate-cmd.ts +49 -29
- package/packages/core/src/federation/sharing.ts +236 -86
- package/packages/core/src/index.ts +2 -2
- package/packages/graph/dist/assets/camera_utils-BMxqtvoZ.js +1 -0
- package/packages/graph/dist/assets/hands-DXA01_mx.js +18 -0
- package/packages/graph/dist/assets/index-DMEe2diW.js +4192 -0
- package/packages/graph/dist/assets/layout.worker-DbKCEFTz.js +1 -0
- package/packages/graph/dist/index.html +17 -0
- package/packages/graph/test-click.mjs +49 -49
- package/packages/graph/test-explore.mjs +102 -102
- package/packages/graph/test-final.mjs +61 -61
- package/packages/graph/test-hover.mjs +48 -48
- package/packages/graph/test-pulse.mjs +68 -68
- package/packages/graph/test-screenshot.mjs +56 -56
- package/packages/graph/test-v2.mjs +97 -97
- package/packages/graph/tsconfig.tsbuildinfo +1 -0
- package/packages/sync/.env.example +11 -11
- package/packages/sync/create-stella-network-notion.mjs +151 -151
- package/packages/sync/create-stellavault-project-notion.mjs +322 -322
- package/packages/sync/package-lock.json +373 -373
- package/tsconfig.base.json +18 -18
|
@@ -1,322 +1,322 @@
|
|
|
1
|
-
import { Client } from '@notionhq/client';
|
|
2
|
-
|
|
3
|
-
const notion = new Client({ auth: '
|
|
4
|
-
const PARENT_PAGE_ID = '330dcee017df808d92d4d9ff46fa7697';
|
|
5
|
-
|
|
6
|
-
function h2(t) { return { type: 'heading_2', heading_2: { rich_text: [{ text: { content: t } }] } }; }
|
|
7
|
-
function p(t) { return { type: 'paragraph', paragraph: { rich_text: [{ text: { content: t } }] } }; }
|
|
8
|
-
function d() { return { type: 'divider', divider: {} }; }
|
|
9
|
-
function callout(t, e = '๐ก') { return { type: 'callout', callout: { rich_text: [{ text: { content: t } }], icon: { emoji: e } } }; }
|
|
10
|
-
|
|
11
|
-
function table(headers, rows) {
|
|
12
|
-
return {
|
|
13
|
-
type: 'table', table: {
|
|
14
|
-
table_width: headers.length,
|
|
15
|
-
has_column_header: true,
|
|
16
|
-
has_row_header: false,
|
|
17
|
-
children: [
|
|
18
|
-
{ type: 'table_row', table_row: { cells: headers.map(h => [{ type: 'text', text: { content: h } }]) } },
|
|
19
|
-
...rows.map(row => ({
|
|
20
|
-
type: 'table_row', table_row: { cells: row.map(c => [{ type: 'text', text: { content: c } }]) }
|
|
21
|
-
})),
|
|
22
|
-
],
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function columnList(columns) {
|
|
28
|
-
return {
|
|
29
|
-
type: 'column_list', column_list: {
|
|
30
|
-
children: columns.map(col => ({
|
|
31
|
-
type: 'column', column: { children: col }
|
|
32
|
-
}))
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
async function main() {
|
|
38
|
-
console.log('Creating Stellavault project page...');
|
|
39
|
-
|
|
40
|
-
const part1 = [
|
|
41
|
-
// Callout header
|
|
42
|
-
callout('Stellavault โ Notes die in folders. Stellavault keeps your knowledge alive.', '๐ง '),
|
|
43
|
-
|
|
44
|
-
// ํ๋ก์ ํธ ๊ฐ์
|
|
45
|
-
h2('ํ๋ก์ ํธ ๊ฐ์'),
|
|
46
|
-
table(['ํญ๋ชฉ', '๋ด์ฉ'], [
|
|
47
|
-
['ํ๋ก์ ํธ๋ช
', 'Stellavault (์คํ
๋ผ๋ณผํธ)'],
|
|
48
|
-
['์ ํ', '๊ฐ์ธ ์ง์ ์ธํ
๋ฆฌ์ ์ค ํ๋ซํผ (์คํ์์ค + Pro)'],
|
|
49
|
-
['๋ชฉ์ ', 'Obsidian vault๋ฅผ ๋ฒกํฐํํ์ฌ 3D ์๊ฐํ, AI ์๋งจํฑ ๊ฒ์, ๊ธฐ์ต ๊ฐ์ ์ถ์ , MCP๋ก AI ์์ด์ ํธ ์ฐ๊ฒฐ'],
|
|
50
|
-
['๋์', 'AI ๊ฐ๋ฐ์, ์ง์ ๋
ธ๋์, Obsidian ์ฌ์ฉ์'],
|
|
51
|
-
['ํต์ฌ ๊ฐ์น', '์ง์ ๊ฐ ์ฐ๊ฒฐ ์๋ ๋ฐ๊ฒฌ + ์ํ๊ฐ๋ ์ง์ ๊ฐ์ง + AI ์์ด์ ํธ์ ์ง์ ์ ์'],
|
|
52
|
-
['๋ผ์ด์ ์ค', 'MIT (์คํ์์ค)'],
|
|
53
|
-
['GitHub', 'github.com/Evanciel/stellavault'],
|
|
54
|
-
['CLI', 'stellavault (alias: sv) โ 19๊ฐ ๋ช
๋ น์ด'],
|
|
55
|
-
['MCP', '13+ tools โ Claude Code ๋ฑ AI ์์ด์ ํธ ์ฐ๋'],
|
|
56
|
-
]),
|
|
57
|
-
d(),
|
|
58
|
-
|
|
59
|
-
// ํต์ฌ ๊ธฐ๋ฅ
|
|
60
|
-
h2('ํต์ฌ ๊ธฐ๋ฅ'),
|
|
61
|
-
columnList([
|
|
62
|
-
[
|
|
63
|
-
callout('3D Knowledge Graph\nReact Three Fiber ๊ธฐ๋ฐ ๋ด๋ด ๋คํธ์ํฌ ์๊ฐํ\nConstellation View + LOD 3๋จ๊ณ\nTimeline ์ฌ๋ผ์ด๋ + Type/Source ํํฐ', '๐'),
|
|
64
|
-
],
|
|
65
|
-
[
|
|
66
|
-
callout('AI Semantic Search\nBM25 + Cosine + RRF ํ์ด๋ธ๋ฆฌ๋\n384์ฐจ์ ๋ก์ปฌ ๋ฒกํฐ ์๋ฒ ๋ฉ\n์๋งจํฑ + ํค์๋ ์ตํฉ', '๐'),
|
|
67
|
-
],
|
|
68
|
-
]),
|
|
69
|
-
columnList([
|
|
70
|
-
[
|
|
71
|
-
callout('Intelligence Layer\nFSRS ๊ธฐ์ต ๊ฐ์ ์ถ์ \n๊ฐญ ํ์ง + ๋ชจ์ ํ์ง\n์ค๋ณต ํ์ง + ์์ธก์ ๊ฐญ ๋ถ์\nAI ํ์ต ๊ฒฝ๋ก ์์ฑ', '๐งฌ'),
|
|
72
|
-
],
|
|
73
|
-
[
|
|
74
|
-
callout('MCP + Plugin\n13๊ฐ MCP ๋๊ตฌ (AI ์์ด์ ํธ ์ฐ๋)\nPlugin SDK (์ด๋ฒคํธ ๋ฒ์ค)\nWebhook ์์คํ
\n์ปค์คํ
MCP ๋๊ตฌ ๋น๋ (YAML)', '๐'),
|
|
75
|
-
],
|
|
76
|
-
]),
|
|
77
|
-
d(),
|
|
78
|
-
|
|
79
|
-
// ๊ธฐ์ ์คํ
|
|
80
|
-
h2('๊ธฐ์ ์คํ'),
|
|
81
|
-
table(['์นดํ
๊ณ ๋ฆฌ', '๊ธฐ์ ', '๋ฒ์ / ๋น๊ณ '], [
|
|
82
|
-
['Runtime', 'Node.js (ESM)', '20+'],
|
|
83
|
-
['Language', 'TypeScript', 'Strict mode'],
|
|
84
|
-
['Monorepo', 'npm workspaces', '4 packages (core, cli, graph, sync)'],
|
|
85
|
-
['Vector DB', 'SQLite-vec (better-sqlite3)', '384์ฐจ์ ์๋ฒ ๋ฉ'],
|
|
86
|
-
['Embedding', '@xenova/transformers', 'all-MiniLM-L6-v2 (๋ก์ปฌ, API ํค ๋ถํ์)'],
|
|
87
|
-
['Search', 'BM25 + Cosine + RRF', 'K=60, ํ์ด๋ธ๋ฆฌ๋ ํจ์ '],
|
|
88
|
-
['3D ์๊ฐํ', 'React Three Fiber + drei + Three.js', 'R3F 9.0 / Three 0.170'],
|
|
89
|
-
['State', 'Zustand', '5.0'],
|
|
90
|
-
['Memory Model', 'FSRS (Free Spaced Repetition)', 'SM2 ์๊ณ ๋ฆฌ์ฆ ๋ณํ'],
|
|
91
|
-
['AI ์ฐ๋', 'MCP (@modelcontextprotocol/sdk)', 'stdio + Streamable HTTP'],
|
|
92
|
-
['Build', 'Vite (graph) + tsc (core/cli)', 'Vite 6.0'],
|
|
93
|
-
['Testing', 'Vitest', '116 tests'],
|
|
94
|
-
]),
|
|
95
|
-
d(),
|
|
96
|
-
|
|
97
|
-
// ๊ท๋ชจ ์งํ
|
|
98
|
-
h2('๊ท๋ชจ ์งํ'),
|
|
99
|
-
columnList([
|
|
100
|
-
[
|
|
101
|
-
callout('์ฝ๋ ๊ท๋ชจ\n175+ ์์ค ํ์ผ\n30,000+ LOC (TypeScript)\n4 workspace packages\n19 CLI ๋ช
๋ น์ด\n13+ MCP ๋๊ตฌ', '๐'),
|
|
102
|
-
],
|
|
103
|
-
[
|
|
104
|
-
callout('๊ธฐ๋ฅ ํํฉ\nPRD 22๊ฐ ๊ธฐ๋ฅ ์ค 18๊ฐ ๊ตฌํ\nP0 (4/4) + P1 (7/7) + P2 (7/7)\nIntelligence ๋ชจ๋ 8๊ฐ\ni18n 4๊ฐ ์ธ์ด (en/ko/ja/zh)', 'โ
'),
|
|
105
|
-
],
|
|
106
|
-
[
|
|
107
|
-
callout('์ํคํ
์ฒ\nHybrid Search (BM25+Vector+RRF)\nPlugin SDK + Webhook\nEmbed Widget (iframe)\nStreamable HTTP MCP\nKeyboard Navigation', '๐๏ธ'),
|
|
108
|
-
],
|
|
109
|
-
]),
|
|
110
|
-
];
|
|
111
|
-
|
|
112
|
-
const page = await notion.pages.create({
|
|
113
|
-
parent: { page_id: PARENT_PAGE_ID },
|
|
114
|
-
icon: { emoji: '๐ง ' },
|
|
115
|
-
properties: { title: [{ text: { content: 'Stellavault (AI ์ง์ ๊ทธ๋ํ ํ๋ซํผ)' } }] },
|
|
116
|
-
children: part1,
|
|
117
|
-
});
|
|
118
|
-
console.log(`Page created: ${page.url}`);
|
|
119
|
-
|
|
120
|
-
// Part 2: ํ์ ํ์ด์ง๋ค
|
|
121
|
-
// ๊ธฐ์ ์ํคํ
์ฒ
|
|
122
|
-
await notion.pages.create({
|
|
123
|
-
parent: { page_id: page.id },
|
|
124
|
-
properties: { title: [{ text: { content: '๊ธฐ์ ์ํคํ
์ฒ' } }] },
|
|
125
|
-
children: [
|
|
126
|
-
h2('Monorepo ๊ตฌ์กฐ'),
|
|
127
|
-
{ type: 'code', code: { rich_text: [{ text: { content:
|
|
128
|
-
`stellavault/
|
|
129
|
-
โโโ packages/
|
|
130
|
-
โ โโโ core/ ๋ฒกํฐ ๊ฒ์ ์์ง + MCP ์๋ฒ + REST API + Intelligence
|
|
131
|
-
โ โ โโโ indexer/ Vault ์ค์บ๋ + ์ฒญํน + ์๋ฒ ๋ฉ
|
|
132
|
-
โ โ โโโ search/ BM25 + Cosine + RRF
|
|
133
|
-
โ โ โโโ store/ SQLite-vec ๋ฒกํฐ ์คํ ์ด
|
|
134
|
-
โ โ โโโ intelligence/ FSRS + Gap + Duplicate + Contradiction + Learning Path
|
|
135
|
-
โ โ โโโ mcp/ MCP ์๋ฒ (13+ tools) + Custom Tool Builder
|
|
136
|
-
โ โ โโโ plugins/ Plugin SDK + Webhook Manager
|
|
137
|
-
โ โ โโโ api/ REST API + Graph Data + Embed + Profile
|
|
138
|
-
โ โ โโโ pack/ Knowledge Pack (.sv-pack)
|
|
139
|
-
โ โ โโโ i18n/ ๋ค๊ตญ์ด (en/ko/ja/zh)
|
|
140
|
-
โ โ โโโ utils/ Error Recovery (retry + StellavaultError)
|
|
141
|
-
โ โโโ cli/ 19 CLI ๋ช
๋ น์ด
|
|
142
|
-
โ โ โโโ commands/ init, index, search, graph, serve, decay, learn,
|
|
143
|
-
โ โ brief, digest, review, gaps, duplicates, contradictions,
|
|
144
|
-
โ โ clip, sync, card, status, pack
|
|
145
|
-
โ โโโ graph/ 3D Knowledge Graph (React Three Fiber)
|
|
146
|
-
โ โ โโโ components/ Layout, Graph3D, GraphNodes, GraphEdges,
|
|
147
|
-
โ โ โ SearchBar, ClusterFilter, TypeFilter, Timeline,
|
|
148
|
-
โ โ โ HealthDashboard, ToolsPanel, NodeDetail, etc.
|
|
149
|
-
โ โ โโโ hooks/ useGraph, useSearch, useLayout, useDecay,
|
|
150
|
-
โ โ โ useKeyboardNav, useExport, useMotion, usePulse
|
|
151
|
-
โ โ โโโ stores/ Zustand graph-store (์ ์ฒด ์ํ ๊ด๋ฆฌ)
|
|
152
|
-
โ โ โโโ embed/ EmbedGraph (iframe ์์ ฏ)
|
|
153
|
-
โ โโโ sync/ Notion-Obsidian ๋๊ธฐํ
|
|
154
|
-
โโโ scripts/ api-only.mjs` } }], language: 'plain text' } },
|
|
155
|
-
d(),
|
|
156
|
-
h2('Intelligence Layer'),
|
|
157
|
-
table(['๋ชจ๋', '๊ธฐ๋ฅ', 'ํ์ผ'], [
|
|
158
|
-
['FSRS Decay Engine', '๊ธฐ์ต ๊ฐ์ ์ถ์ (SM2 ์๊ณ ๋ฆฌ์ฆ)', 'intelligence/fsrs.ts + decay-engine.ts'],
|
|
159
|
-
['Gap Detector', 'ํด๋ฌ์คํฐ ๊ฐ ์ง์ ๊ฐญ ํ์ง', 'intelligence/gap-detector.ts'],
|
|
160
|
-
['Duplicate Detector', '๋ฒกํฐ ์ ์ฌ๋ ๊ธฐ๋ฐ ์ค๋ณต ํ์ง', 'intelligence/duplicate-detector.ts'],
|
|
161
|
-
['Contradiction Detector', '๋ชจ์ ์ง์ ํ์ง (NLI ํจํด)', 'intelligence/contradiction-detector.ts'],
|
|
162
|
-
['Learning Path', 'AI ํ์ต ๊ฒฝ๋ก ์์ฑ', 'intelligence/learning-path.ts'],
|
|
163
|
-
['Predictive Gaps', '๊ทธ๋ํ ํ ํด๋ก์ง ๊ธฐ๋ฐ ์์ธก', 'intelligence/predictive-gaps.ts'],
|
|
164
|
-
['Semantic Versioning', '์๋ฒ ๋ฉ ๋๋ฆฌํํธ ์ถ์ ', 'intelligence/semantic-versioning.ts'],
|
|
165
|
-
['Notifications', '์ค์ ๊ฐ๋ฅํ ์๋ฆผ ์์คํ
', 'intelligence/notifications.ts'],
|
|
166
|
-
]),
|
|
167
|
-
d(),
|
|
168
|
-
h2('MCP Tools (13+)'),
|
|
169
|
-
table(['#', 'Tool', '๊ธฐ๋ฅ'], [
|
|
170
|
-
['1', 'search', 'RRF ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์'],
|
|
171
|
-
['2', 'get-document', '๋ฌธ์ ์ ๋ฌธ ์กฐํ'],
|
|
172
|
-
['3', 'list-topics', 'ํ ํฝ ํด๋ผ์ฐ๋'],
|
|
173
|
-
['4', 'get-related', '๊ด๋ จ ๋ฌธ์ ํ์'],
|
|
174
|
-
['5', 'generate-claude-md', 'CLAUDE.md ์๋ ์์ฑ'],
|
|
175
|
-
['6', 'create-snapshot', '์ปจํ
์คํธ ์ค๋
์ท'],
|
|
176
|
-
['7', 'load-snapshot', '์ค๋
์ท ๋ณต์'],
|
|
177
|
-
['8', 'log-decision', '๊ธฐ์ ๊ฒฐ์ ๊ธฐ๋ก'],
|
|
178
|
-
['9', 'find-decisions', '๊ฒฐ์ ๊ฒ์'],
|
|
179
|
-
['10', 'export', 'JSON/CSV ๋ด๋ณด๋ด๊ธฐ'],
|
|
180
|
-
['11', 'get-decay-status', '๊ธฐ์ต ๊ฐ์ ๋ฆฌํฌํธ'],
|
|
181
|
-
['12', 'get-morning-brief', '์์นจ ์ง์ ๋ธ๋ฆฌํ'],
|
|
182
|
-
['13', 'get-learning-path', 'AI ํ์ต ๊ฒฝ๋ก ์ถ์ฒ'],
|
|
183
|
-
]),
|
|
184
|
-
],
|
|
185
|
-
});
|
|
186
|
-
console.log(' + ๊ธฐ์ ์ํคํ
์ฒ');
|
|
187
|
-
|
|
188
|
-
// PDCA ์ฐ์ถ๋ฌผ ์์ฝ
|
|
189
|
-
await notion.pages.create({
|
|
190
|
-
parent: { page_id: page.id },
|
|
191
|
-
properties: { title: [{ text: { content: 'PDCA ์ฐ์ถ๋ฌผ ์์ฝ' } }] },
|
|
192
|
-
children: [
|
|
193
|
-
h2('PM ๋ถ์'),
|
|
194
|
-
table(['๋ฌธ์', '๋ด์ฉ'], [
|
|
195
|
-
['core.prd.md', 'Phase 4 ๊ธฐ๋ฅ ๋ถ์ (FSRS, ๊ฐญ ํ์ง, ํด๋ฆฌํ ๋ฑ)'],
|
|
196
|
-
['stellavault-advanced.prd.md', 'Advanced 22 features PRD (P0-P3, 5 tiers)'],
|
|
197
|
-
['stellavault-federation.prd.md', 'Federation Protocol PRD (P2P ๋ถ์ฐ ์ง์ ๋คํธ์ํฌ)'],
|
|
198
|
-
]),
|
|
199
|
-
d(),
|
|
200
|
-
h2('๊ตฌํ ์๋ฃ ๊ธฐ๋ฅ (18/22)'),
|
|
201
|
-
table(['Tier', '๊ธฐ๋ฅ', '์ํ'], [
|
|
202
|
-
['P0', 'F-A01 Onboarding Wizard (stellavault init)', 'โ
'],
|
|
203
|
-
['P0', 'F-A02 Error Recovery System (withRetry + StellavaultError)', 'โ
'],
|
|
204
|
-
['P0', 'F-A03 Performance Optimization (์ธ๋ฑ์ resilience)', 'โ
'],
|
|
205
|
-
['P0', 'F-A08 Embeddable Graph Widget (/api/embed)', 'โ
'],
|
|
206
|
-
['P1', 'F-A21 CLI Output Polish (--json, --quiet)', 'โ
'],
|
|
207
|
-
['P1', 'F-A11 AI Learning Path Generator (sv learn + MCP)', 'โ
'],
|
|
208
|
-
['P1', 'F-A05 Notification Center', 'โ
'],
|
|
209
|
-
['P1', 'F-A09 Knowledge Profile (/api/profile)', 'โ
'],
|
|
210
|
-
['P1', 'F-A22 Streamable HTTP MCP', 'โ
'],
|
|
211
|
-
['P1', 'F-A20 10K+ Performance (maxVisibleNodes)', 'โ
'],
|
|
212
|
-
['P1', 'F-A15 Plugin SDK (PluginManager + ์ด๋ฒคํธ ๋ฒ์ค)', 'โ
'],
|
|
213
|
-
['P2', 'F-A12 Contradiction Detector', 'โ
'],
|
|
214
|
-
['P2', 'F-A17 Webhook/Event System', 'โ
'],
|
|
215
|
-
['P2', 'F-A16 Custom MCP Tool Builder (YAML)', 'โ
'],
|
|
216
|
-
['P2', 'F-A18 Keyboard Graph Navigation', 'โ
'],
|
|
217
|
-
['P2', 'F-A13 Semantic Versioning (์๋ฒ ๋ฉ ๋๋ฆฌํํธ)', 'โ
'],
|
|
218
|
-
['P2', 'F-A14 Predictive Gap Analysis', 'โ
'],
|
|
219
|
-
['P2', 'F-A19 i18n (en/ko/ja/zh)', 'โ
'],
|
|
220
|
-
]),
|
|
221
|
-
d(),
|
|
222
|
-
h2('๋ฏธ๊ตฌํ (์ธํ๋ผ ํ์)'),
|
|
223
|
-
table(['๊ธฐ๋ฅ', 'ํ์ ์ธํ๋ผ', '์ํ'], [
|
|
224
|
-
['F-A04 Cloud Sync Engine', 'S3/R2 ์คํ ๋ฆฌ์ง', '๋๊ธฐ'],
|
|
225
|
-
['F-A06 Team Vault', '์ธ์ฆ ์๋ฒ', '๋๊ธฐ'],
|
|
226
|
-
['F-A07 Pack Marketplace', '์น ์๋น์ค', '๋๊ธฐ'],
|
|
227
|
-
['P3 (5๊ฑด)', '์ฅ๊ธฐ ๋น์ ', '๋๊ธฐ'],
|
|
228
|
-
]),
|
|
229
|
-
],
|
|
230
|
-
});
|
|
231
|
-
console.log(' + PDCA ์ฐ์ถ๋ฌผ ์์ฝ');
|
|
232
|
-
|
|
233
|
-
// ๊ธฐ๋ฅ ์์ธ
|
|
234
|
-
await notion.pages.create({
|
|
235
|
-
parent: { page_id: page.id },
|
|
236
|
-
properties: { title: [{ text: { content: '๊ธฐ๋ฅ ์์ธ ๋ช
์ธ' } }] },
|
|
237
|
-
children: [
|
|
238
|
-
h2('CLI ๋ช
๋ น์ด (19๊ฐ)'),
|
|
239
|
-
table(['๋ช
๋ น์ด', '๊ธฐ๋ฅ'], [
|
|
240
|
-
['sv init', '์ธํฐ๋ํฐ๋ธ 3๋จ๊ณ ์
์
์์ ๋'],
|
|
241
|
-
['sv index <path>', 'Obsidian vault ๋ฒกํฐํ ์ธ๋ฑ์ฑ'],
|
|
242
|
-
['sv search <query>', 'ํฐ๋ฏธ๋ ์๋งจํฑ ๊ฒ์'],
|
|
243
|
-
['sv graph', '3D Knowledge Graph + API ์๋ฒ ์คํ'],
|
|
244
|
-
['sv serve', 'MCP ์๋ฒ (stdio)'],
|
|
245
|
-
['sv status', '์ธ๋ฑ์ค ์ํ ํ์ธ'],
|
|
246
|
-
['sv decay', '๊ธฐ์ต ๊ฐ์ ๋ฆฌํฌํธ'],
|
|
247
|
-
['sv learn', 'AI ํ์ต ๊ฒฝ๋ก ์ถ์ฒ'],
|
|
248
|
-
['sv brief', '์ค๋์ ์ง์ ๋ธ๋ฆฌํ'],
|
|
249
|
-
['sv digest', '์ฃผ๊ฐ ํ๋ ๋ฆฌํฌํธ'],
|
|
250
|
-
['sv review', 'FSRS ๊ธฐ๋ฐ ์ผ์ผ ๋ฆฌ๋ทฐ ์ธ์
'],
|
|
251
|
-
['sv gaps', '์ง์ ๊ฐญ ํ์ง'],
|
|
252
|
-
['sv duplicates', '์ค๋ณต ๋
ธํธ ํ์ง'],
|
|
253
|
-
['sv contradictions', '๋ชจ์ ์ง์ ํ์ง'],
|
|
254
|
-
['sv clip <url>', '์น/YouTube ํด๋ฆฌํ'],
|
|
255
|
-
['sv sync', 'Notion โ Obsidian ๋๊ธฐํ'],
|
|
256
|
-
['sv card', 'SVG ํ๋กํ ์นด๋ ์์ฑ'],
|
|
257
|
-
['sv pack <cmd>', 'Knowledge Pack ๊ด๋ฆฌ'],
|
|
258
|
-
]),
|
|
259
|
-
d(),
|
|
260
|
-
h2('3D Graph UI ์ปดํฌ๋ํธ'),
|
|
261
|
-
table(['์ปดํฌ๋ํธ', '๊ธฐ๋ฅ'], [
|
|
262
|
-
['Graph3D', 'R3F Canvas + OrbitControls + ์๋ ํ์ '],
|
|
263
|
-
['GraphNodes', 'Points ํด๋ผ์ฐ๋ ๋ ๋๋ง + ํด๋ฌ์คํฐ ์์ + Decay ์ค๋ฒ๋ ์ด'],
|
|
264
|
-
['ConstellationView', 'MST ๊ธฐ๋ฐ ๋ณ์๋ฆฌ ๋ทฐ + LOD 3๋จ๊ณ'],
|
|
265
|
-
['SearchBar', '์๋งจํฑ ๊ฒ์ + ๊ฒ์ ํ์คํ ๋ฆฌ ๋๋กญ๋ค์ด'],
|
|
266
|
-
['ClusterFilter', 'ํด๋ฌ์คํฐ ํ ๊ธ ํํฐ'],
|
|
267
|
-
['TypeFilter', 'source/type ํํฐ ๋๋กญ๋ค์ด'],
|
|
268
|
-
['Timeline', '๋ ์ง ๋ฒ์ ์ฌ๋ผ์ด๋ + ํ์คํ ๊ทธ๋จ'],
|
|
269
|
-
['HealthDashboard', '์ข
ํฉ ๊ฑด๊ฐ๋ (decay/gaps/dups/growth)'],
|
|
270
|
-
['ToolsPanel', 'Intelligence 6ํญ (Gaps/Duplicates/Decay/Clip/Sync/Health)'],
|
|
271
|
-
['NodeDetail', '๋
ธ๋ ์์ธ ํจ๋ + ๊ด๋ จ ๋ฌธ์ + Obsidian ์ด๊ธฐ'],
|
|
272
|
-
['EmbedGraph', 'iframe ์๋ฒ ๋์ฉ ๋ฏธ๋ ๊ทธ๋ํ'],
|
|
273
|
-
]),
|
|
274
|
-
d(),
|
|
275
|
-
h2('API Endpoints'),
|
|
276
|
-
table(['Method', 'Path', '๊ธฐ๋ฅ'], [
|
|
277
|
-
['GET', '/api/graph', '์ ์ฒด ๊ทธ๋ํ ๋ฐ์ดํฐ (cached)'],
|
|
278
|
-
['GET', '/api/search', 'RRF ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์'],
|
|
279
|
-
['GET', '/api/document/:id', '๋ฌธ์ ์ ๋ฌธ + ๊ด๋ จ ๋ฌธ์'],
|
|
280
|
-
['GET', '/api/stats', '์ธ๋ฑ์ค ํต๊ณ'],
|
|
281
|
-
['GET', '/api/decay', '๊ธฐ์ต ๊ฐ์ ๋ฆฌํฌํธ'],
|
|
282
|
-
['GET', '/api/duplicates', '์ค๋ณต ๋
ธํธ ํ์ง'],
|
|
283
|
-
['GET', '/api/gaps', '์ง์ ๊ฐญ ๋ฆฌํฌํธ'],
|
|
284
|
-
['GET', '/api/health', '์ข
ํฉ ๊ฑด๊ฐ๋ ๋์๋ณด๋'],
|
|
285
|
-
['GET', '/api/profile', '์ง์ ํ๋กํ (๊ณต๊ฐ์ฉ)'],
|
|
286
|
-
['GET', '/api/embed', '์๋ฒ ๋์ฉ ๊ฒฝ๋ ๊ทธ๋ํ'],
|
|
287
|
-
['GET', '/api/profile-card', 'SVG ํ๋กํ ์นด๋'],
|
|
288
|
-
['POST', '/api/clip', '์น ํด๋ฆฌํ'],
|
|
289
|
-
['POST', '/api/sync', 'Notion ๋๊ธฐํ ํธ๋ฆฌ๊ฑฐ'],
|
|
290
|
-
['POST', '/api/duplicates/merge', '์ค๋ณต ๋
ธํธ ๋ณํฉ'],
|
|
291
|
-
['POST', '/api/gaps/create-bridge', '๊ฐญ ๋ธ๋ฆฟ์ง ๋
ธํธ ์์ฑ'],
|
|
292
|
-
]),
|
|
293
|
-
],
|
|
294
|
-
});
|
|
295
|
-
console.log(' + ๊ธฐ๋ฅ ์์ธ ๋ช
์ธ');
|
|
296
|
-
|
|
297
|
-
// Next Steps
|
|
298
|
-
await notion.pages.create({
|
|
299
|
-
parent: { page_id: page.id },
|
|
300
|
-
properties: { title: [{ text: { content: '๐ฎ Next: Stella Network (Federation)' } }] },
|
|
301
|
-
children: [
|
|
302
|
-
callout('Stellavault์ ๋ค์ ๋จ๊ณ: ๋ถ์ฐ ์ง์ ๋คํธ์ํฌ (Federation Protocol)', '๐'),
|
|
303
|
-
p('๊ฐ Stellavault ์ธ์คํด์ค๋ฅผ P2P ๋
ธ๋๋ก ์ฐ๊ฒฐํ์ฌ "์ง์ ํ ๋ ํธ" ๊ตฌํ.'),
|
|
304
|
-
p('์๋ฒ ๋ฉ๋ง ๊ณต์ (์๋ฌธ ๋น๊ณต๊ฐ), AI ์์ด์ ํธ๊ฐ ์ง๋จ ์ง์ฑ์ ์ ๊ทผ.'),
|
|
305
|
-
p('์์ธ: Stella Network ํ์ด์ง ์ฐธ์กฐ'),
|
|
306
|
-
d(),
|
|
307
|
-
h2('Git History'),
|
|
308
|
-
table(['Commit', '๋ด์ฉ'], [
|
|
309
|
-
['94dceb4', 'feat: initial release of Stellavault'],
|
|
310
|
-
['d1b01c6', 'docs: rewrite README with core value proposition'],
|
|
311
|
-
['9b8caac', 'feat: P0 features (init, error recovery, perf, embed)'],
|
|
312
|
-
['1a72d52', 'feat: P1 features (CLI polish, learning path, notifications, profile, HTTP MCP, plugin SDK)'],
|
|
313
|
-
['6175b80', 'feat: P2 features (contradictions, webhooks, custom MCP, keyboard nav, semantic versioning, predictive gaps, i18n)'],
|
|
314
|
-
]),
|
|
315
|
-
],
|
|
316
|
-
});
|
|
317
|
-
console.log(' + Next Steps');
|
|
318
|
-
|
|
319
|
-
console.log(`\nโ
Done! ${page.url}`);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
main().catch(console.error);
|
|
1
|
+
import { Client } from '@notionhq/client';
|
|
2
|
+
|
|
3
|
+
const notion = new Client({ auth: 'process.env.NOTION_TOKEN' });
|
|
4
|
+
const PARENT_PAGE_ID = '330dcee017df808d92d4d9ff46fa7697';
|
|
5
|
+
|
|
6
|
+
function h2(t) { return { type: 'heading_2', heading_2: { rich_text: [{ text: { content: t } }] } }; }
|
|
7
|
+
function p(t) { return { type: 'paragraph', paragraph: { rich_text: [{ text: { content: t } }] } }; }
|
|
8
|
+
function d() { return { type: 'divider', divider: {} }; }
|
|
9
|
+
function callout(t, e = '๐ก') { return { type: 'callout', callout: { rich_text: [{ text: { content: t } }], icon: { emoji: e } } }; }
|
|
10
|
+
|
|
11
|
+
function table(headers, rows) {
|
|
12
|
+
return {
|
|
13
|
+
type: 'table', table: {
|
|
14
|
+
table_width: headers.length,
|
|
15
|
+
has_column_header: true,
|
|
16
|
+
has_row_header: false,
|
|
17
|
+
children: [
|
|
18
|
+
{ type: 'table_row', table_row: { cells: headers.map(h => [{ type: 'text', text: { content: h } }]) } },
|
|
19
|
+
...rows.map(row => ({
|
|
20
|
+
type: 'table_row', table_row: { cells: row.map(c => [{ type: 'text', text: { content: c } }]) }
|
|
21
|
+
})),
|
|
22
|
+
],
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function columnList(columns) {
|
|
28
|
+
return {
|
|
29
|
+
type: 'column_list', column_list: {
|
|
30
|
+
children: columns.map(col => ({
|
|
31
|
+
type: 'column', column: { children: col }
|
|
32
|
+
}))
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function main() {
|
|
38
|
+
console.log('Creating Stellavault project page...');
|
|
39
|
+
|
|
40
|
+
const part1 = [
|
|
41
|
+
// Callout header
|
|
42
|
+
callout('Stellavault โ Notes die in folders. Stellavault keeps your knowledge alive.', '๐ง '),
|
|
43
|
+
|
|
44
|
+
// ํ๋ก์ ํธ ๊ฐ์
|
|
45
|
+
h2('ํ๋ก์ ํธ ๊ฐ์'),
|
|
46
|
+
table(['ํญ๋ชฉ', '๋ด์ฉ'], [
|
|
47
|
+
['ํ๋ก์ ํธ๋ช
', 'Stellavault (์คํ
๋ผ๋ณผํธ)'],
|
|
48
|
+
['์ ํ', '๊ฐ์ธ ์ง์ ์ธํ
๋ฆฌ์ ์ค ํ๋ซํผ (์คํ์์ค + Pro)'],
|
|
49
|
+
['๋ชฉ์ ', 'Obsidian vault๋ฅผ ๋ฒกํฐํํ์ฌ 3D ์๊ฐํ, AI ์๋งจํฑ ๊ฒ์, ๊ธฐ์ต ๊ฐ์ ์ถ์ , MCP๋ก AI ์์ด์ ํธ ์ฐ๊ฒฐ'],
|
|
50
|
+
['๋์', 'AI ๊ฐ๋ฐ์, ์ง์ ๋
ธ๋์, Obsidian ์ฌ์ฉ์'],
|
|
51
|
+
['ํต์ฌ ๊ฐ์น', '์ง์ ๊ฐ ์ฐ๊ฒฐ ์๋ ๋ฐ๊ฒฌ + ์ํ๊ฐ๋ ์ง์ ๊ฐ์ง + AI ์์ด์ ํธ์ ์ง์ ์ ์'],
|
|
52
|
+
['๋ผ์ด์ ์ค', 'MIT (์คํ์์ค)'],
|
|
53
|
+
['GitHub', 'github.com/Evanciel/stellavault'],
|
|
54
|
+
['CLI', 'stellavault (alias: sv) โ 19๊ฐ ๋ช
๋ น์ด'],
|
|
55
|
+
['MCP', '13+ tools โ Claude Code ๋ฑ AI ์์ด์ ํธ ์ฐ๋'],
|
|
56
|
+
]),
|
|
57
|
+
d(),
|
|
58
|
+
|
|
59
|
+
// ํต์ฌ ๊ธฐ๋ฅ
|
|
60
|
+
h2('ํต์ฌ ๊ธฐ๋ฅ'),
|
|
61
|
+
columnList([
|
|
62
|
+
[
|
|
63
|
+
callout('3D Knowledge Graph\nReact Three Fiber ๊ธฐ๋ฐ ๋ด๋ด ๋คํธ์ํฌ ์๊ฐํ\nConstellation View + LOD 3๋จ๊ณ\nTimeline ์ฌ๋ผ์ด๋ + Type/Source ํํฐ', '๐'),
|
|
64
|
+
],
|
|
65
|
+
[
|
|
66
|
+
callout('AI Semantic Search\nBM25 + Cosine + RRF ํ์ด๋ธ๋ฆฌ๋\n384์ฐจ์ ๋ก์ปฌ ๋ฒกํฐ ์๋ฒ ๋ฉ\n์๋งจํฑ + ํค์๋ ์ตํฉ', '๐'),
|
|
67
|
+
],
|
|
68
|
+
]),
|
|
69
|
+
columnList([
|
|
70
|
+
[
|
|
71
|
+
callout('Intelligence Layer\nFSRS ๊ธฐ์ต ๊ฐ์ ์ถ์ \n๊ฐญ ํ์ง + ๋ชจ์ ํ์ง\n์ค๋ณต ํ์ง + ์์ธก์ ๊ฐญ ๋ถ์\nAI ํ์ต ๊ฒฝ๋ก ์์ฑ', '๐งฌ'),
|
|
72
|
+
],
|
|
73
|
+
[
|
|
74
|
+
callout('MCP + Plugin\n13๊ฐ MCP ๋๊ตฌ (AI ์์ด์ ํธ ์ฐ๋)\nPlugin SDK (์ด๋ฒคํธ ๋ฒ์ค)\nWebhook ์์คํ
\n์ปค์คํ
MCP ๋๊ตฌ ๋น๋ (YAML)', '๐'),
|
|
75
|
+
],
|
|
76
|
+
]),
|
|
77
|
+
d(),
|
|
78
|
+
|
|
79
|
+
// ๊ธฐ์ ์คํ
|
|
80
|
+
h2('๊ธฐ์ ์คํ'),
|
|
81
|
+
table(['์นดํ
๊ณ ๋ฆฌ', '๊ธฐ์ ', '๋ฒ์ / ๋น๊ณ '], [
|
|
82
|
+
['Runtime', 'Node.js (ESM)', '20+'],
|
|
83
|
+
['Language', 'TypeScript', 'Strict mode'],
|
|
84
|
+
['Monorepo', 'npm workspaces', '4 packages (core, cli, graph, sync)'],
|
|
85
|
+
['Vector DB', 'SQLite-vec (better-sqlite3)', '384์ฐจ์ ์๋ฒ ๋ฉ'],
|
|
86
|
+
['Embedding', '@xenova/transformers', 'all-MiniLM-L6-v2 (๋ก์ปฌ, API ํค ๋ถํ์)'],
|
|
87
|
+
['Search', 'BM25 + Cosine + RRF', 'K=60, ํ์ด๋ธ๋ฆฌ๋ ํจ์ '],
|
|
88
|
+
['3D ์๊ฐํ', 'React Three Fiber + drei + Three.js', 'R3F 9.0 / Three 0.170'],
|
|
89
|
+
['State', 'Zustand', '5.0'],
|
|
90
|
+
['Memory Model', 'FSRS (Free Spaced Repetition)', 'SM2 ์๊ณ ๋ฆฌ์ฆ ๋ณํ'],
|
|
91
|
+
['AI ์ฐ๋', 'MCP (@modelcontextprotocol/sdk)', 'stdio + Streamable HTTP'],
|
|
92
|
+
['Build', 'Vite (graph) + tsc (core/cli)', 'Vite 6.0'],
|
|
93
|
+
['Testing', 'Vitest', '116 tests'],
|
|
94
|
+
]),
|
|
95
|
+
d(),
|
|
96
|
+
|
|
97
|
+
// ๊ท๋ชจ ์งํ
|
|
98
|
+
h2('๊ท๋ชจ ์งํ'),
|
|
99
|
+
columnList([
|
|
100
|
+
[
|
|
101
|
+
callout('์ฝ๋ ๊ท๋ชจ\n175+ ์์ค ํ์ผ\n30,000+ LOC (TypeScript)\n4 workspace packages\n19 CLI ๋ช
๋ น์ด\n13+ MCP ๋๊ตฌ', '๐'),
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
callout('๊ธฐ๋ฅ ํํฉ\nPRD 22๊ฐ ๊ธฐ๋ฅ ์ค 18๊ฐ ๊ตฌํ\nP0 (4/4) + P1 (7/7) + P2 (7/7)\nIntelligence ๋ชจ๋ 8๊ฐ\ni18n 4๊ฐ ์ธ์ด (en/ko/ja/zh)', 'โ
'),
|
|
105
|
+
],
|
|
106
|
+
[
|
|
107
|
+
callout('์ํคํ
์ฒ\nHybrid Search (BM25+Vector+RRF)\nPlugin SDK + Webhook\nEmbed Widget (iframe)\nStreamable HTTP MCP\nKeyboard Navigation', '๐๏ธ'),
|
|
108
|
+
],
|
|
109
|
+
]),
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
const page = await notion.pages.create({
|
|
113
|
+
parent: { page_id: PARENT_PAGE_ID },
|
|
114
|
+
icon: { emoji: '๐ง ' },
|
|
115
|
+
properties: { title: [{ text: { content: 'Stellavault (AI ์ง์ ๊ทธ๋ํ ํ๋ซํผ)' } }] },
|
|
116
|
+
children: part1,
|
|
117
|
+
});
|
|
118
|
+
console.log(`Page created: ${page.url}`);
|
|
119
|
+
|
|
120
|
+
// Part 2: ํ์ ํ์ด์ง๋ค
|
|
121
|
+
// ๊ธฐ์ ์ํคํ
์ฒ
|
|
122
|
+
await notion.pages.create({
|
|
123
|
+
parent: { page_id: page.id },
|
|
124
|
+
properties: { title: [{ text: { content: '๊ธฐ์ ์ํคํ
์ฒ' } }] },
|
|
125
|
+
children: [
|
|
126
|
+
h2('Monorepo ๊ตฌ์กฐ'),
|
|
127
|
+
{ type: 'code', code: { rich_text: [{ text: { content:
|
|
128
|
+
`stellavault/
|
|
129
|
+
โโโ packages/
|
|
130
|
+
โ โโโ core/ ๋ฒกํฐ ๊ฒ์ ์์ง + MCP ์๋ฒ + REST API + Intelligence
|
|
131
|
+
โ โ โโโ indexer/ Vault ์ค์บ๋ + ์ฒญํน + ์๋ฒ ๋ฉ
|
|
132
|
+
โ โ โโโ search/ BM25 + Cosine + RRF
|
|
133
|
+
โ โ โโโ store/ SQLite-vec ๋ฒกํฐ ์คํ ์ด
|
|
134
|
+
โ โ โโโ intelligence/ FSRS + Gap + Duplicate + Contradiction + Learning Path
|
|
135
|
+
โ โ โโโ mcp/ MCP ์๋ฒ (13+ tools) + Custom Tool Builder
|
|
136
|
+
โ โ โโโ plugins/ Plugin SDK + Webhook Manager
|
|
137
|
+
โ โ โโโ api/ REST API + Graph Data + Embed + Profile
|
|
138
|
+
โ โ โโโ pack/ Knowledge Pack (.sv-pack)
|
|
139
|
+
โ โ โโโ i18n/ ๋ค๊ตญ์ด (en/ko/ja/zh)
|
|
140
|
+
โ โ โโโ utils/ Error Recovery (retry + StellavaultError)
|
|
141
|
+
โ โโโ cli/ 19 CLI ๋ช
๋ น์ด
|
|
142
|
+
โ โ โโโ commands/ init, index, search, graph, serve, decay, learn,
|
|
143
|
+
โ โ brief, digest, review, gaps, duplicates, contradictions,
|
|
144
|
+
โ โ clip, sync, card, status, pack
|
|
145
|
+
โ โโโ graph/ 3D Knowledge Graph (React Three Fiber)
|
|
146
|
+
โ โ โโโ components/ Layout, Graph3D, GraphNodes, GraphEdges,
|
|
147
|
+
โ โ โ SearchBar, ClusterFilter, TypeFilter, Timeline,
|
|
148
|
+
โ โ โ HealthDashboard, ToolsPanel, NodeDetail, etc.
|
|
149
|
+
โ โ โโโ hooks/ useGraph, useSearch, useLayout, useDecay,
|
|
150
|
+
โ โ โ useKeyboardNav, useExport, useMotion, usePulse
|
|
151
|
+
โ โ โโโ stores/ Zustand graph-store (์ ์ฒด ์ํ ๊ด๋ฆฌ)
|
|
152
|
+
โ โ โโโ embed/ EmbedGraph (iframe ์์ ฏ)
|
|
153
|
+
โ โโโ sync/ Notion-Obsidian ๋๊ธฐํ
|
|
154
|
+
โโโ scripts/ api-only.mjs` } }], language: 'plain text' } },
|
|
155
|
+
d(),
|
|
156
|
+
h2('Intelligence Layer'),
|
|
157
|
+
table(['๋ชจ๋', '๊ธฐ๋ฅ', 'ํ์ผ'], [
|
|
158
|
+
['FSRS Decay Engine', '๊ธฐ์ต ๊ฐ์ ์ถ์ (SM2 ์๊ณ ๋ฆฌ์ฆ)', 'intelligence/fsrs.ts + decay-engine.ts'],
|
|
159
|
+
['Gap Detector', 'ํด๋ฌ์คํฐ ๊ฐ ์ง์ ๊ฐญ ํ์ง', 'intelligence/gap-detector.ts'],
|
|
160
|
+
['Duplicate Detector', '๋ฒกํฐ ์ ์ฌ๋ ๊ธฐ๋ฐ ์ค๋ณต ํ์ง', 'intelligence/duplicate-detector.ts'],
|
|
161
|
+
['Contradiction Detector', '๋ชจ์ ์ง์ ํ์ง (NLI ํจํด)', 'intelligence/contradiction-detector.ts'],
|
|
162
|
+
['Learning Path', 'AI ํ์ต ๊ฒฝ๋ก ์์ฑ', 'intelligence/learning-path.ts'],
|
|
163
|
+
['Predictive Gaps', '๊ทธ๋ํ ํ ํด๋ก์ง ๊ธฐ๋ฐ ์์ธก', 'intelligence/predictive-gaps.ts'],
|
|
164
|
+
['Semantic Versioning', '์๋ฒ ๋ฉ ๋๋ฆฌํํธ ์ถ์ ', 'intelligence/semantic-versioning.ts'],
|
|
165
|
+
['Notifications', '์ค์ ๊ฐ๋ฅํ ์๋ฆผ ์์คํ
', 'intelligence/notifications.ts'],
|
|
166
|
+
]),
|
|
167
|
+
d(),
|
|
168
|
+
h2('MCP Tools (13+)'),
|
|
169
|
+
table(['#', 'Tool', '๊ธฐ๋ฅ'], [
|
|
170
|
+
['1', 'search', 'RRF ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์'],
|
|
171
|
+
['2', 'get-document', '๋ฌธ์ ์ ๋ฌธ ์กฐํ'],
|
|
172
|
+
['3', 'list-topics', 'ํ ํฝ ํด๋ผ์ฐ๋'],
|
|
173
|
+
['4', 'get-related', '๊ด๋ จ ๋ฌธ์ ํ์'],
|
|
174
|
+
['5', 'generate-claude-md', 'CLAUDE.md ์๋ ์์ฑ'],
|
|
175
|
+
['6', 'create-snapshot', '์ปจํ
์คํธ ์ค๋
์ท'],
|
|
176
|
+
['7', 'load-snapshot', '์ค๋
์ท ๋ณต์'],
|
|
177
|
+
['8', 'log-decision', '๊ธฐ์ ๊ฒฐ์ ๊ธฐ๋ก'],
|
|
178
|
+
['9', 'find-decisions', '๊ฒฐ์ ๊ฒ์'],
|
|
179
|
+
['10', 'export', 'JSON/CSV ๋ด๋ณด๋ด๊ธฐ'],
|
|
180
|
+
['11', 'get-decay-status', '๊ธฐ์ต ๊ฐ์ ๋ฆฌํฌํธ'],
|
|
181
|
+
['12', 'get-morning-brief', '์์นจ ์ง์ ๋ธ๋ฆฌํ'],
|
|
182
|
+
['13', 'get-learning-path', 'AI ํ์ต ๊ฒฝ๋ก ์ถ์ฒ'],
|
|
183
|
+
]),
|
|
184
|
+
],
|
|
185
|
+
});
|
|
186
|
+
console.log(' + ๊ธฐ์ ์ํคํ
์ฒ');
|
|
187
|
+
|
|
188
|
+
// PDCA ์ฐ์ถ๋ฌผ ์์ฝ
|
|
189
|
+
await notion.pages.create({
|
|
190
|
+
parent: { page_id: page.id },
|
|
191
|
+
properties: { title: [{ text: { content: 'PDCA ์ฐ์ถ๋ฌผ ์์ฝ' } }] },
|
|
192
|
+
children: [
|
|
193
|
+
h2('PM ๋ถ์'),
|
|
194
|
+
table(['๋ฌธ์', '๋ด์ฉ'], [
|
|
195
|
+
['core.prd.md', 'Phase 4 ๊ธฐ๋ฅ ๋ถ์ (FSRS, ๊ฐญ ํ์ง, ํด๋ฆฌํ ๋ฑ)'],
|
|
196
|
+
['stellavault-advanced.prd.md', 'Advanced 22 features PRD (P0-P3, 5 tiers)'],
|
|
197
|
+
['stellavault-federation.prd.md', 'Federation Protocol PRD (P2P ๋ถ์ฐ ์ง์ ๋คํธ์ํฌ)'],
|
|
198
|
+
]),
|
|
199
|
+
d(),
|
|
200
|
+
h2('๊ตฌํ ์๋ฃ ๊ธฐ๋ฅ (18/22)'),
|
|
201
|
+
table(['Tier', '๊ธฐ๋ฅ', '์ํ'], [
|
|
202
|
+
['P0', 'F-A01 Onboarding Wizard (stellavault init)', 'โ
'],
|
|
203
|
+
['P0', 'F-A02 Error Recovery System (withRetry + StellavaultError)', 'โ
'],
|
|
204
|
+
['P0', 'F-A03 Performance Optimization (์ธ๋ฑ์ resilience)', 'โ
'],
|
|
205
|
+
['P0', 'F-A08 Embeddable Graph Widget (/api/embed)', 'โ
'],
|
|
206
|
+
['P1', 'F-A21 CLI Output Polish (--json, --quiet)', 'โ
'],
|
|
207
|
+
['P1', 'F-A11 AI Learning Path Generator (sv learn + MCP)', 'โ
'],
|
|
208
|
+
['P1', 'F-A05 Notification Center', 'โ
'],
|
|
209
|
+
['P1', 'F-A09 Knowledge Profile (/api/profile)', 'โ
'],
|
|
210
|
+
['P1', 'F-A22 Streamable HTTP MCP', 'โ
'],
|
|
211
|
+
['P1', 'F-A20 10K+ Performance (maxVisibleNodes)', 'โ
'],
|
|
212
|
+
['P1', 'F-A15 Plugin SDK (PluginManager + ์ด๋ฒคํธ ๋ฒ์ค)', 'โ
'],
|
|
213
|
+
['P2', 'F-A12 Contradiction Detector', 'โ
'],
|
|
214
|
+
['P2', 'F-A17 Webhook/Event System', 'โ
'],
|
|
215
|
+
['P2', 'F-A16 Custom MCP Tool Builder (YAML)', 'โ
'],
|
|
216
|
+
['P2', 'F-A18 Keyboard Graph Navigation', 'โ
'],
|
|
217
|
+
['P2', 'F-A13 Semantic Versioning (์๋ฒ ๋ฉ ๋๋ฆฌํํธ)', 'โ
'],
|
|
218
|
+
['P2', 'F-A14 Predictive Gap Analysis', 'โ
'],
|
|
219
|
+
['P2', 'F-A19 i18n (en/ko/ja/zh)', 'โ
'],
|
|
220
|
+
]),
|
|
221
|
+
d(),
|
|
222
|
+
h2('๋ฏธ๊ตฌํ (์ธํ๋ผ ํ์)'),
|
|
223
|
+
table(['๊ธฐ๋ฅ', 'ํ์ ์ธํ๋ผ', '์ํ'], [
|
|
224
|
+
['F-A04 Cloud Sync Engine', 'S3/R2 ์คํ ๋ฆฌ์ง', '๋๊ธฐ'],
|
|
225
|
+
['F-A06 Team Vault', '์ธ์ฆ ์๋ฒ', '๋๊ธฐ'],
|
|
226
|
+
['F-A07 Pack Marketplace', '์น ์๋น์ค', '๋๊ธฐ'],
|
|
227
|
+
['P3 (5๊ฑด)', '์ฅ๊ธฐ ๋น์ ', '๋๊ธฐ'],
|
|
228
|
+
]),
|
|
229
|
+
],
|
|
230
|
+
});
|
|
231
|
+
console.log(' + PDCA ์ฐ์ถ๋ฌผ ์์ฝ');
|
|
232
|
+
|
|
233
|
+
// ๊ธฐ๋ฅ ์์ธ
|
|
234
|
+
await notion.pages.create({
|
|
235
|
+
parent: { page_id: page.id },
|
|
236
|
+
properties: { title: [{ text: { content: '๊ธฐ๋ฅ ์์ธ ๋ช
์ธ' } }] },
|
|
237
|
+
children: [
|
|
238
|
+
h2('CLI ๋ช
๋ น์ด (19๊ฐ)'),
|
|
239
|
+
table(['๋ช
๋ น์ด', '๊ธฐ๋ฅ'], [
|
|
240
|
+
['sv init', '์ธํฐ๋ํฐ๋ธ 3๋จ๊ณ ์
์
์์ ๋'],
|
|
241
|
+
['sv index <path>', 'Obsidian vault ๋ฒกํฐํ ์ธ๋ฑ์ฑ'],
|
|
242
|
+
['sv search <query>', 'ํฐ๋ฏธ๋ ์๋งจํฑ ๊ฒ์'],
|
|
243
|
+
['sv graph', '3D Knowledge Graph + API ์๋ฒ ์คํ'],
|
|
244
|
+
['sv serve', 'MCP ์๋ฒ (stdio)'],
|
|
245
|
+
['sv status', '์ธ๋ฑ์ค ์ํ ํ์ธ'],
|
|
246
|
+
['sv decay', '๊ธฐ์ต ๊ฐ์ ๋ฆฌํฌํธ'],
|
|
247
|
+
['sv learn', 'AI ํ์ต ๊ฒฝ๋ก ์ถ์ฒ'],
|
|
248
|
+
['sv brief', '์ค๋์ ์ง์ ๋ธ๋ฆฌํ'],
|
|
249
|
+
['sv digest', '์ฃผ๊ฐ ํ๋ ๋ฆฌํฌํธ'],
|
|
250
|
+
['sv review', 'FSRS ๊ธฐ๋ฐ ์ผ์ผ ๋ฆฌ๋ทฐ ์ธ์
'],
|
|
251
|
+
['sv gaps', '์ง์ ๊ฐญ ํ์ง'],
|
|
252
|
+
['sv duplicates', '์ค๋ณต ๋
ธํธ ํ์ง'],
|
|
253
|
+
['sv contradictions', '๋ชจ์ ์ง์ ํ์ง'],
|
|
254
|
+
['sv clip <url>', '์น/YouTube ํด๋ฆฌํ'],
|
|
255
|
+
['sv sync', 'Notion โ Obsidian ๋๊ธฐํ'],
|
|
256
|
+
['sv card', 'SVG ํ๋กํ ์นด๋ ์์ฑ'],
|
|
257
|
+
['sv pack <cmd>', 'Knowledge Pack ๊ด๋ฆฌ'],
|
|
258
|
+
]),
|
|
259
|
+
d(),
|
|
260
|
+
h2('3D Graph UI ์ปดํฌ๋ํธ'),
|
|
261
|
+
table(['์ปดํฌ๋ํธ', '๊ธฐ๋ฅ'], [
|
|
262
|
+
['Graph3D', 'R3F Canvas + OrbitControls + ์๋ ํ์ '],
|
|
263
|
+
['GraphNodes', 'Points ํด๋ผ์ฐ๋ ๋ ๋๋ง + ํด๋ฌ์คํฐ ์์ + Decay ์ค๋ฒ๋ ์ด'],
|
|
264
|
+
['ConstellationView', 'MST ๊ธฐ๋ฐ ๋ณ์๋ฆฌ ๋ทฐ + LOD 3๋จ๊ณ'],
|
|
265
|
+
['SearchBar', '์๋งจํฑ ๊ฒ์ + ๊ฒ์ ํ์คํ ๋ฆฌ ๋๋กญ๋ค์ด'],
|
|
266
|
+
['ClusterFilter', 'ํด๋ฌ์คํฐ ํ ๊ธ ํํฐ'],
|
|
267
|
+
['TypeFilter', 'source/type ํํฐ ๋๋กญ๋ค์ด'],
|
|
268
|
+
['Timeline', '๋ ์ง ๋ฒ์ ์ฌ๋ผ์ด๋ + ํ์คํ ๊ทธ๋จ'],
|
|
269
|
+
['HealthDashboard', '์ข
ํฉ ๊ฑด๊ฐ๋ (decay/gaps/dups/growth)'],
|
|
270
|
+
['ToolsPanel', 'Intelligence 6ํญ (Gaps/Duplicates/Decay/Clip/Sync/Health)'],
|
|
271
|
+
['NodeDetail', '๋
ธ๋ ์์ธ ํจ๋ + ๊ด๋ จ ๋ฌธ์ + Obsidian ์ด๊ธฐ'],
|
|
272
|
+
['EmbedGraph', 'iframe ์๋ฒ ๋์ฉ ๋ฏธ๋ ๊ทธ๋ํ'],
|
|
273
|
+
]),
|
|
274
|
+
d(),
|
|
275
|
+
h2('API Endpoints'),
|
|
276
|
+
table(['Method', 'Path', '๊ธฐ๋ฅ'], [
|
|
277
|
+
['GET', '/api/graph', '์ ์ฒด ๊ทธ๋ํ ๋ฐ์ดํฐ (cached)'],
|
|
278
|
+
['GET', '/api/search', 'RRF ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์'],
|
|
279
|
+
['GET', '/api/document/:id', '๋ฌธ์ ์ ๋ฌธ + ๊ด๋ จ ๋ฌธ์'],
|
|
280
|
+
['GET', '/api/stats', '์ธ๋ฑ์ค ํต๊ณ'],
|
|
281
|
+
['GET', '/api/decay', '๊ธฐ์ต ๊ฐ์ ๋ฆฌํฌํธ'],
|
|
282
|
+
['GET', '/api/duplicates', '์ค๋ณต ๋
ธํธ ํ์ง'],
|
|
283
|
+
['GET', '/api/gaps', '์ง์ ๊ฐญ ๋ฆฌํฌํธ'],
|
|
284
|
+
['GET', '/api/health', '์ข
ํฉ ๊ฑด๊ฐ๋ ๋์๋ณด๋'],
|
|
285
|
+
['GET', '/api/profile', '์ง์ ํ๋กํ (๊ณต๊ฐ์ฉ)'],
|
|
286
|
+
['GET', '/api/embed', '์๋ฒ ๋์ฉ ๊ฒฝ๋ ๊ทธ๋ํ'],
|
|
287
|
+
['GET', '/api/profile-card', 'SVG ํ๋กํ ์นด๋'],
|
|
288
|
+
['POST', '/api/clip', '์น ํด๋ฆฌํ'],
|
|
289
|
+
['POST', '/api/sync', 'Notion ๋๊ธฐํ ํธ๋ฆฌ๊ฑฐ'],
|
|
290
|
+
['POST', '/api/duplicates/merge', '์ค๋ณต ๋
ธํธ ๋ณํฉ'],
|
|
291
|
+
['POST', '/api/gaps/create-bridge', '๊ฐญ ๋ธ๋ฆฟ์ง ๋
ธํธ ์์ฑ'],
|
|
292
|
+
]),
|
|
293
|
+
],
|
|
294
|
+
});
|
|
295
|
+
console.log(' + ๊ธฐ๋ฅ ์์ธ ๋ช
์ธ');
|
|
296
|
+
|
|
297
|
+
// Next Steps
|
|
298
|
+
await notion.pages.create({
|
|
299
|
+
parent: { page_id: page.id },
|
|
300
|
+
properties: { title: [{ text: { content: '๐ฎ Next: Stella Network (Federation)' } }] },
|
|
301
|
+
children: [
|
|
302
|
+
callout('Stellavault์ ๋ค์ ๋จ๊ณ: ๋ถ์ฐ ์ง์ ๋คํธ์ํฌ (Federation Protocol)', '๐'),
|
|
303
|
+
p('๊ฐ Stellavault ์ธ์คํด์ค๋ฅผ P2P ๋
ธ๋๋ก ์ฐ๊ฒฐํ์ฌ "์ง์ ํ ๋ ํธ" ๊ตฌํ.'),
|
|
304
|
+
p('์๋ฒ ๋ฉ๋ง ๊ณต์ (์๋ฌธ ๋น๊ณต๊ฐ), AI ์์ด์ ํธ๊ฐ ์ง๋จ ์ง์ฑ์ ์ ๊ทผ.'),
|
|
305
|
+
p('์์ธ: Stella Network ํ์ด์ง ์ฐธ์กฐ'),
|
|
306
|
+
d(),
|
|
307
|
+
h2('Git History'),
|
|
308
|
+
table(['Commit', '๋ด์ฉ'], [
|
|
309
|
+
['94dceb4', 'feat: initial release of Stellavault'],
|
|
310
|
+
['d1b01c6', 'docs: rewrite README with core value proposition'],
|
|
311
|
+
['9b8caac', 'feat: P0 features (init, error recovery, perf, embed)'],
|
|
312
|
+
['1a72d52', 'feat: P1 features (CLI polish, learning path, notifications, profile, HTTP MCP, plugin SDK)'],
|
|
313
|
+
['6175b80', 'feat: P2 features (contradictions, webhooks, custom MCP, keyboard nav, semantic versioning, predictive gaps, i18n)'],
|
|
314
|
+
]),
|
|
315
|
+
],
|
|
316
|
+
});
|
|
317
|
+
console.log(' + Next Steps');
|
|
318
|
+
|
|
319
|
+
console.log(`\nโ
Done! ${page.url}`);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
main().catch(console.error);
|