@askdkc/kiokuko 0.1.3 → 0.1.5

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 (55) hide show
  1. package/README.ja.md +20 -14
  2. package/README.ko.md +20 -14
  3. package/README.md +40 -21
  4. package/README.zh-CN.md +20 -14
  5. package/dist/agent-file/render.d.ts +1 -1
  6. package/dist/agent-file/render.d.ts.map +1 -1
  7. package/dist/agent-file/render.js +7 -5
  8. package/dist/agent-file/render.js.map +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +12 -5
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/init.d.ts +1 -0
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +19 -2
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/setup.d.ts +4 -2
  17. package/dist/commands/setup.d.ts.map +1 -1
  18. package/dist/commands/setup.js +22 -4
  19. package/dist/commands/setup.js.map +1 -1
  20. package/dist/config/paths.d.ts +4 -0
  21. package/dist/config/paths.d.ts.map +1 -1
  22. package/dist/config/paths.js +66 -1
  23. package/dist/config/paths.js.map +1 -1
  24. package/dist/db/connection.d.ts.map +1 -1
  25. package/dist/db/connection.js +4 -2
  26. package/dist/db/connection.js.map +1 -1
  27. package/dist/db/migrate.d.ts +7 -0
  28. package/dist/db/migrate.d.ts.map +1 -1
  29. package/dist/db/migrate.js +76 -4
  30. package/dist/db/migrate.js.map +1 -1
  31. package/dist/db/upgrade-backup.d.ts +3 -0
  32. package/dist/db/upgrade-backup.d.ts.map +1 -0
  33. package/dist/db/upgrade-backup.js +43 -0
  34. package/dist/db/upgrade-backup.js.map +1 -0
  35. package/dist/mcp/server.js +3 -3
  36. package/dist/mcp/server.js.map +1 -1
  37. package/dist/setup/hermes-config.d.ts +4 -0
  38. package/dist/setup/hermes-config.d.ts.map +1 -0
  39. package/dist/setup/hermes-config.js +74 -0
  40. package/dist/setup/hermes-config.js.map +1 -0
  41. package/dist/setup/opencode-loop-guard.d.ts +4 -0
  42. package/dist/setup/opencode-loop-guard.d.ts.map +1 -0
  43. package/dist/setup/opencode-loop-guard.js +168 -0
  44. package/dist/setup/opencode-loop-guard.js.map +1 -0
  45. package/dist/setup/render.d.ts.map +1 -1
  46. package/dist/setup/render.js +7 -5
  47. package/dist/setup/render.js.map +1 -1
  48. package/dist/web/i18n.d.ts +4 -4
  49. package/dist/web/i18n.js +16 -16
  50. package/dist/web/i18n.js.map +1 -1
  51. package/dist/web/ui.d.ts.map +1 -1
  52. package/dist/web/ui.js +83 -18
  53. package/dist/web/ui.js.map +1 -1
  54. package/package.json +3 -1
  55. package/templates/AGENTS.md +7 -5
package/dist/web/i18n.js CHANGED
@@ -8,13 +8,13 @@ export const WEB_LOCALE_LABELS = {
8
8
  };
9
9
  const englishMessages = {
10
10
  eyebrow: 'Local memory console',
11
- subtitle: 'Browse SQLite memory by bot role, memory type, and cross-cutting tags, and safely edit candidate entries.',
11
+ subtitle: 'Browse SQLite memory by role and purpose, memory type, and cross-cutting tags, and safely edit candidate entries.',
12
12
  workspaceLabel: 'Workspace',
13
13
  languageLabel: 'Language',
14
14
  searchPlaceholder: 'Search memory…',
15
15
  refresh: 'Refresh',
16
- filtersPanelTitle: 'Bot role / tags',
17
- filtersNavLabel: 'Filter by bot role, memory type, or tag',
16
+ filtersPanelTitle: 'Role and purpose / tags',
17
+ filtersNavLabel: 'Filter by role and purpose, memory type, or tag',
18
18
  entriesTitle: 'Memory',
19
19
  'entryCount.one': '{count} item',
20
20
  'entryCount.other': '{count} items',
@@ -37,7 +37,7 @@ const englishMessages = {
37
37
  'bot.writer': 'Writer',
38
38
  'bot.analyst': 'Analyst',
39
39
  requestFailed: 'The request failed.',
40
- botFilterTitle: 'Bot roles (tags)',
40
+ botFilterTitle: 'Roles and purposes (tags)',
41
41
  memoryTypeFilterTitle: 'Memory type',
42
42
  crossTagFilterTitle: 'Cross-cutting tags',
43
43
  noEntries: 'No matching memory entries.',
@@ -81,13 +81,13 @@ const englishMessages = {
81
81
  };
82
82
  const japaneseMessages = {
83
83
  eyebrow: 'ローカル記憶コンソール',
84
- subtitle: 'Bot用途・記憶タイプ・横断タグからSQLiteの記憶を確認し、安全に候補エントリを編集します。',
84
+ subtitle: '役割・用途、記憶タイプ、横断タグからSQLiteの記憶を確認し、安全に候補エントリを編集します。',
85
85
  workspaceLabel: 'ワークスペース',
86
86
  languageLabel: '言語',
87
87
  searchPlaceholder: '記憶を検索…',
88
88
  refresh: '更新',
89
- filtersPanelTitle: 'Bot用途 / タグ',
90
- filtersNavLabel: 'Bot用途・記憶タイプ・タグで絞り込む',
89
+ filtersPanelTitle: '役割・用途 / タグ',
90
+ filtersNavLabel: '役割・用途・記憶タイプ・タグで絞り込む',
91
91
  entriesTitle: '記憶',
92
92
  'entryCount.one': '{count}件',
93
93
  'entryCount.other': '{count}件',
@@ -110,7 +110,7 @@ const japaneseMessages = {
110
110
  'bot.writer': 'ライター',
111
111
  'bot.analyst': 'アナリスト',
112
112
  requestFailed: 'リクエストに失敗しました。',
113
- botFilterTitle: 'Bot用途(タグ)',
113
+ botFilterTitle: '役割・用途(タグ)',
114
114
  memoryTypeFilterTitle: '記憶タイプ',
115
115
  crossTagFilterTitle: '横断タグ',
116
116
  noEntries: '該当する記憶はありません。',
@@ -154,13 +154,13 @@ const japaneseMessages = {
154
154
  };
155
155
  const simplifiedChineseMessages = {
156
156
  eyebrow: '本地记忆控制台',
157
- subtitle: '按机器人用途、记忆类型和跨类别标签浏览SQLite记忆,并安全地编辑候选条目。',
157
+ subtitle: '按角色与用途、记忆类型和跨类别标签浏览SQLite记忆,并安全地编辑候选条目。',
158
158
  workspaceLabel: '工作区',
159
159
  languageLabel: '语言',
160
160
  searchPlaceholder: '搜索记忆…',
161
161
  refresh: '刷新',
162
- filtersPanelTitle: '机器人用途 / 标签',
163
- filtersNavLabel: '按机器人用途、记忆类型或标签筛选',
162
+ filtersPanelTitle: '角色与用途 / 标签',
163
+ filtersNavLabel: '按角色与用途、记忆类型或标签筛选',
164
164
  entriesTitle: '记忆',
165
165
  'entryCount.one': '{count}条',
166
166
  'entryCount.other': '{count}条',
@@ -183,7 +183,7 @@ const simplifiedChineseMessages = {
183
183
  'bot.writer': '写作者',
184
184
  'bot.analyst': '分析师',
185
185
  requestFailed: '请求失败。',
186
- botFilterTitle: '机器人用途(标签)',
186
+ botFilterTitle: '角色与用途(标签)',
187
187
  memoryTypeFilterTitle: '记忆类型',
188
188
  crossTagFilterTitle: '跨类别标签',
189
189
  noEntries: '没有匹配的记忆。',
@@ -227,13 +227,13 @@ const simplifiedChineseMessages = {
227
227
  };
228
228
  const koreanMessages = {
229
229
  eyebrow: '로컬 메모리 콘솔',
230
- subtitle: ' 역할, 메모리 유형, 교차 태그로 SQLite 메모리를 확인하고 후보 항목을 안전하게 편집합니다.',
230
+ subtitle: '역할과 용도, 메모리 유형, 교차 태그로 SQLite 메모리를 확인하고 후보 항목을 안전하게 편집합니다.',
231
231
  workspaceLabel: '워크스페이스',
232
232
  languageLabel: '언어',
233
233
  searchPlaceholder: '메모리 검색…',
234
234
  refresh: '새로 고침',
235
- filtersPanelTitle: ' 역할 / 태그',
236
- filtersNavLabel: ' 역할, 메모리 유형 또는 태그로 필터링',
235
+ filtersPanelTitle: '역할과 용도 / 태그',
236
+ filtersNavLabel: '역할과 용도, 메모리 유형 또는 태그로 필터링',
237
237
  entriesTitle: '메모리',
238
238
  'entryCount.one': '{count}개',
239
239
  'entryCount.other': '{count}개',
@@ -256,7 +256,7 @@ const koreanMessages = {
256
256
  'bot.writer': '라이터',
257
257
  'bot.analyst': '애널리스트',
258
258
  requestFailed: '요청에 실패했습니다.',
259
- botFilterTitle: ' 역할(태그)',
259
+ botFilterTitle: '역할과 용도(태그)',
260
260
  memoryTypeFilterTitle: '메모리 유형',
261
261
  crossTagFilterTitle: '교차 태그',
262
262
  noEntries: '일치하는 메모리가 없습니다.',
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/web/i18n.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/web/i18n.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,QAAQ,QAmUb,CAAC"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,QAAQ,QAoYb,CAAC"}
package/dist/web/ui.js CHANGED
@@ -19,15 +19,29 @@ export const WEB_HTML = String.raw `<!doctype html>
19
19
  <style>
20
20
  :root { color-scheme: light; --ink:#1e293b; --muted:#64748b; --line:#e2e8f0; --panel:#ffffff; --surface:#f8fafc; --accent:#2563eb; --accent-soft:#eff6ff; --warn:#b45309; --danger:#b91c1c; }
21
21
  * { box-sizing:border-box; }
22
+ [hidden] { display:none !important; }
22
23
  body { margin:0; background:linear-gradient(135deg,#f8fafc,#eef2ff); color:var(--ink); font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
23
24
  button,input,select,textarea { font:inherit; }
24
25
  button { cursor:pointer; }
25
26
  .shell { max-width:1440px; margin:0 auto; padding:28px; }
26
- .topbar { display:flex; gap:18px; justify-content:space-between; align-items:flex-end; margin-bottom:22px; }
27
+ .topbar { display:grid; grid-template-columns:minmax(0,1.1fr) minmax(420px,.9fr); gap:24px; align-items:start; margin-bottom:22px; }
28
+ .brand,.topbar-side { min-width:0; }
29
+ .topbar-side { display:flex; flex-direction:column; gap:10px; align-self:stretch; }
27
30
  .eyebrow { color:var(--accent); font-size:12px; font-weight:800; letter-spacing:.16em; text-transform:uppercase; }
28
31
  h1 { margin:4px 0 0; font-size:clamp(28px,4vw,44px); letter-spacing:-.04em; }
29
32
  .subtitle { margin:8px 0 0; color:var(--muted); }
30
- .toolbar { display:flex; gap:10px; align-items:center; flex-wrap:wrap; }
33
+ .language-picker { position:relative; align-self:flex-end; z-index:10; }
34
+ .language-toggle { display:grid; place-items:center; width:44px; height:44px; border:1px solid var(--line); border-radius:12px; background:var(--panel); color:var(--ink); box-shadow:0 6px 18px rgba(15,23,42,.06); }
35
+ .language-toggle:hover,.language-toggle[aria-expanded="true"] { border-color:#93c5fd; background:var(--accent-soft); color:var(--accent); }
36
+ .language-toggle:focus-visible,.language-option:focus-visible { outline:3px solid rgba(37,99,235,.25); outline-offset:2px; }
37
+ .language-toggle svg { width:22px; height:22px; }
38
+ .language-menu { position:absolute; top:calc(100% + 8px); right:0; display:grid; gap:2px; width:max-content; min-width:168px; padding:6px; border:1px solid var(--line); border-radius:14px; background:var(--panel); box-shadow:0 18px 48px rgba(15,23,42,.16); }
39
+ .language-option { display:flex; align-items:center; justify-content:space-between; gap:18px; width:100%; border:0; border-radius:9px; padding:9px 11px; background:transparent; color:var(--ink); text-align:left; }
40
+ .language-option:hover,.language-option:focus-visible,.language-option[aria-checked="true"] { background:var(--accent-soft); color:var(--accent); }
41
+ .language-option[aria-checked="true"]::after { content:"✓"; font-weight:800; }
42
+ .toolbar { display:flex; gap:10px; align-items:center; justify-content:flex-end; flex-wrap:wrap; margin-top:auto; }
43
+ .topbar-side .control { flex:1 1 210px; width:auto; min-width:0; }
44
+ .topbar-side .search { flex:1.4 1 240px; width:auto; min-width:0; }
31
45
  .control, .search { border:1px solid var(--line); border-radius:12px; background:var(--panel); color:var(--ink); padding:10px 12px; }
32
46
  .search { min-width:260px; }
33
47
  .button { border:1px solid var(--line); border-radius:12px; background:var(--panel); color:var(--ink); padding:10px 14px; font-weight:700; }
@@ -78,29 +92,36 @@ export const WEB_HTML = String.raw `<!doctype html>
78
92
  .detail-text { white-space:pre-wrap; overflow-wrap:anywhere; color:var(--muted); font-size:13px; }
79
93
  @media (max-width:680px) { .operator-grid { grid-template-columns:1fr; } }
80
94
  @media (max-width:1050px) { .layout { grid-template-columns:180px minmax(280px,1fr); } .editor-panel { grid-column:1 / -1; } }
81
- @media (max-width:680px) { .shell { padding:16px; } .topbar { display:block; } .toolbar { margin-top:16px; } .search { min-width:0; flex:1; } .layout { grid-template-columns:1fr; } .genres-panel { order:0; } .list-panel { order:1; } .editor-panel { order:2; } .entry-list { max-height:none; } }
95
+ @media (max-width:680px) { .shell { padding:16px; } .topbar { display:block; position:relative; } .brand { padding-right:56px; } .topbar-side { margin-top:16px; align-self:auto; } .language-picker { position:absolute; top:0; right:0; } .toolbar { justify-content:stretch; margin-top:0; } .topbar-side .control,.topbar-side .search { flex:1 1 100%; width:100%; } .search { min-width:0; } .layout { grid-template-columns:1fr; } .genres-panel { order:0; } .list-panel { order:1; } .editor-panel { order:2; } .entry-list { max-height:none; } }
82
96
  </style>
83
97
  </head>
84
98
  <body>
85
99
  <main class="shell">
86
100
  <header class="topbar">
87
- <div>
101
+ <div class="brand">
88
102
  <div class="eyebrow" data-i18n="eyebrow">Local memory console</div>
89
103
  <h1>Kiokuko Web</h1>
90
- <p class="subtitle" data-i18n="subtitle">Browse SQLite memory by bot role, memory type, and cross-cutting tags, and safely edit candidate entries.</p>
104
+ <p class="subtitle" data-i18n="subtitle">Browse SQLite memory by role and purpose, memory type, and cross-cutting tags, and safely edit candidate entries.</p>
91
105
  </div>
92
- <div class="toolbar">
93
- <select id="locale" class="control" aria-label="Language" data-i18n-aria-label="languageLabel"></select>
94
- <select id="workspace" class="control" aria-label="Workspace" data-i18n-aria-label="workspaceLabel"></select>
95
- <input id="search" class="search" type="search" placeholder="Search memory…" aria-label="Search memory…" data-i18n-placeholder="searchPlaceholder" data-i18n-aria-label="searchPlaceholder">
96
- <button id="refresh" class="button" type="button" data-i18n="refresh">Refresh</button>
106
+ <div class="topbar-side">
107
+ <div id="language-picker" class="language-picker">
108
+ <button id="language-toggle" class="language-toggle" type="button" aria-haspopup="menu" aria-expanded="false" aria-controls="language-menu" aria-label="Language" data-i18n-aria-label="languageLabel">
109
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"></circle><path d="M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"></path></svg>
110
+ </button>
111
+ <div id="language-menu" class="language-menu" role="menu" aria-label="Language" data-i18n-aria-label="languageLabel" hidden></div>
112
+ </div>
113
+ <div class="toolbar">
114
+ <select id="workspace" class="control" aria-label="Workspace" data-i18n-aria-label="workspaceLabel"></select>
115
+ <input id="search" class="search" type="search" placeholder="Search memory…" aria-label="Search memory…" data-i18n-placeholder="searchPlaceholder" data-i18n-aria-label="searchPlaceholder">
116
+ <button id="refresh" class="button" type="button" data-i18n="refresh">Refresh</button>
117
+ </div>
97
118
  </div>
98
119
  </header>
99
120
  <div id="status" class="status" role="status"></div>
100
121
  <section class="layout">
101
122
  <aside class="panel genres-panel">
102
- <div class="panel-head"><h2 data-i18n="filtersPanelTitle">Bot role / tags</h2></div>
103
- <nav id="genres" class="genres" aria-label="Filter by bot role, memory type, or tag" data-i18n-aria-label="filtersNavLabel"></nav>
123
+ <div class="panel-head"><h2 data-i18n="filtersPanelTitle">Role and purpose / tags</h2></div>
124
+ <nav id="genres" class="genres" aria-label="Filter by role and purpose, memory type, or tag" data-i18n-aria-label="filtersNavLabel"></nav>
104
125
  </aside>
105
126
  <section class="panel list-panel">
106
127
  <div class="panel-head"><h2 id="list-title">Memory</h2><span id="result-count" class="badge">0 items</span></div>
@@ -164,6 +185,35 @@ export const WEB_HTML = String.raw `<!doctype html>
164
185
  const setStatus = (message, error = false) => { state.localizedStatus = null; showStatus(message, error); };
165
186
  const setLocalizedStatus = (key, parameters = {}, error = false) => { state.localizedStatus = { key, parameters, error }; showStatus(t(key, parameters), error); };
166
187
  const setLocalizedCountStatus = (key, count, error = false) => { state.localizedStatus = { key, count, error, plural: true }; showStatus(tp(key, count), error); };
188
+ const renderLanguageMenu = () => {
189
+ const menu = $('language-menu');
190
+ menu.replaceChildren(...i18n.locales.map((locale) => {
191
+ const option = document.createElement('button');
192
+ option.type = 'button';
193
+ option.className = 'language-option';
194
+ option.lang = locale;
195
+ option.dataset.locale = locale;
196
+ option.setAttribute('role', 'menuitemradio');
197
+ option.setAttribute('aria-checked', String(locale === state.locale));
198
+ option.textContent = i18n.localeLabels[locale];
199
+ option.addEventListener('click', () => selectLocale(locale));
200
+ return option;
201
+ }));
202
+ };
203
+ const setLanguageMenuOpen = (open, restoreFocus = false) => {
204
+ const menu = $('language-menu');
205
+ const toggle = $('language-toggle');
206
+ menu.hidden = !open;
207
+ toggle.setAttribute('aria-expanded', String(open));
208
+ if (open) requestAnimationFrame(() => menu.querySelector('[aria-checked="true"]')?.focus());
209
+ else if (restoreFocus) toggle.focus();
210
+ };
211
+ const selectLocale = (value) => {
212
+ state.locale = normalizeLocale(value) || i18n.defaultLocale;
213
+ try { localStorage.setItem(localeStorageKey, state.locale); } catch {}
214
+ setLanguageMenuOpen(false, true);
215
+ applyTranslations(); renderFilters(); renderEntries(); renderRuns(); renderRunDetail(); updateEditorState();
216
+ };
167
217
  const applyTranslations = () => {
168
218
  document.documentElement.lang = state.locale;
169
219
  document.querySelectorAll('[data-i18n]').forEach((element) => { element.textContent = t(element.dataset.i18n); });
@@ -173,7 +223,7 @@ export const WEB_HTML = String.raw `<!doctype html>
173
223
  const value = labelForStatus(element.dataset.i18nStatus);
174
224
  if ('value' in element) element.value = value; else element.textContent = value;
175
225
  });
176
- $('locale').value = state.locale;
226
+ renderLanguageMenu();
177
227
  if (state.localizedStatus) showStatus(state.localizedStatus.plural ? tp(state.localizedStatus.key, state.localizedStatus.count) : t(state.localizedStatus.key, state.localizedStatus.parameters), state.localizedStatus.error);
178
228
  };
179
229
  const api = async (path, options) => {
@@ -320,12 +370,27 @@ export const WEB_HTML = String.raw `<!doctype html>
320
370
  async function loadEntries() { if (!state.workspace) return; try { const params = new URLSearchParams({ workspace: state.workspace }); if (state.kind !== 'all') params.set('kind', state.kind); if (state.tag) params.set('tag', state.tag); if (state.query) params.set('q', state.query); const result = await api('/api/entries?' + params); state.entries = result.entries; if (state.selected && !state.entries.some((entry) => entry.id === state.selected.id)) state.selected = null; renderEntries(); renderFilters(); if (!state.selected && state.entries[0]) await selectEntry(state.entries[0].id); else renderEditor(); setLocalizedCountStatus('displayedCount', result.entries.length); } catch (error) { setStatus(error.message, true); } }
321
371
  async function loadTags() { if (!state.workspace) return; try { const result = await api('/api/tags?workspace=' + encodeURIComponent(state.workspace)); state.tags = result.tags; renderFilters(); } catch (error) { setStatus(error.message, true); } }
322
372
  async function loadWorkspaces() { try { const result = await api('/api/workspaces'); const select = $('workspace'); select.replaceChildren(...result.workspaces.map((item) => { const option = document.createElement('option'); option.value = item.workspace; option.textContent = (item.displayName || item.workspace) + ' (' + item.count + ')'; return option; })); if (!state.workspace && result.workspaces[0]) state.workspace = result.workspaces[0].workspace; select.value = state.workspace; if (state.workspace) { await loadTags(); await loadEntries(); await loadRuns(); } else setLocalizedStatus('noWorkspace', {}, true); } catch (error) { setStatus(error.message, true); } }
323
- $('locale').replaceChildren(...i18n.locales.map((locale) => { const option = document.createElement('option'); option.value = locale; option.lang = locale; option.textContent = i18n.localeLabels[locale]; return option; }));
324
- $('locale').addEventListener('change', (event) => {
325
- state.locale = normalizeLocale(event.target.value) || i18n.defaultLocale;
326
- try { localStorage.setItem(localeStorageKey, state.locale); } catch {}
327
- applyTranslations(); renderFilters(); renderEntries(); renderRuns(); renderRunDetail(); updateEditorState();
373
+ $('language-toggle').addEventListener('click', () => {
374
+ setLanguageMenuOpen($('language-toggle').getAttribute('aria-expanded') !== 'true');
375
+ });
376
+ $('language-toggle').addEventListener('keydown', (event) => {
377
+ if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;
378
+ event.preventDefault();
379
+ setLanguageMenuOpen(true);
380
+ });
381
+ $('language-menu').addEventListener('keydown', (event) => {
382
+ const options = [...$('language-menu').querySelectorAll('.language-option')];
383
+ const current = options.indexOf(document.activeElement);
384
+ let next = null;
385
+ if (event.key === 'ArrowDown') next = options[(current + 1) % options.length];
386
+ if (event.key === 'ArrowUp') next = options[(current - 1 + options.length) % options.length];
387
+ if (event.key === 'Home') next = options[0];
388
+ if (event.key === 'End') next = options.at(-1);
389
+ if (event.key === 'Escape') { event.preventDefault(); setLanguageMenuOpen(false, true); return; }
390
+ if (next) { event.preventDefault(); next.focus(); }
328
391
  });
392
+ document.addEventListener('click', (event) => { if (!$('language-picker')?.contains(event.target)) setLanguageMenuOpen(false); });
393
+ document.addEventListener('focusin', (event) => { if (!$('language-picker')?.contains(event.target)) setLanguageMenuOpen(false); });
329
394
  $('workspace').addEventListener('change', (event) => { state.workspace = event.target.value; state.selected = null; state.selectedRun = null; state.runs = []; state.tag = ''; loadTags().then(loadEntries).then(loadRuns); });
330
395
  $('refresh').addEventListener('click', () => loadWorkspaces());
331
396
  let searchTimer; $('search').addEventListener('input', (event) => { clearTimeout(searchTimer); state.query = event.target.value.trim(); searchTimer = setTimeout(() => loadEntries(), 180); });
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE7F,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;IACrC,aAAa,EAAE,kBAAkB;IACjC,YAAY,EAAE,iBAAiB;IAC/B,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;CACvB,CAAC;KACC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;KAC1B,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;KAC1B,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;KAC1B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;KAC/B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBA8Gf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqN1B,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/web/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE7F,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;IACrC,aAAa,EAAE,kBAAkB;IACjC,YAAY,EAAE,iBAAiB;IAC/B,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;CACvB,CAAC;KACC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;KAC1B,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;KAC1B,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC;KAC1B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;KAC/B,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEnC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAmIf,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiQ1B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askdkc/kiokuko",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Model-agnostic external memory for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -32,9 +32,11 @@
32
32
  "prepublishOnly": "npm run typecheck && npm test && npm run build && npm run pack:check"
33
33
  },
34
34
  "dependencies": {
35
+ "@askdkc/kiokuko": "^0.1.4",
35
36
  "@modelcontextprotocol/sdk": "^1.30.0",
36
37
  "commander": "^14.0.1",
37
38
  "jsonc-parser": "^3.3.1",
39
+ "yaml": "^2.9.0",
38
40
  "zod": "^4.4.3"
39
41
  },
40
42
  "devDependencies": {
@@ -1,5 +1,5 @@
1
1
  <!-- BEGIN KIOKUKO MANAGED BLOCK -->
2
- <!-- kiokuko-template-version: 4 -->
2
+ <!-- kiokuko-template-version: 5 -->
3
3
  <!-- This section is managed by `kiokuko use`. Edit outside the markers. -->
4
4
 
5
5
  ## Kiokuko external memory
@@ -14,7 +14,7 @@ Use the Kiokuko MCP tools rather than reading or modifying the SQLite file direc
14
14
 
15
15
  ### Before non-trivial work
16
16
 
17
- 1. Call `task_prepare` with the actual task, current working directory, and only profile hints supported by the user request or repository evidence.
17
+ 1. Call `task_prepare` at most once for the current user request, with the actual task, current working directory, and only profile hints supported by the user request or repository evidence. Reuse its result for the rest of the request; never call it again after `memory_checkpoint`.
18
18
  2. Include the complete names and short descriptions of skills and MCP tools available in the current client. Pass an empty catalog only when none are available; omit it when availability is unknown. The catalog is not stored.
19
19
  3. Kiokuko may consult `https://github.com/mattpocock/skills` only when the supplied catalog contains zero skills. If any skill is available, or the catalog is unknown, external skill fallback stays disabled.
20
20
  4. If the intake needs an answer, call `task_answer` with the same capability catalog only when current evidence supports the answer; otherwise ask the user the returned question.
@@ -23,9 +23,11 @@ Use the Kiokuko MCP tools rather than reading or modifying the SQLite file direc
23
23
 
24
24
  ### After substantial work
25
25
 
26
- 1. Call `memory_checkpoint` only for concise, durable, verified facts, decisions, lessons, preferences, or references that will help future work.
27
- 2. Keep repository knowledge in project scope. Use global scope only for knowledge that truly applies across projects.
28
- 3. Checkpoints remain untrusted candidates until explicitly reviewed; never auto-promote them to verified.
26
+ 1. Call `memory_checkpoint` at most once for the current user request, only for concise, durable, verified facts, decisions, lessons, preferences, or references that will help future work.
27
+ 2. Treat a completed `memory_checkpoint` as terminal for tool use: do not call it or any other tool again; immediately return the final response.
28
+ 3. Do not retry an unchanged tool call after it fails or returns no new information. Summarize the blocker or current result and stop tool use.
29
+ 4. Keep repository knowledge in project scope. Use global scope only for knowledge that truly applies across projects.
30
+ 5. Checkpoints remain untrusted candidates until explicitly reviewed; never auto-promote them to verified.
29
31
 
30
32
  If the MCP tools are unavailable, report the failure briefly and continue from repository evidence. Never store passwords, API keys, access tokens, private keys, session cookies, auth headers, provider credentials, client secrets, private user data, full transcripts, or capability catalogs.
31
33