@the-cascade-protocol/cli 0.2.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 (165) hide show
  1. package/.dockerignore +7 -0
  2. package/.eslintrc.json +23 -0
  3. package/.prettierrc +7 -0
  4. package/DOCKER.md +36 -0
  5. package/Dockerfile +18 -0
  6. package/README.md +69 -0
  7. package/dist/commands/capabilities.d.ts +9 -0
  8. package/dist/commands/capabilities.d.ts.map +1 -0
  9. package/dist/commands/capabilities.js +194 -0
  10. package/dist/commands/capabilities.js.map +1 -0
  11. package/dist/commands/conformance.d.ts +15 -0
  12. package/dist/commands/conformance.d.ts.map +1 -0
  13. package/dist/commands/conformance.js +348 -0
  14. package/dist/commands/conformance.js.map +1 -0
  15. package/dist/commands/convert.d.ts +21 -0
  16. package/dist/commands/convert.d.ts.map +1 -0
  17. package/dist/commands/convert.js +134 -0
  18. package/dist/commands/convert.js.map +1 -0
  19. package/dist/commands/pod/export.d.ts +8 -0
  20. package/dist/commands/pod/export.d.ts.map +1 -0
  21. package/dist/commands/pod/export.js +72 -0
  22. package/dist/commands/pod/export.js.map +1 -0
  23. package/dist/commands/pod/helpers.d.ts +79 -0
  24. package/dist/commands/pod/helpers.d.ts.map +1 -0
  25. package/dist/commands/pod/helpers.js +369 -0
  26. package/dist/commands/pod/helpers.js.map +1 -0
  27. package/dist/commands/pod/index.d.ts +20 -0
  28. package/dist/commands/pod/index.d.ts.map +1 -0
  29. package/dist/commands/pod/index.js +29 -0
  30. package/dist/commands/pod/index.js.map +1 -0
  31. package/dist/commands/pod/info.d.ts +9 -0
  32. package/dist/commands/pod/info.d.ts.map +1 -0
  33. package/dist/commands/pod/info.js +196 -0
  34. package/dist/commands/pod/info.js.map +1 -0
  35. package/dist/commands/pod/init.d.ts +9 -0
  36. package/dist/commands/pod/init.d.ts.map +1 -0
  37. package/dist/commands/pod/init.js +251 -0
  38. package/dist/commands/pod/init.js.map +1 -0
  39. package/dist/commands/pod/query.d.ts +9 -0
  40. package/dist/commands/pod/query.d.ts.map +1 -0
  41. package/dist/commands/pod/query.js +169 -0
  42. package/dist/commands/pod/query.js.map +1 -0
  43. package/dist/commands/pod 2.js +1017 -0
  44. package/dist/commands/pod.d.ts +28 -0
  45. package/dist/commands/pod.d.ts 2.map +1 -0
  46. package/dist/commands/pod.d.ts.map +1 -0
  47. package/dist/commands/pod.js +1031 -0
  48. package/dist/commands/pod.js 2.map +1 -0
  49. package/dist/commands/pod.js.map +1 -0
  50. package/dist/commands/serve.d.ts +33 -0
  51. package/dist/commands/serve.d.ts.map +1 -0
  52. package/dist/commands/serve.js +74 -0
  53. package/dist/commands/serve.js.map +1 -0
  54. package/dist/commands/validate.d.ts +18 -0
  55. package/dist/commands/validate.d.ts.map +1 -0
  56. package/dist/commands/validate.js +275 -0
  57. package/dist/commands/validate.js.map +1 -0
  58. package/dist/index.d.ts +19 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +49 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts +17 -0
  63. package/dist/lib/fhir-converter/cascade-to-fhir.d.ts.map +1 -0
  64. package/dist/lib/fhir-converter/cascade-to-fhir.js +358 -0
  65. package/dist/lib/fhir-converter/cascade-to-fhir.js.map +1 -0
  66. package/dist/lib/fhir-converter/converters-clinical.d.ts +29 -0
  67. package/dist/lib/fhir-converter/converters-clinical.d.ts.map +1 -0
  68. package/dist/lib/fhir-converter/converters-clinical.js +391 -0
  69. package/dist/lib/fhir-converter/converters-clinical.js.map +1 -0
  70. package/dist/lib/fhir-converter/converters-demographics.d.ts +20 -0
  71. package/dist/lib/fhir-converter/converters-demographics.d.ts.map +1 -0
  72. package/dist/lib/fhir-converter/converters-demographics.js +242 -0
  73. package/dist/lib/fhir-converter/converters-demographics.js.map +1 -0
  74. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts +17 -0
  75. package/dist/lib/fhir-converter/fhir-to-cascade.d.ts.map +1 -0
  76. package/dist/lib/fhir-converter/fhir-to-cascade.js +63 -0
  77. package/dist/lib/fhir-converter/fhir-to-cascade.js.map +1 -0
  78. package/dist/lib/fhir-converter/index.d.ts +36 -0
  79. package/dist/lib/fhir-converter/index.d.ts.map +1 -0
  80. package/dist/lib/fhir-converter/index.js +187 -0
  81. package/dist/lib/fhir-converter/index.js.map +1 -0
  82. package/dist/lib/fhir-converter/types.d.ts +77 -0
  83. package/dist/lib/fhir-converter/types.d.ts.map +1 -0
  84. package/dist/lib/fhir-converter/types.js +236 -0
  85. package/dist/lib/fhir-converter/types.js.map +1 -0
  86. package/dist/lib/fhir-converter.d.ts +62 -0
  87. package/dist/lib/fhir-converter.d.ts.map +1 -0
  88. package/dist/lib/fhir-converter.js +1474 -0
  89. package/dist/lib/fhir-converter.js.map +1 -0
  90. package/dist/lib/mcp/audit.d.ts +24 -0
  91. package/dist/lib/mcp/audit.d.ts.map +1 -0
  92. package/dist/lib/mcp/audit.js +85 -0
  93. package/dist/lib/mcp/audit.js.map +1 -0
  94. package/dist/lib/mcp/server.d.ts +38 -0
  95. package/dist/lib/mcp/server.d.ts.map +1 -0
  96. package/dist/lib/mcp/server.js +172 -0
  97. package/dist/lib/mcp/server.js.map +1 -0
  98. package/dist/lib/mcp/tools.d.ts +47 -0
  99. package/dist/lib/mcp/tools.d.ts.map +1 -0
  100. package/dist/lib/mcp/tools.js +547 -0
  101. package/dist/lib/mcp/tools.js.map +1 -0
  102. package/dist/lib/output.d.ts +26 -0
  103. package/dist/lib/output.d.ts.map +1 -0
  104. package/dist/lib/output.js +64 -0
  105. package/dist/lib/output.js.map +1 -0
  106. package/dist/lib/shacl-validator.d.ts +53 -0
  107. package/dist/lib/shacl-validator.d.ts.map +1 -0
  108. package/dist/lib/shacl-validator.js +245 -0
  109. package/dist/lib/shacl-validator.js.map +1 -0
  110. package/dist/lib/turtle-parser.d.ts +64 -0
  111. package/dist/lib/turtle-parser.d.ts.map +1 -0
  112. package/dist/lib/turtle-parser.js +236 -0
  113. package/dist/lib/turtle-parser.js.map +1 -0
  114. package/dist/shapes/checkup.shapes.ttl +1459 -0
  115. package/dist/shapes/clinical.shapes.ttl +1350 -0
  116. package/dist/shapes/clinical.ttl +1369 -0
  117. package/dist/shapes/core.shapes.ttl +450 -0
  118. package/dist/shapes/core.ttl +603 -0
  119. package/dist/shapes/coverage.shapes.ttl +214 -0
  120. package/dist/shapes/coverage.ttl +182 -0
  121. package/dist/shapes/health.shapes.ttl +697 -0
  122. package/dist/shapes/health.ttl +859 -0
  123. package/dist/shapes/pots.shapes.ttl +481 -0
  124. package/package.json +54 -0
  125. package/src/commands/capabilities.ts +235 -0
  126. package/src/commands/conformance.ts +447 -0
  127. package/src/commands/convert.ts +164 -0
  128. package/src/commands/pod/export.ts +85 -0
  129. package/src/commands/pod/helpers.ts +449 -0
  130. package/src/commands/pod/index.ts +32 -0
  131. package/src/commands/pod/info.ts +239 -0
  132. package/src/commands/pod/init.ts +273 -0
  133. package/src/commands/pod/query.ts +224 -0
  134. package/src/commands/serve.ts +92 -0
  135. package/src/commands/validate.ts +303 -0
  136. package/src/index.ts +58 -0
  137. package/src/lib/fhir-converter/cascade-to-fhir.ts +369 -0
  138. package/src/lib/fhir-converter/converters-clinical.ts +446 -0
  139. package/src/lib/fhir-converter/converters-demographics.ts +270 -0
  140. package/src/lib/fhir-converter/fhir-to-cascade.ts +82 -0
  141. package/src/lib/fhir-converter/index.ts +215 -0
  142. package/src/lib/fhir-converter/types.ts +318 -0
  143. package/src/lib/mcp/audit.ts +107 -0
  144. package/src/lib/mcp/server.ts +192 -0
  145. package/src/lib/mcp/tools.ts +668 -0
  146. package/src/lib/output.ts +76 -0
  147. package/src/lib/shacl-validator.ts +314 -0
  148. package/src/lib/turtle-parser.ts +277 -0
  149. package/src/shapes/checkup.shapes.ttl +1459 -0
  150. package/src/shapes/clinical.shapes.ttl +1350 -0
  151. package/src/shapes/clinical.ttl +1369 -0
  152. package/src/shapes/core.shapes.ttl +450 -0
  153. package/src/shapes/core.ttl +603 -0
  154. package/src/shapes/coverage.shapes.ttl +214 -0
  155. package/src/shapes/coverage.ttl +182 -0
  156. package/src/shapes/health.shapes.ttl +697 -0
  157. package/src/shapes/health.ttl +859 -0
  158. package/src/shapes/pots.shapes.ttl +481 -0
  159. package/test-fixtures/fhir-bundle-example.json +216 -0
  160. package/test-fixtures/fhir-medication-example.json +18 -0
  161. package/tests/cli.test.ts +126 -0
  162. package/tests/fhir-converter.test.ts +874 -0
  163. package/tests/mcp-server.test.ts +396 -0
  164. package/tests/pod.test.ts +400 -0
  165. package/tsconfig.json +24 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * cascade pod query <pod-dir>
3
+ *
4
+ * Query data within a Cascade Pod by type (medications, conditions, etc.)
5
+ * or across all data types.
6
+ */
7
+ import * as path from 'path';
8
+ import { printResult, printError, printVerbose } from '../../lib/output.js';
9
+ import { DATA_TYPES, resolvePodDir, isDirectory, fileExists, discoverTtlFiles, parseDataFile, extractLabelFromProps, selectKeyProperties, } from './helpers.js';
10
+ export function registerQuerySubcommand(pod, program) {
11
+ pod
12
+ .command('query')
13
+ .description('Query data within a pod')
14
+ .argument('<pod-dir>', 'Path to the Cascade Pod')
15
+ .option('--medications', 'Query medications')
16
+ .option('--conditions', 'Query conditions')
17
+ .option('--allergies', 'Query allergies')
18
+ .option('--lab-results', 'Query lab results')
19
+ .option('--immunizations', 'Query immunizations')
20
+ .option('--vital-signs', 'Query vital signs')
21
+ .option('--supplements', 'Query supplements')
22
+ .option('--all', 'Query all data')
23
+ .action(async (podDir, options) => {
24
+ const globalOpts = program.opts();
25
+ const absDir = resolvePodDir(podDir);
26
+ printVerbose(`Querying pod: ${absDir}`, globalOpts);
27
+ printVerbose(`Filters: ${JSON.stringify(options)}`, globalOpts);
28
+ // Validate pod exists
29
+ if (!(await isDirectory(absDir))) {
30
+ printError(`Pod directory not found: ${absDir}`, globalOpts);
31
+ process.exitCode = 1;
32
+ return;
33
+ }
34
+ try {
35
+ // Determine which data types to query
36
+ let requestedTypes;
37
+ if (options.all) {
38
+ // Discover all TTL files in the pod
39
+ requestedTypes = Object.keys(DATA_TYPES);
40
+ }
41
+ else {
42
+ requestedTypes = [];
43
+ if (options.medications)
44
+ requestedTypes.push('medications');
45
+ if (options.conditions)
46
+ requestedTypes.push('conditions');
47
+ if (options.allergies)
48
+ requestedTypes.push('allergies');
49
+ if (options.labResults)
50
+ requestedTypes.push('lab-results');
51
+ if (options.immunizations)
52
+ requestedTypes.push('immunizations');
53
+ if (options.vitalSigns)
54
+ requestedTypes.push('vital-signs');
55
+ if (options.supplements)
56
+ requestedTypes.push('supplements');
57
+ }
58
+ if (requestedTypes.length === 0) {
59
+ printError('No query filter specified. Use --medications, --conditions, --all, etc.', globalOpts);
60
+ process.exitCode = 1;
61
+ return;
62
+ }
63
+ // Process each requested data type
64
+ const queryResults = {};
65
+ // If --all, also discover any TTL files not in the registry
66
+ const extraFiles = [];
67
+ if (options.all) {
68
+ const allTtlFiles = await discoverTtlFiles(absDir);
69
+ const knownPaths = new Set(Object.values(DATA_TYPES).map((dt) => path.join(absDir, dt.directory, dt.filename)));
70
+ // Also exclude index.ttl, manifest.ttl, profile/card.ttl, type indexes
71
+ const excludePaths = new Set([
72
+ path.join(absDir, 'index.ttl'),
73
+ path.join(absDir, 'manifest.ttl'),
74
+ path.join(absDir, 'profile', 'card.ttl'),
75
+ path.join(absDir, 'settings', 'publicTypeIndex.ttl'),
76
+ path.join(absDir, 'settings', 'privateTypeIndex.ttl'),
77
+ ]);
78
+ for (const f of allTtlFiles) {
79
+ if (!knownPaths.has(f) && !excludePaths.has(f)) {
80
+ extraFiles.push(f);
81
+ }
82
+ }
83
+ }
84
+ for (const typeName of requestedTypes) {
85
+ const typeInfo = DATA_TYPES[typeName];
86
+ if (!typeInfo)
87
+ continue;
88
+ const filePath = path.join(absDir, typeInfo.directory, typeInfo.filename);
89
+ if (!(await fileExists(filePath))) {
90
+ printVerbose(`Skipping ${typeName}: file not found at ${filePath}`, globalOpts);
91
+ continue;
92
+ }
93
+ const { records, error } = await parseDataFile(filePath);
94
+ queryResults[typeName] = {
95
+ count: records.length,
96
+ file: `${typeInfo.directory}/${typeInfo.filename}`,
97
+ records: records.map((r) => ({
98
+ id: r.id,
99
+ type: r.type,
100
+ properties: r.properties,
101
+ })),
102
+ error,
103
+ };
104
+ }
105
+ // Process extra files found in --all mode
106
+ for (const extraFile of extraFiles) {
107
+ const relPath = path.relative(absDir, extraFile);
108
+ const baseName = path.basename(extraFile, '.ttl');
109
+ const { records, error } = await parseDataFile(extraFile);
110
+ if (records.length > 0) {
111
+ queryResults[baseName] = {
112
+ count: records.length,
113
+ file: relPath,
114
+ records: records.map((r) => ({
115
+ id: r.id,
116
+ type: r.type,
117
+ properties: r.properties,
118
+ })),
119
+ error,
120
+ };
121
+ }
122
+ }
123
+ // Output results
124
+ if (globalOpts.json) {
125
+ printResult({
126
+ pod: podDir,
127
+ dataTypes: queryResults,
128
+ }, globalOpts);
129
+ }
130
+ else {
131
+ // Human-readable output
132
+ const typeKeys = Object.keys(queryResults);
133
+ if (typeKeys.length === 0) {
134
+ console.log('No data found for the specified query filters.');
135
+ return;
136
+ }
137
+ for (const typeName of typeKeys) {
138
+ const data = queryResults[typeName];
139
+ const typeInfo = DATA_TYPES[typeName];
140
+ const displayLabel = typeInfo?.label ?? typeName;
141
+ console.log(`\n=== ${displayLabel} (${data.count} records) ===`);
142
+ if (data.error) {
143
+ console.log(` Error: ${data.error}`);
144
+ continue;
145
+ }
146
+ console.log(` File: ${data.file}\n`);
147
+ for (let i = 0; i < data.records.length; i++) {
148
+ const rec = data.records[i];
149
+ const label = extractLabelFromProps(rec.properties);
150
+ const idShort = rec.id.length > 40 ? rec.id.substring(0, 40) + '...' : rec.id;
151
+ console.log(` ${i + 1}. ${label ?? rec.type} (${idShort})`);
152
+ // Show key properties
153
+ const keyProps = selectKeyProperties(typeName, rec.properties);
154
+ for (const [key, value] of Object.entries(keyProps)) {
155
+ console.log(` ${key}: ${value}`);
156
+ }
157
+ console.log('');
158
+ }
159
+ }
160
+ }
161
+ }
162
+ catch (err) {
163
+ const message = err instanceof Error ? err.message : String(err);
164
+ printError(`Failed to query pod: ${message}`, globalOpts);
165
+ process.exitCode = 1;
166
+ }
167
+ });
168
+ }
169
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/commands/pod/query.ts"],"names":[],"mappings":"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"}