@medicine-wheel/app 0.2.3
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/Dockerfile +69 -0
- package/LICENSE +205 -0
- package/README.md +201 -0
- package/app/accountability/page.tsx +95 -0
- package/app/api/ceremonies/route.ts +52 -0
- package/app/api/directions/route.ts +6 -0
- package/app/api/edges/route.ts +27 -0
- package/app/api/health/route.ts +37 -0
- package/app/api/narrative/beats/route.ts +29 -0
- package/app/api/narrative/cycles/route.ts +23 -0
- package/app/api/nodes/route.ts +52 -0
- package/app/api/resources/route.ts +48 -0
- package/app/ceremonies/page.tsx +161 -0
- package/app/globals.css +68 -0
- package/app/graph/page.tsx +200 -0
- package/app/layout.tsx +24 -0
- package/app/narrative/beats/page.tsx +145 -0
- package/app/narrative/cycles/page.tsx +143 -0
- package/app/narrative/page.tsx +113 -0
- package/app/nodes/page.tsx +199 -0
- package/app/page.tsx +148 -0
- package/app/relations/page.tsx +191 -0
- package/components/direction-panel.tsx +96 -0
- package/components/navigation.tsx +105 -0
- package/components/theme-provider.tsx +11 -0
- package/components/workspaces-panel.tsx +110 -0
- package/dist/cli/mw.js +731 -0
- package/dist/cli/mwsrv.js +267 -0
- package/docker-build-push.sh +15 -0
- package/docker-entrypoint.sh +26 -0
- package/lib/jsonl-store.ts +586 -0
- package/lib/store.ts +226 -0
- package/lib/types.ts +23 -0
- package/lib/utils.ts +6 -0
- package/next-env.d.ts +6 -0
- package/next.config.mjs +5 -0
- package/package.json +112 -0
- package/postcss.config.mjs +6 -0
- package/public/fonts/Stereohead.otf +0 -0
- package/tsconfig.json +21 -0
package/lib/store.ts
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Medicine Wheel — Web UI Data Store
|
|
3
|
+
*
|
|
4
|
+
* Provider-agnostic data layer that supports multiple backends:
|
|
5
|
+
* - JSONL (default for local development)
|
|
6
|
+
* - Neon/Postgres (production on Vercel)
|
|
7
|
+
* - Redis/Upstash (coming soon)
|
|
8
|
+
*
|
|
9
|
+
* Backend selection via MW_STORAGE_PROVIDER env var:
|
|
10
|
+
* - 'neon' or 'postgres' → NeonProvider (requires DATABASE_URL)
|
|
11
|
+
* - 'jsonl' or unset → JsonlProvider (file-based)
|
|
12
|
+
*
|
|
13
|
+
* @see lib/jsonl-store.ts — the JSONL persistence engine (fallback)
|
|
14
|
+
* @see src/storage-provider — the provider abstraction layer
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
RelationalNode,
|
|
19
|
+
RelationalEdge,
|
|
20
|
+
CeremonyLog,
|
|
21
|
+
NarrativeBeat,
|
|
22
|
+
MedicineWheelCycle,
|
|
23
|
+
} from '@/lib/types';
|
|
24
|
+
|
|
25
|
+
import { getJsonlStore } from './jsonl-store';
|
|
26
|
+
|
|
27
|
+
// JSONL store for sync operations (used by seeding and legacy code paths)
|
|
28
|
+
// For async provider access (Neon), use API routes or import from @medicine-wheel/storage-provider directly
|
|
29
|
+
const store = getJsonlStore();
|
|
30
|
+
|
|
31
|
+
// ── Nodes ──
|
|
32
|
+
|
|
33
|
+
export function getAllNodes(): RelationalNode[] {
|
|
34
|
+
return store.getAllNodes() as unknown as RelationalNode[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function getNodesByType(type: string): RelationalNode[] {
|
|
38
|
+
return store.getNodesByType(type) as unknown as RelationalNode[];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function getNodesByDirection(direction: string): RelationalNode[] {
|
|
42
|
+
return store.getNodesByDirection(direction) as unknown as RelationalNode[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function getNode(id: string): RelationalNode | null {
|
|
46
|
+
return (store.getNode(id) as unknown as RelationalNode) ?? null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function createNode(data: Omit<RelationalNode, 'id' | 'created_at' | 'updated_at' | 'metadata'> & { id?: string; metadata?: Record<string, unknown> }): RelationalNode {
|
|
50
|
+
const id = data.id || crypto.randomUUID();
|
|
51
|
+
const now = new Date().toISOString();
|
|
52
|
+
const node: RelationalNode = {
|
|
53
|
+
id,
|
|
54
|
+
name: data.name,
|
|
55
|
+
type: data.type,
|
|
56
|
+
direction: data.direction,
|
|
57
|
+
metadata: data.metadata ?? {},
|
|
58
|
+
created_at: now,
|
|
59
|
+
updated_at: now,
|
|
60
|
+
};
|
|
61
|
+
store.createNode(node as any);
|
|
62
|
+
return node;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── Edges ──
|
|
66
|
+
|
|
67
|
+
export function getAllEdges(): RelationalEdge[] {
|
|
68
|
+
return store.edges.getAll() as unknown as RelationalEdge[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function getEdgesByNode(nodeId: string): RelationalEdge[] {
|
|
72
|
+
return store.getEdgesForNode(nodeId) as unknown as RelationalEdge[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function createEdge(data: Omit<RelationalEdge, 'id' | 'created_at'> & { id?: string }): RelationalEdge {
|
|
76
|
+
const id = data.id || `${data.from_id}:${data.to_id}`;
|
|
77
|
+
const now = new Date().toISOString();
|
|
78
|
+
const edge: RelationalEdge = {
|
|
79
|
+
id,
|
|
80
|
+
from_id: data.from_id,
|
|
81
|
+
to_id: data.to_id,
|
|
82
|
+
relationship_type: data.relationship_type,
|
|
83
|
+
strength: data.strength ?? 0.5,
|
|
84
|
+
ceremony_honored: data.ceremony_honored ?? false,
|
|
85
|
+
obligations: data.obligations ?? [],
|
|
86
|
+
created_at: now,
|
|
87
|
+
};
|
|
88
|
+
store.createEdge(edge as any);
|
|
89
|
+
return edge;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// ── Ceremonies ──
|
|
93
|
+
|
|
94
|
+
export function getAllCeremonies(): CeremonyLog[] {
|
|
95
|
+
return store.getAllCeremonies() as unknown as CeremonyLog[];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function getCeremoniesByDirection(direction: string): CeremonyLog[] {
|
|
99
|
+
return store.getCeremoniesByDirection(direction) as unknown as CeremonyLog[];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function getCeremoniesByType(type: string): CeremonyLog[] {
|
|
103
|
+
return store.getCeremoniesByType(type) as unknown as CeremonyLog[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function createCeremony(data: Omit<CeremonyLog, 'id' | 'timestamp'> & { id?: string; timestamp?: string }): CeremonyLog {
|
|
107
|
+
const id = data.id || crypto.randomUUID();
|
|
108
|
+
const ceremony: CeremonyLog = {
|
|
109
|
+
id,
|
|
110
|
+
type: data.type,
|
|
111
|
+
direction: data.direction,
|
|
112
|
+
participants: data.participants ?? [],
|
|
113
|
+
medicines_used: data.medicines_used ?? [],
|
|
114
|
+
intentions: data.intentions ?? [],
|
|
115
|
+
timestamp: data.timestamp || new Date().toISOString(),
|
|
116
|
+
research_context: data.research_context,
|
|
117
|
+
};
|
|
118
|
+
store.logCeremony(ceremony as any);
|
|
119
|
+
return ceremony;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ── Narrative Beats ──
|
|
123
|
+
|
|
124
|
+
export function getAllBeats(): NarrativeBeat[] {
|
|
125
|
+
return store.getAllBeats() as unknown as NarrativeBeat[];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function getBeatsByDirection(direction: string): NarrativeBeat[] {
|
|
129
|
+
return store.getBeatsByDirection(direction) as unknown as NarrativeBeat[];
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function createBeat(data: Omit<NarrativeBeat, 'id' | 'timestamp'> & { id?: string; timestamp?: string }): NarrativeBeat {
|
|
133
|
+
const id = data.id || crypto.randomUUID();
|
|
134
|
+
const beat: NarrativeBeat = {
|
|
135
|
+
id,
|
|
136
|
+
direction: data.direction,
|
|
137
|
+
title: data.title,
|
|
138
|
+
description: data.description,
|
|
139
|
+
prose: data.prose,
|
|
140
|
+
ceremonies: data.ceremonies ?? [],
|
|
141
|
+
learnings: data.learnings ?? [],
|
|
142
|
+
timestamp: data.timestamp || new Date().toISOString(),
|
|
143
|
+
act: data.act ?? 1,
|
|
144
|
+
relations_honored: data.relations_honored ?? [],
|
|
145
|
+
};
|
|
146
|
+
store.createBeat(beat as any);
|
|
147
|
+
return beat;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ── Cycles ──
|
|
151
|
+
|
|
152
|
+
export function getAllCycles(): MedicineWheelCycle[] {
|
|
153
|
+
const { active, archived } = store.getAllCycles();
|
|
154
|
+
return [...active, ...archived] as unknown as MedicineWheelCycle[];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function createCycle(data: { research_question: string; current_direction?: string }): MedicineWheelCycle {
|
|
158
|
+
const id = `cycle-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
159
|
+
const cycle: MedicineWheelCycle = {
|
|
160
|
+
id,
|
|
161
|
+
research_question: data.research_question,
|
|
162
|
+
start_date: new Date().toISOString(),
|
|
163
|
+
current_direction: (data.current_direction as any) || 'east',
|
|
164
|
+
beats: [],
|
|
165
|
+
ceremonies_conducted: 0,
|
|
166
|
+
relations_mapped: 0,
|
|
167
|
+
wilson_alignment: 0,
|
|
168
|
+
ocap_compliant: false,
|
|
169
|
+
};
|
|
170
|
+
store.createCycle(cycle as any);
|
|
171
|
+
return cycle;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ── Seed Data ──
|
|
175
|
+
|
|
176
|
+
export function seedDemoData() {
|
|
177
|
+
if (store.nodes.size() > 0) return; // Already seeded
|
|
178
|
+
|
|
179
|
+
// Create some demo nodes
|
|
180
|
+
createNode({ name: 'Elder Sarah', type: 'human', direction: 'north' });
|
|
181
|
+
createNode({ name: 'Youth Circle', type: 'human', direction: 'south' });
|
|
182
|
+
createNode({ name: 'Turtle Island', type: 'land', direction: 'east' });
|
|
183
|
+
createNode({ name: 'Sacred River', type: 'land', direction: 'west' });
|
|
184
|
+
createNode({ name: 'Ancestor Teachings', type: 'ancestor', direction: 'north' });
|
|
185
|
+
createNode({ name: 'Dream Vision', type: 'spirit', direction: 'east' });
|
|
186
|
+
createNode({ name: 'Seven Generations', type: 'future', direction: 'south' });
|
|
187
|
+
createNode({ name: 'Oral Traditions', type: 'knowledge', direction: 'west' });
|
|
188
|
+
|
|
189
|
+
const allN = getAllNodes();
|
|
190
|
+
// Create edges between nodes
|
|
191
|
+
if (allN.length >= 4) {
|
|
192
|
+
createEdge({ from_id: allN[0].id, to_id: allN[1].id, relationship_type: 'mentorship', strength: 0.9, ceremony_honored: true, obligations: ['teaching', 'guidance'] });
|
|
193
|
+
createEdge({ from_id: allN[0].id, to_id: allN[4].id, relationship_type: 'carries_teachings', strength: 0.8, ceremony_honored: true, obligations: ['remembering'] });
|
|
194
|
+
createEdge({ from_id: allN[2].id, to_id: allN[3].id, relationship_type: 'stewardship', strength: 0.7, ceremony_honored: false, obligations: ['land care'] });
|
|
195
|
+
createEdge({ from_id: allN[1].id, to_id: allN[6].id, relationship_type: 'responsibility', strength: 0.6, ceremony_honored: false, obligations: ['future planning'] });
|
|
196
|
+
createEdge({ from_id: allN[5].id, to_id: allN[7].id, relationship_type: 'inspiration', strength: 0.8, ceremony_honored: true, obligations: ['listening'] });
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Create a demo ceremony
|
|
200
|
+
createCeremony({
|
|
201
|
+
type: 'smudging',
|
|
202
|
+
direction: 'east',
|
|
203
|
+
participants: ['Elder Sarah', 'Youth Circle'],
|
|
204
|
+
medicines_used: ['sage', 'tobacco'],
|
|
205
|
+
intentions: ['Opening the research journey with gratitude'],
|
|
206
|
+
research_context: 'Beginning relational inquiry',
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Create a demo beat
|
|
210
|
+
createBeat({
|
|
211
|
+
direction: 'east',
|
|
212
|
+
title: 'Vision Quest Beginning',
|
|
213
|
+
description: 'Initial visioning for the research journey',
|
|
214
|
+
prose: 'We begin in the East, where the sun rises...',
|
|
215
|
+
ceremonies: [],
|
|
216
|
+
learnings: ['Relational accountability starts with listening'],
|
|
217
|
+
act: 1,
|
|
218
|
+
relations_honored: [],
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// Create a demo cycle
|
|
222
|
+
createCycle({ research_question: 'How do we honor relational accountability in software development?' });
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Auto-seed on import
|
|
226
|
+
seedDemoData();
|
package/lib/types.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Medicine Wheel — Type Definitions
|
|
3
|
+
* Re-exported from @medicine-wheel/ontology-core.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type {
|
|
7
|
+
DirectionName,
|
|
8
|
+
NodeType,
|
|
9
|
+
CeremonyType,
|
|
10
|
+
RelationalNode,
|
|
11
|
+
RelationalEdge,
|
|
12
|
+
CeremonyLog,
|
|
13
|
+
NarrativeBeat,
|
|
14
|
+
MedicineWheelCycle,
|
|
15
|
+
Direction,
|
|
16
|
+
} from '@medicine-wheel/ontology-core';
|
|
17
|
+
|
|
18
|
+
export {
|
|
19
|
+
DIRECTIONS,
|
|
20
|
+
DIRECTION_COLORS,
|
|
21
|
+
NODE_TYPE_COLORS,
|
|
22
|
+
CEREMONY_ICONS,
|
|
23
|
+
} from '@medicine-wheel/ontology-core';
|
package/lib/utils.ts
ADDED
package/next-env.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/// <reference types="next" />
|
|
2
|
+
/// <reference types="next/image-types/global" />
|
|
3
|
+
/// <reference path="./.next/types/routes.d.ts" />
|
|
4
|
+
|
|
5
|
+
// NOTE: This file should not be edited
|
|
6
|
+
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
package/next.config.mjs
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@medicine-wheel/app",
|
|
3
|
+
"version": "0.2.3",
|
|
4
|
+
"description": "Medicine Wheel — Interactive visual layer for Indigenous relational research with Four Directions, ceremonies, and narrative arcs",
|
|
5
|
+
"bin": {
|
|
6
|
+
"mw": "dist/cli/mw.js",
|
|
7
|
+
"mwsrv": "dist/cli/mwsrv.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"app/**/*",
|
|
11
|
+
"components/**/*",
|
|
12
|
+
"hooks/**/*",
|
|
13
|
+
"lib/**/*",
|
|
14
|
+
"public/**/*",
|
|
15
|
+
"dist/cli/**/*",
|
|
16
|
+
"next.config.mjs",
|
|
17
|
+
"next-env.d.ts",
|
|
18
|
+
"postcss.config.mjs",
|
|
19
|
+
"tsconfig.json",
|
|
20
|
+
"Dockerfile",
|
|
21
|
+
"docker-entrypoint.sh",
|
|
22
|
+
"docker-build-push.sh",
|
|
23
|
+
"README.md"
|
|
24
|
+
],
|
|
25
|
+
"workspaces": [
|
|
26
|
+
"src/ceremony-protocol",
|
|
27
|
+
"src/community-review",
|
|
28
|
+
"src/consent-lifecycle",
|
|
29
|
+
"src/data-store",
|
|
30
|
+
"src/data-store-postgres",
|
|
31
|
+
"src/fire-keeper",
|
|
32
|
+
"src/graph-viz",
|
|
33
|
+
"src/importance-unit",
|
|
34
|
+
"src/narrative-engine",
|
|
35
|
+
"src/ontology-core",
|
|
36
|
+
"src/prompt-decomposition",
|
|
37
|
+
"src/relational-index",
|
|
38
|
+
"src/relational-query",
|
|
39
|
+
"src/session-reader",
|
|
40
|
+
"src/storage-provider",
|
|
41
|
+
"src/transformation-tracker",
|
|
42
|
+
"src/ui-components",
|
|
43
|
+
"mcp"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build:packages": "npm run build -w src/ontology-core && npm run build --workspaces --if-present",
|
|
47
|
+
"build:cli": "tsc -p tsconfig.cli.json && chmod +x dist/cli/mw.js dist/cli/mwsrv.js",
|
|
48
|
+
"clean:packages": "npm run clean --workspaces --if-present",
|
|
49
|
+
"prebuild": "npm run build:packages",
|
|
50
|
+
"predev": "npm run build:packages",
|
|
51
|
+
"dev": "next dev -p 3940",
|
|
52
|
+
"build": "next build",
|
|
53
|
+
"start": "next start -p 3940",
|
|
54
|
+
"lint": "next lint",
|
|
55
|
+
"version:patch": "node scripts/bump-versions.mjs patch && node scripts/sync-versions.mjs && shx rm -rf node_modules src/*/node_modules package-lock.json && npm install --legacy-peer-deps",
|
|
56
|
+
"version:minor": "node scripts/bump-versions.mjs minor && node scripts/sync-versions.mjs && shx rm -rf node_modules src/*/node_modules package-lock.json && npm install --legacy-peer-deps",
|
|
57
|
+
"version:major": "node scripts/bump-versions.mjs major && node scripts/sync-versions.mjs && shx rm -rf node_modules src/*/node_modules package-lock.json && npm install --legacy-peer-deps",
|
|
58
|
+
"version:set": "npm version -ws && node scripts/sync-versions.mjs",
|
|
59
|
+
"sync:versions": "node scripts/sync-versions.mjs",
|
|
60
|
+
"prepublishOnly": "npm run clean:packages && npm run build:packages && npm run build:cli",
|
|
61
|
+
"publish:packages": "npm run prepublishOnly && node scripts/publish-workspaces.mjs",
|
|
62
|
+
"publish:root": "npm publish --access public",
|
|
63
|
+
"publish:all": "npm run prepublishOnly && node scripts/publish-workspaces.mjs && npm publish --access public --ignore-scripts",
|
|
64
|
+
"publish:dry": "npm run prepublishOnly && node scripts/publish-workspaces.mjs --dry-run && npm publish --access public --dry-run --ignore-scripts",
|
|
65
|
+
"docker:build": "docker build -t jgwill/medicine-wheel:app .",
|
|
66
|
+
"docker:push": "docker push jgwill/medicine-wheel:app",
|
|
67
|
+
"docker:build-push": "npm run docker:build && npm run docker:push",
|
|
68
|
+
"release:commit": "node scripts/release-commit.mjs",
|
|
69
|
+
"release:patch": "npm run version:patch && npm run publish:all && npm run release:commit",
|
|
70
|
+
"release:minor": "npm run version:minor && npm run publish:all && npm run release:commit",
|
|
71
|
+
"release:major": "npm run version:major && npm run publish:all && npm run release:commit"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"next": "^15.3.0",
|
|
75
|
+
"react": "^19.0.0",
|
|
76
|
+
"react-dom": "^19.0.0",
|
|
77
|
+
"next-themes": "^0.4.6",
|
|
78
|
+
"sonner": "^1.7.0",
|
|
79
|
+
"lucide-react": "^0.475.0",
|
|
80
|
+
"clsx": "^2.1.1",
|
|
81
|
+
"tailwind-merge": "^3.0.2",
|
|
82
|
+
"recharts": "^2.15.4",
|
|
83
|
+
"@medicine-wheel/ontology-core": "^0.2.3",
|
|
84
|
+
"@medicine-wheel/ceremony-protocol": "^0.2.3",
|
|
85
|
+
"@medicine-wheel/narrative-engine": "^0.2.3",
|
|
86
|
+
"@medicine-wheel/graph-viz": "^0.2.3",
|
|
87
|
+
"@medicine-wheel/relational-query": "^0.2.3",
|
|
88
|
+
"@medicine-wheel/prompt-decomposition": "^0.2.3",
|
|
89
|
+
"@medicine-wheel/ui-components": "^0.2.3",
|
|
90
|
+
"@medicine-wheel/data-store": "^0.2.3",
|
|
91
|
+
"@medicine-wheel/session-reader": "^0.2.3",
|
|
92
|
+
"@medicine-wheel/fire-keeper": "^0.2.3",
|
|
93
|
+
"@medicine-wheel/importance-unit": "^0.2.3",
|
|
94
|
+
"@medicine-wheel/relational-index": "^0.2.3",
|
|
95
|
+
"@medicine-wheel/transformation-tracker": "^0.2.3",
|
|
96
|
+
"@medicine-wheel/storage-provider": "^0.2.3",
|
|
97
|
+
"@medicine-wheel/community-review": "^0.2.3",
|
|
98
|
+
"@medicine-wheel/consent-lifecycle": "^0.2.3",
|
|
99
|
+
"@medicine-wheel/data-store-postgres": "^0.2.3",
|
|
100
|
+
"@medicine-wheel/mcp": "^4.0.0",
|
|
101
|
+
"@neondatabase/serverless": "^0.10.0"
|
|
102
|
+
},
|
|
103
|
+
"devDependencies": {
|
|
104
|
+
"@tailwindcss/postcss": "^4.1.0",
|
|
105
|
+
"@types/node": "^22.0.0",
|
|
106
|
+
"@types/react": "^19.0.0",
|
|
107
|
+
"@types/react-dom": "^19.0.0",
|
|
108
|
+
"shx": "^0.4.0",
|
|
109
|
+
"tailwindcss": "^4.1.0",
|
|
110
|
+
"typescript": "^5.7.0"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
Binary file
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [{ "name": "next" }],
|
|
17
|
+
"paths": { "@/*": ["./*"] }
|
|
18
|
+
},
|
|
19
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
20
|
+
"exclude": ["node_modules", "src", "mcp"]
|
|
21
|
+
}
|