@medicine-wheel/app 0.20.0 → 0.22.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.
Files changed (3) hide show
  1. package/README.md +13 -0
  2. package/dist/cli/mw.js +78 -3
  3. package/package.json +30 -28
package/README.md CHANGED
@@ -53,6 +53,8 @@ Recently landed:
53
53
  ├── @medicine-wheel/data-store-postgres ← PostgreSQL / Neon provider scaffold
54
54
  ├── @medicine-wheel/storage-provider ← Canonical persistence contract (JSONL ⇄ Neon)
55
55
  ├── @medicine-wheel/infra ← Hosts, tenants, services, port bindings as facets
56
+ ├── @medicine-wheel/capabilities ← What the platform can do, who provides it, who said so
57
+ ├── @medicine-wheel/developer-repository-mapping ← Owner hubs of repository rows; mw-repomap
56
58
  ├── @medicine-wheel/honcho ← The wheel's projection into Honcho, memory that reasons
57
59
  ├── @medicine-wheel/perception-layer ← Witness recordings as typed perceptual events
58
60
  ├── @medicine-wheel/narrative-cluster ← Events → clusters → beats → Film Edit Brief
@@ -186,6 +188,16 @@ Typed infrastructure facets — hosts, tenants, services and port bindings — k
186
188
 
187
189
  - **Dependencies:** `@medicine-wheel/ontology-core`, `zod`
188
190
 
191
+ ### [@medicine-wheel/capabilities](src/capabilities)
192
+ The platform-features and capabilities layer: a capability rides a `knowledge` node carrying `metadata.kind: "capability"`, says what it does in at most 55 words, and lists the repositories and services that provide it. Every row carries its attribution (who wrote it, when, from what evidence, and whether a person has read it since), and a model's row starts `pending`. `findSharedCapabilities` names a capability more than one provider gives. Pure.
193
+
194
+ - **Dependencies:** `@medicine-wheel/ontology-core`, `@medicine-wheel/infra`, `zod`
195
+
196
+ ### [@medicine-wheel/developer-repository-mapping](src/developer-repository-mapping)
197
+ Repository mapping: the JSONL rows an owner hub (`<owner>/<owner>/.miadi/repository-mapping/`) holds, the lifecycle state machine checked against git, a meta hub that reads other hubs without copying them, and the projection into wheel nodes and edges. The `mw-repomap` CLI makes, validates, observes and serves a mapping on one small web page.
198
+
199
+ - **Dependencies:** `@medicine-wheel/ontology-core`, `@medicine-wheel/capabilities`, `zod`
200
+
189
201
  ### [@medicine-wheel/honcho](src/honcho)
190
202
  The wheel's projection into [Honcho](https://honcho.dev), memory that reasons. The wheel stays canonical; Honcho holds what the history has come to mean about each peer. A beat becomes a message from its speaker in the session of its ceremony, a speaker's evolving representation is recalled before they speak again, and a derived conclusion returns as a `knowledge` node carrying `metadata.kind: "memory_projection"` with its status and provenance. Zero dependencies, `/v3` only, configured by `HONCHO_URL`. Nothing is filtered here.
191
203
 
@@ -258,6 +270,7 @@ RISE framework specifications are in [`rispecs/`](rispecs/). Start with [`medici
258
270
  | data-store-postgres | [data-store-postgres.spec.md](rispecs/data-store-postgres.spec.md) |
259
271
  | session-reader | [session-reader.spec.md](rispecs/session-reader.spec.md) |
260
272
  | infra | [infrastructure-topology-ui.spec.md](rispecs/infrastructure-topology-ui.spec.md) |
273
+ | capabilities · developer-repository-mapping | [developer-suite/repository-mapping/](rispecs/developer-suite/repository-mapping/SPEC.md) |
261
274
  | perception-layer | [perception-layer.spec.md](rispecs/perception-layer.spec.md) |
262
275
  | narrative-cluster | [narrative-cluster.spec.md](rispecs/narrative-cluster.spec.md) |
263
276
  | captures & recordings | [capture-registry.spec.md](rispecs/capture-registry.spec.md) |
package/dist/cli/mw.js CHANGED
@@ -280,6 +280,12 @@ ${C.bold}🌿 mw — Medicine Wheel CLI${C.reset}
280
280
  mw chart create <outcome> <reality> <dir> Create STC
281
281
  mw chart list [--direction east] List charts
282
282
  mw chart progress <id> Get progress
283
+ mw chart get <id> The chart, whole
284
+ mw chart delay <chart> <step> <resolve_by> <reason> --by <who>
285
+ [--primary <text>] [--wake-on <cue>] Choose to delay a step's resolution
286
+ [--session <id> --cwd <dir> --resume <cmd>] ...with the session to rehydrate
287
+ mw chart delayed [--within <days>] [--all] Delays by resolve_by, owed first
288
+ mw chart end-delay <chart> <step> <rehydrated|released> --by <who> [--note <text>]
283
289
  mw mmot <chart_id> <expected> <actual> <analysis> MMOT review
284
290
 
285
291
  RELATIONS
@@ -666,7 +672,19 @@ function cmdWeb(positional) {
666
672
  mcpCall('get_relational_web', { node_id: nodeId, depth });
667
673
  }
668
674
  // ── Chart / STC ───────────────────────────────────────────────────
669
- function cmdChart(positional) {
675
+ function chartUsage(line) {
676
+ console.error(`${C.south}Usage: ${line}${C.reset}`);
677
+ process.exitCode = EXIT_USAGE;
678
+ }
679
+ function flagText(flags, ...keys) {
680
+ for (const key of keys) {
681
+ const v = flags[key];
682
+ if (typeof v === 'string' && v.trim() !== '')
683
+ return v;
684
+ }
685
+ return undefined;
686
+ }
687
+ function cmdChart(positional, flags = {}) {
670
688
  const sub = positional[0] ?? 'list';
671
689
  switch (sub) {
672
690
  case 'create':
@@ -682,8 +700,65 @@ function cmdChart(positional) {
682
700
  case 'progress':
683
701
  mcpCall('get_chart_progress', { chart_id: positional[1] ?? '' });
684
702
  break;
703
+ case 'get':
704
+ mcpCall('get_chart', { chart_id: positional[1] ?? '' });
705
+ break;
706
+ case 'delay': {
707
+ const [, chartId, stepId, resolveBy, reason] = positional;
708
+ const by = flagText(flags, 'by');
709
+ if (!chartId || !stepId || !resolveBy || !reason || !by) {
710
+ chartUsage('mw chart delay <chart_id> <step_id> <resolve_by> <reason> --by <who> [--primary <text>] [--wake-on <cue>] [--session <id>] [--cwd <dir>] [--resume <command>]');
711
+ return;
712
+ }
713
+ const sessionId = flagText(flags, 'session');
714
+ const wakeOn = flagText(flags, 'wake-on');
715
+ mcpCall('delay_resolution', {
716
+ chart_id: chartId,
717
+ step_id: stepId,
718
+ resolve_by: resolveBy,
719
+ reason,
720
+ chosen_by: by,
721
+ ...(flagText(flags, 'primary') ? { primary_choice: flagText(flags, 'primary') } : {}),
722
+ ...(wakeOn ? { wake_on: [wakeOn] } : {}),
723
+ ...(sessionId
724
+ ? {
725
+ session: {
726
+ session_id: sessionId,
727
+ ...(flagText(flags, 'cwd') ? { cwd: flagText(flags, 'cwd') } : {}),
728
+ ...(flagText(flags, 'resume') ? { resume_command: flagText(flags, 'resume') } : {}),
729
+ ...(flagText(flags, 'host') ? { host: flagText(flags, 'host') } : {}),
730
+ },
731
+ }
732
+ : {}),
733
+ });
734
+ break;
735
+ }
736
+ case 'delayed': {
737
+ const within = flagText(flags, 'within');
738
+ mcpCall('list_delayed_resolutions', {
739
+ ...(within !== undefined ? { due_within_days: Number(within) } : {}),
740
+ ...(flags['all'] === true ? { include_ended: true } : {}),
741
+ });
742
+ break;
743
+ }
744
+ case 'end-delay': {
745
+ const [, chartId, stepId, outcome] = positional;
746
+ const by = flagText(flags, 'by');
747
+ if (!chartId || !stepId || (outcome !== 'rehydrated' && outcome !== 'released') || !by) {
748
+ chartUsage('mw chart end-delay <chart_id> <step_id> <rehydrated|released> --by <who> [--note <text>]');
749
+ return;
750
+ }
751
+ mcpCall('end_delayed_resolution', {
752
+ chart_id: chartId,
753
+ step_id: stepId,
754
+ outcome,
755
+ ended_by: by,
756
+ ...(flagText(flags, 'note') ? { end_note: flagText(flags, 'note') } : {}),
757
+ });
758
+ break;
759
+ }
685
760
  default:
686
- unknownSub('chart', sub, ['create', 'list', 'progress']);
761
+ unknownSub('chart', sub, ['create', 'list', 'progress', 'get', 'delay', 'delayed', 'end-delay']);
687
762
  }
688
763
  }
689
764
  // ── MMOT ──────────────────────────────────────────────────────────
@@ -911,7 +986,7 @@ async function main() {
911
986
  break;
912
987
  case 'chart':
913
988
  case 'stc':
914
- cmdChart(rest);
989
+ cmdChart(rest, flags);
915
990
  break;
916
991
  case 'mmot':
917
992
  cmdMmot(rest);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medicine-wheel/app",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
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",
@@ -28,6 +28,8 @@
28
28
  "workspaces": [
29
29
  "src/ontology-core",
30
30
  "src/infra",
31
+ "src/capabilities",
32
+ "src/developer-repository-mapping",
31
33
  "src/events",
32
34
  "src/creative-orientation",
33
35
  "src/session-reader",
@@ -92,33 +94,33 @@
92
94
  "release:major": "npm run version:major && npm run publish:all && npm run release:commit"
93
95
  },
94
96
  "dependencies": {
95
- "@medicine-wheel/ceremonial-diary": "^0.20.0",
96
- "@medicine-wheel/ceremony-protocol": "^0.20.0",
97
- "@medicine-wheel/community-identity": "^0.20.0",
98
- "@medicine-wheel/community-review": "^0.20.0",
99
- "@medicine-wheel/consent-lifecycle": "^0.20.0",
100
- "@medicine-wheel/creative-orientation": "^0.20.0",
101
- "@medicine-wheel/data-store": "^0.20.0",
102
- "@medicine-wheel/data-store-postgres": "^0.20.0",
103
- "@medicine-wheel/events": "^0.20.0",
104
- "@medicine-wheel/fire-keeper": "^0.20.0",
105
- "@medicine-wheel/github-ceremony": "^0.20.0",
106
- "@medicine-wheel/graph-viz": "^0.20.0",
107
- "@medicine-wheel/honcho": "^0.20.0",
108
- "@medicine-wheel/importance-unit": "^0.20.0",
109
- "@medicine-wheel/mcp": "^4.20.0",
110
- "@medicine-wheel/memory": "^0.20.0",
111
- "@medicine-wheel/narrative-cluster": "^0.20.0",
112
- "@medicine-wheel/narrative-engine": "^0.20.0",
113
- "@medicine-wheel/ontology-core": "^0.20.0",
114
- "@medicine-wheel/perception-layer": "^0.20.0",
115
- "@medicine-wheel/prompt-decomposition": "^0.20.0",
116
- "@medicine-wheel/relational-index": "^0.20.0",
117
- "@medicine-wheel/relational-query": "^0.20.0",
118
- "@medicine-wheel/session-reader": "^0.20.0",
119
- "@medicine-wheel/storage-provider": "^0.20.0",
120
- "@medicine-wheel/transformation-tracker": "^0.20.0",
121
- "@medicine-wheel/ui-components": "^0.20.0",
97
+ "@medicine-wheel/ceremonial-diary": "^0.22.0",
98
+ "@medicine-wheel/ceremony-protocol": "^0.22.0",
99
+ "@medicine-wheel/community-identity": "^0.22.0",
100
+ "@medicine-wheel/community-review": "^0.22.0",
101
+ "@medicine-wheel/consent-lifecycle": "^0.22.0",
102
+ "@medicine-wheel/creative-orientation": "^0.22.0",
103
+ "@medicine-wheel/data-store": "^0.22.0",
104
+ "@medicine-wheel/data-store-postgres": "^0.22.0",
105
+ "@medicine-wheel/events": "^0.22.0",
106
+ "@medicine-wheel/fire-keeper": "^0.22.0",
107
+ "@medicine-wheel/github-ceremony": "^0.22.0",
108
+ "@medicine-wheel/graph-viz": "^0.22.0",
109
+ "@medicine-wheel/honcho": "^0.22.0",
110
+ "@medicine-wheel/importance-unit": "^0.22.0",
111
+ "@medicine-wheel/mcp": "^4.22.0",
112
+ "@medicine-wheel/memory": "^0.22.0",
113
+ "@medicine-wheel/narrative-cluster": "^0.22.0",
114
+ "@medicine-wheel/narrative-engine": "^0.22.0",
115
+ "@medicine-wheel/ontology-core": "^0.22.0",
116
+ "@medicine-wheel/perception-layer": "^0.22.0",
117
+ "@medicine-wheel/prompt-decomposition": "^0.22.0",
118
+ "@medicine-wheel/relational-index": "^0.22.0",
119
+ "@medicine-wheel/relational-query": "^0.22.0",
120
+ "@medicine-wheel/session-reader": "^0.22.0",
121
+ "@medicine-wheel/storage-provider": "^0.22.0",
122
+ "@medicine-wheel/transformation-tracker": "^0.22.0",
123
+ "@medicine-wheel/ui-components": "^0.22.0",
122
124
  "@miadi/episode-vessel": "^0.2.1",
123
125
  "@neondatabase/serverless": "^0.10.0",
124
126
  "@xyflow/react": "^12.3.0",