opentology 0.3.0 → 0.3.2

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.
@@ -27,7 +27,13 @@ export function registerDiff(program) {
27
27
  for (const triple of result.removed) {
28
28
  console.log(pc.red(`- ${triple}`));
29
29
  }
30
- console.log(`\n${result.added.length} added, ${result.removed.length} removed, ${result.unchanged} unchanged`);
30
+ const addedLabel = result.truncated && result.addedCount > result.added.length
31
+ ? `${result.added.length}/${result.addedCount} added (truncated)`
32
+ : `${result.addedCount} added`;
33
+ const removedLabel = result.truncated && result.removedCount > result.removed.length
34
+ ? `${result.removed.length}/${result.removedCount} removed (truncated)`
35
+ : `${result.removedCount} removed`;
36
+ console.log(`\n${addedLabel}, ${removedLabel}, ${result.unchanged} unchanged`);
31
37
  }
32
38
  catch (err) {
33
39
  const message = err.message;
@@ -75,11 +75,11 @@ export function generateSymbolTriples(result) {
75
75
  }
76
76
  }
77
77
  for (const call of result.methodCalls) {
78
- // Method calls reference by class.method pattern — generate a simple triple
79
- triples.push(`<urn:call:${encodeSegment(call.caller)}> <${OTX}calls> <urn:call:${encodeSegment(call.callee)}> .`);
80
- // Store caller/callee names for queryability
81
- triples.push(`<urn:call:${encodeSegment(call.caller)}> <${OTX}title> "${esc(call.caller)}" .`);
82
- triples.push(`<urn:call:${encodeSegment(call.callee)}> <${OTX}title> "${esc(call.callee)}" .`);
78
+ const callUri = `urn:call:${encodeSegment(call.caller)}--${encodeSegment(call.callee)}`;
79
+ triples.push(`<${callUri}> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <${OTX}MethodCall> .`);
80
+ triples.push(`<${callUri}> <${OTX}callerSymbol> "${esc(call.caller)}" .`);
81
+ triples.push(`<${callUri}> <${OTX}calleeSymbol> "${esc(call.callee)}" .`);
82
+ triples.push(`<${callUri}> <${OTX}title> "${esc(call.caller)} -> ${esc(call.callee)}" .`);
83
83
  }
84
84
  return triples;
85
85
  }
@@ -96,6 +96,8 @@ export async function deleteExistingSymbols(adapter, graphUri, modulePaths) {
96
96
  const modUri = moduleUri(modPath);
97
97
  await adapter.sparqlUpdate(`DELETE WHERE { GRAPH <${graphUri}> { ?s <${OTX}definedIn> <${modUri}> . ?s ?p ?o } }`);
98
98
  }
99
+ // Clean up MethodCall triples (no definedIn link, so delete all and re-insert)
100
+ await adapter.sparqlUpdate(`DELETE WHERE { GRAPH <${graphUri}> { ?s a <${OTX}MethodCall> . ?s ?p ?o } }`);
99
101
  }
100
102
  export async function pushSymbolTriples(adapter, graphUri, result) {
101
103
  // Collect all module paths for scoped delete
@@ -18,10 +18,13 @@ export declare class EmbeddedAdapter implements StoreAdapter {
18
18
  turtle?: string;
19
19
  where?: string;
20
20
  }): Promise<void>;
21
- diffGraph(graphUri: string, localTurtle: string): Promise<{
21
+ diffGraph(graphUri: string, localTurtle: string, limit?: number): Promise<{
22
22
  added: string[];
23
23
  removed: string[];
24
24
  unchanged: number;
25
+ addedCount: number;
26
+ removedCount: number;
27
+ truncated: boolean;
25
28
  }>;
26
29
  getSchemaOverview(graphUri: string): Promise<{
27
30
  prefixes: Record<string, string>;
@@ -148,7 +148,7 @@ export class EmbeddedAdapter {
148
148
  throw new Error('deleteTriples: either options.turtle or options.where must be provided');
149
149
  }
150
150
  }
151
- async diffGraph(graphUri, localTurtle) {
151
+ async diffGraph(graphUri, localTurtle, limit = 50) {
152
152
  const localQuads = await parseTurtle(localTurtle);
153
153
  const localSet = new Set(localQuads.map((q) => `${termToSparql(q.subject)} ${termToSparql(q.predicate)} ${termToSparql(q.object)}`));
154
154
  // Get remote quads from the store
@@ -158,10 +158,18 @@ export class EmbeddedAdapter {
158
158
  const n3q = wasmQuadToN3Quad(q);
159
159
  remoteSet.add(`${termToSparql(n3q.subject)} ${termToSparql(n3q.predicate)} ${termToSparql(n3q.object)}`);
160
160
  }
161
- const added = [...localSet].filter((t) => !remoteSet.has(t));
162
- const removed = [...remoteSet].filter((t) => !localSet.has(t));
161
+ const allAdded = [...localSet].filter((t) => !remoteSet.has(t));
162
+ const allRemoved = [...remoteSet].filter((t) => !localSet.has(t));
163
163
  const unchanged = [...localSet].filter((t) => remoteSet.has(t)).length;
164
- return { added, removed, unchanged };
164
+ const truncated = allAdded.length > limit || allRemoved.length > limit;
165
+ return {
166
+ added: allAdded.slice(0, limit),
167
+ removed: allRemoved.slice(0, limit),
168
+ unchanged,
169
+ addedCount: allAdded.length,
170
+ removedCount: allRemoved.length,
171
+ truncated,
172
+ };
165
173
  }
166
174
  async getSchemaOverview(graphUri) {
167
175
  const tripleCount = await this.getGraphTripleCount(graphUri);
@@ -14,10 +14,13 @@ export declare class HttpAdapter implements StoreAdapter {
14
14
  turtle?: string;
15
15
  where?: string;
16
16
  }): Promise<void>;
17
- diffGraph(graphUri: string, localTurtle: string): Promise<{
17
+ diffGraph(graphUri: string, localTurtle: string, limit?: number): Promise<{
18
18
  added: string[];
19
19
  removed: string[];
20
20
  unchanged: number;
21
+ addedCount: number;
22
+ removedCount: number;
23
+ truncated: boolean;
21
24
  }>;
22
25
  getSchemaOverview(graphUri: string): Promise<{
23
26
  prefixes: Record<string, string>;
@@ -115,7 +115,7 @@ export class HttpAdapter {
115
115
  throw new Error('deleteTriples: either options.turtle or options.where must be provided');
116
116
  }
117
117
  }
118
- async diffGraph(graphUri, localTurtle) {
118
+ async diffGraph(graphUri, localTurtle, limit = 50) {
119
119
  const localQuads = await parseTurtle(localTurtle);
120
120
  const localSet = new Set(localQuads.map((q) => `${termToSparql(q.subject)} ${termToSparql(q.predicate)} ${termToSparql(q.object)}`));
121
121
  // Fetch remote quads via CONSTRUCT
@@ -125,10 +125,18 @@ export class HttpAdapter {
125
125
  ? await parseTurtle(remoteTurtle)
126
126
  : [];
127
127
  const remoteSet = new Set(remoteQuads.map((q) => `${termToSparql(q.subject)} ${termToSparql(q.predicate)} ${termToSparql(q.object)}`));
128
- const added = [...localSet].filter((t) => !remoteSet.has(t));
129
- const removed = [...remoteSet].filter((t) => !localSet.has(t));
128
+ const allAdded = [...localSet].filter((t) => !remoteSet.has(t));
129
+ const allRemoved = [...remoteSet].filter((t) => !localSet.has(t));
130
130
  const unchanged = [...localSet].filter((t) => remoteSet.has(t)).length;
131
- return { added, removed, unchanged };
131
+ const truncated = allAdded.length > limit || allRemoved.length > limit;
132
+ return {
133
+ added: allAdded.slice(0, limit),
134
+ removed: allRemoved.slice(0, limit),
135
+ unchanged,
136
+ addedCount: allAdded.length,
137
+ removedCount: allRemoved.length,
138
+ truncated,
139
+ };
132
140
  }
133
141
  async getSchemaOverview(graphUri) {
134
142
  const tripleCount = await this.getGraphTripleCount(graphUri);
@@ -34,10 +34,13 @@ export interface StoreAdapter {
34
34
  }): Promise<void>;
35
35
  getGraphTripleCount(graphUri: string): Promise<number>;
36
36
  exportGraph(graphUri: string): Promise<string>;
37
- diffGraph(graphUri: string, localTurtle: string): Promise<{
37
+ diffGraph(graphUri: string, localTurtle: string, limit?: number): Promise<{
38
38
  added: string[];
39
39
  removed: string[];
40
40
  unchanged: number;
41
+ addedCount: number;
42
+ removedCount: number;
43
+ truncated: boolean;
41
44
  }>;
42
45
  getSchemaOverview(graphUri: string): Promise<{
43
46
  prefixes: Record<string, string>;
@@ -269,12 +269,13 @@ async function handleDiff(args) {
269
269
  if (!content) {
270
270
  throw new Error('content (Turtle) is required');
271
271
  }
272
+ const limit = typeof args.limit === 'number' ? args.limit : 50;
272
273
  const { config, graphUri } = resolveConfig({
273
274
  graphUri: args.graphUri,
274
275
  graph: args.graph,
275
276
  });
276
277
  const adapter = await createReadyAdapter(config);
277
- return await adapter.diffGraph(graphUri, content);
278
+ return await adapter.diffGraph(graphUri, content, limit);
278
279
  }
279
280
  async function handleGraphList(_args) {
280
281
  const config = loadConfig();
@@ -354,9 +355,11 @@ async function handleInfer(args) {
354
355
  if (clear) {
355
356
  await snapshotGraph(adapter, config, graphUri);
356
357
  await clearInferences(adapter, graphUri);
358
+ await persistGraph(adapter, config, graphUri);
357
359
  return { success: true, cleared: true };
358
360
  }
359
361
  const result = await materializeInferences(adapter, graphUri);
362
+ await persistGraph(adapter, config, graphUri);
360
363
  return result;
361
364
  }
362
365
  async function handleContextScan(args) {
@@ -389,7 +392,7 @@ async function handleContextScan(args) {
389
392
  pushStats,
390
393
  _experimental: true,
391
394
  _hint: pushStats
392
- ? `Symbol triples pushed: ${pushStats.triplesInserted} triples in ${pushStats.batchCount} batches. Query with: SELECT ?c WHERE { ?c a otx:Class ; otx:definedIn <urn:module:...> }`
395
+ ? `Symbol triples pushed: ${pushStats.triplesInserted} triples in ${pushStats.batchCount} batches. Query examples:\n- Classes: SELECT ?c ?name WHERE { ?c a otx:Class ; otx:title ?name }\n- Functions in a module: SELECT ?f ?name WHERE { ?f a otx:Function ; otx:title ?name ; otx:definedIn <urn:module:src/mcp/server> }\n- Call graph: SELECT ?caller ?callee WHERE { ?s a otx:MethodCall ; otx:callerSymbol ?caller ; otx:calleeSymbol ?callee }`
393
396
  : 'Deep scan completed but triple push failed. Use push manually with the generated triples.',
394
397
  };
395
398
  }
@@ -603,6 +606,7 @@ async function handleContextInit(args) {
603
606
  moduleStats,
604
607
  dependencyHint,
605
608
  hooksAutoInstalled: hooksChanged,
609
+ scanSuggestion: 'Run context_scan to populate the knowledge graph. Use depth="module" for file-level dependencies, or depth="symbol" (with includeMethodCalls=true) for class/function/call-level analysis. The symbol scan enables queries like "which functions call persistGraph?" from the graph.',
606
610
  };
607
611
  }
608
612
  async function handleContextLoad() {
@@ -1086,7 +1090,7 @@ export async function startMcpServer() {
1086
1090
  },
1087
1091
  {
1088
1092
  name: 'diff',
1089
- description: 'Compare local Turtle content against the remote graph. Returns added triples (in local but not remote), removed triples (in remote but not local), and count of unchanged triples.',
1093
+ description: 'Compare local Turtle content against the remote graph. Returns added triples (in local but not remote), removed triples (in remote but not local), and count of unchanged triples. Output is limited to avoid blowing up LLM context windows.',
1090
1094
  inputSchema: {
1091
1095
  type: 'object',
1092
1096
  properties: {
@@ -1094,6 +1098,10 @@ export async function startMcpServer() {
1094
1098
  type: 'string',
1095
1099
  description: 'Turtle (RDF) content to compare against the remote graph',
1096
1100
  },
1101
+ limit: {
1102
+ type: 'number',
1103
+ description: 'Maximum number of added/removed triples to return (default: 50). Total counts are always included.',
1104
+ },
1097
1105
  graph: {
1098
1106
  type: 'string',
1099
1107
  description: 'Logical graph name (as created by graph_create). Resolves to a graph URI via config.',
@@ -1408,9 +1416,12 @@ export async function startMcpServer() {
1408
1416
  case 'context_sync': {
1409
1417
  const syncConfig = loadConfig();
1410
1418
  const syncContextUri = `${syncConfig.graphUri}/context`;
1419
+ const syncSessionsUri = `${syncConfig.graphUri}/sessions`;
1411
1420
  const syncAdapter = await createReadyAdapter(syncConfig);
1412
1421
  await snapshotGraph(syncAdapter, syncConfig, syncContextUri);
1413
1422
  result = await syncContext(syncConfig, process.cwd());
1423
+ await persistGraph(syncAdapter, syncConfig, syncContextUri);
1424
+ await persistGraph(syncAdapter, syncConfig, syncSessionsUri);
1414
1425
  break;
1415
1426
  }
1416
1427
  case 'rollback':
@@ -7,7 +7,10 @@ export function generateContextSection(projectId, graphUri) {
7
7
  return `${MARKER_BEGIN}
8
8
  ## Context Management — OpenTology
9
9
 
10
- This project uses OpenTology as its project context graph.
10
+ This project uses OpenTology as its knowledge graph — treat it as the project's **long-term memory**.
11
+ Before reading source files, grep-searching, or making assumptions, **query the graph first**.
12
+ It holds architectural decisions, resolved issues, reusable patterns, module dependencies,
13
+ symbol-level call graphs, and session history. Prefer graph knowledge over re-deriving facts from code.
11
14
 
12
15
  ### Graph Structure
13
16
 
@@ -26,6 +29,12 @@ This project uses OpenTology as its project context graph.
26
29
  | \`otx:Knowledge\` | Reusable knowledge |
27
30
  | \`otx:Session\` | Session logs |
28
31
  | \`otx:Pattern\` | Recurring patterns/conventions |
32
+ | \`otx:Module\` | Source file module |
33
+ | \`otx:Class\` | Class definition (symbol scan) |
34
+ | \`otx:Interface\` | Interface definition (symbol scan) |
35
+ | \`otx:Function\` | Function definition (symbol scan) |
36
+ | \`otx:Method\` | Method definition (symbol scan) |
37
+ | \`otx:MethodCall\` | Call relationship between symbols (symbol scan) |
29
38
 
30
39
  | Property | Range | Description |
31
40
  |----------|-------|-------------|
@@ -36,6 +45,11 @@ This project uses OpenTology as its project context graph.
36
45
  | \`otx:reason\` | string | Decision rationale |
37
46
  | \`otx:nextTodo\` | string | Next action item |
38
47
  | \`otx:relatedTo\` | resource | Related entity |
48
+ | \`otx:dependsOn\` | Module | Module import dependency |
49
+ | \`otx:definedIn\` | Module | Which module a symbol belongs to |
50
+ | \`otx:callerSymbol\` | string | Caller in a MethodCall |
51
+ | \`otx:calleeSymbol\` | string | Callee in a MethodCall |
52
+ | \`otx:calls\` | resource | Call relationship |
39
53
 
40
54
  ### When to Record
41
55
 
@@ -107,13 +121,48 @@ If impact is **high**, inform the user of affected modules and get confirmation
107
121
 
108
122
  #### Searching the Knowledge Graph
109
123
 
110
- Use \`query\` with SPARQL to find anything in the project graph:
124
+ Use \`query\` with SPARQL to find anything in the project graph. **Always query the graph before reading source files** when investigating code structure, dependencies, or call relationships:
125
+
111
126
  - **Decisions**: \`?s a otx:Decision\` — why architectural choices were made
112
127
  - **Issues**: \`?s a otx:Issue ; otx:status "open"\` — known bugs and their status
113
128
  - **Knowledge**: \`?s a otx:Knowledge\` — reusable patterns and lessons learned
114
129
  - **Sessions**: query the sessions graph for past work logs and next TODOs
115
130
  - **Modules**: \`?s a otx:Module\` — all scanned source modules and their dependencies (\`otx:dependsOn\`)
116
131
  - **Symbols**: \`?s a otx:Class\`, \`otx:Interface\`, \`otx:Function\`, \`otx:Method\` — code-level entities (available after symbol-depth scan)
132
+ - **Call graph**: \`?s a otx:MethodCall\` — who calls whom (available after symbol scan with \`includeMethodCalls=true\`)
133
+
134
+ \`\`\`sparql
135
+ # Functions in a specific module
136
+ PREFIX otx: <https://opentology.dev/vocab#>
137
+ SELECT ?name WHERE {
138
+ GRAPH <${contextUri}> {
139
+ ?f a otx:Function ; otx:title ?name ; otx:definedIn <urn:module:src/mcp/server> .
140
+ }
141
+ }
142
+
143
+ # Who calls a specific function?
144
+ PREFIX otx: <https://opentology.dev/vocab#>
145
+ SELECT ?caller WHERE {
146
+ GRAPH <${contextUri}> {
147
+ ?s a otx:MethodCall ; otx:callerSymbol ?caller ; otx:calleeSymbol ?callee .
148
+ FILTER(CONTAINS(?callee, "persistGraph"))
149
+ }
150
+ }
151
+
152
+ # Module dependency chain (what depends on a module?)
153
+ PREFIX otx: <https://opentology.dev/vocab#>
154
+ SELECT ?dependent WHERE {
155
+ GRAPH <${contextUri}> {
156
+ ?dependent otx:dependsOn+ <urn:module:src/lib/store-adapter> .
157
+ }
158
+ }
159
+ \`\`\`
160
+
161
+ #### Post-Edit Graph Update
162
+
163
+ After significant code changes (new files, renamed functions, changed dependencies), run \`context_scan\` to keep the knowledge graph in sync:
164
+ - \`depth="module"\` — fast, updates file-level imports
165
+ - \`depth="symbol"\` with \`includeMethodCalls=true\` — thorough, updates class/function/call graph
117
166
 
118
167
  #### Other Useful Tools
119
168
 
@@ -1 +1 @@
1
- export declare const OTX_BOOTSTRAP_TURTLE = "@prefix otx: <https://opentology.dev/vocab#> .\n@prefix owl: <http://www.w3.org/2002/07/owl#> .\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\notx:Project a owl:Class .\notx:Decision a owl:Class .\notx:Issue a owl:Class .\notx:Knowledge a owl:Class .\notx:Session a owl:Class .\notx:Pattern a owl:Class .\notx:Module a owl:Class .\n\notx:title a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:date a owl:DatatypeProperty ; rdfs:range xsd:date .\notx:body a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:status a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:reason a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:cause a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:solution a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:nextTodo a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:relatedTo a owl:ObjectProperty .\notx:project a owl:ObjectProperty .\notx:dependsOn a owl:ObjectProperty ; rdfs:domain otx:Module ; rdfs:range otx:Module .\notx:stack a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:alternative a owl:DatatypeProperty ; rdfs:range xsd:string .\n\notx:Class a owl:Class .\notx:Interface a owl:Class .\notx:Function a owl:Class .\notx:Method a owl:Class .\n\notx:definedIn a owl:ObjectProperty ; rdfs:range otx:Module .\notx:extends a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Class .\notx:implements a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Interface .\notx:hasMethod a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Method .\notx:calls a owl:ObjectProperty ; rdfs:domain otx:Method ; rdfs:range otx:Method .\notx:returns a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:paramType a owl:DatatypeProperty ; rdfs:range xsd:string .\n";
1
+ export declare const OTX_BOOTSTRAP_TURTLE = "@prefix otx: <https://opentology.dev/vocab#> .\n@prefix owl: <http://www.w3.org/2002/07/owl#> .\n@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n\notx:Project a owl:Class .\notx:Decision a owl:Class .\notx:Issue a owl:Class .\notx:Knowledge a owl:Class .\notx:Session a owl:Class .\notx:Pattern a owl:Class .\notx:Module a owl:Class .\n\notx:title a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:date a owl:DatatypeProperty ; rdfs:range xsd:date .\notx:body a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:status a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:reason a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:cause a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:solution a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:nextTodo a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:relatedTo a owl:ObjectProperty .\notx:project a owl:ObjectProperty .\notx:dependsOn a owl:ObjectProperty ; rdfs:domain otx:Module ; rdfs:range otx:Module .\notx:stack a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:alternative a owl:DatatypeProperty ; rdfs:range xsd:string .\n\notx:Class a owl:Class .\notx:Interface a owl:Class .\notx:Function a owl:Class .\notx:Method a owl:Class .\notx:MethodCall a owl:Class .\n\notx:definedIn a owl:ObjectProperty ; rdfs:range otx:Module .\notx:extends a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Class .\notx:implements a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Interface .\notx:hasMethod a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Method .\notx:calls a owl:ObjectProperty .\notx:callerSymbol a owl:ObjectProperty ; rdfs:domain otx:MethodCall .\notx:calleeSymbol a owl:ObjectProperty ; rdfs:domain otx:MethodCall .\notx:returns a owl:DatatypeProperty ; rdfs:range xsd:string .\notx:paramType a owl:DatatypeProperty ; rdfs:range xsd:string .\n";
@@ -30,12 +30,15 @@ otx:Class a owl:Class .
30
30
  otx:Interface a owl:Class .
31
31
  otx:Function a owl:Class .
32
32
  otx:Method a owl:Class .
33
+ otx:MethodCall a owl:Class .
33
34
 
34
35
  otx:definedIn a owl:ObjectProperty ; rdfs:range otx:Module .
35
36
  otx:extends a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Class .
36
37
  otx:implements a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Interface .
37
38
  otx:hasMethod a owl:ObjectProperty ; rdfs:domain otx:Class ; rdfs:range otx:Method .
38
- otx:calls a owl:ObjectProperty ; rdfs:domain otx:Method ; rdfs:range otx:Method .
39
+ otx:calls a owl:ObjectProperty .
40
+ otx:callerSymbol a owl:ObjectProperty ; rdfs:domain otx:MethodCall .
41
+ otx:calleeSymbol a owl:ObjectProperty ; rdfs:domain otx:MethodCall .
39
42
  otx:returns a owl:DatatypeProperty ; rdfs:range xsd:string .
40
43
  otx:paramType a owl:DatatypeProperty ; rdfs:range xsd:string .
41
44
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opentology",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Ontology-powered project memory for AI coding assistants — your codebase as a knowledge graph",
5
5
  "type": "module",
6
6
  "bin": {