@iwo-szapar/data-mcp 0.1.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 (213) hide show
  1. package/dist/adapter/factory.d.ts +9 -0
  2. package/dist/adapter/factory.d.ts.map +1 -0
  3. package/dist/adapter/factory.js +23 -0
  4. package/dist/adapter/factory.js.map +1 -0
  5. package/dist/adapter/pocketbase.d.ts +37 -0
  6. package/dist/adapter/pocketbase.d.ts.map +1 -0
  7. package/dist/adapter/pocketbase.js +350 -0
  8. package/dist/adapter/pocketbase.js.map +1 -0
  9. package/dist/adapter/schema-map.d.ts +45 -0
  10. package/dist/adapter/schema-map.d.ts.map +1 -0
  11. package/dist/adapter/schema-map.js +75 -0
  12. package/dist/adapter/schema-map.js.map +1 -0
  13. package/dist/adapter/supabase.d.ts +32 -0
  14. package/dist/adapter/supabase.d.ts.map +1 -0
  15. package/dist/adapter/supabase.js +294 -0
  16. package/dist/adapter/supabase.js.map +1 -0
  17. package/dist/adapter/types.d.ts +67 -0
  18. package/dist/adapter/types.d.ts.map +1 -0
  19. package/dist/adapter/types.js +9 -0
  20. package/dist/adapter/types.js.map +1 -0
  21. package/dist/config.d.ts +31 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +62 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/errors/adapter-error.d.ts +12 -0
  26. package/dist/errors/adapter-error.d.ts.map +1 -0
  27. package/dist/errors/adapter-error.js +15 -0
  28. package/dist/errors/adapter-error.js.map +1 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +27 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/search/alias-expansion.d.ts +53 -0
  34. package/dist/search/alias-expansion.d.ts.map +1 -0
  35. package/dist/search/alias-expansion.js +131 -0
  36. package/dist/search/alias-expansion.js.map +1 -0
  37. package/dist/server.d.ts +9 -0
  38. package/dist/server.d.ts.map +1 -0
  39. package/dist/server.js +40 -0
  40. package/dist/server.js.map +1 -0
  41. package/dist/tools/business/blog-create.d.ts +9 -0
  42. package/dist/tools/business/blog-create.d.ts.map +1 -0
  43. package/dist/tools/business/blog-create.js +53 -0
  44. package/dist/tools/business/blog-create.js.map +1 -0
  45. package/dist/tools/business/blog-delete.d.ts +9 -0
  46. package/dist/tools/business/blog-delete.d.ts.map +1 -0
  47. package/dist/tools/business/blog-delete.js +29 -0
  48. package/dist/tools/business/blog-delete.js.map +1 -0
  49. package/dist/tools/business/blog-list.d.ts +9 -0
  50. package/dist/tools/business/blog-list.d.ts.map +1 -0
  51. package/dist/tools/business/blog-list.js +37 -0
  52. package/dist/tools/business/blog-list.js.map +1 -0
  53. package/dist/tools/business/blog-update.d.ts +9 -0
  54. package/dist/tools/business/blog-update.d.ts.map +1 -0
  55. package/dist/tools/business/blog-update.js +66 -0
  56. package/dist/tools/business/blog-update.js.map +1 -0
  57. package/dist/tools/business/content-queue-add.d.ts +9 -0
  58. package/dist/tools/business/content-queue-add.d.ts.map +1 -0
  59. package/dist/tools/business/content-queue-add.js +40 -0
  60. package/dist/tools/business/content-queue-add.js.map +1 -0
  61. package/dist/tools/business/content-queue-list.d.ts +9 -0
  62. package/dist/tools/business/content-queue-list.d.ts.map +1 -0
  63. package/dist/tools/business/content-queue-list.js +41 -0
  64. package/dist/tools/business/content-queue-list.js.map +1 -0
  65. package/dist/tools/business/email-queue-add.d.ts +9 -0
  66. package/dist/tools/business/email-queue-add.d.ts.map +1 -0
  67. package/dist/tools/business/email-queue-add.js +47 -0
  68. package/dist/tools/business/email-queue-add.js.map +1 -0
  69. package/dist/tools/business/prospect-create.d.ts +9 -0
  70. package/dist/tools/business/prospect-create.d.ts.map +1 -0
  71. package/dist/tools/business/prospect-create.js +50 -0
  72. package/dist/tools/business/prospect-create.js.map +1 -0
  73. package/dist/tools/business/prospect-list.d.ts +9 -0
  74. package/dist/tools/business/prospect-list.d.ts.map +1 -0
  75. package/dist/tools/business/prospect-list.js +37 -0
  76. package/dist/tools/business/prospect-list.js.map +1 -0
  77. package/dist/tools/business/prospect-search.d.ts +9 -0
  78. package/dist/tools/business/prospect-search.d.ts.map +1 -0
  79. package/dist/tools/business/prospect-search.js +29 -0
  80. package/dist/tools/business/prospect-search.js.map +1 -0
  81. package/dist/tools/business/prospect-update.d.ts +9 -0
  82. package/dist/tools/business/prospect-update.d.ts.map +1 -0
  83. package/dist/tools/business/prospect-update.js +68 -0
  84. package/dist/tools/business/prospect-update.js.map +1 -0
  85. package/dist/tools/memory/brain-decay.d.ts +11 -0
  86. package/dist/tools/memory/brain-decay.d.ts.map +1 -0
  87. package/dist/tools/memory/brain-decay.js +58 -0
  88. package/dist/tools/memory/brain-decay.js.map +1 -0
  89. package/dist/tools/memory/brain-stats.d.ts +11 -0
  90. package/dist/tools/memory/brain-stats.d.ts.map +1 -0
  91. package/dist/tools/memory/brain-stats.js +63 -0
  92. package/dist/tools/memory/brain-stats.js.map +1 -0
  93. package/dist/tools/memory/contact-create.d.ts +9 -0
  94. package/dist/tools/memory/contact-create.d.ts.map +1 -0
  95. package/dist/tools/memory/contact-create.js +42 -0
  96. package/dist/tools/memory/contact-create.js.map +1 -0
  97. package/dist/tools/memory/contact-list.d.ts +9 -0
  98. package/dist/tools/memory/contact-list.d.ts.map +1 -0
  99. package/dist/tools/memory/contact-list.js +30 -0
  100. package/dist/tools/memory/contact-list.js.map +1 -0
  101. package/dist/tools/memory/contact-search.d.ts +9 -0
  102. package/dist/tools/memory/contact-search.d.ts.map +1 -0
  103. package/dist/tools/memory/contact-search.js +29 -0
  104. package/dist/tools/memory/contact-search.js.map +1 -0
  105. package/dist/tools/memory/contact-update.d.ts +9 -0
  106. package/dist/tools/memory/contact-update.d.ts.map +1 -0
  107. package/dist/tools/memory/contact-update.js +59 -0
  108. package/dist/tools/memory/contact-update.js.map +1 -0
  109. package/dist/tools/memory/goal-create.d.ts +9 -0
  110. package/dist/tools/memory/goal-create.d.ts.map +1 -0
  111. package/dist/tools/memory/goal-create.js +40 -0
  112. package/dist/tools/memory/goal-create.js.map +1 -0
  113. package/dist/tools/memory/goal-list.d.ts +9 -0
  114. package/dist/tools/memory/goal-list.d.ts.map +1 -0
  115. package/dist/tools/memory/goal-list.js +41 -0
  116. package/dist/tools/memory/goal-list.js.map +1 -0
  117. package/dist/tools/memory/goal-update.d.ts +9 -0
  118. package/dist/tools/memory/goal-update.d.ts.map +1 -0
  119. package/dist/tools/memory/goal-update.js +51 -0
  120. package/dist/tools/memory/goal-update.js.map +1 -0
  121. package/dist/tools/memory/knowledge-decide.d.ts +10 -0
  122. package/dist/tools/memory/knowledge-decide.d.ts.map +1 -0
  123. package/dist/tools/memory/knowledge-decide.js +39 -0
  124. package/dist/tools/memory/knowledge-decide.js.map +1 -0
  125. package/dist/tools/memory/knowledge-delete.d.ts +10 -0
  126. package/dist/tools/memory/knowledge-delete.d.ts.map +1 -0
  127. package/dist/tools/memory/knowledge-delete.js +33 -0
  128. package/dist/tools/memory/knowledge-delete.js.map +1 -0
  129. package/dist/tools/memory/knowledge-learn.d.ts +10 -0
  130. package/dist/tools/memory/knowledge-learn.d.ts.map +1 -0
  131. package/dist/tools/memory/knowledge-learn.js +39 -0
  132. package/dist/tools/memory/knowledge-learn.js.map +1 -0
  133. package/dist/tools/memory/knowledge-list.d.ts +9 -0
  134. package/dist/tools/memory/knowledge-list.d.ts.map +1 -0
  135. package/dist/tools/memory/knowledge-list.js +43 -0
  136. package/dist/tools/memory/knowledge-list.js.map +1 -0
  137. package/dist/tools/memory/knowledge-recall.d.ts +11 -0
  138. package/dist/tools/memory/knowledge-recall.d.ts.map +1 -0
  139. package/dist/tools/memory/knowledge-recall.js +79 -0
  140. package/dist/tools/memory/knowledge-recall.js.map +1 -0
  141. package/dist/tools/memory/knowledge-store.d.ts +10 -0
  142. package/dist/tools/memory/knowledge-store.d.ts.map +1 -0
  143. package/dist/tools/memory/knowledge-store.js +56 -0
  144. package/dist/tools/memory/knowledge-store.js.map +1 -0
  145. package/dist/tools/memory/knowledge-update.d.ts +10 -0
  146. package/dist/tools/memory/knowledge-update.d.ts.map +1 -0
  147. package/dist/tools/memory/knowledge-update.js +50 -0
  148. package/dist/tools/memory/knowledge-update.js.map +1 -0
  149. package/dist/tools/memory/knowledge-validate.d.ts +10 -0
  150. package/dist/tools/memory/knowledge-validate.d.ts.map +1 -0
  151. package/dist/tools/memory/knowledge-validate.js +40 -0
  152. package/dist/tools/memory/knowledge-validate.js.map +1 -0
  153. package/dist/tools/memory/session-list.d.ts +9 -0
  154. package/dist/tools/memory/session-list.d.ts.map +1 -0
  155. package/dist/tools/memory/session-list.js +30 -0
  156. package/dist/tools/memory/session-list.js.map +1 -0
  157. package/dist/tools/memory/session-log.d.ts +9 -0
  158. package/dist/tools/memory/session-log.d.ts.map +1 -0
  159. package/dist/tools/memory/session-log.js +56 -0
  160. package/dist/tools/memory/session-log.js.map +1 -0
  161. package/dist/tools/memory/task-create.d.ts +9 -0
  162. package/dist/tools/memory/task-create.d.ts.map +1 -0
  163. package/dist/tools/memory/task-create.js +38 -0
  164. package/dist/tools/memory/task-create.js.map +1 -0
  165. package/dist/tools/memory/task-list.d.ts +9 -0
  166. package/dist/tools/memory/task-list.d.ts.map +1 -0
  167. package/dist/tools/memory/task-list.js +41 -0
  168. package/dist/tools/memory/task-list.js.map +1 -0
  169. package/dist/tools/memory/task-update.d.ts +9 -0
  170. package/dist/tools/memory/task-update.d.ts.map +1 -0
  171. package/dist/tools/memory/task-update.js +50 -0
  172. package/dist/tools/memory/task-update.js.map +1 -0
  173. package/dist/tools/register.d.ts +7 -0
  174. package/dist/tools/register.d.ts.map +1 -0
  175. package/dist/tools/register.js +84 -0
  176. package/dist/tools/register.js.map +1 -0
  177. package/dist/tools/setup/setup-migrate.d.ts +10 -0
  178. package/dist/tools/setup/setup-migrate.d.ts.map +1 -0
  179. package/dist/tools/setup/setup-migrate.js +73 -0
  180. package/dist/tools/setup/setup-migrate.js.map +1 -0
  181. package/dist/tools/setup/setup-seed.d.ts +9 -0
  182. package/dist/tools/setup/setup-seed.d.ts.map +1 -0
  183. package/dist/tools/setup/setup-seed.js +133 -0
  184. package/dist/tools/setup/setup-seed.js.map +1 -0
  185. package/dist/tools/setup/setup-status.d.ts +9 -0
  186. package/dist/tools/setup/setup-status.d.ts.map +1 -0
  187. package/dist/tools/setup/setup-status.js +76 -0
  188. package/dist/tools/setup/setup-status.js.map +1 -0
  189. package/dist/tools/shared.d.ts +56 -0
  190. package/dist/tools/shared.d.ts.map +1 -0
  191. package/dist/tools/shared.js +93 -0
  192. package/dist/tools/shared.js.map +1 -0
  193. package/dist/types/records.d.ts +163 -0
  194. package/dist/types/records.d.ts.map +1 -0
  195. package/dist/types/records.js +8 -0
  196. package/dist/types/records.js.map +1 -0
  197. package/migrations/pocketbase/001_core_schema.js +72 -0
  198. package/migrations/pocketbase/002_goals_tasks.js +49 -0
  199. package/migrations/pocketbase/003_contacts.js +29 -0
  200. package/migrations/pocketbase/004_entity_aliases.js +40 -0
  201. package/migrations/pocketbase/005_prospects.js +33 -0
  202. package/migrations/pocketbase/006_business.js +80 -0
  203. package/migrations/pocketbase/007_newsletter_affiliates.js +50 -0
  204. package/migrations/supabase/001_core_schema.sql +78 -0
  205. package/migrations/supabase/002_goals_tasks.sql +38 -0
  206. package/migrations/supabase/003_contacts.sql +27 -0
  207. package/migrations/supabase/004_entity_aliases.sql +22 -0
  208. package/migrations/supabase/005_prospects.sql +31 -0
  209. package/migrations/supabase/006_business.sql +68 -0
  210. package/migrations/supabase/007_seed_aliases.sql +69 -0
  211. package/migrations/supabase/008_newsletter_affiliates.sql +39 -0
  212. package/package.json +48 -0
  213. package/seed/entity-aliases.json +57 -0
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Per-collection record types.
3
+ *
4
+ * These provide type safety when using DataAdapter generic methods.
5
+ * Usage: adapter.create<KnowledgeRecord>('knowledge', data)
6
+ */
7
+ export interface BaseRecord extends Record<string, unknown> {
8
+ id: string;
9
+ created_at: string;
10
+ updated_at?: string;
11
+ }
12
+ export interface KnowledgeRecord extends BaseRecord {
13
+ type: string;
14
+ title: string;
15
+ content: string;
16
+ summary?: string;
17
+ tags?: string[];
18
+ source?: string;
19
+ confidence?: number;
20
+ last_validated_at?: string;
21
+ }
22
+ export interface DecisionRecord extends BaseRecord {
23
+ title: string;
24
+ context?: string;
25
+ options_considered: string[];
26
+ chosen_option: string;
27
+ rationale?: string;
28
+ outcome?: string;
29
+ tags?: string[];
30
+ }
31
+ export interface SessionRecord extends BaseRecord {
32
+ title: string;
33
+ summary: string;
34
+ session_date?: string;
35
+ skills_used?: string[];
36
+ files_changed?: string[];
37
+ decisions_made?: Array<{
38
+ title: string;
39
+ chosen: string;
40
+ }>;
41
+ duration_minutes?: number;
42
+ task_id?: string;
43
+ branch?: string;
44
+ patterns_learned?: Array<{
45
+ pattern: string;
46
+ domain: string;
47
+ }>;
48
+ knowledge_created?: number;
49
+ knowledge_updated?: number;
50
+ metadata?: Record<string, unknown>;
51
+ }
52
+ export interface GoalRecord extends BaseRecord {
53
+ title: string;
54
+ description?: string;
55
+ timeframe: string;
56
+ status: string;
57
+ key_results?: Array<{
58
+ description: string;
59
+ target?: number;
60
+ current?: number;
61
+ }>;
62
+ tags?: string[];
63
+ }
64
+ export interface TaskRecord extends BaseRecord {
65
+ title: string;
66
+ description?: string;
67
+ status: string;
68
+ priority: string;
69
+ due_date?: string;
70
+ tags?: string[];
71
+ goal_id?: string;
72
+ }
73
+ export interface ContactRecord extends BaseRecord {
74
+ name: string;
75
+ company?: string;
76
+ role?: string;
77
+ email?: string;
78
+ phone?: string;
79
+ relationship?: string;
80
+ notes?: string;
81
+ tags?: string[];
82
+ last_contact_date?: string;
83
+ }
84
+ export interface ProspectRecord extends BaseRecord {
85
+ name: string;
86
+ email?: string;
87
+ company?: string;
88
+ role?: string;
89
+ stage: string;
90
+ source?: string;
91
+ estimated_value?: number;
92
+ next_action_type?: string;
93
+ next_followup_date?: string;
94
+ last_contact_date?: string;
95
+ notes?: string;
96
+ tags?: string[];
97
+ linkedin_url?: string;
98
+ }
99
+ export interface BlogPostRecord extends BaseRecord {
100
+ title: string;
101
+ slug: string;
102
+ content: string;
103
+ excerpt?: string;
104
+ status: string;
105
+ published_at?: string;
106
+ tags?: string[];
107
+ seo_title?: string;
108
+ seo_description?: string;
109
+ og_image_url?: string;
110
+ }
111
+ export interface EmailQueueRecord extends BaseRecord {
112
+ to_email: string;
113
+ to_name?: string;
114
+ subject: string;
115
+ body_html: string;
116
+ body_text?: string;
117
+ status: string;
118
+ sequence_id?: string;
119
+ sequence_step?: number;
120
+ prospect_id?: string;
121
+ scheduled_at?: string;
122
+ sent_at?: string;
123
+ error?: string;
124
+ resend_id?: string;
125
+ }
126
+ export interface ContentCalendarRecord extends BaseRecord {
127
+ title: string;
128
+ content?: string;
129
+ platform: string;
130
+ pillar?: string;
131
+ status: string;
132
+ scheduled_date?: string;
133
+ published_url?: string;
134
+ persona?: string;
135
+ }
136
+ export interface SettingsRecord extends BaseRecord {
137
+ key: string;
138
+ value?: string;
139
+ }
140
+ export interface EntityAliasRecord extends BaseRecord {
141
+ canonical: string;
142
+ alias: string;
143
+ }
144
+ export interface NewsletterSubscriberRecord extends BaseRecord {
145
+ email: string;
146
+ name?: string;
147
+ status: string;
148
+ source?: string;
149
+ tags?: string[];
150
+ subscribed_at?: string;
151
+ unsubscribed_at?: string;
152
+ }
153
+ export interface AffiliateRecord extends BaseRecord {
154
+ name: string;
155
+ email: string;
156
+ code: string;
157
+ commission_rate: number;
158
+ status: string;
159
+ total_earned_cents: number;
160
+ total_paid_cents: number;
161
+ stripe_account_id?: string;
162
+ }
163
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/types/records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Per-collection record types.
3
+ *
4
+ * These provide type safety when using DataAdapter generic methods.
5
+ * Usage: adapter.create<KnowledgeRecord>('knowledge', data)
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/types/records.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * PocketBase Migration 001: Core schema
3
+ *
4
+ * Creates knowledge, decisions, sessions collections.
5
+ */
6
+
7
+ /// <reference path="../pb_data/types.d.ts" />
8
+
9
+ migrate((app) => {
10
+ // knowledge collection
11
+ const knowledge = new Collection({
12
+ name: 'knowledge',
13
+ type: 'base',
14
+ schema: [
15
+ { name: 'type', type: 'select', required: true, options: { values: ['fact', 'knowledge', 'pattern', 'insight', 'lesson', 'reference'] } },
16
+ { name: 'title', type: 'text', required: true, options: { maxSize: 500 } },
17
+ { name: 'content', type: 'editor', required: true, options: { maxSize: 50000 } },
18
+ { name: 'summary', type: 'text', options: { maxSize: 2000 } },
19
+ { name: 'tags', type: 'json' },
20
+ { name: 'source', type: 'text', options: { maxSize: 500 } },
21
+ { name: 'confidence', type: 'number', options: { min: 0, max: 1 } },
22
+ { name: 'last_validated_at', type: 'date' },
23
+ ],
24
+ indexes: [
25
+ 'CREATE INDEX idx_knowledge_type ON knowledge (type)',
26
+ 'CREATE INDEX idx_knowledge_last_validated ON knowledge (last_validated_at)',
27
+ ],
28
+ });
29
+ app.save(knowledge);
30
+
31
+ // decisions collection
32
+ const decisions = new Collection({
33
+ name: 'decisions',
34
+ type: 'base',
35
+ schema: [
36
+ { name: 'title', type: 'text', required: true, options: { maxSize: 500 } },
37
+ { name: 'context', type: 'editor', options: { maxSize: 5000 } },
38
+ { name: 'options_considered', type: 'json', required: true },
39
+ { name: 'chosen_option', type: 'text', required: true, options: { maxSize: 500 } },
40
+ { name: 'rationale', type: 'editor', options: { maxSize: 5000 } },
41
+ { name: 'outcome', type: 'editor', options: { maxSize: 5000 } },
42
+ { name: 'tags', type: 'json' },
43
+ ],
44
+ });
45
+ app.save(decisions);
46
+
47
+ // sessions collection
48
+ const sessions = new Collection({
49
+ name: 'sessions',
50
+ type: 'base',
51
+ schema: [
52
+ { name: 'title', type: 'text', required: true, options: { maxSize: 500 } },
53
+ { name: 'summary', type: 'editor', required: true, options: { maxSize: 10000 } },
54
+ { name: 'session_date', type: 'date' },
55
+ { name: 'skills_used', type: 'json' },
56
+ { name: 'files_changed', type: 'json' },
57
+ { name: 'decisions_made', type: 'json' },
58
+ { name: 'duration_minutes', type: 'number' },
59
+ { name: 'task_id', type: 'text', options: { maxSize: 100 } },
60
+ { name: 'branch', type: 'text', options: { maxSize: 200 } },
61
+ { name: 'patterns_learned', type: 'json' },
62
+ { name: 'knowledge_created', type: 'number' },
63
+ { name: 'knowledge_updated', type: 'number' },
64
+ { name: 'metadata', type: 'json' },
65
+ ],
66
+ });
67
+ app.save(sessions);
68
+ }, (app) => {
69
+ app.delete(app.findCollectionByNameOrId('sessions'));
70
+ app.delete(app.findCollectionByNameOrId('decisions'));
71
+ app.delete(app.findCollectionByNameOrId('knowledge'));
72
+ });
@@ -0,0 +1,49 @@
1
+ /**
2
+ * PocketBase Migration 002: Goals and tasks
3
+ */
4
+
5
+ /// <reference path="../pb_data/types.d.ts" />
6
+
7
+ migrate((app) => {
8
+ // goals collection
9
+ const goals = new Collection({
10
+ name: 'goals',
11
+ type: 'base',
12
+ schema: [
13
+ { name: 'title', type: 'text', required: true, options: { maxSize: 500 } },
14
+ { name: 'description', type: 'editor', options: { maxSize: 5000 } },
15
+ { name: 'timeframe', type: 'select', required: true, options: { values: ['daily', 'weekly', 'monthly', 'quarterly', 'yearly'] } },
16
+ { name: 'status', type: 'select', required: true, options: { values: ['active', 'completed', 'paused', 'abandoned'] } },
17
+ { name: 'key_results', type: 'json' },
18
+ { name: 'tags', type: 'json' },
19
+ ],
20
+ indexes: [
21
+ 'CREATE INDEX idx_goals_status ON goals (status)',
22
+ 'CREATE INDEX idx_goals_timeframe ON goals (timeframe)',
23
+ ],
24
+ });
25
+ app.save(goals);
26
+
27
+ // tasks collection
28
+ const tasks = new Collection({
29
+ name: 'tasks',
30
+ type: 'base',
31
+ schema: [
32
+ { name: 'title', type: 'text', required: true, options: { maxSize: 500 } },
33
+ { name: 'description', type: 'editor', options: { maxSize: 5000 } },
34
+ { name: 'status', type: 'select', required: true, options: { values: ['todo', 'in_progress', 'done', 'cancelled'] } },
35
+ { name: 'priority', type: 'select', required: true, options: { values: ['low', 'medium', 'high', 'urgent'] } },
36
+ { name: 'due_date', type: 'date' },
37
+ { name: 'tags', type: 'json' },
38
+ { name: 'goal_id', type: 'text', options: { maxSize: 100 } },
39
+ ],
40
+ indexes: [
41
+ 'CREATE INDEX idx_tasks_status ON tasks (status)',
42
+ 'CREATE INDEX idx_tasks_priority ON tasks (priority)',
43
+ ],
44
+ });
45
+ app.save(tasks);
46
+ }, (app) => {
47
+ app.delete(app.findCollectionByNameOrId('tasks'));
48
+ app.delete(app.findCollectionByNameOrId('goals'));
49
+ });
@@ -0,0 +1,29 @@
1
+ /**
2
+ * PocketBase Migration 003: Contacts
3
+ */
4
+
5
+ /// <reference path="../pb_data/types.d.ts" />
6
+
7
+ migrate((app) => {
8
+ const contacts = new Collection({
9
+ name: 'contacts',
10
+ type: 'base',
11
+ schema: [
12
+ { name: 'name', type: 'text', required: true, options: { maxSize: 200 } },
13
+ { name: 'company', type: 'text', options: { maxSize: 200 } },
14
+ { name: 'role', type: 'text', options: { maxSize: 200 } },
15
+ { name: 'email', type: 'email', options: { maxSize: 200 } },
16
+ { name: 'phone', type: 'text', options: { maxSize: 50 } },
17
+ { name: 'relationship', type: 'select', options: { values: ['colleague', 'client', 'prospect', 'partner', 'other'] } },
18
+ { name: 'notes', type: 'editor', options: { maxSize: 5000 } },
19
+ { name: 'tags', type: 'json' },
20
+ { name: 'last_contact_date', type: 'date' },
21
+ ],
22
+ indexes: [
23
+ 'CREATE INDEX idx_contacts_name ON contacts (name)',
24
+ ],
25
+ });
26
+ app.save(contacts);
27
+ }, (app) => {
28
+ app.delete(app.findCollectionByNameOrId('contacts'));
29
+ });
@@ -0,0 +1,40 @@
1
+ /**
2
+ * PocketBase Migration 004: Entity aliases + settings
3
+ */
4
+
5
+ /// <reference path="../pb_data/types.d.ts" />
6
+
7
+ migrate((app) => {
8
+ // entity_aliases collection
9
+ const aliases = new Collection({
10
+ name: 'entity_aliases',
11
+ type: 'base',
12
+ schema: [
13
+ { name: 'canonical', type: 'text', required: true, options: { maxSize: 100 } },
14
+ { name: 'alias', type: 'text', required: true, options: { maxSize: 200 } },
15
+ ],
16
+ indexes: [
17
+ 'CREATE UNIQUE INDEX idx_entity_aliases_unique ON entity_aliases (canonical, alias)',
18
+ 'CREATE INDEX idx_entity_aliases_canonical ON entity_aliases (canonical)',
19
+ 'CREATE INDEX idx_entity_aliases_alias ON entity_aliases (alias)',
20
+ ],
21
+ });
22
+ app.save(aliases);
23
+
24
+ // settings collection
25
+ const settings = new Collection({
26
+ name: 'settings',
27
+ type: 'base',
28
+ schema: [
29
+ { name: 'key', type: 'text', required: true, options: { maxSize: 100 } },
30
+ { name: 'value', type: 'editor' },
31
+ ],
32
+ indexes: [
33
+ 'CREATE UNIQUE INDEX idx_settings_key ON settings (key)',
34
+ ],
35
+ });
36
+ app.save(settings);
37
+ }, (app) => {
38
+ app.delete(app.findCollectionByNameOrId('settings'));
39
+ app.delete(app.findCollectionByNameOrId('entity_aliases'));
40
+ });
@@ -0,0 +1,33 @@
1
+ /**
2
+ * PocketBase Migration 005: Prospects (CRM)
3
+ */
4
+
5
+ /// <reference path="../pb_data/types.d.ts" />
6
+
7
+ migrate((app) => {
8
+ const prospects = new Collection({
9
+ name: 'prospects',
10
+ type: 'base',
11
+ schema: [
12
+ { name: 'name', type: 'text', required: true, options: { maxSize: 200 } },
13
+ { name: 'email', type: 'email', options: { maxSize: 200 } },
14
+ { name: 'company', type: 'text', options: { maxSize: 200 } },
15
+ { name: 'role', type: 'text', options: { maxSize: 200 } },
16
+ { name: 'stage', type: 'select', required: true, options: { values: ['new', 'contacted', 'responded', 'interested', 'ready_to_buy', 'proposal_sent', 'negotiating', 'closed_won', 'closed_lost', 'nurturing'] } },
17
+ { name: 'source', type: 'text', options: { maxSize: 200 } },
18
+ { name: 'estimated_value', type: 'number' },
19
+ { name: 'next_action_type', type: 'text', options: { maxSize: 100 } },
20
+ { name: 'next_followup_date', type: 'date' },
21
+ { name: 'last_contact_date', type: 'date' },
22
+ { name: 'notes', type: 'editor', options: { maxSize: 10000 } },
23
+ { name: 'tags', type: 'json' },
24
+ { name: 'linkedin_url', type: 'url', options: { maxSize: 500 } },
25
+ ],
26
+ indexes: [
27
+ 'CREATE INDEX idx_prospects_stage ON prospects (stage)',
28
+ ],
29
+ });
30
+ app.save(prospects);
31
+ }, (app) => {
32
+ app.delete(app.findCollectionByNameOrId('prospects'));
33
+ });
@@ -0,0 +1,80 @@
1
+ /**
2
+ * PocketBase Migration 006: Business collections (blog, email, content)
3
+ */
4
+
5
+ /// <reference path="../pb_data/types.d.ts" />
6
+
7
+ migrate((app) => {
8
+ // blog_posts collection
9
+ const blogPosts = new Collection({
10
+ name: 'blog_posts',
11
+ type: 'base',
12
+ schema: [
13
+ { name: 'title', type: 'text', required: true, options: { maxSize: 500 } },
14
+ { name: 'slug', type: 'text', required: true, options: { maxSize: 200 } },
15
+ { name: 'content', type: 'editor', required: true },
16
+ { name: 'excerpt', type: 'text', options: { maxSize: 500 } },
17
+ { name: 'status', type: 'select', required: true, options: { values: ['draft', 'published', 'archived'] } },
18
+ { name: 'published_at', type: 'date' },
19
+ { name: 'tags', type: 'json' },
20
+ { name: 'seo_title', type: 'text', options: { maxSize: 200 } },
21
+ { name: 'seo_description', type: 'text', options: { maxSize: 300 } },
22
+ { name: 'og_image_url', type: 'url', options: { maxSize: 500 } },
23
+ ],
24
+ indexes: [
25
+ 'CREATE UNIQUE INDEX idx_blog_posts_slug ON blog_posts (slug)',
26
+ 'CREATE INDEX idx_blog_posts_status ON blog_posts (status)',
27
+ ],
28
+ });
29
+ app.save(blogPosts);
30
+
31
+ // email_queue collection
32
+ const emailQueue = new Collection({
33
+ name: 'email_queue',
34
+ type: 'base',
35
+ schema: [
36
+ { name: 'to_email', type: 'email', required: true, options: { maxSize: 200 } },
37
+ { name: 'to_name', type: 'text', options: { maxSize: 200 } },
38
+ { name: 'subject', type: 'text', required: true, options: { maxSize: 500 } },
39
+ { name: 'body_html', type: 'editor', required: true },
40
+ { name: 'body_text', type: 'editor' },
41
+ { name: 'status', type: 'select', required: true, options: { values: ['queued', 'sent', 'failed', 'bounced'] } },
42
+ { name: 'sequence_id', type: 'text', options: { maxSize: 100 } },
43
+ { name: 'sequence_step', type: 'number' },
44
+ { name: 'prospect_id', type: 'text', options: { maxSize: 100 } },
45
+ { name: 'scheduled_at', type: 'date' },
46
+ { name: 'sent_at', type: 'date' },
47
+ { name: 'error', type: 'editor' },
48
+ { name: 'resend_id', type: 'text', options: { maxSize: 200 } },
49
+ ],
50
+ indexes: [
51
+ 'CREATE INDEX idx_email_queue_status ON email_queue (status)',
52
+ ],
53
+ });
54
+ app.save(emailQueue);
55
+
56
+ // content_calendar collection
57
+ const contentCalendar = new Collection({
58
+ name: 'content_calendar',
59
+ type: 'base',
60
+ schema: [
61
+ { name: 'title', type: 'text', required: true, options: { maxSize: 500 } },
62
+ { name: 'content', type: 'editor' },
63
+ { name: 'platform', type: 'select', required: true, options: { values: ['linkedin', 'newsletter', 'blog', 'twitter', 'other'] } },
64
+ { name: 'pillar', type: 'text', options: { maxSize: 100 } },
65
+ { name: 'status', type: 'select', required: true, options: { values: ['idea', 'drafting', 'ready', 'published'] } },
66
+ { name: 'scheduled_date', type: 'date' },
67
+ { name: 'published_url', type: 'url', options: { maxSize: 500 } },
68
+ { name: 'persona', type: 'text', options: { maxSize: 100 } },
69
+ ],
70
+ indexes: [
71
+ 'CREATE INDEX idx_content_calendar_platform ON content_calendar (platform)',
72
+ 'CREATE INDEX idx_content_calendar_status ON content_calendar (status)',
73
+ ],
74
+ });
75
+ app.save(contentCalendar);
76
+ }, (app) => {
77
+ app.delete(app.findCollectionByNameOrId('content_calendar'));
78
+ app.delete(app.findCollectionByNameOrId('email_queue'));
79
+ app.delete(app.findCollectionByNameOrId('blog_posts'));
80
+ });
@@ -0,0 +1,50 @@
1
+ /**
2
+ * PocketBase Migration 007: Newsletter subscribers and affiliates
3
+ */
4
+
5
+ /// <reference path="../pb_data/types.d.ts" />
6
+
7
+ migrate((app) => {
8
+ // newsletter_subscribers collection
9
+ const subscribers = new Collection({
10
+ name: 'newsletter_subscribers',
11
+ type: 'base',
12
+ schema: [
13
+ { name: 'email', type: 'email', required: true, options: { maxSize: 200 } },
14
+ { name: 'name', type: 'text', options: { maxSize: 200 } },
15
+ { name: 'status', type: 'select', required: true, options: { values: ['active', 'unsubscribed', 'bounced'] } },
16
+ { name: 'source', type: 'text', options: { maxSize: 200 } },
17
+ { name: 'tags', type: 'json' },
18
+ { name: 'subscribed_at', type: 'date' },
19
+ { name: 'unsubscribed_at', type: 'date' },
20
+ ],
21
+ indexes: [
22
+ 'CREATE UNIQUE INDEX idx_newsletter_subscribers_email ON newsletter_subscribers (email)',
23
+ ],
24
+ });
25
+ app.save(subscribers);
26
+
27
+ // affiliates collection
28
+ const affiliates = new Collection({
29
+ name: 'affiliates',
30
+ type: 'base',
31
+ schema: [
32
+ { name: 'name', type: 'text', required: true, options: { maxSize: 200 } },
33
+ { name: 'email', type: 'email', required: true, options: { maxSize: 200 } },
34
+ { name: 'code', type: 'text', required: true, options: { maxSize: 100 } },
35
+ { name: 'commission_rate', type: 'number', options: { min: 0, max: 1 } },
36
+ { name: 'status', type: 'select', required: true, options: { values: ['pending', 'active', 'paused', 'terminated'] } },
37
+ { name: 'total_earned_cents', type: 'number' },
38
+ { name: 'total_paid_cents', type: 'number' },
39
+ { name: 'stripe_account_id', type: 'text', options: { maxSize: 200 } },
40
+ ],
41
+ indexes: [
42
+ 'CREATE UNIQUE INDEX idx_affiliates_email ON affiliates (email)',
43
+ 'CREATE UNIQUE INDEX idx_affiliates_code ON affiliates (code)',
44
+ ],
45
+ });
46
+ app.save(affiliates);
47
+ }, (app) => {
48
+ app.delete(app.findCollectionByNameOrId('affiliates'));
49
+ app.delete(app.findCollectionByNameOrId('newsletter_subscribers'));
50
+ });
@@ -0,0 +1,78 @@
1
+ -- Migration 001: Core schema (knowledge, decisions, sessions)
2
+
3
+ CREATE TABLE IF NOT EXISTS knowledge (
4
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ type text NOT NULL CHECK (type IN ('fact', 'knowledge', 'pattern', 'insight', 'lesson', 'reference')),
6
+ title text NOT NULL CHECK (char_length(title) <= 500),
7
+ content text NOT NULL CHECK (char_length(content) <= 50000),
8
+ summary text CHECK (char_length(summary) <= 2000),
9
+ tags text[] DEFAULT '{}',
10
+ source text CHECK (char_length(source) <= 500),
11
+ confidence float DEFAULT 0.8 CHECK (confidence >= 0 AND confidence <= 1),
12
+ last_validated_at timestamptz DEFAULT now(),
13
+ search_vector tsvector GENERATED ALWAYS AS (
14
+ setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
15
+ setweight(to_tsvector('english', coalesce(content, '')), 'B') ||
16
+ setweight(to_tsvector('english', coalesce(summary, '')), 'C')
17
+ ) STORED,
18
+ created_at timestamptz DEFAULT now(),
19
+ updated_at timestamptz DEFAULT now()
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_knowledge_search ON knowledge USING gin(search_vector);
23
+ CREATE INDEX IF NOT EXISTS idx_knowledge_type ON knowledge (type);
24
+ CREATE INDEX IF NOT EXISTS idx_knowledge_last_validated ON knowledge (last_validated_at);
25
+ CREATE INDEX IF NOT EXISTS idx_knowledge_tags ON knowledge USING gin(tags);
26
+
27
+ CREATE TABLE IF NOT EXISTS decisions (
28
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
29
+ title text NOT NULL CHECK (char_length(title) <= 500),
30
+ context text CHECK (char_length(context) <= 5000),
31
+ options_considered text[] NOT NULL,
32
+ chosen_option text NOT NULL CHECK (char_length(chosen_option) <= 500),
33
+ rationale text CHECK (char_length(rationale) <= 5000),
34
+ outcome text CHECK (char_length(outcome) <= 5000),
35
+ tags text[] DEFAULT '{}',
36
+ search_vector tsvector GENERATED ALWAYS AS (
37
+ setweight(to_tsvector('english', coalesce(title, '')), 'A') ||
38
+ setweight(to_tsvector('english', coalesce(context, '')), 'B') ||
39
+ setweight(to_tsvector('english', coalesce(chosen_option, '')), 'B')
40
+ ) STORED,
41
+ created_at timestamptz DEFAULT now(),
42
+ updated_at timestamptz DEFAULT now()
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_decisions_search ON decisions USING gin(search_vector);
46
+
47
+ CREATE TABLE IF NOT EXISTS sessions (
48
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
49
+ title text NOT NULL CHECK (char_length(title) <= 500),
50
+ summary text NOT NULL CHECK (char_length(summary) <= 10000),
51
+ session_date date DEFAULT CURRENT_DATE,
52
+ skills_used text[] DEFAULT '{}',
53
+ files_changed text[] DEFAULT '{}',
54
+ decisions_made jsonb DEFAULT '[]',
55
+ duration_minutes int,
56
+ task_id text CHECK (char_length(task_id) <= 100),
57
+ branch text CHECK (char_length(branch) <= 200),
58
+ patterns_learned jsonb DEFAULT '[]',
59
+ knowledge_created int DEFAULT 0,
60
+ knowledge_updated int DEFAULT 0,
61
+ metadata jsonb,
62
+ created_at timestamptz DEFAULT now()
63
+ );
64
+
65
+ -- Trigger to auto-update updated_at
66
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
67
+ RETURNS TRIGGER AS $$
68
+ BEGIN
69
+ NEW.updated_at = now();
70
+ RETURN NEW;
71
+ END;
72
+ $$ language 'plpgsql';
73
+
74
+ CREATE TRIGGER knowledge_updated_at BEFORE UPDATE ON knowledge
75
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
76
+
77
+ CREATE TRIGGER decisions_updated_at BEFORE UPDATE ON decisions
78
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
@@ -0,0 +1,38 @@
1
+ -- Migration 002: Goals and tasks
2
+
3
+ CREATE TABLE IF NOT EXISTS goals (
4
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
5
+ title text NOT NULL CHECK (char_length(title) <= 500),
6
+ description text CHECK (char_length(description) <= 5000),
7
+ timeframe text NOT NULL CHECK (timeframe IN ('daily', 'weekly', 'monthly', 'quarterly', 'yearly')),
8
+ status text NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'completed', 'paused', 'abandoned')),
9
+ key_results jsonb DEFAULT '[]',
10
+ tags text[] DEFAULT '{}',
11
+ created_at timestamptz DEFAULT now(),
12
+ updated_at timestamptz DEFAULT now()
13
+ );
14
+
15
+ CREATE INDEX IF NOT EXISTS idx_goals_status ON goals (status);
16
+ CREATE INDEX IF NOT EXISTS idx_goals_timeframe ON goals (timeframe);
17
+
18
+ CREATE TABLE IF NOT EXISTS tasks (
19
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
20
+ title text NOT NULL CHECK (char_length(title) <= 500),
21
+ description text CHECK (char_length(description) <= 5000),
22
+ status text NOT NULL DEFAULT 'todo' CHECK (status IN ('todo', 'in_progress', 'done', 'cancelled')),
23
+ priority text NOT NULL DEFAULT 'medium' CHECK (priority IN ('low', 'medium', 'high', 'urgent')),
24
+ due_date date,
25
+ tags text[] DEFAULT '{}',
26
+ goal_id text CHECK (char_length(goal_id) <= 100),
27
+ created_at timestamptz DEFAULT now(),
28
+ updated_at timestamptz DEFAULT now()
29
+ );
30
+
31
+ CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks (status);
32
+ CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks (priority);
33
+
34
+ CREATE TRIGGER goals_updated_at BEFORE UPDATE ON goals
35
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
36
+
37
+ CREATE TRIGGER tasks_updated_at BEFORE UPDATE ON tasks
38
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();