@mulmoclaude/todo-plugin 0.1.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/dist/Preview.vue.d.ts +8 -0
- package/dist/View.vue.d.ts +12 -0
- package/dist/composables/index.d.ts +2 -0
- package/dist/composables/useTodos.d.ts +26 -0
- package/dist/composables.js +101 -0
- package/dist/composables.js.map +1 -0
- package/dist/definition-mymex4HE.js +55 -0
- package/dist/definition-mymex4HE.js.map +1 -0
- package/dist/definition.d.ts +43 -0
- package/dist/handlers/columns.d.ts +31 -0
- package/dist/handlers/items.d.ts +36 -0
- package/dist/handlers/llm.d.ts +30 -0
- package/dist/handlers/priority-notifier.d.ts +55 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.js +1223 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/utils.d.ts +4 -0
- package/dist/io.d.ts +6 -0
- package/dist/labels-C4z7FMoE.js +85 -0
- package/dist/labels-C4z7FMoE.js.map +1 -0
- package/dist/labels.d.ts +15 -0
- package/dist/lang/de.d.ts +25 -0
- package/dist/lang/en.d.ts +25 -0
- package/dist/lang/es.d.ts +25 -0
- package/dist/lang/fr.d.ts +25 -0
- package/dist/lang/index.d.ts +28 -0
- package/dist/lang/ja.d.ts +25 -0
- package/dist/lang/ko.d.ts +25 -0
- package/dist/lang/pt-BR.d.ts +25 -0
- package/dist/lang/zh.d.ts +25 -0
- package/dist/lang-D72AIF9U.js +215 -0
- package/dist/lang-D72AIF9U.js.map +1 -0
- package/dist/priority.d.ts +10 -0
- package/dist/shared.d.ts +13 -0
- package/dist/shared.js +89 -0
- package/dist/shared.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/viewModes.d.ts +11 -0
- package/dist/vue.d.ts +59 -0
- package/dist/vue.js +422 -0
- package/dist/vue.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { computed } from "vue";
|
|
2
|
+
import { useRuntime } from "gui-chat-protocol/vue";
|
|
3
|
+
//#endregion
|
|
4
|
+
//#region src/lang/index.ts
|
|
5
|
+
var MESSAGES = {
|
|
6
|
+
en: {
|
|
7
|
+
clearFilters: "Clear all filters",
|
|
8
|
+
deleteItem: "Delete item",
|
|
9
|
+
apiError: "⚠ Failed to update todos: {error}",
|
|
10
|
+
loadFailed: "Failed to load todos",
|
|
11
|
+
heading: "Todo List",
|
|
12
|
+
completedRatio: "{done}/{total} completed",
|
|
13
|
+
filter: "Filter:",
|
|
14
|
+
noItems: "No todo items yet",
|
|
15
|
+
noMatchingFilter: "No items match the active filter",
|
|
16
|
+
update: "Update",
|
|
17
|
+
clearCompleted: "Clear completed",
|
|
18
|
+
clearButton: "Clear ✕",
|
|
19
|
+
deleteSymbol: "✕",
|
|
20
|
+
cancel: "Cancel",
|
|
21
|
+
previewHeaderIcon: "☑",
|
|
22
|
+
previewDoneIcon: "✓",
|
|
23
|
+
previewPendingIcon: "○",
|
|
24
|
+
previewMoreLabels: "+{count}",
|
|
25
|
+
previewMoreItems: "+ {count} more…",
|
|
26
|
+
collapse: "Collapse",
|
|
27
|
+
expand: "Expand",
|
|
28
|
+
yamlParseError: "Could not parse YAML — 'text' field is required"
|
|
29
|
+
},
|
|
30
|
+
ja: {
|
|
31
|
+
clearFilters: "すべてのフィルタをクリア",
|
|
32
|
+
deleteItem: "項目を削除",
|
|
33
|
+
apiError: "⚠ Todo の更新に失敗: {error}",
|
|
34
|
+
loadFailed: "Todo の読み込みに失敗しました",
|
|
35
|
+
heading: "Todo リスト",
|
|
36
|
+
completedRatio: "{done}/{total} 完了",
|
|
37
|
+
filter: "フィルタ:",
|
|
38
|
+
noItems: "Todo 項目はまだありません",
|
|
39
|
+
noMatchingFilter: "該当する項目はありません",
|
|
40
|
+
update: "更新",
|
|
41
|
+
clearCompleted: "完了済みを削除",
|
|
42
|
+
clearButton: "クリア ✕",
|
|
43
|
+
deleteSymbol: "✕",
|
|
44
|
+
cancel: "キャンセル",
|
|
45
|
+
previewHeaderIcon: "☑",
|
|
46
|
+
previewDoneIcon: "✓",
|
|
47
|
+
previewPendingIcon: "○",
|
|
48
|
+
previewMoreLabels: "+{count}",
|
|
49
|
+
previewMoreItems: "+ {count} 件…",
|
|
50
|
+
collapse: "折りたたむ",
|
|
51
|
+
expand: "展開",
|
|
52
|
+
yamlParseError: "YAML を解析できませんでした — 'text' フィールドは必須です"
|
|
53
|
+
},
|
|
54
|
+
zh: {
|
|
55
|
+
clearFilters: "清除所有筛选",
|
|
56
|
+
deleteItem: "删除项目",
|
|
57
|
+
apiError: "⚠ 更新待办失败: {error}",
|
|
58
|
+
loadFailed: "加载 Todo 失败",
|
|
59
|
+
heading: "待办列表",
|
|
60
|
+
completedRatio: "{done}/{total} 已完成",
|
|
61
|
+
filter: "筛选:",
|
|
62
|
+
noItems: "还没有待办项",
|
|
63
|
+
noMatchingFilter: "没有项目匹配当前筛选",
|
|
64
|
+
update: "更新",
|
|
65
|
+
clearCompleted: "清除已完成",
|
|
66
|
+
clearButton: "清除 ✕",
|
|
67
|
+
deleteSymbol: "✕",
|
|
68
|
+
cancel: "取消",
|
|
69
|
+
previewHeaderIcon: "☑",
|
|
70
|
+
previewDoneIcon: "✓",
|
|
71
|
+
previewPendingIcon: "○",
|
|
72
|
+
previewMoreLabels: "+{count}",
|
|
73
|
+
previewMoreItems: "+ 还有 {count} 项…",
|
|
74
|
+
collapse: "收起",
|
|
75
|
+
expand: "展开",
|
|
76
|
+
yamlParseError: "无法解析 YAML — 'text' 字段为必填项"
|
|
77
|
+
},
|
|
78
|
+
ko: {
|
|
79
|
+
clearFilters: "모든 필터 지우기",
|
|
80
|
+
deleteItem: "항목 삭제",
|
|
81
|
+
apiError: "⚠ 할 일 업데이트 실패: {error}",
|
|
82
|
+
loadFailed: "Todo 불러오기에 실패했습니다",
|
|
83
|
+
heading: "할 일 목록",
|
|
84
|
+
completedRatio: "{done}/{total} 완료",
|
|
85
|
+
filter: "필터:",
|
|
86
|
+
noItems: "아직 할 일이 없습니다",
|
|
87
|
+
noMatchingFilter: "현재 필터와 일치하는 항목이 없습니다",
|
|
88
|
+
update: "업데이트",
|
|
89
|
+
clearCompleted: "완료된 항목 지우기",
|
|
90
|
+
clearButton: "지우기 ✕",
|
|
91
|
+
deleteSymbol: "✕",
|
|
92
|
+
cancel: "취소",
|
|
93
|
+
previewHeaderIcon: "☑",
|
|
94
|
+
previewDoneIcon: "✓",
|
|
95
|
+
previewPendingIcon: "○",
|
|
96
|
+
previewMoreLabels: "+{count}",
|
|
97
|
+
previewMoreItems: "+ {count}개 더…",
|
|
98
|
+
collapse: "접기",
|
|
99
|
+
expand: "펼치기",
|
|
100
|
+
yamlParseError: "YAML 을 해석하지 못했습니다 — 'text' 필드는 필수입니다"
|
|
101
|
+
},
|
|
102
|
+
es: {
|
|
103
|
+
clearFilters: "Borrar todos los filtros",
|
|
104
|
+
deleteItem: "Eliminar elemento",
|
|
105
|
+
apiError: "⚠ Error al actualizar las tareas: {error}",
|
|
106
|
+
loadFailed: "Error al cargar los Todos",
|
|
107
|
+
heading: "Lista de tareas",
|
|
108
|
+
completedRatio: "{done}/{total} completadas",
|
|
109
|
+
filter: "Filtro:",
|
|
110
|
+
noItems: "Aún no hay tareas",
|
|
111
|
+
noMatchingFilter: "Ningún elemento coincide con el filtro activo",
|
|
112
|
+
update: "Actualizar",
|
|
113
|
+
clearCompleted: "Borrar completadas",
|
|
114
|
+
clearButton: "Borrar ✕",
|
|
115
|
+
deleteSymbol: "✕",
|
|
116
|
+
cancel: "Cancelar",
|
|
117
|
+
previewHeaderIcon: "☑",
|
|
118
|
+
previewDoneIcon: "✓",
|
|
119
|
+
previewPendingIcon: "○",
|
|
120
|
+
previewMoreLabels: "+{count}",
|
|
121
|
+
previewMoreItems: "+ {count} más…",
|
|
122
|
+
collapse: "Colapsar",
|
|
123
|
+
expand: "Expandir",
|
|
124
|
+
yamlParseError: "No se pudo analizar YAML — el campo 'text' es obligatorio"
|
|
125
|
+
},
|
|
126
|
+
"pt-BR": {
|
|
127
|
+
clearFilters: "Limpar todos os filtros",
|
|
128
|
+
deleteItem: "Excluir item",
|
|
129
|
+
apiError: "⚠ Falha ao atualizar as tarefas: {error}",
|
|
130
|
+
loadFailed: "Falha ao carregar os Todos",
|
|
131
|
+
heading: "Lista de tarefas",
|
|
132
|
+
completedRatio: "{done}/{total} concluídas",
|
|
133
|
+
filter: "Filtro:",
|
|
134
|
+
noItems: "Ainda não há tarefas",
|
|
135
|
+
noMatchingFilter: "Nenhum item corresponde ao filtro ativo",
|
|
136
|
+
update: "Atualizar",
|
|
137
|
+
clearCompleted: "Limpar concluídas",
|
|
138
|
+
clearButton: "Limpar ✕",
|
|
139
|
+
deleteSymbol: "✕",
|
|
140
|
+
cancel: "Cancelar",
|
|
141
|
+
previewHeaderIcon: "☑",
|
|
142
|
+
previewDoneIcon: "✓",
|
|
143
|
+
previewPendingIcon: "○",
|
|
144
|
+
previewMoreLabels: "+{count}",
|
|
145
|
+
previewMoreItems: "+ {count} mais…",
|
|
146
|
+
collapse: "Recolher",
|
|
147
|
+
expand: "Expandir",
|
|
148
|
+
yamlParseError: "Não foi possível analisar o YAML — o campo 'text' é obrigatório"
|
|
149
|
+
},
|
|
150
|
+
fr: {
|
|
151
|
+
clearFilters: "Effacer tous les filtres",
|
|
152
|
+
deleteItem: "Supprimer l'élément",
|
|
153
|
+
apiError: "⚠ Échec de la mise à jour des tâches : {error}",
|
|
154
|
+
loadFailed: "Échec du chargement des todos",
|
|
155
|
+
heading: "Liste de tâches",
|
|
156
|
+
completedRatio: "{done}/{total} terminées",
|
|
157
|
+
filter: "Filtre :",
|
|
158
|
+
noItems: "Aucune tâche pour le moment",
|
|
159
|
+
noMatchingFilter: "Aucun élément ne correspond au filtre actif",
|
|
160
|
+
update: "Mettre à jour",
|
|
161
|
+
clearCompleted: "Effacer les terminées",
|
|
162
|
+
clearButton: "Effacer ✕",
|
|
163
|
+
deleteSymbol: "✕",
|
|
164
|
+
cancel: "Annuler",
|
|
165
|
+
previewHeaderIcon: "☑",
|
|
166
|
+
previewDoneIcon: "✓",
|
|
167
|
+
previewPendingIcon: "○",
|
|
168
|
+
previewMoreLabels: "+{count}",
|
|
169
|
+
previewMoreItems: "+ {count} de plus…",
|
|
170
|
+
collapse: "Réduire",
|
|
171
|
+
expand: "Développer",
|
|
172
|
+
yamlParseError: "Impossible d'analyser le YAML — le champ « text » est obligatoire"
|
|
173
|
+
},
|
|
174
|
+
de: {
|
|
175
|
+
clearFilters: "Alle Filter zurücksetzen",
|
|
176
|
+
deleteItem: "Eintrag löschen",
|
|
177
|
+
apiError: "⚠ Aktualisieren der To-dos fehlgeschlagen: {error}",
|
|
178
|
+
loadFailed: "Todos konnten nicht geladen werden",
|
|
179
|
+
heading: "Aufgabenliste",
|
|
180
|
+
completedRatio: "{done}/{total} erledigt",
|
|
181
|
+
filter: "Filter:",
|
|
182
|
+
noItems: "Noch keine To-dos",
|
|
183
|
+
noMatchingFilter: "Keine Einträge passen zum aktiven Filter",
|
|
184
|
+
update: "Aktualisieren",
|
|
185
|
+
clearCompleted: "Erledigte entfernen",
|
|
186
|
+
clearButton: "Löschen ✕",
|
|
187
|
+
deleteSymbol: "✕",
|
|
188
|
+
cancel: "Abbrechen",
|
|
189
|
+
previewHeaderIcon: "☑",
|
|
190
|
+
previewDoneIcon: "✓",
|
|
191
|
+
previewPendingIcon: "○",
|
|
192
|
+
previewMoreLabels: "+{count}",
|
|
193
|
+
previewMoreItems: "+ {count} weitere…",
|
|
194
|
+
collapse: "Einklappen",
|
|
195
|
+
expand: "Ausklappen",
|
|
196
|
+
yamlParseError: "YAML konnte nicht geparst werden — Feld 'text' ist erforderlich"
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
function isSupportedLocale(value) {
|
|
200
|
+
return value in MESSAGES;
|
|
201
|
+
}
|
|
202
|
+
function useT() {
|
|
203
|
+
const { locale } = useRuntime();
|
|
204
|
+
return computed(() => isSupportedLocale(locale.value) ? MESSAGES[locale.value] : MESSAGES.en);
|
|
205
|
+
}
|
|
206
|
+
/** Tiny `{name}` placeholder substitution — the plugin's locale
|
|
207
|
+
* strings use the same syntax as vue-i18n templates so the keys
|
|
208
|
+
* carry over from the host's i18n verbatim. */
|
|
209
|
+
function format(template, params) {
|
|
210
|
+
return template.replace(/\{(\w+)\}/g, (_, name) => String(params[name] ?? `{${name}}`));
|
|
211
|
+
}
|
|
212
|
+
//#endregion
|
|
213
|
+
export { useT as n, format as t };
|
|
214
|
+
|
|
215
|
+
//# sourceMappingURL=lang-D72AIF9U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lang-D72AIF9U.js","names":[],"sources":["../src/lang/en.ts","../src/lang/ja.ts","../src/lang/zh.ts","../src/lang/ko.ts","../src/lang/es.ts","../src/lang/pt-BR.ts","../src/lang/fr.ts","../src/lang/de.ts","../src/lang/index.ts"],"sourcesContent":["export default {\n clearFilters: \"Clear all filters\",\n deleteItem: \"Delete item\",\n apiError: \"⚠ Failed to update todos: {error}\",\n loadFailed: \"Failed to load todos\",\n heading: \"Todo List\",\n completedRatio: \"{done}/{total} completed\",\n filter: \"Filter:\",\n noItems: \"No todo items yet\",\n noMatchingFilter: \"No items match the active filter\",\n update: \"Update\",\n clearCompleted: \"Clear completed\",\n clearButton: \"Clear ✕\",\n deleteSymbol: \"✕\",\n cancel: \"Cancel\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ {count} more…\",\n collapse: \"Collapse\",\n expand: \"Expand\",\n yamlParseError: \"Could not parse YAML — 'text' field is required\",\n};\n","export default {\n clearFilters: \"すべてのフィルタをクリア\",\n deleteItem: \"項目を削除\",\n apiError: \"⚠ Todo の更新に失敗: {error}\",\n loadFailed: \"Todo の読み込みに失敗しました\",\n heading: \"Todo リスト\",\n completedRatio: \"{done}/{total} 完了\",\n filter: \"フィルタ:\",\n noItems: \"Todo 項目はまだありません\",\n noMatchingFilter: \"該当する項目はありません\",\n update: \"更新\",\n clearCompleted: \"完了済みを削除\",\n clearButton: \"クリア ✕\",\n deleteSymbol: \"✕\",\n cancel: \"キャンセル\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ {count} 件…\",\n collapse: \"折りたたむ\",\n expand: \"展開\",\n yamlParseError: \"YAML を解析できませんでした — 'text' フィールドは必須です\",\n};\n","export default {\n clearFilters: \"清除所有筛选\",\n deleteItem: \"删除项目\",\n apiError: \"⚠ 更新待办失败: {error}\",\n loadFailed: \"加载 Todo 失败\",\n heading: \"待办列表\",\n completedRatio: \"{done}/{total} 已完成\",\n filter: \"筛选:\",\n noItems: \"还没有待办项\",\n noMatchingFilter: \"没有项目匹配当前筛选\",\n update: \"更新\",\n clearCompleted: \"清除已完成\",\n clearButton: \"清除 ✕\",\n deleteSymbol: \"✕\",\n cancel: \"取消\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ 还有 {count} 项…\",\n collapse: \"收起\",\n expand: \"展开\",\n yamlParseError: \"无法解析 YAML — 'text' 字段为必填项\",\n};\n","export default {\n clearFilters: \"모든 필터 지우기\",\n deleteItem: \"항목 삭제\",\n apiError: \"⚠ 할 일 업데이트 실패: {error}\",\n loadFailed: \"Todo 불러오기에 실패했습니다\",\n heading: \"할 일 목록\",\n completedRatio: \"{done}/{total} 완료\",\n filter: \"필터:\",\n noItems: \"아직 할 일이 없습니다\",\n noMatchingFilter: \"현재 필터와 일치하는 항목이 없습니다\",\n update: \"업데이트\",\n clearCompleted: \"완료된 항목 지우기\",\n clearButton: \"지우기 ✕\",\n deleteSymbol: \"✕\",\n cancel: \"취소\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ {count}개 더…\",\n collapse: \"접기\",\n expand: \"펼치기\",\n yamlParseError: \"YAML 을 해석하지 못했습니다 — 'text' 필드는 필수입니다\",\n};\n","export default {\n clearFilters: \"Borrar todos los filtros\",\n deleteItem: \"Eliminar elemento\",\n apiError: \"⚠ Error al actualizar las tareas: {error}\",\n loadFailed: \"Error al cargar los Todos\",\n heading: \"Lista de tareas\",\n completedRatio: \"{done}/{total} completadas\",\n filter: \"Filtro:\",\n noItems: \"Aún no hay tareas\",\n noMatchingFilter: \"Ningún elemento coincide con el filtro activo\",\n update: \"Actualizar\",\n clearCompleted: \"Borrar completadas\",\n clearButton: \"Borrar ✕\",\n deleteSymbol: \"✕\",\n cancel: \"Cancelar\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ {count} más…\",\n collapse: \"Colapsar\",\n expand: \"Expandir\",\n yamlParseError: \"No se pudo analizar YAML — el campo 'text' es obligatorio\",\n};\n","export default {\n clearFilters: \"Limpar todos os filtros\",\n deleteItem: \"Excluir item\",\n apiError: \"⚠ Falha ao atualizar as tarefas: {error}\",\n loadFailed: \"Falha ao carregar os Todos\",\n heading: \"Lista de tarefas\",\n completedRatio: \"{done}/{total} concluídas\",\n filter: \"Filtro:\",\n noItems: \"Ainda não há tarefas\",\n noMatchingFilter: \"Nenhum item corresponde ao filtro ativo\",\n update: \"Atualizar\",\n clearCompleted: \"Limpar concluídas\",\n clearButton: \"Limpar ✕\",\n deleteSymbol: \"✕\",\n cancel: \"Cancelar\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ {count} mais…\",\n collapse: \"Recolher\",\n expand: \"Expandir\",\n yamlParseError: \"Não foi possível analisar o YAML — o campo 'text' é obrigatório\",\n};\n","export default {\n clearFilters: \"Effacer tous les filtres\",\n deleteItem: \"Supprimer l'élément\",\n apiError: \"⚠ Échec de la mise à jour des tâches : {error}\",\n loadFailed: \"Échec du chargement des todos\",\n heading: \"Liste de tâches\",\n completedRatio: \"{done}/{total} terminées\",\n filter: \"Filtre :\",\n noItems: \"Aucune tâche pour le moment\",\n noMatchingFilter: \"Aucun élément ne correspond au filtre actif\",\n update: \"Mettre à jour\",\n clearCompleted: \"Effacer les terminées\",\n clearButton: \"Effacer ✕\",\n deleteSymbol: \"✕\",\n cancel: \"Annuler\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ {count} de plus…\",\n collapse: \"Réduire\",\n expand: \"Développer\",\n yamlParseError: \"Impossible d'analyser le YAML — le champ « text » est obligatoire\",\n};\n","export default {\n clearFilters: \"Alle Filter zurücksetzen\",\n deleteItem: \"Eintrag löschen\",\n apiError: \"⚠ Aktualisieren der To-dos fehlgeschlagen: {error}\",\n loadFailed: \"Todos konnten nicht geladen werden\",\n heading: \"Aufgabenliste\",\n completedRatio: \"{done}/{total} erledigt\",\n filter: \"Filter:\",\n noItems: \"Noch keine To-dos\",\n noMatchingFilter: \"Keine Einträge passen zum aktiven Filter\",\n update: \"Aktualisieren\",\n clearCompleted: \"Erledigte entfernen\",\n clearButton: \"Löschen ✕\",\n deleteSymbol: \"✕\",\n cancel: \"Abbrechen\",\n previewHeaderIcon: \"☑\",\n previewDoneIcon: \"✓\",\n previewPendingIcon: \"○\",\n previewMoreLabels: \"+{count}\",\n previewMoreItems: \"+ {count} weitere…\",\n collapse: \"Einklappen\",\n expand: \"Ausklappen\",\n yamlParseError: \"YAML konnte nicht geparst werden — Feld 'text' ist erforderlich\",\n};\n","// Plugin-local i18n. Translation tables travel with the plugin\n// bundle; the host's vue-i18n is not touched. The plugin reads the\n// host's locale via `useRuntime().locale` and looks up its own\n// table reactively. Same pattern as bookmarks-plugin.\n//\n// {error}, {done}, {total} are interpolation placeholders. The\n// `format(template, params)` helper does the substitution at the\n// call site so plugin code reads as `t.value.apiError({error: msg})`.\n\nimport { computed } from \"vue\";\nimport { useRuntime } from \"gui-chat-protocol/vue\";\nimport en from \"./en\";\nimport ja from \"./ja\";\nimport zh from \"./zh\";\nimport ko from \"./ko\";\nimport es from \"./es\";\nimport ptBR from \"./pt-BR\";\nimport fr from \"./fr\";\nimport de from \"./de\";\n\nconst MESSAGES = { en, ja, zh, ko, es, \"pt-BR\": ptBR, fr, de } as const;\ntype LocaleKey = keyof typeof MESSAGES;\n\nfunction isSupportedLocale(value: string): value is LocaleKey {\n return value in MESSAGES;\n}\n\nexport function useT() {\n const { locale } = useRuntime();\n return computed(() => (isSupportedLocale(locale.value) ? MESSAGES[locale.value] : MESSAGES.en));\n}\n\n/** Tiny `{name}` placeholder substitution — the plugin's locale\n * strings use the same syntax as vue-i18n templates so the keys\n * carry over from the host's i18n verbatim. */\nexport function format(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, name) => String(params[name] ?? `{${name}}`));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TodoPriority } from './types';
|
|
2
|
+
export declare const PRIORITY_ORDER: Record<TodoPriority, number>;
|
|
3
|
+
export declare const PRIORITY_LABELS: Record<TodoPriority, string>;
|
|
4
|
+
export declare const PRIORITY_CLASSES: Record<TodoPriority, string>;
|
|
5
|
+
export declare const PRIORITY_BORDER: Record<TodoPriority, string>;
|
|
6
|
+
export declare const PRIORITIES: readonly TodoPriority[];
|
|
7
|
+
export declare function isPriority(value: unknown): value is TodoPriority;
|
|
8
|
+
export declare function dueDateClasses(dueDate: string | undefined): string;
|
|
9
|
+
export declare function todayISO(): string;
|
|
10
|
+
export declare function formatDueLabel(dueDate: string | undefined): string;
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type { TodoItem, TodoPriority, StatusColumn, TodoData } from './types';
|
|
2
|
+
export { PRIORITIES, PRIORITY_LABELS, PRIORITY_ORDER, PRIORITY_CLASSES, PRIORITY_BORDER, isPriority, dueDateClasses, todayISO, formatDueLabel, } from './priority';
|
|
3
|
+
export { LABEL_PALETTE, colorForLabel, filterByLabels, listLabelsWithCount, mergeLabels, normalizeLabel, subtractLabels, labelsEqual } from './labels';
|
|
4
|
+
export { TODO_VIEW, TODO_VIEW_MODES, type TodoViewMode } from './viewModes';
|
|
5
|
+
export type { CreateInput as CreateItemInput, PatchInput as PatchItemInput, MoveInput as MoveItemInput } from './handlers/items';
|
|
6
|
+
export interface AddColumnInput {
|
|
7
|
+
label: string;
|
|
8
|
+
isDone?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface PatchColumnInput {
|
|
11
|
+
label?: string;
|
|
12
|
+
isDone?: boolean;
|
|
13
|
+
}
|
package/dist/shared.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { a as listLabelsWithCount, c as subtractLabels, i as labelsEqual, n as colorForLabel, o as mergeLabels, r as filterByLabels, s as normalizeLabel, t as LABEL_PALETTE } from "./labels-C4z7FMoE.js";
|
|
2
|
+
//#region src/priority.ts
|
|
3
|
+
var PRIORITY_ORDER = {
|
|
4
|
+
low: 0,
|
|
5
|
+
medium: 1,
|
|
6
|
+
high: 2,
|
|
7
|
+
urgent: 3
|
|
8
|
+
};
|
|
9
|
+
var PRIORITY_LABELS = {
|
|
10
|
+
low: "Low",
|
|
11
|
+
medium: "Medium",
|
|
12
|
+
high: "High",
|
|
13
|
+
urgent: "Urgent"
|
|
14
|
+
};
|
|
15
|
+
var PRIORITY_CLASSES = {
|
|
16
|
+
low: "bg-slate-100 text-slate-600",
|
|
17
|
+
medium: "bg-sky-100 text-sky-700",
|
|
18
|
+
high: "bg-orange-100 text-orange-700",
|
|
19
|
+
urgent: "bg-red-100 text-red-700"
|
|
20
|
+
};
|
|
21
|
+
var PRIORITY_BORDER = {
|
|
22
|
+
low: "border-l-slate-300",
|
|
23
|
+
medium: "border-l-sky-400",
|
|
24
|
+
high: "border-l-orange-400",
|
|
25
|
+
urgent: "border-l-red-500"
|
|
26
|
+
};
|
|
27
|
+
var PRIORITIES = [
|
|
28
|
+
"low",
|
|
29
|
+
"medium",
|
|
30
|
+
"high",
|
|
31
|
+
"urgent"
|
|
32
|
+
];
|
|
33
|
+
function isPriority(value) {
|
|
34
|
+
return typeof value === "string" && Object.prototype.hasOwnProperty.call(PRIORITY_ORDER, value);
|
|
35
|
+
}
|
|
36
|
+
function dueDateClasses(dueDate) {
|
|
37
|
+
if (!dueDate) return "";
|
|
38
|
+
const today = todayISO();
|
|
39
|
+
if (dueDate < today) return "bg-red-100 text-red-700";
|
|
40
|
+
if (dueDate === today) return "bg-orange-100 text-orange-700";
|
|
41
|
+
const todayDate = new Date(today);
|
|
42
|
+
const dueDateObj = new Date(dueDate);
|
|
43
|
+
if (Math.round((dueDateObj.getTime() - todayDate.getTime()) / (1e3 * 60 * 60 * 24)) <= 3) return "bg-yellow-100 text-yellow-700";
|
|
44
|
+
return "bg-gray-100 text-gray-600";
|
|
45
|
+
}
|
|
46
|
+
function todayISO() {
|
|
47
|
+
const now = /* @__PURE__ */ new Date();
|
|
48
|
+
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")}`;
|
|
49
|
+
}
|
|
50
|
+
function formatDueLabel(dueDate) {
|
|
51
|
+
if (!dueDate) return "";
|
|
52
|
+
const date = /* @__PURE__ */ new Date(`${dueDate}T00:00:00`);
|
|
53
|
+
if (Number.isNaN(date.getTime())) return dueDate;
|
|
54
|
+
const today = /* @__PURE__ */ new Date();
|
|
55
|
+
const sameYear = date.getFullYear() === today.getFullYear();
|
|
56
|
+
return date.toLocaleDateString(void 0, {
|
|
57
|
+
month: "short",
|
|
58
|
+
day: "numeric",
|
|
59
|
+
...sameYear ? {} : { year: "numeric" }
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/viewModes.ts
|
|
64
|
+
var TODO_VIEW = {
|
|
65
|
+
kanban: "kanban",
|
|
66
|
+
table: "table",
|
|
67
|
+
list: "list"
|
|
68
|
+
};
|
|
69
|
+
var TODO_VIEW_MODES = [
|
|
70
|
+
{
|
|
71
|
+
key: TODO_VIEW.kanban,
|
|
72
|
+
label: "Kanban",
|
|
73
|
+
icon: "view_kanban"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
key: TODO_VIEW.table,
|
|
77
|
+
label: "Table",
|
|
78
|
+
icon: "table_rows"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: TODO_VIEW.list,
|
|
82
|
+
label: "List",
|
|
83
|
+
icon: "view_list"
|
|
84
|
+
}
|
|
85
|
+
];
|
|
86
|
+
//#endregion
|
|
87
|
+
export { LABEL_PALETTE, PRIORITIES, PRIORITY_BORDER, PRIORITY_CLASSES, PRIORITY_LABELS, PRIORITY_ORDER, TODO_VIEW, TODO_VIEW_MODES, colorForLabel, dueDateClasses, filterByLabels, formatDueLabel, isPriority, labelsEqual, listLabelsWithCount, mergeLabels, normalizeLabel, subtractLabels, todayISO };
|
|
88
|
+
|
|
89
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","names":[],"sources":["../src/priority.ts","../src/viewModes.ts"],"sourcesContent":["// Pure helpers for the todo `priority` field. Used by the kanban\n// cards, the table view, and any future plugin code that needs to\n// render a priority badge — kept dependency-free so both the server\n// and the browser can import it.\n\nimport type { TodoPriority } from \"./types\";\n\nexport const PRIORITY_ORDER: Record<TodoPriority, number> = {\n low: 0,\n medium: 1,\n high: 2,\n urgent: 3,\n};\n\n// Display label for each priority level. Capitalised so it reads well\n// in chips / dropdowns without further formatting at the call site.\nexport const PRIORITY_LABELS: Record<TodoPriority, string> = {\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n urgent: \"Urgent\",\n};\n\n// Tailwind classes for the priority chip backgrounds. Picked to be\n// distinguishable at small sizes without competing too hard with the\n// label colours from labels.ts.\nexport const PRIORITY_CLASSES: Record<TodoPriority, string> = {\n low: \"bg-slate-100 text-slate-600\",\n medium: \"bg-sky-100 text-sky-700\",\n high: \"bg-orange-100 text-orange-700\",\n urgent: \"bg-red-100 text-red-700\",\n};\n\n// Tailwind border-color classes for the kanban card left border.\n// Slightly bolder than the chip palette so a card with no labels still\n// shows priority at a glance.\nexport const PRIORITY_BORDER: Record<TodoPriority, string> = {\n low: \"border-l-slate-300\",\n medium: \"border-l-sky-400\",\n high: \"border-l-orange-400\",\n urgent: \"border-l-red-500\",\n};\n\nexport const PRIORITIES: readonly TodoPriority[] = [\"low\", \"medium\", \"high\", \"urgent\"];\n\nexport function isPriority(value: unknown): value is TodoPriority {\n // Use hasOwnProperty rather than the `in` operator: `in` walks the\n // prototype chain, so `\"toString\" in PRIORITY_ORDER` would return\n // true and incorrectly narrow `\"toString\"` to TodoPriority. We use\n // the .call form (rather than Object.hasOwn) because the project's\n // client tsconfig targets ES2021, and Object.hasOwn is ES2022.\n return typeof value === \"string\" && Object.prototype.hasOwnProperty.call(PRIORITY_ORDER, value);\n}\n\n// ── due date helpers ─────────────────────────────────────────────\n\n// Returns a Tailwind class string for a due-date badge based on how\n// far the date is from today. The 4 buckets match what GitHub\n// Projects shows in its kanban view.\nexport function dueDateClasses(dueDate: string | undefined): string {\n if (!dueDate) return \"\";\n const today = todayISO();\n if (dueDate < today) return \"bg-red-100 text-red-700\";\n if (dueDate === today) return \"bg-orange-100 text-orange-700\";\n // Within 3 days?\n const todayDate = new Date(today);\n const dueDateObj = new Date(dueDate);\n const diffDays = Math.round((dueDateObj.getTime() - todayDate.getTime()) / (1000 * 60 * 60 * 24));\n if (diffDays <= 3) return \"bg-yellow-100 text-yellow-700\";\n return \"bg-gray-100 text-gray-600\";\n}\n\n// Today's date as YYYY-MM-DD in the user's local timezone. Avoiding\n// `toISOString` here on purpose: that returns UTC, which would flip\n// the day boundary for users west of UTC and lead to \"due today\"\n// flickering at midnight.\nexport function todayISO(): string {\n const now = new Date();\n const yyyy = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, \"0\");\n const day = String(now.getDate()).padStart(2, \"0\");\n return `${yyyy}-${month}-${day}`;\n}\n\n// Pretty short label for the kanban card badges. \"2026-04-12\" →\n// \"Apr 12\". Year is omitted unless it differs from the current one.\nexport function formatDueLabel(dueDate: string | undefined): string {\n if (!dueDate) return \"\";\n const date = new Date(`${dueDate}T00:00:00`);\n if (Number.isNaN(date.getTime())) return dueDate;\n const today = new Date();\n const sameYear = date.getFullYear() === today.getFullYear();\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n ...(sameYear ? {} : { year: \"numeric\" }),\n });\n}\n","// View mode constants for the Todo Explorer.\n\nexport const TODO_VIEW = {\n kanban: \"kanban\",\n table: \"table\",\n list: \"list\",\n} as const;\n\nexport type TodoViewMode = (typeof TODO_VIEW)[keyof typeof TODO_VIEW];\n\nexport const TODO_VIEW_MODES: {\n key: TodoViewMode;\n label: string;\n icon: string;\n}[] = [\n { key: TODO_VIEW.kanban, label: \"Kanban\", icon: \"view_kanban\" },\n { key: TODO_VIEW.table, label: \"Table\", icon: \"table_rows\" },\n { key: TODO_VIEW.list, label: \"List\", icon: \"view_list\" },\n];\n"],"mappings":";;AAOA,IAAa,iBAA+C;CAC1D,KAAK;CACL,QAAQ;CACR,MAAM;CACN,QAAQ;AACV;AAIA,IAAa,kBAAgD;CAC3D,KAAK;CACL,QAAQ;CACR,MAAM;CACN,QAAQ;AACV;AAKA,IAAa,mBAAiD;CAC5D,KAAK;CACL,QAAQ;CACR,MAAM;CACN,QAAQ;AACV;AAKA,IAAa,kBAAgD;CAC3D,KAAK;CACL,QAAQ;CACR,MAAM;CACN,QAAQ;AACV;AAEA,IAAa,aAAsC;CAAC;CAAO;CAAU;CAAQ;AAAQ;AAErF,SAAgB,WAAW,OAAuC;CAMhE,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,eAAe,KAAK,gBAAgB,KAAK;AAChG;AAOA,SAAgB,eAAe,SAAqC;CAClE,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,SAAS;CACvB,IAAI,UAAU,OAAO,OAAO;CAC5B,IAAI,YAAY,OAAO,OAAO;CAE9B,MAAM,YAAY,IAAI,KAAK,KAAK;CAChC,MAAM,aAAa,IAAI,KAAK,OAAO;CAEnC,IADiB,KAAK,OAAO,WAAW,QAAQ,IAAI,UAAU,QAAQ,MAAM,MAAO,KAAK,KAAK,GACzF,KAAY,GAAG,OAAO;CAC1B,OAAO;AACT;AAMA,SAAgB,WAAmB;CACjC,MAAM,sBAAM,IAAI,KAAK;CAIrB,OAAO,GAHM,IAAI,YAGP,EAAK,GAFD,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAEnC,EAAM,GADZ,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GACnB;AAC7B;AAIA,SAAgB,eAAe,SAAqC;CAClE,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,uBAAO,IAAI,KAAK,GAAG,QAAQ,UAAU;CAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG,OAAO;CACzC,MAAM,wBAAQ,IAAI,KAAK;CACvB,MAAM,WAAW,KAAK,YAAY,MAAM,MAAM,YAAY;CAC1D,OAAO,KAAK,mBAAmB,KAAA,GAAW;EACxC,OAAO;EACP,KAAK;EACL,GAAI,WAAW,CAAC,IAAI,EAAE,MAAM,UAAU;CACxC,CAAC;AACH;;;AC/FA,IAAa,YAAY;CACvB,QAAQ;CACR,OAAO;CACP,MAAM;AACR;AAIA,IAAa,kBAIP;CACJ;EAAE,KAAK,UAAU;EAAQ,OAAO;EAAU,MAAM;CAAc;CAC9D;EAAE,KAAK,UAAU;EAAO,OAAO;EAAS,MAAM;CAAa;CAC3D;EAAE,KAAK,UAAU;EAAM,OAAO;EAAQ,MAAM;CAAY;AAC1D"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type TodoPriority = "low" | "medium" | "high" | "urgent";
|
|
2
|
+
export interface TodoItem {
|
|
3
|
+
id: string;
|
|
4
|
+
text: string;
|
|
5
|
+
note?: string;
|
|
6
|
+
labels?: string[];
|
|
7
|
+
completed: boolean;
|
|
8
|
+
createdAt: number;
|
|
9
|
+
status?: string;
|
|
10
|
+
priority?: TodoPriority;
|
|
11
|
+
dueDate?: string;
|
|
12
|
+
order?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface StatusColumn {
|
|
15
|
+
id: string;
|
|
16
|
+
label: string;
|
|
17
|
+
isDone?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface TodoData {
|
|
20
|
+
items: TodoItem[];
|
|
21
|
+
columns?: StatusColumn[];
|
|
22
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const TODO_VIEW: {
|
|
2
|
+
readonly kanban: "kanban";
|
|
3
|
+
readonly table: "table";
|
|
4
|
+
readonly list: "list";
|
|
5
|
+
};
|
|
6
|
+
export type TodoViewMode = (typeof TODO_VIEW)[keyof typeof TODO_VIEW];
|
|
7
|
+
export declare const TODO_VIEW_MODES: {
|
|
8
|
+
key: TodoViewMode;
|
|
9
|
+
label: string;
|
|
10
|
+
icon: string;
|
|
11
|
+
}[];
|
package/dist/vue.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export declare const plugin: {
|
|
2
|
+
toolDefinition: {
|
|
3
|
+
type: "function";
|
|
4
|
+
name: "manageTodoList";
|
|
5
|
+
prompt: string;
|
|
6
|
+
description: string;
|
|
7
|
+
parameters: {
|
|
8
|
+
type: "object";
|
|
9
|
+
properties: {
|
|
10
|
+
action: {
|
|
11
|
+
type: string;
|
|
12
|
+
enum: string[];
|
|
13
|
+
description: string;
|
|
14
|
+
};
|
|
15
|
+
text: {
|
|
16
|
+
type: string;
|
|
17
|
+
description: string;
|
|
18
|
+
};
|
|
19
|
+
newText: {
|
|
20
|
+
type: string;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
note: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
};
|
|
27
|
+
labels: {
|
|
28
|
+
type: string;
|
|
29
|
+
items: {
|
|
30
|
+
type: string;
|
|
31
|
+
};
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
filterLabels: {
|
|
35
|
+
type: string;
|
|
36
|
+
items: {
|
|
37
|
+
type: string;
|
|
38
|
+
};
|
|
39
|
+
description: string;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
required: string[];
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
viewComponent: import('vue').DefineComponent<{
|
|
46
|
+
selectedResult: import('gui-chat-protocol/vue').ToolResultComplete<import('./types').TodoData>;
|
|
47
|
+
}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
48
|
+
updateResult: (result: import('gui-chat-protocol/vue').ToolResultComplete<unknown, unknown>) => any;
|
|
49
|
+
}, string, import('vue').PublicProps, Readonly<{
|
|
50
|
+
selectedResult: import('gui-chat-protocol/vue').ToolResultComplete<import('./types').TodoData>;
|
|
51
|
+
}> & Readonly<{
|
|
52
|
+
onUpdateResult?: ((result: import('gui-chat-protocol/vue').ToolResultComplete<unknown, unknown>) => any) | undefined;
|
|
53
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
54
|
+
previewComponent: import('vue').DefineComponent<{
|
|
55
|
+
result: import('gui-chat-protocol/vue').ToolResultComplete<import('./types').TodoData>;
|
|
56
|
+
}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{
|
|
57
|
+
result: import('gui-chat-protocol/vue').ToolResultComplete<import('./types').TodoData>;
|
|
58
|
+
}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
59
|
+
};
|