devglide 0.1.1
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/LICENSE +21 -0
- package/README.md +338 -0
- package/bin/claude-md-template.js +94 -0
- package/bin/devglide.js +387 -0
- package/package.json +85 -0
- package/pnpm-workspace.yaml +3 -0
- package/src/apps/coder/.turbo/turbo-lint.log +5 -0
- package/src/apps/coder/package.json +16 -0
- package/src/apps/coder/public/favicon.svg +7 -0
- package/src/apps/coder/public/page.css +275 -0
- package/src/apps/coder/public/page.js +528 -0
- package/src/apps/coder/server.js +3 -0
- package/src/apps/documentation/public/page.css +597 -0
- package/src/apps/documentation/public/page.js +609 -0
- package/src/apps/kanban/.turbo/turbo-lint.log +97 -0
- package/src/apps/kanban/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/kanban/package.json +32 -0
- package/src/apps/kanban/public/favicon.svg +7 -0
- package/src/apps/kanban/public/page.css +1010 -0
- package/src/apps/kanban/public/page.js +1730 -0
- package/src/apps/kanban/public/vendor/marked.min.js +6 -0
- package/src/apps/kanban/public/vendor/sortable.min.js +2 -0
- package/src/apps/kanban/src/db.ts +319 -0
- package/src/apps/kanban/src/index.ts +14 -0
- package/src/apps/kanban/src/mcp-helpers.test.ts +88 -0
- package/src/apps/kanban/src/mcp-helpers.ts +60 -0
- package/src/apps/kanban/src/mcp.ts +59 -0
- package/src/apps/kanban/src/routes/attachments.ts +161 -0
- package/src/apps/kanban/src/routes/features.ts +233 -0
- package/src/apps/kanban/src/routes/issues.ts +373 -0
- package/src/apps/kanban/src/tools/feature-tools.ts +164 -0
- package/src/apps/kanban/src/tools/item-tools.ts +307 -0
- package/src/apps/kanban/src/tools/versioned-entry-tools.ts +72 -0
- package/src/apps/kanban/tsconfig.check.json +9 -0
- package/src/apps/kanban/tsconfig.json +9 -0
- package/src/apps/keymap/.turbo/turbo-lint.log +5 -0
- package/src/apps/keymap/package.json +16 -0
- package/src/apps/keymap/public/page.css +275 -0
- package/src/apps/keymap/public/page.js +294 -0
- package/src/apps/keymap/server.js +25 -0
- package/src/apps/log/.turbo/turbo-build.log +5 -0
- package/src/apps/log/.turbo/turbo-lint.log +45 -0
- package/src/apps/log/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/log/node_modules/.bin/tsc +21 -0
- package/src/apps/log/node_modules/.bin/tsserver +21 -0
- package/src/apps/log/node_modules/.bin/tsx +21 -0
- package/src/apps/log/package.json +36 -0
- package/src/apps/log/public/console-sniffer.js +221 -0
- package/src/apps/log/public/favicon.svg +7 -0
- package/src/apps/log/public/page.css +322 -0
- package/src/apps/log/public/page.js +463 -0
- package/src/apps/log/src/index.ts +9 -0
- package/src/apps/log/src/mcp.ts +122 -0
- package/src/apps/log/src/routes/log.ts +333 -0
- package/src/apps/log/src/routes/status.ts +25 -0
- package/src/apps/log/src/server-sniffer.ts +118 -0
- package/src/apps/log/src/services/file-patterns.ts +39 -0
- package/src/apps/log/src/services/file-tailer.ts +228 -0
- package/src/apps/log/src/services/line-parser.ts +94 -0
- package/src/apps/log/src/services/log-writer.ts +39 -0
- package/src/apps/log/tsconfig.json +8 -0
- package/src/apps/prompts/.turbo/turbo-build.log +5 -0
- package/src/apps/prompts/.turbo/turbo-lint.log +24 -0
- package/src/apps/prompts/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/prompts/mcp.ts +175 -0
- package/src/apps/prompts/node_modules/.bin/tsc +21 -0
- package/src/apps/prompts/node_modules/.bin/tsserver +21 -0
- package/src/apps/prompts/node_modules/.bin/tsx +21 -0
- package/src/apps/prompts/package.json +25 -0
- package/src/apps/prompts/public/page.css +315 -0
- package/src/apps/prompts/public/page.js +541 -0
- package/src/apps/prompts/services/prompt-store.ts +212 -0
- package/src/apps/prompts/src/index.ts +9 -0
- package/src/apps/prompts/tsconfig.json +8 -0
- package/src/apps/prompts/types.ts +27 -0
- package/src/apps/shell/.turbo/turbo-build.log +5 -0
- package/src/apps/shell/.turbo/turbo-lint.log +34 -0
- package/src/apps/shell/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/shell/package.json +35 -0
- package/src/apps/shell/public/favicon.svg +7 -0
- package/src/apps/shell/public/page.css +407 -0
- package/src/apps/shell/public/page.js +1577 -0
- package/src/apps/shell/src/index.ts +150 -0
- package/src/apps/shell/src/mcp.ts +398 -0
- package/src/apps/shell/src/shell-types.ts +41 -0
- package/src/apps/shell/tsconfig.json +8 -0
- package/src/apps/test/.turbo/turbo-build.log +5 -0
- package/src/apps/test/.turbo/turbo-lint.log +27 -0
- package/src/apps/test/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/test/node_modules/.bin/tsc +21 -0
- package/src/apps/test/node_modules/.bin/tsserver +21 -0
- package/src/apps/test/node_modules/.bin/tsx +21 -0
- package/src/apps/test/node_modules/.bin/uuid +21 -0
- package/src/apps/test/package.json +35 -0
- package/src/apps/test/public/favicon.svg +7 -0
- package/src/apps/test/public/page.css +499 -0
- package/src/apps/test/public/page.js +417 -0
- package/src/apps/test/public/scenario-runner.js +450 -0
- package/src/apps/test/src/index.ts +9 -0
- package/src/apps/test/src/mcp.ts +192 -0
- package/src/apps/test/src/routes/trigger.ts +285 -0
- package/src/apps/test/src/services/scenario-broadcaster.ts +60 -0
- package/src/apps/test/src/services/scenario-manager.ts +361 -0
- package/src/apps/test/src/services/scenario-store.ts +145 -0
- package/src/apps/test/tsconfig.json +8 -0
- package/src/apps/vocabulary/.turbo/turbo-build.log +5 -0
- package/src/apps/vocabulary/.turbo/turbo-lint.log +25 -0
- package/src/apps/vocabulary/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/vocabulary/mcp.ts +173 -0
- package/src/apps/vocabulary/node_modules/.bin/tsc +21 -0
- package/src/apps/vocabulary/node_modules/.bin/tsserver +21 -0
- package/src/apps/vocabulary/node_modules/.bin/tsx +21 -0
- package/src/apps/vocabulary/package.json +25 -0
- package/src/apps/vocabulary/public/page.css +247 -0
- package/src/apps/vocabulary/public/page.js +444 -0
- package/src/apps/vocabulary/services/vocabulary-store.ts +179 -0
- package/src/apps/vocabulary/src/index.ts +10 -0
- package/src/apps/vocabulary/tsconfig.json +8 -0
- package/src/apps/vocabulary/types.ts +22 -0
- package/src/apps/voice/.turbo/turbo-build.log +5 -0
- package/src/apps/voice/.turbo/turbo-lint.log +43 -0
- package/src/apps/voice/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/voice/node_modules/.bin/openai +21 -0
- package/src/apps/voice/node_modules/.bin/tsc +21 -0
- package/src/apps/voice/node_modules/.bin/tsserver +21 -0
- package/src/apps/voice/node_modules/.bin/tsx +21 -0
- package/src/apps/voice/package.json +35 -0
- package/src/apps/voice/public/favicon.svg +7 -0
- package/src/apps/voice/public/page.css +388 -0
- package/src/apps/voice/public/page.js +718 -0
- package/src/apps/voice/src/index.ts +10 -0
- package/src/apps/voice/src/mcp.ts +70 -0
- package/src/apps/voice/src/providers/index.ts +85 -0
- package/src/apps/voice/src/providers/openai-compatible.ts +94 -0
- package/src/apps/voice/src/providers/types.ts +27 -0
- package/src/apps/voice/src/routes/config.ts +118 -0
- package/src/apps/voice/src/routes/transcribe.ts +90 -0
- package/src/apps/voice/src/services/config-store.ts +129 -0
- package/src/apps/voice/src/services/stats.ts +108 -0
- package/src/apps/voice/src/transcribe.ts +11 -0
- package/src/apps/voice/src/utils/mime.ts +16 -0
- package/src/apps/voice/tsconfig.json +8 -0
- package/src/apps/workflow/.turbo/turbo-build.log +5 -0
- package/src/apps/workflow/.turbo/turbo-lint.log +96 -0
- package/src/apps/workflow/.turbo/turbo-typecheck.log +5 -0
- package/src/apps/workflow/engine/executors/decision-executor.ts +87 -0
- package/src/apps/workflow/engine/executors/file-executor.ts +90 -0
- package/src/apps/workflow/engine/executors/git-executor.ts +137 -0
- package/src/apps/workflow/engine/executors/http-executor.ts +65 -0
- package/src/apps/workflow/engine/executors/index.ts +28 -0
- package/src/apps/workflow/engine/executors/kanban-executor.ts +154 -0
- package/src/apps/workflow/engine/executors/llm-executor.ts +46 -0
- package/src/apps/workflow/engine/executors/log-executor.ts +62 -0
- package/src/apps/workflow/engine/executors/loop-executor.ts +14 -0
- package/src/apps/workflow/engine/executors/shell-executor.ts +107 -0
- package/src/apps/workflow/engine/executors/sub-workflow-executor.ts +61 -0
- package/src/apps/workflow/engine/executors/test-executor.ts +73 -0
- package/src/apps/workflow/engine/executors/trigger-executor.ts +39 -0
- package/src/apps/workflow/engine/expression-evaluator.ts +117 -0
- package/src/apps/workflow/engine/graph-runner.ts +438 -0
- package/src/apps/workflow/engine/node-executor.ts +104 -0
- package/src/apps/workflow/engine/node-registry.ts +15 -0
- package/src/apps/workflow/engine/variable-resolver.ts +109 -0
- package/src/apps/workflow/mcp.ts +223 -0
- package/src/apps/workflow/node_modules/.bin/tsc +21 -0
- package/src/apps/workflow/node_modules/.bin/tsserver +21 -0
- package/src/apps/workflow/node_modules/.bin/tsx +21 -0
- package/src/apps/workflow/package.json +25 -0
- package/src/apps/workflow/public/editor/canvas.js +366 -0
- package/src/apps/workflow/public/editor/drag-manager.js +326 -0
- package/src/apps/workflow/public/editor/edge-renderer.js +235 -0
- package/src/apps/workflow/public/editor/history-manager.js +147 -0
- package/src/apps/workflow/public/editor/layout-engine.js +159 -0
- package/src/apps/workflow/public/editor/node-renderer.js +199 -0
- package/src/apps/workflow/public/editor/selection-manager.js +193 -0
- package/src/apps/workflow/public/favicon.svg +7 -0
- package/src/apps/workflow/public/models/node-types.js +300 -0
- package/src/apps/workflow/public/models/workflow-model.js +257 -0
- package/src/apps/workflow/public/page.css +406 -0
- package/src/apps/workflow/public/page.js +658 -0
- package/src/apps/workflow/public/panels/inspector.js +360 -0
- package/src/apps/workflow/public/panels/palette.js +106 -0
- package/src/apps/workflow/public/panels/run-view.js +275 -0
- package/src/apps/workflow/public/panels/toolbar.js +232 -0
- package/src/apps/workflow/public/panels/workflow-list.js +237 -0
- package/src/apps/workflow/public/state/store.js +47 -0
- package/src/apps/workflow/services/custom-node-loader.ts +48 -0
- package/src/apps/workflow/services/legacy-converter.ts +72 -0
- package/src/apps/workflow/services/run-manager.ts +190 -0
- package/src/apps/workflow/services/workflow-store.ts +424 -0
- package/src/apps/workflow/services/workflow-validator.test.ts +103 -0
- package/src/apps/workflow/services/workflow-validator.ts +98 -0
- package/src/apps/workflow/src/index.ts +10 -0
- package/src/apps/workflow/templates/ci-pipeline.json +18 -0
- package/src/apps/workflow/templates/code-review.json +22 -0
- package/src/apps/workflow/templates/kanban-testing.json +24 -0
- package/src/apps/workflow/tsconfig.json +8 -0
- package/src/apps/workflow/types.ts +268 -0
- package/src/packages/auth-middleware.ts +14 -0
- package/src/packages/design-tokens/.turbo/turbo-build.log +10 -0
- package/src/packages/design-tokens/STYLEGUIDE.md +414 -0
- package/src/packages/design-tokens/build.js +413 -0
- package/src/packages/design-tokens/demo/index.html +1367 -0
- package/src/packages/design-tokens/demo/proposition-a.html +717 -0
- package/src/packages/design-tokens/demo/proposition-b.html +1239 -0
- package/src/packages/design-tokens/demo/proposition-c.html +1049 -0
- package/src/packages/design-tokens/dist/tailwind-preset.js +115 -0
- package/src/packages/design-tokens/dist/tokens.css +345 -0
- package/src/packages/design-tokens/dist/tokens.d.ts +229 -0
- package/src/packages/design-tokens/dist/tokens.js +386 -0
- package/src/packages/design-tokens/package.json +25 -0
- package/src/packages/design-tokens/tokens.json +228 -0
- package/src/packages/devtools-middleware.ts +22 -0
- package/src/packages/eslint-config/index.js +63 -0
- package/src/packages/eslint-config/node_modules/.bin/eslint +21 -0
- package/src/packages/eslint-config/package.json +18 -0
- package/src/packages/json-file-store.ts +232 -0
- package/src/packages/mcp-utils/.turbo/turbo-build.log +5 -0
- package/src/packages/mcp-utils/dist/index.d.ts +33 -0
- package/src/packages/mcp-utils/dist/index.d.ts.map +1 -0
- package/src/packages/mcp-utils/dist/index.js +126 -0
- package/src/packages/mcp-utils/dist/index.js.map +1 -0
- package/src/packages/mcp-utils/node_modules/.bin/tsc +21 -0
- package/src/packages/mcp-utils/node_modules/.bin/tsserver +21 -0
- package/src/packages/mcp-utils/package.json +32 -0
- package/src/packages/mcp-utils/src/index.ts +171 -0
- package/src/packages/mcp-utils/tsconfig.json +9 -0
- package/src/packages/paths.ts +18 -0
- package/src/packages/project-context/index.js +55 -0
- package/src/packages/project-context/package.json +13 -0
- package/src/packages/project-store.ts +127 -0
- package/src/packages/server-sniffer.ts +132 -0
- package/src/packages/shared-assets/favicon.svg +7 -0
- package/src/packages/shared-assets/keymap-registry.js +512 -0
- package/src/packages/shared-assets/logo.svg +6 -0
- package/src/packages/shared-assets/package.json +11 -0
- package/src/packages/shared-assets/ui-utils.js +48 -0
- package/src/packages/shared-assets/voice-widget.d.ts +37 -0
- package/src/packages/shared-assets/voice-widget.js +695 -0
- package/src/packages/shared-types/.turbo/turbo-build.log +5 -0
- package/src/packages/shared-types/dist/index.d.ts +39 -0
- package/src/packages/shared-types/dist/index.d.ts.map +1 -0
- package/src/packages/shared-types/node_modules/.bin/tsc +21 -0
- package/src/packages/shared-types/node_modules/.bin/tsserver +21 -0
- package/src/packages/shared-types/package.json +25 -0
- package/src/packages/shared-types/src/index.ts +41 -0
- package/src/packages/shared-types/tsconfig.json +11 -0
- package/src/packages/tsconfig/base.json +15 -0
- package/src/packages/tsconfig/next.json +14 -0
- package/src/packages/tsconfig/node.json +11 -0
- package/src/packages/tsconfig/package.json +10 -0
- package/turbo.json +25 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import type { VocabularyEntry, VocabularyEntrySummary } from '../types.js';
|
|
3
|
+
import { getActiveProject } from '../../../project-context.js';
|
|
4
|
+
import { VOCABULARY_DIR } from '../../../packages/paths.js';
|
|
5
|
+
import { JsonFileStore } from '../../../packages/json-file-store.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Per-project and global vocabulary storage.
|
|
9
|
+
* One JSON file per entry for git-friendly diffs.
|
|
10
|
+
* Storage: ~/.devglide/vocabulary/{projectId}/ and ~/.devglide/vocabulary/
|
|
11
|
+
*/
|
|
12
|
+
export class VocabularyStore extends JsonFileStore<VocabularyEntry> {
|
|
13
|
+
private static instance: VocabularyStore;
|
|
14
|
+
protected readonly baseDir = VOCABULARY_DIR;
|
|
15
|
+
|
|
16
|
+
static getInstance(): VocabularyStore {
|
|
17
|
+
if (!VocabularyStore.instance) {
|
|
18
|
+
VocabularyStore.instance = new VocabularyStore();
|
|
19
|
+
}
|
|
20
|
+
return VocabularyStore.instance;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async list(filter?: { category?: string; tag?: string }): Promise<VocabularyEntrySummary[]> {
|
|
24
|
+
const seen = new Map<string, VocabularyEntrySummary>();
|
|
25
|
+
|
|
26
|
+
const projectDir = this.getProjectDir();
|
|
27
|
+
if (projectDir) {
|
|
28
|
+
// Active project set — scan project dir (priority) then global
|
|
29
|
+
for (const s of await this.scanDir(projectDir, 'project')) {
|
|
30
|
+
seen.set(s.id, s);
|
|
31
|
+
}
|
|
32
|
+
for (const s of await this.scanDir(this.getGlobalDir(), 'global')) {
|
|
33
|
+
if (!seen.has(s.id)) seen.set(s.id, s);
|
|
34
|
+
}
|
|
35
|
+
} else {
|
|
36
|
+
// No active project (e.g. stdio MCP mode) — scan all dirs
|
|
37
|
+
for (const entry of await this.scanAllDirs()) {
|
|
38
|
+
if (!seen.has(entry.id)) {
|
|
39
|
+
seen.set(entry.id, this.toSummary(entry, 'project'));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let results = [...seen.values()];
|
|
45
|
+
|
|
46
|
+
if (filter?.category) {
|
|
47
|
+
results = results.filter((e) => e.category === filter.category);
|
|
48
|
+
}
|
|
49
|
+
if (filter?.tag) {
|
|
50
|
+
results = results.filter((e) => e.tags.includes(filter.tag!));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async lookup(term: string): Promise<VocabularyEntry | null> {
|
|
57
|
+
const all = await this.listFull();
|
|
58
|
+
const normalized = term.toLowerCase();
|
|
59
|
+
|
|
60
|
+
for (const entry of all) {
|
|
61
|
+
if (entry.term.toLowerCase() === normalized) return entry;
|
|
62
|
+
if (entry.aliases?.some((a) => a.toLowerCase() === normalized)) return entry;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async save(
|
|
69
|
+
input: Omit<VocabularyEntry, 'id' | 'createdAt' | 'updatedAt'> & { id?: string; scope?: 'project' | 'global' },
|
|
70
|
+
): Promise<VocabularyEntry> {
|
|
71
|
+
const lockKey = input.id ?? this.generateId();
|
|
72
|
+
return this.withLock(lockKey, async () => {
|
|
73
|
+
const now = new Date().toISOString();
|
|
74
|
+
const isUpdate = !!input.id;
|
|
75
|
+
|
|
76
|
+
let existing: VocabularyEntry | null = null;
|
|
77
|
+
if (isUpdate) {
|
|
78
|
+
existing = await this.get(input.id!);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const entry: VocabularyEntry = {
|
|
82
|
+
id: input.id ?? lockKey,
|
|
83
|
+
term: input.term,
|
|
84
|
+
definition: input.definition,
|
|
85
|
+
aliases: input.aliases,
|
|
86
|
+
category: input.category,
|
|
87
|
+
tags: input.tags ?? [],
|
|
88
|
+
projectId: input.projectId,
|
|
89
|
+
createdAt: existing?.createdAt ?? now,
|
|
90
|
+
updatedAt: now,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
let scope = input.scope;
|
|
94
|
+
if (!scope && isUpdate) {
|
|
95
|
+
scope = await this.resolveExistingScope(input.id!);
|
|
96
|
+
}
|
|
97
|
+
scope = scope ?? (getActiveProject() ? 'project' : 'global');
|
|
98
|
+
|
|
99
|
+
await this.writeEntity(entry, scope, getActiveProject()?.id);
|
|
100
|
+
return entry;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async getCompiledContext(projectId?: string): Promise<string> {
|
|
105
|
+
const all = await this.listFull();
|
|
106
|
+
|
|
107
|
+
const filtered = all.filter((e) => {
|
|
108
|
+
if (projectId && e.projectId && e.projectId !== projectId) return false;
|
|
109
|
+
return true;
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
if (filtered.length === 0) return '';
|
|
113
|
+
|
|
114
|
+
const lines: string[] = [
|
|
115
|
+
'# Domain Vocabulary',
|
|
116
|
+
'',
|
|
117
|
+
'> Use the following domain-specific terms when interpreting user requests.',
|
|
118
|
+
'',
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
const byCategory = new Map<string, VocabularyEntry[]>();
|
|
122
|
+
for (const entry of filtered) {
|
|
123
|
+
const cat = entry.category ?? 'General';
|
|
124
|
+
if (!byCategory.has(cat)) byCategory.set(cat, []);
|
|
125
|
+
byCategory.get(cat)!.push(entry);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
for (const [category, entries] of byCategory) {
|
|
129
|
+
lines.push(`## ${category}`, '');
|
|
130
|
+
for (const entry of entries) {
|
|
131
|
+
const aliases = entry.aliases?.length ? ` (also: ${entry.aliases.join(', ')})` : '';
|
|
132
|
+
lines.push(`- **${entry.term}**${aliases}: ${entry.definition}`);
|
|
133
|
+
}
|
|
134
|
+
lines.push('');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return lines.join('\n');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private async listFull(): Promise<VocabularyEntry[]> {
|
|
141
|
+
const seen = new Map<string, VocabularyEntry>();
|
|
142
|
+
|
|
143
|
+
const projectDir = this.getProjectDir();
|
|
144
|
+
if (projectDir) {
|
|
145
|
+
// Active project set — scan project dir (priority) then global
|
|
146
|
+
for (const e of await this.scanDirFull(projectDir)) {
|
|
147
|
+
seen.set(e.id, e);
|
|
148
|
+
}
|
|
149
|
+
for (const e of await this.scanDirFull(this.getGlobalDir())) {
|
|
150
|
+
if (!seen.has(e.id)) seen.set(e.id, e);
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
// No active project (e.g. stdio MCP mode) — scan all dirs
|
|
154
|
+
for (const e of await this.scanAllDirs()) {
|
|
155
|
+
if (!seen.has(e.id)) seen.set(e.id, e);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return [...seen.values()];
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
private toSummary(entry: VocabularyEntry, scope: 'project' | 'global'): VocabularyEntrySummary {
|
|
163
|
+
return {
|
|
164
|
+
id: entry.id,
|
|
165
|
+
term: entry.term,
|
|
166
|
+
definition: entry.definition,
|
|
167
|
+
aliases: entry.aliases,
|
|
168
|
+
category: entry.category,
|
|
169
|
+
tags: entry.tags,
|
|
170
|
+
scope,
|
|
171
|
+
updatedAt: entry.updatedAt,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private async scanDir(dir: string, scope: 'project' | 'global'): Promise<VocabularyEntrySummary[]> {
|
|
176
|
+
const entries = await this.scanDirFull(dir);
|
|
177
|
+
return entries.map((e) => this.toSummary(e, scope));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createVocabularyMcpServer } from "../mcp.js";
|
|
3
|
+
import { runStdio } from "@devglide/mcp-utils";
|
|
4
|
+
|
|
5
|
+
// ── Stdio MCP mode ──────────────────────────────────────────────────────────
|
|
6
|
+
if (process.argv.includes("--stdio")) {
|
|
7
|
+
const server = createVocabularyMcpServer();
|
|
8
|
+
await runStdio(server);
|
|
9
|
+
console.error("Devglide Vocabulary MCP server running on stdio");
|
|
10
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface VocabularyEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
term: string;
|
|
4
|
+
definition: string;
|
|
5
|
+
aliases?: string[];
|
|
6
|
+
category?: string;
|
|
7
|
+
tags: string[];
|
|
8
|
+
projectId?: string;
|
|
9
|
+
createdAt: string;
|
|
10
|
+
updatedAt: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface VocabularyEntrySummary {
|
|
14
|
+
id: string;
|
|
15
|
+
term: string;
|
|
16
|
+
definition: string;
|
|
17
|
+
aliases?: string[];
|
|
18
|
+
category?: string;
|
|
19
|
+
tags: string[];
|
|
20
|
+
scope: 'project' | 'global';
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
WARN Issue while reading "/home/runner/_work/devglide/devglide/.npmrc". Failed to replace env in config: ${NODE_AUTH_TOKEN}
|
|
2
|
+
|
|
3
|
+
> @devglide/voice@0.1.0 lint /home/runner/_work/devglide/devglide/src/apps/voice
|
|
4
|
+
> eslint .
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/index.ts
|
|
8
|
+
2:1 warning There should be at least one empty line between import groups import/order
|
|
9
|
+
3:1 warning `@devglide/mcp-utils` import should occur before import of `./mcp.js` import/order
|
|
10
|
+
|
|
11
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/mcp.ts
|
|
12
|
+
1:1 warning There should be at least one empty line between import groups import/order
|
|
13
|
+
2:1 warning There should be at least one empty line between import groups import/order
|
|
14
|
+
4:1 warning `./services/stats.js` import should occur before import of `./transcribe.js` import/order
|
|
15
|
+
6:1 warning `./services/config-store.js` import should occur before import of `./transcribe.js` import/order
|
|
16
|
+
|
|
17
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/providers/index.ts
|
|
18
|
+
2:1 warning There should be at least one empty line between import groups import/order
|
|
19
|
+
2:1 warning `./openai-compatible.js` import should occur before type import of `./types.js` import/order
|
|
20
|
+
3:1 warning `../services/config-store.js` import should occur before type import of `./types.js` import/order
|
|
21
|
+
|
|
22
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/providers/openai-compatible.ts
|
|
23
|
+
9:14 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any
|
|
24
|
+
10:38 warning Unexpected any. Specify a different type @typescript-eslint/no-explicit-any
|
|
25
|
+
|
|
26
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/routes/config.ts
|
|
27
|
+
1:1 warning There should be at least one empty line between import groups import/order
|
|
28
|
+
9:1 warning There should be at least one empty line between import groups import/order
|
|
29
|
+
|
|
30
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/routes/transcribe.ts
|
|
31
|
+
1:1 warning There should be at least one empty line between import groups import/order
|
|
32
|
+
|
|
33
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/services/config-store.ts
|
|
34
|
+
2:1 warning There should be at least one empty line between import groups import/order
|
|
35
|
+
|
|
36
|
+
/home/runner/_work/devglide/devglide/src/apps/voice/src/services/stats.ts
|
|
37
|
+
1:1 warning There should be at least one empty line between import groups import/order
|
|
38
|
+
1:1 warning `../providers/index.js` import should occur after import of `../../../../packages/paths.js` import/order
|
|
39
|
+
3:1 warning There should be at least one empty line between import groups import/order
|
|
40
|
+
|
|
41
|
+
✖ 18 problems (0 errors, 18 warnings)
|
|
42
|
+
0 errors and 16 warnings potentially fixable with the `--fix` option.
|
|
43
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/openai@4.104.0_ws@8.19.0_zod@3.25.76/node_modules/openai/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/openai@4.104.0_ws@8.19.0_zod@3.25.76/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/openai@4.104.0_ws@8.19.0_zod@3.25.76/node_modules/openai/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/openai@4.104.0_ws@8.19.0_zod@3.25.76/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../openai/bin/cli" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../openai/bin/cli" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../typescript/bin/tsc" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/typescript@5.9.3/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../typescript/bin/tsserver" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/home/runner/_work/devglide/devglide/node_modules/.pnpm/tsx@4.21.0/node_modules/tsx/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/tsx@4.21.0/node_modules:/home/runner/_work/devglide/devglide/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../tsx/dist/cli.mjs" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../tsx/dist/cli.mjs" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@devglide/voice",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Speech-to-text with config dashboard",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"devglide-voice": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "tsx watch src/index.ts",
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"clean": "rm -rf dist",
|
|
15
|
+
"mcp": "tsx src/index.ts --stdio",
|
|
16
|
+
"mcp:http": "tsx src/index.ts",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"lint": "eslint ."
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@devglide/mcp-utils": "workspace:*",
|
|
22
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
23
|
+
"cors": "^2.8.5",
|
|
24
|
+
"express": "^5.2.1",
|
|
25
|
+
"openai": "^4.80.0",
|
|
26
|
+
"zod": "^3.25.49"
|
|
27
|
+
},
|
|
28
|
+
"private": true,
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/cors": "^2.8.17",
|
|
31
|
+
"@types/express": "^5.0.0",
|
|
32
|
+
"tsx": "^4.19.4",
|
|
33
|
+
"typescript": "^5.8.0"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
2
|
+
<rect width="32" height="32" fill="#1c2128"/>
|
|
3
|
+
<rect width="32" height="32" fill="none" stroke="#7ee787" stroke-width="1.5"/>
|
|
4
|
+
<path d="M8 10h6a6 6 0 0 1 0 12H8V10z" fill="#7ee787"/>
|
|
5
|
+
<rect x="18" y="10" width="6" height="4" fill="#7ee787" opacity="0.6"/>
|
|
6
|
+
<rect x="18" y="18" width="6" height="4" fill="#7ee787" opacity="0.6"/>
|
|
7
|
+
</svg>
|