cortex-engine 0.4.1 → 0.5.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 (89) hide show
  1. package/README.md +63 -57
  2. package/dist/bin/anomalies-cmd.d.ts +17 -0
  3. package/dist/bin/anomalies-cmd.d.ts.map +1 -0
  4. package/dist/bin/anomalies-cmd.js +417 -0
  5. package/dist/bin/anomalies-cmd.js.map +1 -0
  6. package/dist/bin/cli.d.ts +5 -0
  7. package/dist/bin/cli.d.ts.map +1 -1
  8. package/dist/bin/cli.js +84 -0
  9. package/dist/bin/cli.js.map +1 -1
  10. package/dist/bin/health-cmd.d.ts +15 -0
  11. package/dist/bin/health-cmd.d.ts.map +1 -0
  12. package/dist/bin/health-cmd.js +273 -0
  13. package/dist/bin/health-cmd.js.map +1 -0
  14. package/dist/bin/init.d.ts.map +1 -1
  15. package/dist/bin/init.js +169 -12
  16. package/dist/bin/init.js.map +1 -1
  17. package/dist/bin/maintain-cmd.d.ts +17 -0
  18. package/dist/bin/maintain-cmd.d.ts.map +1 -0
  19. package/dist/bin/maintain-cmd.js +352 -0
  20. package/dist/bin/maintain-cmd.js.map +1 -0
  21. package/dist/bin/report-cmd.d.ts +17 -0
  22. package/dist/bin/report-cmd.d.ts.map +1 -0
  23. package/dist/bin/report-cmd.js +309 -0
  24. package/dist/bin/report-cmd.js.map +1 -0
  25. package/dist/bin/store-factory.d.ts +21 -0
  26. package/dist/bin/store-factory.d.ts.map +1 -0
  27. package/dist/bin/store-factory.js +64 -0
  28. package/dist/bin/store-factory.js.map +1 -0
  29. package/dist/bin/vitals-cmd.d.ts +16 -0
  30. package/dist/bin/vitals-cmd.d.ts.map +1 -0
  31. package/dist/bin/vitals-cmd.js +425 -0
  32. package/dist/bin/vitals-cmd.js.map +1 -0
  33. package/dist/core/types.d.ts +6 -0
  34. package/dist/core/types.d.ts.map +1 -1
  35. package/dist/engines/cognition.d.ts.map +1 -1
  36. package/dist/engines/cognition.js +39 -3
  37. package/dist/engines/cognition.js.map +1 -1
  38. package/dist/index.d.ts +8 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/mcp/tools.d.ts +1 -1
  43. package/dist/mcp/tools.d.ts.map +1 -1
  44. package/dist/mcp/tools.js +22 -2
  45. package/dist/mcp/tools.js.map +1 -1
  46. package/dist/tools/evolution-list.d.ts +6 -0
  47. package/dist/tools/evolution-list.d.ts.map +1 -0
  48. package/dist/tools/evolution-list.js +52 -0
  49. package/dist/tools/evolution-list.js.map +1 -0
  50. package/dist/tools/evolve.d.ts +6 -0
  51. package/dist/tools/evolve.d.ts.map +1 -0
  52. package/dist/tools/evolve.js +63 -0
  53. package/dist/tools/evolve.js.map +1 -0
  54. package/dist/tools/journal-read.d.ts +6 -0
  55. package/dist/tools/journal-read.d.ts.map +1 -0
  56. package/dist/tools/journal-read.js +59 -0
  57. package/dist/tools/journal-read.js.map +1 -0
  58. package/dist/tools/journal-write.d.ts +6 -0
  59. package/dist/tools/journal-write.d.ts.map +1 -0
  60. package/dist/tools/journal-write.js +71 -0
  61. package/dist/tools/journal-write.js.map +1 -0
  62. package/dist/tools/thread-create.d.ts +6 -0
  63. package/dist/tools/thread-create.d.ts.map +1 -0
  64. package/dist/tools/thread-create.js +57 -0
  65. package/dist/tools/thread-create.js.map +1 -0
  66. package/dist/tools/thread-resolve.d.ts +6 -0
  67. package/dist/tools/thread-resolve.d.ts.map +1 -0
  68. package/dist/tools/thread-resolve.js +42 -0
  69. package/dist/tools/thread-resolve.js.map +1 -0
  70. package/dist/tools/thread-update.d.ts +6 -0
  71. package/dist/tools/thread-update.d.ts.map +1 -0
  72. package/dist/tools/thread-update.js +91 -0
  73. package/dist/tools/thread-update.js.map +1 -0
  74. package/dist/tools/threads-list.d.ts +6 -0
  75. package/dist/tools/threads-list.d.ts.map +1 -0
  76. package/dist/tools/threads-list.js +70 -0
  77. package/dist/tools/threads-list.js.map +1 -0
  78. package/fozikio.json +14 -0
  79. package/hooks/cognitive-grounding.sh +26 -0
  80. package/hooks/cortex-telemetry.sh +53 -0
  81. package/hooks/observe-first.sh +25 -0
  82. package/hooks/project-board-gate.sh +195 -0
  83. package/hooks/session-lifecycle.sh +21 -0
  84. package/package.json +119 -107
  85. package/reflex-rules/cognitive-grounding.yaml +17 -0
  86. package/reflex-rules/note-about-doing.yaml +17 -0
  87. package/reflex-rules/observe-first.yaml +17 -0
  88. package/skills/cortex-query/SKILL.md +86 -0
  89. package/skills/cortex-review/SKILL.md +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-create.d.ts","sourceRoot":"","sources":["../../src/tools/thread-create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,iBAAiB,CAAC;AAInE,eAAO,MAAM,gBAAgB,EAAE,cAsD9B,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * thread_create — create a new thought thread.
3
+ */
4
+ const COLLECTION = 'threads_v2';
5
+ export const threadCreateTool = {
6
+ name: 'thread_create',
7
+ description: 'Create a new thought thread for tracking ongoing questions, explorations, or topics.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ title: { type: 'string', description: 'Short thread name' },
12
+ body: { type: 'string', description: 'Current state description' },
13
+ kind: { type: 'string', description: "Thread kind: 'work' | 'exploration' | 'creative' | 'revenue' | 'meta'" },
14
+ tags: { type: 'array', items: { type: 'string' }, description: 'Array of tags' },
15
+ priority: { type: 'number', description: 'Priority 0-1 (default 0.5)' },
16
+ project: { type: 'string', description: 'Project scope for filtered queries' },
17
+ next_step: { type: 'string', description: 'Actionable next move' },
18
+ namespace: { type: 'string', description: 'Namespace (defaults to default)' },
19
+ },
20
+ required: ['title', 'body'],
21
+ },
22
+ async handler(args, ctx) {
23
+ const title = typeof args['title'] === 'string' ? args['title'] : '';
24
+ const body = typeof args['body'] === 'string' ? args['body'] : '';
25
+ if (!title)
26
+ return { error: 'title is required' };
27
+ if (!body)
28
+ return { error: 'body is required' };
29
+ const kind = typeof args['kind'] === 'string' ? args['kind'] : 'exploration';
30
+ const project = typeof args['project'] === 'string' ? args['project'] : null;
31
+ const tags = Array.isArray(args['tags']) ? args['tags'] : [];
32
+ const priority = typeof args['priority'] === 'number' ? args['priority'] : 0.5;
33
+ const nextStep = typeof args['next_step'] === 'string' ? args['next_step'] : undefined;
34
+ const namespace = typeof args['namespace'] === 'string' ? args['namespace'] : undefined;
35
+ const store = ctx.namespaces.getStore(namespace);
36
+ const now = new Date().toISOString();
37
+ const doc = {
38
+ title,
39
+ body,
40
+ kind,
41
+ project,
42
+ tags,
43
+ status: 'open',
44
+ priority,
45
+ updates: [],
46
+ session_refs: [],
47
+ related_memory_ids: [],
48
+ created_at: now,
49
+ updated_at: now,
50
+ };
51
+ if (nextStep !== undefined)
52
+ doc['next_step'] = nextStep;
53
+ const id = await store.put(COLLECTION, doc);
54
+ return { id, title, body, kind, project, status: 'open', priority };
55
+ },
56
+ };
57
+ //# sourceMappingURL=thread-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-create.js","sourceRoot":"","sources":["../../src/tools/thread-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * thread_resolve — resolve a thread with a resolution note.
3
+ */
4
+ import type { ToolDefinition } from '../mcp/tools.js';
5
+ export declare const threadResolveTool: ToolDefinition;
6
+ //# sourceMappingURL=thread-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-resolve.d.ts","sourceRoot":"","sources":["../../src/tools/thread-resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,iBAAiB,CAAC;AAInE,eAAO,MAAM,iBAAiB,EAAE,cAuC/B,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * thread_resolve — resolve a thread with a resolution note.
3
+ */
4
+ const COLLECTION = 'threads_v2';
5
+ export const threadResolveTool = {
6
+ name: 'thread_resolve',
7
+ description: 'Resolve a thread with a resolution note.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ id: { type: 'string', description: 'Thread ID' },
12
+ resolution: { type: 'string', description: 'How/why it was resolved' },
13
+ namespace: { type: 'string', description: 'Namespace (defaults to default)' },
14
+ },
15
+ required: ['id', 'resolution'],
16
+ },
17
+ async handler(args, ctx) {
18
+ const id = typeof args['id'] === 'string' ? args['id'] : '';
19
+ const resolution = typeof args['resolution'] === 'string' ? args['resolution'] : '';
20
+ if (!id)
21
+ return { error: 'id is required' };
22
+ if (!resolution)
23
+ return { error: 'resolution is required' };
24
+ const namespace = typeof args['namespace'] === 'string' ? args['namespace'] : undefined;
25
+ const store = ctx.namespaces.getStore(namespace);
26
+ const existing = await store.get(COLLECTION, id);
27
+ if (!existing)
28
+ return { error: `Thread not found: ${id}` };
29
+ const now = new Date().toISOString();
30
+ const existingUpdates = Array.isArray(existing['updates']) ? existing['updates'] : [];
31
+ const resolveEntry = { timestamp: now, content: `Resolved: ${resolution}` };
32
+ await store.update(COLLECTION, id, {
33
+ status: 'resolved',
34
+ resolved_at: now,
35
+ resolution,
36
+ updated_at: now,
37
+ updates: [...existingUpdates, resolveEntry],
38
+ });
39
+ return { id, status: 'resolved', resolution };
40
+ },
41
+ };
42
+ //# sourceMappingURL=thread-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-resolve.js","sourceRoot":"","sources":["../../src/tools/thread-resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,0CAA0C;IACvD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE;YAChD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;YACtE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;SAC9E;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC;KAC/B;IAED,KAAK,CAAC,OAAO,CAAC,IAA6B,EAAE,GAAgB;QAC3D,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAE5D,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE,CAAC;QAE3D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAA8B,CAAC,CAAC,CAAC,EAAE,CAAC;QACnH,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,UAAU,EAAE,EAAE,CAAC;QAE5E,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE;YACjC,MAAM,EAAE,UAAU;YAClB,WAAW,EAAE,GAAG;YAChB,UAAU;YACV,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,CAAC,GAAG,eAAe,EAAE,YAAY,CAAC;SAC5C,CAAC,CAAC;QAEH,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IAChD,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * thread_update — update a thread's status, content, or metadata.
3
+ */
4
+ import type { ToolDefinition } from '../mcp/tools.js';
5
+ export declare const threadUpdateTool: ToolDefinition;
6
+ //# sourceMappingURL=thread-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-update.d.ts","sourceRoot":"","sources":["../../src/tools/thread-update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,iBAAiB,CAAC;AAInE,eAAO,MAAM,gBAAgB,EAAE,cAsF9B,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * thread_update — update a thread's status, content, or metadata.
3
+ */
4
+ const COLLECTION = 'threads_v2';
5
+ export const threadUpdateTool = {
6
+ name: 'thread_update',
7
+ description: 'Update a thread — change status, edit title/body, add session refs, link memories.',
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ id: { type: 'string', description: 'Thread ID' },
12
+ title: { type: 'string', description: 'New title' },
13
+ body: { type: 'string', description: 'New body text' },
14
+ kind: { type: 'string', description: "Thread kind: 'work' | 'exploration' | 'creative' | 'revenue' | 'meta'" },
15
+ status: { type: 'string', description: 'New status: open, active, blocked, parked, resolved' },
16
+ blocked_by: { type: 'string', description: 'What is blocking this thread — auto-sets status to blocked' },
17
+ next_step: { type: 'string', description: 'Actionable next move' },
18
+ update_note: { type: 'string', description: 'Progress note to append to updates log' },
19
+ add_session_ref: { type: 'string', description: 'Session date to append' },
20
+ project: { type: 'string', description: 'Set or change project scope' },
21
+ add_memory_id: { type: 'string', description: 'Memory ID to link' },
22
+ priority: { type: 'number', description: 'New priority 0-1' },
23
+ tags: { type: 'array', items: { type: 'string' }, description: 'Replace tags entirely' },
24
+ namespace: { type: 'string', description: 'Namespace (defaults to default)' },
25
+ },
26
+ required: ['id'],
27
+ },
28
+ async handler(args, ctx) {
29
+ const id = typeof args['id'] === 'string' ? args['id'] : '';
30
+ if (!id)
31
+ return { error: 'id is required' };
32
+ const namespace = typeof args['namespace'] === 'string' ? args['namespace'] : undefined;
33
+ const store = ctx.namespaces.getStore(namespace);
34
+ const existing = await store.get(COLLECTION, id);
35
+ if (!existing)
36
+ return { error: `Thread not found: ${id}` };
37
+ const now = new Date().toISOString();
38
+ const updates = { updated_at: now };
39
+ if (typeof args['title'] === 'string')
40
+ updates['title'] = args['title'];
41
+ if (typeof args['body'] === 'string')
42
+ updates['body'] = args['body'];
43
+ if (typeof args['kind'] === 'string')
44
+ updates['kind'] = args['kind'];
45
+ if (typeof args['status'] === 'string')
46
+ updates['status'] = args['status'];
47
+ if (typeof args['next_step'] === 'string')
48
+ updates['next_step'] = args['next_step'];
49
+ if (typeof args['project'] === 'string')
50
+ updates['project'] = args['project'] || null;
51
+ if (typeof args['priority'] === 'number')
52
+ updates['priority'] = args['priority'];
53
+ if (Array.isArray(args['tags']))
54
+ updates['tags'] = args['tags'];
55
+ // Append to session_refs array
56
+ if (typeof args['add_session_ref'] === 'string') {
57
+ const refs = Array.isArray(existing['session_refs']) ? existing['session_refs'] : [];
58
+ if (!refs.includes(args['add_session_ref'])) {
59
+ updates['session_refs'] = [...refs, args['add_session_ref']];
60
+ }
61
+ }
62
+ // Append to related_memory_ids array
63
+ if (typeof args['add_memory_id'] === 'string') {
64
+ const ids = Array.isArray(existing['related_memory_ids']) ? existing['related_memory_ids'] : [];
65
+ if (!ids.includes(args['add_memory_id'])) {
66
+ updates['related_memory_ids'] = [...ids, args['add_memory_id']];
67
+ }
68
+ }
69
+ // Handle blocked_by — auto-set status
70
+ if (typeof args['blocked_by'] === 'string') {
71
+ updates['blocked_by'] = args['blocked_by'];
72
+ updates['status'] = 'blocked';
73
+ }
74
+ // Append update note
75
+ if (typeof args['update_note'] === 'string') {
76
+ const existingUpdates = Array.isArray(existing['updates']) ? existing['updates'] : [];
77
+ const entry = {
78
+ timestamp: now,
79
+ content: args['update_note'],
80
+ };
81
+ if (typeof args['add_session_ref'] === 'string') {
82
+ entry['session_ref'] = args['add_session_ref'];
83
+ }
84
+ updates['updates'] = [...existingUpdates, entry];
85
+ }
86
+ await store.update(COLLECTION, id, updates);
87
+ const updated = await store.get(COLLECTION, id);
88
+ return { id, ...updated };
89
+ },
90
+ };
91
+ //# sourceMappingURL=thread-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-update.js","sourceRoot":"","sources":["../../src/tools/thread-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * threads_list — list thought threads with filters.
3
+ */
4
+ import type { ToolDefinition } from '../mcp/tools.js';
5
+ export declare const threadsListTool: ToolDefinition;
6
+ //# sourceMappingURL=threads-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads-list.d.ts","sourceRoot":"","sources":["../../src/tools/threads-list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,iBAAiB,CAAC;AAKnE,eAAO,MAAM,eAAe,EAAE,cAuE7B,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * threads_list — list thought threads with filters.
3
+ */
4
+ const COLLECTION = 'threads_v2';
5
+ export const threadsListTool = {
6
+ name: 'threads_list',
7
+ description: "List thought threads. Filter by status (default 'open'), project, kind, or tag.",
8
+ inputSchema: {
9
+ type: 'object',
10
+ properties: {
11
+ status: { type: 'string', description: "Filter by status: open, active, blocked, parked, resolved (default 'open')" },
12
+ project: { type: 'string', description: 'Filter by project scope' },
13
+ kind: { type: 'string', description: "Filter by kind: 'work' | 'exploration' | 'creative' | 'revenue' | 'meta'" },
14
+ tag: { type: 'string', description: 'Filter by tag' },
15
+ limit: { type: 'number', description: 'Max threads to return (default 50)' },
16
+ namespace: { type: 'string', description: 'Namespace (defaults to default)' },
17
+ },
18
+ },
19
+ async handler(args, ctx) {
20
+ const status = typeof args['status'] === 'string' ? args['status'] : 'open';
21
+ const project = typeof args['project'] === 'string' ? args['project'] : undefined;
22
+ const kind = typeof args['kind'] === 'string' ? args['kind'] : undefined;
23
+ const tag = typeof args['tag'] === 'string' ? args['tag'] : undefined;
24
+ const limit = typeof args['limit'] === 'number' ? args['limit'] : 50;
25
+ const namespace = typeof args['namespace'] === 'string' ? args['namespace'] : undefined;
26
+ const store = ctx.namespaces.getStore(namespace);
27
+ // Build filters
28
+ const filters = [
29
+ { field: 'status', op: '==', value: status },
30
+ ];
31
+ if (project) {
32
+ filters.push({ field: 'project', op: '==', value: project });
33
+ }
34
+ if (tag) {
35
+ filters.push({ field: 'tags', op: 'array-contains', value: tag });
36
+ }
37
+ const docs = await store.query(COLLECTION, filters, {
38
+ limit,
39
+ orderBy: 'priority',
40
+ orderDir: 'desc',
41
+ });
42
+ // Client-side kind filter (not all stores support compound queries efficiently)
43
+ let threads = docs.map(d => ({
44
+ id: d['id'],
45
+ title: d['title'],
46
+ body: d['body'],
47
+ kind: d['kind'],
48
+ project: d['project'] ?? null,
49
+ priority: d['priority'],
50
+ status: d['status'],
51
+ next_step: d['next_step'],
52
+ tags: d['tags'],
53
+ updates_count: Array.isArray(d['updates']) ? d['updates'].length : 0,
54
+ created_at: d['created_at'],
55
+ updated_at: d['updated_at'],
56
+ }));
57
+ if (kind) {
58
+ threads = threads.filter(t => t.kind === kind);
59
+ }
60
+ return {
61
+ status,
62
+ project: project ?? 'all',
63
+ kind: kind ?? 'all',
64
+ filter: tag ?? 'all',
65
+ count: threads.length,
66
+ threads,
67
+ };
68
+ },
69
+ };
70
+ //# sourceMappingURL=threads-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threads-list.js","sourceRoot":"","sources":["../../src/tools/threads-list.ts"],"names":[],"mappings":"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"}
package/fozikio.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "cortex-engine",
3
+ "version": "0.4.1",
4
+ "description": "Portable cognitive engine for AI agents — semantic memory, embeddings, dream consolidation, MCP server",
5
+ "requires": {
6
+ "cortex_api": ">=0.3.0"
7
+ },
8
+ "contents": {
9
+ "hooks": ["cognitive-grounding", "observe-first", "cortex-telemetry", "session-lifecycle", "project-board-gate"],
10
+ "reflex_rules": ["cognitive-grounding", "observe-first", "note-about-doing"],
11
+ "skills": ["cortex-query", "cortex-review"],
12
+ "agents": ["cortex-researcher"]
13
+ }
14
+ }
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env bash
2
+ # ============================================================================
3
+ # cognitive-grounding.sh — Claude Code Hook
4
+ # ============================================================================
5
+ # Event: UserPromptSubmit
6
+ # Purpose: Reminds agents to call cortex query() before substantive work
7
+ # (evaluation, design, review, architecture, etc.)
8
+ # How: Pattern-matches the user prompt for cognitive-work keywords.
9
+ # If matched, injects a system message nudging the agent to query().
10
+ # Disable: Delete this file from .claude/hooks/ — no other config needed.
11
+ # Part of: fozikio — portable, no project-specific paths.
12
+ # ============================================================================
13
+
14
+ INPUT=$(cat)
15
+ PROMPT=$(echo "$INPUT" | jq -r '.user_prompt // ""' 2>/dev/null)
16
+
17
+ # Check if prompt involves evaluation/design/review work
18
+ if echo "$PROMPT" | grep -qiE '(evaluat|review|design|assess|analyz|creat|build|architect|plan|propos|critique|audit|diagnos)'; then
19
+ cat <<'EOF'
20
+ {
21
+ "systemMessage": "**[fozikio: cognitive-grounding]**\nThis prompt involves substantive cognitive work. Before responding, call `query()` on the topic to ground your work in accumulated experience.\n\n```\nmcp__cortex__query({ text: \"[the topic]\" })\n```"
22
+ }
23
+ EOF
24
+ else
25
+ echo '{}'
26
+ fi
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env bash
2
+ # ============================================================================
3
+ # cortex-telemetry.sh — Claude Code Hook
4
+ # ============================================================================
5
+ # Event: PostToolUse
6
+ # Purpose: Tracks cortex retrieval tool usage and detects retries (repeat
7
+ # retrieval calls within 60s), sending feedback to the cortex API
8
+ # for retrieval quality improvement.
9
+ # How: Logs each cortex retrieval call (query, recall, wander, etc.) to
10
+ # .claude/state/cortex-calls.log. If two calls happen within 60s,
11
+ # POSTs a "retry" signal to CORTEX_API_URL/api/v2/retrieval-feedback.
12
+ # Env: CORTEX_API_URL, CORTEX_API_TOKEN (optional — skips API call if unset)
13
+ # Disable: Delete this file from .claude/hooks/ — no other config needed.
14
+ # Part of: fozikio — portable, fire-and-forget HTTP calls.
15
+ # ============================================================================
16
+
17
+ INPUT=$(cat)
18
+ TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
19
+ TIMESTAMP=$(date +%s)
20
+ STATE_DIR="${CLAUDE_PROJECT_DIR:-.}/.claude/state"
21
+ LOG_FILE="$STATE_DIR/cortex-calls.log"
22
+
23
+ # Only track cortex retrieval tools
24
+ case "$TOOL_NAME" in
25
+ mcp__cortex__query|mcp__cortex__recall|mcp__cortex__wander|mcp__cortex__neighbors|mcp__cortex__surface|mcp__cortex__retrieve)
26
+ mkdir -p "$STATE_DIR"
27
+
28
+ # Read previous entry BEFORE appending current
29
+ PREV=$(tail -1 "$LOG_FILE" 2>/dev/null || echo "")
30
+ PREV_TS=$(echo "$PREV" | cut -d' ' -f1)
31
+ PREV_TOOL=$(echo "$PREV" | cut -d' ' -f2-)
32
+
33
+ # Log current call
34
+ echo "$TIMESTAMP $TOOL_NAME" >> "$LOG_FILE"
35
+
36
+ # Check if this is a retry (another cortex call within 60s)
37
+ if [ -n "$PREV_TS" ] && [ "$((TIMESTAMP - PREV_TS))" -lt 60 ] 2>/dev/null; then
38
+ # Post feedback to cortex API (fire and forget)
39
+ CORTEX_API_URL="${CORTEX_API_URL:-}"
40
+ CORTEX_API_TOKEN="${CORTEX_API_TOKEN:-}"
41
+ if [ -n "$CORTEX_API_URL" ] && [ -n "$CORTEX_API_TOKEN" ]; then
42
+ curl -s --max-time 3 "$CORTEX_API_URL/api/v2/retrieval-feedback" \
43
+ -H "x-cortex-token: $CORTEX_API_TOKEN" \
44
+ -H "Content-Type: application/json" \
45
+ -d "{\"original_tool\":\"$PREV_TOOL\",\"retry_tool\":\"$TOOL_NAME\",\"signal\":\"retry\",\"timestamp\":$TIMESTAMP}" \
46
+ > /dev/null 2>&1 &
47
+ fi
48
+ fi
49
+ ;;
50
+ esac
51
+
52
+ # Always output empty JSON (non-blocking hook)
53
+ echo '{}'
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env bash
2
+ # ============================================================================
3
+ # observe-first.sh — Claude Code Hook
4
+ # ============================================================================
5
+ # Event: PreToolUse (Write, Edit)
6
+ # Purpose: Reminds agents to call observe() or query() before writing to
7
+ # memory directories (Mind/, Journal/, memory/).
8
+ # How: Checks the file path of Write/Edit operations. If targeting a
9
+ # memory directory, injects a system message reminder.
10
+ # Disable: Delete this file from .claude/hooks/ — no other config needed.
11
+ # Part of: fozikio — portable, no project-specific paths.
12
+ # ============================================================================
13
+
14
+ INPUT=$(cat)
15
+ FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // ""' 2>/dev/null)
16
+
17
+ if echo "$FILE_PATH" | grep -qiE '(Mind|Journal|memory)'; then
18
+ cat <<'EOF'
19
+ {
20
+ "systemMessage": "**[fozikio: observe-first]**\nWriting to a memory directory. Have you called observe() or query() first? Memory writes should be grounded in cortex context."
21
+ }
22
+ EOF
23
+ else
24
+ echo '{}'
25
+ fi