@medicine-wheel/app 0.4.13 → 0.5.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/app/accountability/layout.tsx +7 -0
- package/app/accountability/page.tsx +7 -7
- package/app/api/edges/route.ts +198 -15
- package/app/api/nodes/[id]/route.ts +101 -0
- package/app/api/nodes/route.ts +39 -12
- package/app/ceremonies/layout.tsx +7 -0
- package/app/ceremonies/page.tsx +17 -14
- package/app/globals.css +78 -36
- package/app/graph/medicine-wheel-flow.css +157 -0
- package/app/graph/page.tsx +152 -1
- package/app/layout.tsx +32 -3
- package/app/narrative/beats/layout.tsx +7 -0
- package/app/narrative/beats/page.tsx +17 -14
- package/app/narrative/cycles/layout.tsx +7 -0
- package/app/narrative/cycles/page.tsx +13 -10
- package/app/narrative/layout.tsx +9 -0
- package/app/narrative/page.tsx +11 -8
- package/app/nodes/page.tsx +256 -82
- package/app/page.tsx +144 -61
- package/app/relations/page.tsx +338 -157
- package/components/direction-panel.tsx +21 -9
- package/components/navigation.tsx +24 -31
- package/components/workspaces-panel.tsx +10 -10
- package/next.config.mjs +18 -0
- package/package.json +25 -21
- package/public/favicon.svg +14 -0
- package/public/fonts/Stereohead.otf +0 -0
|
@@ -7,16 +7,19 @@ import { Menu, X, ChevronDown } from "lucide-react";
|
|
|
7
7
|
import { useState } from "react";
|
|
8
8
|
import { WorkspacesPanel, WORKSPACES, type Workspace } from "@/components/workspaces-panel";
|
|
9
9
|
|
|
10
|
+
/* Colors are token vars: direction colors only where the page MEANS that
|
|
11
|
+
* direction (Ceremonies=south, Accountability=north, home=east); the rest
|
|
12
|
+
* take node-type category colors. */
|
|
10
13
|
const NAV_ITEMS = [
|
|
11
|
-
{ href: "/", label: "
|
|
12
|
-
{ href: "/graph", label: "Graph", color: "
|
|
13
|
-
{ href: "/nodes", label: "Nodes", color: "
|
|
14
|
-
{ href: "/relations", label: "Relations", color: "
|
|
15
|
-
{ href: "/ceremonies", label: "Ceremonies", color: "
|
|
16
|
-
{ href: "/narrative", label: "Narrative", color: "
|
|
17
|
-
{ href: "/narrative/beats", label: "Beats", color: "
|
|
18
|
-
{ href: "/narrative/cycles", label: "Cycles", color: "
|
|
19
|
-
{ href: "/accountability", label: "Accountability", color: "
|
|
14
|
+
{ href: "/", label: "Wheel", color: "var(--mw-east)" },
|
|
15
|
+
{ href: "/graph", label: "Graph", color: "var(--mw-primary)" },
|
|
16
|
+
{ href: "/nodes", label: "Nodes", color: "var(--mw-node-land)" },
|
|
17
|
+
{ href: "/relations", label: "Relations", color: "var(--mw-node-future)" },
|
|
18
|
+
{ href: "/ceremonies", label: "Ceremonies", color: "var(--mw-south)" },
|
|
19
|
+
{ href: "/narrative", label: "Narrative", color: "var(--mw-node-spirit)" },
|
|
20
|
+
{ href: "/narrative/beats", label: "Beats", color: "var(--mw-node-ancestor)" },
|
|
21
|
+
{ href: "/narrative/cycles", label: "Cycles", color: "var(--mw-node-human)" },
|
|
22
|
+
{ href: "/accountability", label: "Accountability", color: "var(--mw-north)" },
|
|
20
23
|
];
|
|
21
24
|
|
|
22
25
|
export function Navigation() {
|
|
@@ -31,31 +34,24 @@ export function Navigation() {
|
|
|
31
34
|
<div className="mx-auto flex h-16 max-w-7xl items-center justify-between gap-3 px-4">
|
|
32
35
|
<button
|
|
33
36
|
onClick={() => setWsOpen(true)}
|
|
34
|
-
className="flex items-center gap-2 rounded-md px-2 py-1 hover:bg-secondary"
|
|
37
|
+
className="flex shrink-0 items-center gap-2 rounded-md px-2 py-1 hover:bg-secondary"
|
|
35
38
|
aria-label="Open workspaces"
|
|
36
39
|
>
|
|
37
|
-
<span className="h-2 w-2 rounded-full" style={{ background: activeWs.color }} />
|
|
38
|
-
<span
|
|
39
|
-
className="hidden sm:inline text-base"
|
|
40
|
-
style={{ fontFamily: "var(--font-display)" }}
|
|
41
|
-
>
|
|
40
|
+
<span className="h-2 w-2 shrink-0 rounded-full" style={{ background: activeWs.color }} />
|
|
41
|
+
<span className="hidden sm:inline whitespace-nowrap text-sm font-semibold">
|
|
42
42
|
{activeWs.name}
|
|
43
43
|
</span>
|
|
44
|
-
<ChevronDown className="h-4 w-4 text-muted-foreground" />
|
|
44
|
+
<ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground" />
|
|
45
45
|
</button>
|
|
46
46
|
|
|
47
|
-
<div className="hidden md:flex items-center gap-1
|
|
47
|
+
<div className="nav-scroll hidden md:flex items-center gap-1">
|
|
48
48
|
{NAV_ITEMS.map((item) => (
|
|
49
49
|
<Link
|
|
50
50
|
key={item.href}
|
|
51
51
|
href={item.href}
|
|
52
|
-
className={cn(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
? "bg-secondary text-foreground"
|
|
56
|
-
: "text-muted-foreground hover:text-foreground hover:bg-secondary/50"
|
|
57
|
-
)}
|
|
58
|
-
style={pathname === item.href ? { borderBottom: `2px solid ${item.color}` } : {}}
|
|
52
|
+
className={cn("nav-item", pathname === item.href && "nav-item--active")}
|
|
53
|
+
style={{ "--nav-c": item.color } as React.CSSProperties}
|
|
54
|
+
aria-current={pathname === item.href ? "page" : undefined}
|
|
59
55
|
>
|
|
60
56
|
{item.label}
|
|
61
57
|
</Link>
|
|
@@ -74,18 +70,15 @@ export function Navigation() {
|
|
|
74
70
|
</div>
|
|
75
71
|
|
|
76
72
|
{mobileOpen && (
|
|
77
|
-
<div className="md:hidden border-t border-border bg-background px-4 pb-4">
|
|
73
|
+
<div className="md:hidden border-t border-border bg-background px-4 pb-4 pt-2">
|
|
78
74
|
{NAV_ITEMS.map((item) => (
|
|
79
75
|
<Link
|
|
80
76
|
key={item.href}
|
|
81
77
|
href={item.href}
|
|
82
78
|
onClick={() => setMobileOpen(false)}
|
|
83
|
-
className={cn(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
? "bg-secondary text-foreground"
|
|
87
|
-
: "text-muted-foreground hover:text-foreground"
|
|
88
|
-
)}
|
|
79
|
+
className={cn("nav-item block", pathname === item.href && "nav-item--active")}
|
|
80
|
+
style={{ "--nav-c": item.color } as React.CSSProperties}
|
|
81
|
+
aria-current={pathname === item.href ? "page" : undefined}
|
|
89
82
|
>
|
|
90
83
|
{item.label}
|
|
91
84
|
</Link>
|
|
@@ -15,12 +15,12 @@ export type Workspace = {
|
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
export const WORKSPACES: Workspace[] = [
|
|
18
|
-
{ id: "medicine-wheel", name: "Medicine Wheel", direction: "east", color: "
|
|
19
|
-
{ id: "iaip", name: "IAIP Platform", direction: "south", color: "
|
|
20
|
-
{ id: "stc", name: "STC Workspaces", direction: "west", color: "
|
|
21
|
-
{ id: "tushell", name: "Tushell Magic Land", direction: "north", color: "
|
|
22
|
-
{ id: "articles", name: "Articles", direction: "east", color: "
|
|
23
|
-
{ id: "pde", name: "PDE", direction: "south", color: "
|
|
18
|
+
{ id: "medicine-wheel", name: "Medicine Wheel", direction: "east", color: "var(--mw-east)", status: "active", repo: "jgwill/medicine-wheel", blurb: "Relational ontology + Four Directions web app" },
|
|
19
|
+
{ id: "iaip", name: "IAIP Platform", direction: "south", color: "var(--mw-south)", status: "active", repo: "jgwill/iaip", blurb: "Three Universes multi-agent orchestration" },
|
|
20
|
+
{ id: "stc", name: "STC Workspaces", direction: "west", color: "var(--mw-west)", status: "active", repo: "jgwill/stcraft", blurb: "Structural tension charts across repos" },
|
|
21
|
+
{ id: "tushell", name: "Tushell Magic Land", direction: "north", color: "var(--mw-north)", status: "idle", repo: "jgwill/tushellplatform", blurb: "Child-friendly knowledge platform" },
|
|
22
|
+
{ id: "articles", name: "Articles", direction: "east", color: "var(--mw-node-ancestor)", status: "idle", repo: "jgwill/medicine-wheel#articles", blurb: "Narrative-technical research" },
|
|
23
|
+
{ id: "pde", name: "PDE", direction: "south", color: "var(--mw-node-spirit)", status: "active", repo: "jgwill/medicine-wheel#pde", blurb: "Four Directions prompt decomposition" },
|
|
24
24
|
];
|
|
25
25
|
|
|
26
26
|
const STATUS_DOT: Record<Workspace["status"], string> = {
|
|
@@ -65,7 +65,7 @@ export function WorkspacesPanel({
|
|
|
65
65
|
)}
|
|
66
66
|
>
|
|
67
67
|
<div className="flex items-center justify-between border-b border-border px-5 py-4">
|
|
68
|
-
<div className="mw-h2"
|
|
68
|
+
<div className="mw-h2">Workspaces</div>
|
|
69
69
|
<button
|
|
70
70
|
onClick={onClose}
|
|
71
71
|
className="rounded-md p-1 text-muted-foreground hover:bg-secondary hover:text-foreground"
|
|
@@ -89,9 +89,9 @@ export function WorkspacesPanel({
|
|
|
89
89
|
)}
|
|
90
90
|
style={{
|
|
91
91
|
borderLeft: `3px solid ${ws.color}`,
|
|
92
|
-
borderTopColor: selected ? ws.color
|
|
93
|
-
borderRightColor: selected ? ws.color
|
|
94
|
-
borderBottomColor: selected ? ws.color
|
|
92
|
+
borderTopColor: selected ? `color-mix(in srgb, ${ws.color} 40%, transparent)` : undefined,
|
|
93
|
+
borderRightColor: selected ? `color-mix(in srgb, ${ws.color} 40%, transparent)` : undefined,
|
|
94
|
+
borderBottomColor: selected ? `color-mix(in srgb, ${ws.color} 40%, transparent)` : undefined,
|
|
95
95
|
}}
|
|
96
96
|
>
|
|
97
97
|
<div className="flex items-center gap-2">
|
package/next.config.mjs
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
/** @type {import('next').NextConfig} */
|
|
2
2
|
const nextConfig = {
|
|
3
3
|
images: { unoptimized: true },
|
|
4
|
+
webpack: (config, { dev }) => {
|
|
5
|
+
if (dev) {
|
|
6
|
+
// The JSONL store lives at .mw/store/ inside the repo — every API write
|
|
7
|
+
// lands there. Keep it out of the dev watcher or each write recompiles.
|
|
8
|
+
// (webpack allows one RegExp OR an array of globs; Next's default is a
|
|
9
|
+
// RegExp over node_modules/.git/.next, so restate those as globs.)
|
|
10
|
+
config.watchOptions = {
|
|
11
|
+
...config.watchOptions,
|
|
12
|
+
ignored: [
|
|
13
|
+
'**/node_modules/**',
|
|
14
|
+
'**/.git/**',
|
|
15
|
+
'**/.next/**',
|
|
16
|
+
'**/.mw/**',
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
return config;
|
|
21
|
+
},
|
|
4
22
|
};
|
|
5
23
|
export default nextConfig;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@medicine-wheel/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Medicine Wheel — Interactive visual layer for Indigenous relational research with Four Directions, ceremonies, and narrative arcs",
|
|
5
5
|
"bin": {
|
|
6
6
|
"mw": "dist/cli/mw.js",
|
|
@@ -40,6 +40,8 @@
|
|
|
40
40
|
"src/relational-query",
|
|
41
41
|
"src/session-reader",
|
|
42
42
|
"src/storage-provider",
|
|
43
|
+
"src/ceremonial-diary",
|
|
44
|
+
"src/github-ceremony",
|
|
43
45
|
"src/transformation-tracker",
|
|
44
46
|
"src/ui-components",
|
|
45
47
|
"mcp"
|
|
@@ -76,26 +78,28 @@
|
|
|
76
78
|
"release:major": "npm run version:major && npm run publish:all && npm run release:commit"
|
|
77
79
|
},
|
|
78
80
|
"dependencies": {
|
|
79
|
-
"@medicine-wheel/
|
|
80
|
-
"@medicine-wheel/
|
|
81
|
-
"@medicine-wheel/
|
|
82
|
-
"@medicine-wheel/
|
|
83
|
-
"@medicine-wheel/data-store
|
|
84
|
-
"@medicine-wheel/
|
|
85
|
-
"@medicine-wheel/
|
|
86
|
-
"@medicine-wheel/
|
|
87
|
-
"@medicine-wheel/
|
|
88
|
-
"@medicine-wheel/
|
|
89
|
-
"@medicine-wheel/
|
|
90
|
-
"@medicine-wheel/
|
|
91
|
-
"@medicine-wheel/
|
|
92
|
-
"@medicine-wheel/
|
|
93
|
-
"@medicine-wheel/
|
|
94
|
-
"@medicine-wheel/
|
|
95
|
-
"@medicine-wheel/
|
|
96
|
-
"@medicine-wheel/
|
|
97
|
-
"@medicine-wheel/
|
|
98
|
-
"@medicine-wheel/
|
|
81
|
+
"@medicine-wheel/ceremonial-diary": "^0.5.1",
|
|
82
|
+
"@medicine-wheel/ceremony-protocol": "^0.5.1",
|
|
83
|
+
"@medicine-wheel/community-review": "^0.5.1",
|
|
84
|
+
"@medicine-wheel/consent-lifecycle": "^0.5.1",
|
|
85
|
+
"@medicine-wheel/data-store": "^0.5.1",
|
|
86
|
+
"@medicine-wheel/data-store-postgres": "^0.5.1",
|
|
87
|
+
"@medicine-wheel/fire-keeper": "^0.5.1",
|
|
88
|
+
"@medicine-wheel/github-ceremony": "^0.5.1",
|
|
89
|
+
"@medicine-wheel/graph-viz": "^0.5.1",
|
|
90
|
+
"@medicine-wheel/importance-unit": "^0.5.1",
|
|
91
|
+
"@medicine-wheel/mcp": "^4.5.0",
|
|
92
|
+
"@medicine-wheel/narrative-cluster": "^0.5.1",
|
|
93
|
+
"@medicine-wheel/narrative-engine": "^0.5.1",
|
|
94
|
+
"@medicine-wheel/ontology-core": "^0.5.1",
|
|
95
|
+
"@medicine-wheel/perception-layer": "^0.5.1",
|
|
96
|
+
"@medicine-wheel/prompt-decomposition": "^0.5.1",
|
|
97
|
+
"@medicine-wheel/relational-index": "^0.5.1",
|
|
98
|
+
"@medicine-wheel/relational-query": "^0.5.1",
|
|
99
|
+
"@medicine-wheel/session-reader": "^0.5.1",
|
|
100
|
+
"@medicine-wheel/storage-provider": "^0.5.1",
|
|
101
|
+
"@medicine-wheel/transformation-tracker": "^0.5.1",
|
|
102
|
+
"@medicine-wheel/ui-components": "^0.5.1",
|
|
99
103
|
"@neondatabase/serverless": "^0.10.0",
|
|
100
104
|
"clsx": "^2.1.1",
|
|
101
105
|
"lucide-react": "^0.475.0",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
|
2
|
+
<!-- Medicine Wheel glyph: four-direction quadrants on midnight ground -->
|
|
3
|
+
<circle cx="16" cy="16" r="15.5" fill="#0A0A1A"/>
|
|
4
|
+
<g>
|
|
5
|
+
<path d="M16 16 L24.49 7.51 A12 12 0 0 1 24.49 24.49 Z" fill="#FFD700"/>
|
|
6
|
+
<path d="M16 16 L24.49 24.49 A12 12 0 0 1 7.51 24.49 Z" fill="#DC2626"/>
|
|
7
|
+
<path d="M16 16 L7.51 24.49 A12 12 0 0 1 7.51 7.51 Z" fill="#6B7A99"/>
|
|
8
|
+
<path d="M16 16 L7.51 7.51 A12 12 0 0 1 24.49 7.51 Z" fill="#F7F5F0"/>
|
|
9
|
+
</g>
|
|
10
|
+
<path d="M7.51 7.51 L24.49 24.49 M24.49 7.51 L7.51 24.49" stroke="#0A0A1A" stroke-width="1.5"/>
|
|
11
|
+
<circle cx="16" cy="16" r="12" fill="none" stroke="#0A0A1A" stroke-width="1"/>
|
|
12
|
+
<circle cx="16" cy="16" r="3.5" fill="#0A0A1A"/>
|
|
13
|
+
<circle cx="16" cy="16" r="3.5" fill="none" stroke="#FFD700" stroke-width="0.75"/>
|
|
14
|
+
</svg>
|
|
Binary file
|