@terreno/mcp 0.31.0 → 56.0.0-beta.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.
Files changed (116) hide show
  1. package/dist/bootstrap.d.ts.map +1 -1
  2. package/dist/bootstrap.js +8 -9
  3. package/dist/bootstrap.js.map +1 -1
  4. package/dist/docs/templates/bootstrap/frontend/app/_layout.template.tsx +1 -1
  5. package/dist/docs/upgrades/56.0.0-beta.2.md +59 -0
  6. package/dist/docs/versioned/next/README.md +2 -0
  7. package/dist/docs/versioned/next/explanation/roadmap-seed-issues.md +21 -0
  8. package/dist/docs/versioned/next/how-to/README.md +2 -0
  9. package/dist/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +445 -0
  10. package/dist/docs/versioned/next/implementationPlans/PLAN_INDEX.md +28 -50
  11. package/dist/docs/versioned/next/implementationPlans/b2b-platform-program.md +3 -2
  12. package/dist/docs/versioned/next/implementationPlans/comms-abstraction.md +98 -15
  13. package/dist/docs/versioned/next/implementationPlans/comms-adapter-sendgrid.md +63 -13
  14. package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +65 -12
  15. package/dist/docs/versioned/next/implementationPlans/comms-adapter-twilio-verify.md +9 -3
  16. package/dist/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +180 -0
  17. package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci-research.md +126 -0
  18. package/dist/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +269 -0
  19. package/dist/docs/versioned/next/implementationPlans/rtk-to-syncdb-migration-docs.md +52 -47
  20. package/dist/docs/versioned/next/implementationPlans/syncdb-api-inventory.md +303 -0
  21. package/dist/docs/versioned/next/implementationPlans/syncdb-codegen.md +252 -0
  22. package/dist/docs/versioned/next/implementationPlans/syncdb-local-first.md +468 -420
  23. package/dist/docs/versioned/next/implementationPlans/syncdb-phase-c-design.md +425 -0
  24. package/dist/docs/versioned/next/implementationPlans/terreno-syncdb-2.md +800 -0
  25. package/dist/docs/versioned/next/reference/README.md +2 -0
  26. package/dist/docs/versioned/next/reference/comms.md +132 -0
  27. package/dist/docs/versioned/next/reference/environment-variables.md +9 -0
  28. package/dist/docs/versioned/next/reference/syncdb.md +456 -0
  29. package/dist/docs/versioned/next/superpowers/plans/2026-07-28-admin-mobile-navigation.md +97 -0
  30. package/dist/docs/versioned/next/superpowers/specs/2026-07-28-admin-mobile-navigation-design.md +36 -0
  31. package/dist/docs/versioned/next/tasks/comms-abstraction.md +29 -16
  32. package/dist/docs/versioned/next/tasks/comms-adapter-sendgrid.md +17 -7
  33. package/dist/docs/versioned/next/tasks/comms-adapter-twilio-sms.md +17 -7
  34. package/dist/docs/versioned/next/tasks/comms-adapter-twilio-verify.md +3 -3
  35. package/dist/docs/versioned/next/tasks/comms-admin-dashboard.md +52 -0
  36. package/dist/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +215 -0
  37. package/dist/docs/versioned/next/tasks/rtk-to-syncdb-migration-docs.md +10 -10
  38. package/dist/docs/versioned/next/tasks/syncdb-codegen.md +65 -0
  39. package/dist/docs/versioned/next/tasks/syncdb-local-first.md +434 -117
  40. package/package.json +3 -3
  41. package/src/docs/templates/bootstrap/frontend/app/_layout.template.tsx +1 -1
  42. package/src/docs/upgrades/56.0.0-beta.2.md +59 -0
  43. package/src/docs/versioned/next/README.md +2 -0
  44. package/src/docs/versioned/next/explanation/roadmap-seed-issues.md +21 -0
  45. package/src/docs/versioned/next/how-to/README.md +2 -0
  46. package/src/docs/versioned/next/how-to/migrate-rtk-to-syncdb.md +445 -0
  47. package/src/docs/versioned/next/implementationPlans/PLAN_INDEX.md +28 -50
  48. package/src/docs/versioned/next/implementationPlans/b2b-platform-program.md +3 -2
  49. package/src/docs/versioned/next/implementationPlans/comms-abstraction.md +98 -15
  50. package/src/docs/versioned/next/implementationPlans/comms-adapter-sendgrid.md +63 -13
  51. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-sms.md +65 -12
  52. package/src/docs/versioned/next/implementationPlans/comms-adapter-twilio-verify.md +9 -3
  53. package/src/docs/versioned/next/implementationPlans/comms-admin-dashboard.md +180 -0
  54. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci-research.md +126 -0
  55. package/src/docs/versioned/next/implementationPlans/migrate-cicd-to-circleci.md +269 -0
  56. package/src/docs/versioned/next/implementationPlans/rtk-to-syncdb-migration-docs.md +52 -47
  57. package/src/docs/versioned/next/implementationPlans/syncdb-api-inventory.md +303 -0
  58. package/src/docs/versioned/next/implementationPlans/syncdb-codegen.md +252 -0
  59. package/src/docs/versioned/next/implementationPlans/syncdb-local-first.md +468 -420
  60. package/src/docs/versioned/next/implementationPlans/syncdb-phase-c-design.md +425 -0
  61. package/src/docs/versioned/next/implementationPlans/terreno-syncdb-2.md +800 -0
  62. package/src/docs/versioned/next/reference/README.md +2 -0
  63. package/src/docs/versioned/next/reference/comms.md +132 -0
  64. package/src/docs/versioned/next/reference/environment-variables.md +9 -0
  65. package/src/docs/versioned/next/reference/syncdb.md +456 -0
  66. package/src/docs/versioned/next/superpowers/plans/2026-07-28-admin-mobile-navigation.md +97 -0
  67. package/src/docs/versioned/next/superpowers/specs/2026-07-28-admin-mobile-navigation-design.md +36 -0
  68. package/src/docs/versioned/next/tasks/comms-abstraction.md +29 -16
  69. package/src/docs/versioned/next/tasks/comms-adapter-sendgrid.md +17 -7
  70. package/src/docs/versioned/next/tasks/comms-adapter-twilio-sms.md +17 -7
  71. package/src/docs/versioned/next/tasks/comms-adapter-twilio-verify.md +3 -3
  72. package/src/docs/versioned/next/tasks/comms-admin-dashboard.md +52 -0
  73. package/src/docs/versioned/next/tasks/migrate-cicd-to-circleci.md +215 -0
  74. package/src/docs/versioned/next/tasks/rtk-to-syncdb-migration-docs.md +10 -10
  75. package/src/docs/versioned/next/tasks/syncdb-codegen.md +65 -0
  76. package/src/docs/versioned/next/tasks/syncdb-local-first.md +434 -117
  77. package/dist/__tests__/bootstrap.test.d.ts +0 -2
  78. package/dist/__tests__/bootstrap.test.d.ts.map +0 -1
  79. package/dist/__tests__/bootstrap.test.js +0 -299
  80. package/dist/__tests__/bootstrap.test.js.map +0 -1
  81. package/dist/__tests__/databaseQuery.test.d.ts +0 -2
  82. package/dist/__tests__/databaseQuery.test.d.ts.map +0 -1
  83. package/dist/__tests__/databaseQuery.test.js +0 -83
  84. package/dist/__tests__/databaseQuery.test.js.map +0 -1
  85. package/dist/__tests__/docsRoot.test.d.ts +0 -2
  86. package/dist/__tests__/docsRoot.test.d.ts.map +0 -1
  87. package/dist/__tests__/docsRoot.test.js +0 -59
  88. package/dist/__tests__/docsRoot.test.js.map +0 -1
  89. package/dist/__tests__/inferPackages.test.d.ts +0 -2
  90. package/dist/__tests__/inferPackages.test.d.ts.map +0 -1
  91. package/dist/__tests__/inferPackages.test.js +0 -35
  92. package/dist/__tests__/inferPackages.test.js.map +0 -1
  93. package/dist/__tests__/preload.d.ts +0 -2
  94. package/dist/__tests__/preload.d.ts.map +0 -1
  95. package/dist/__tests__/preload.js +0 -12
  96. package/dist/__tests__/preload.js.map +0 -1
  97. package/dist/__tests__/prompts.test.d.ts +0 -2
  98. package/dist/__tests__/prompts.test.d.ts.map +0 -1
  99. package/dist/__tests__/prompts.test.js +0 -295
  100. package/dist/__tests__/prompts.test.js.map +0 -1
  101. package/dist/__tests__/resources.test.d.ts +0 -2
  102. package/dist/__tests__/resources.test.d.ts.map +0 -1
  103. package/dist/__tests__/resources.test.js +0 -352
  104. package/dist/__tests__/resources.test.js.map +0 -1
  105. package/dist/__tests__/search.test.d.ts +0 -2
  106. package/dist/__tests__/search.test.d.ts.map +0 -1
  107. package/dist/__tests__/search.test.js +0 -163
  108. package/dist/__tests__/search.test.js.map +0 -1
  109. package/dist/__tests__/tools.test.d.ts +0 -2
  110. package/dist/__tests__/tools.test.d.ts.map +0 -1
  111. package/dist/__tests__/tools.test.js +0 -540
  112. package/dist/__tests__/tools.test.js.map +0 -1
  113. package/dist/__tests__/upgradeGuide.test.d.ts +0 -2
  114. package/dist/__tests__/upgradeGuide.test.d.ts.map +0 -1
  115. package/dist/__tests__/upgradeGuide.test.js +0 -22
  116. package/dist/__tests__/upgradeGuide.test.js.map +0 -1
@@ -1,540 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import { handleToolCall, tools } from "../tools.js";
3
- describe("tools", () => {
4
- test("should export all required tools", () => {
5
- const toolNames = tools.map((t) => t.name);
6
- expect(toolNames).toContain("terreno_generate_model");
7
- expect(toolNames).toContain("terreno_generate_route");
8
- expect(toolNames).toContain("terreno_generate_screen");
9
- expect(toolNames).toContain("terreno_generate_form_fields");
10
- expect(toolNames).toContain("terreno_validate_model_schema");
11
- expect(toolNames).toContain("terreno_install_admin");
12
- expect(toolNames).toContain("terreno_bootstrap_app");
13
- expect(toolNames).toContain("terreno_bootstrap_ai_rules");
14
- expect(toolNames).toContain("terreno_search_docs");
15
- expect(toolNames).toContain("terreno_get_component_docs");
16
- expect(toolNames).toContain("terreno_get_upgrade_guide");
17
- });
18
- test("should have valid tool structure", () => {
19
- for (const tool of tools) {
20
- expect(tool.name).toBeDefined();
21
- expect(tool.description).toBeDefined();
22
- expect(tool.inputSchema).toBeDefined();
23
- expect(tool.inputSchema.type).toBe("object");
24
- expect(tool.inputSchema.properties).toBeDefined();
25
- }
26
- });
27
- describe("terreno_generate_model", () => {
28
- test("should generate basic model", () => {
29
- const result = handleToolCall("terreno_generate_model", {
30
- fields: [
31
- { name: "title", required: true, type: "String" },
32
- { name: "price", required: true, type: "Number" },
33
- ],
34
- name: "Product",
35
- });
36
- const content = result.content[0].text;
37
- expect(content).toContain("interface ProductDocument");
38
- expect(content).toContain("interface ProductModel");
39
- expect(content).toContain("productSchema");
40
- expect(content).toContain('strict: "throw"');
41
- expect(content).toContain("addDefaultPlugins");
42
- expect(content).toContain("title: { type: String");
43
- expect(content).toContain("price: { type: Number");
44
- });
45
- test("should generate model with owner", () => {
46
- const result = handleToolCall("terreno_generate_model", {
47
- fields: [{ name: "title", required: true, type: "String" }],
48
- hasOwner: true,
49
- name: "Todo",
50
- });
51
- const content = result.content[0].text;
52
- expect(content).toContain("ownerId");
53
- expect(content).toContain('ref: "User"');
54
- expect(content).toContain("mongoose.Types.ObjectId");
55
- });
56
- test("should generate model with soft delete", () => {
57
- const result = handleToolCall("terreno_generate_model", {
58
- fields: [{ name: "name", type: "String" }],
59
- name: "Item",
60
- softDelete: true,
61
- });
62
- const content = result.content[0].text;
63
- expect(content).toContain("isDeletedPlugin");
64
- });
65
- test("should handle field with reference", () => {
66
- const result = handleToolCall("terreno_generate_model", {
67
- fields: [{ name: "userId", ref: "User", required: true, type: "ObjectId" }],
68
- name: "Order",
69
- });
70
- const content = result.content[0].text;
71
- expect(content).toContain("mongoose.Schema.Types.ObjectId");
72
- expect(content).toContain('ref: "User"');
73
- });
74
- test("should handle field with default value", () => {
75
- const result = handleToolCall("terreno_generate_model", {
76
- fields: [{ default: "true", name: "active", type: "Boolean" }],
77
- name: "Setting",
78
- });
79
- const content = result.content[0].text;
80
- expect(content).toContain("default: true");
81
- });
82
- });
83
- describe("terreno_generate_route", () => {
84
- test("should generate basic route", () => {
85
- const result = handleToolCall("terreno_generate_route", {
86
- modelName: "Product",
87
- routePath: "/products",
88
- });
89
- const content = result.content[0].text;
90
- expect(content).toContain("addProductRoutes");
91
- expect(content).toContain("modelRouter");
92
- expect(content).toContain('"/products"');
93
- expect(content).toContain("Permissions.IsAuthenticated");
94
- });
95
- test("should generate route with custom permissions", () => {
96
- const result = handleToolCall("terreno_generate_route", {
97
- modelName: "Post",
98
- permissions: {
99
- create: "authenticated",
100
- delete: "admin",
101
- list: "any",
102
- read: "any",
103
- update: "owner",
104
- },
105
- routePath: "/posts",
106
- });
107
- const content = result.content[0].text;
108
- expect(content).toContain("Permissions.IsAny");
109
- expect(content).toContain("Permissions.IsOwner");
110
- expect(content).toContain("Permissions.IsAdmin");
111
- });
112
- test("should generate route with owner filter", () => {
113
- const result = handleToolCall("terreno_generate_route", {
114
- modelName: "Task",
115
- ownerFiltered: true,
116
- routePath: "/tasks",
117
- });
118
- const content = result.content[0].text;
119
- expect(content).toContain("OwnerQueryFilter");
120
- expect(content).toContain("preCreate");
121
- expect(content).toContain("ownerId");
122
- expect(content).toContain("UserDocument");
123
- });
124
- test("should generate route with query fields", () => {
125
- const result = handleToolCall("terreno_generate_route", {
126
- modelName: "Item",
127
- queryFields: ["status", "category"],
128
- routePath: "/items",
129
- });
130
- const content = result.content[0].text;
131
- expect(content).toContain('queryFields: ["status","category"]');
132
- });
133
- test("should generate route with sort", () => {
134
- const result = handleToolCall("terreno_generate_route", {
135
- modelName: "Event",
136
- routePath: "/events",
137
- sort: "-startDate",
138
- });
139
- const content = result.content[0].text;
140
- expect(content).toContain('sort: "-startDate"');
141
- });
142
- });
143
- describe("terreno_generate_screen", () => {
144
- test("should generate empty screen", () => {
145
- const result = handleToolCall("terreno_generate_screen", {
146
- name: "Dashboard",
147
- type: "empty",
148
- });
149
- const content = result.content[0].text;
150
- expect(content).toContain("DashboardScreen");
151
- expect(content).toContain("Page");
152
- expect(content).toContain("Box");
153
- expect(content).toContain("Text");
154
- });
155
- test("should generate list screen", () => {
156
- const result = handleToolCall("terreno_generate_screen", {
157
- fields: ["title", "price"],
158
- modelName: "Product",
159
- name: "ProductList",
160
- type: "list",
161
- });
162
- const content = result.content[0].text;
163
- expect(content).toContain("ProductListScreen");
164
- expect(content).toContain("useGetProductsQuery");
165
- expect(content).toContain("isLoading");
166
- expect(content).toContain("error");
167
- expect(content).toContain("refetch");
168
- expect(content).toContain("ScrollView");
169
- });
170
- test("should generate form screen", () => {
171
- const result = handleToolCall("terreno_generate_screen", {
172
- fields: ["title", "description"],
173
- modelName: "Product",
174
- name: "CreateProduct",
175
- type: "form",
176
- });
177
- const content = result.content[0].text;
178
- expect(content).toContain("CreateProductScreen");
179
- expect(content).toContain("useCreateProductMutation");
180
- expect(content).toContain("useState");
181
- expect(content).toContain("TextField");
182
- expect(content).toContain("handleSubmit");
183
- expect(content).toContain("FormErrors");
184
- });
185
- test("should generate detail screen", () => {
186
- const result = handleToolCall("terreno_generate_screen", {
187
- fields: ["title", "price", "description"],
188
- modelName: "Product",
189
- name: "ProductDetail",
190
- type: "detail",
191
- });
192
- const content = result.content[0].text;
193
- expect(content).toContain("ProductDetailScreen");
194
- expect(content).toContain("useGetProductQuery");
195
- expect(content).toContain("useLocalSearchParams");
196
- expect(content).toContain("item.title");
197
- expect(content).toContain("item.price");
198
- });
199
- });
200
- describe("terreno_generate_form_fields", () => {
201
- test("should generate text field", () => {
202
- const result = handleToolCall("terreno_generate_form_fields", {
203
- fields: [{ label: "Full Name", name: "name", type: "text" }],
204
- });
205
- const content = result.content[0].text;
206
- expect(content).toContain("TextField");
207
- expect(content).toContain('label="Full Name"');
208
- expect(content).toContain("value={name}");
209
- expect(content).toContain("onChangeText={setName}");
210
- });
211
- test("should generate email field", () => {
212
- const result = handleToolCall("terreno_generate_form_fields", {
213
- fields: [{ name: "email", required: true, type: "email" }],
214
- });
215
- const content = result.content[0].text;
216
- expect(content).toContain("EmailField");
217
- expect(content).toContain("error={errors.email}");
218
- });
219
- test("should generate select field with options", () => {
220
- const result = handleToolCall("terreno_generate_form_fields", {
221
- fields: [
222
- {
223
- name: "country",
224
- options: [
225
- { label: "USA", value: "us" },
226
- { label: "Canada", value: "ca" },
227
- ],
228
- type: "select",
229
- },
230
- ],
231
- });
232
- const content = result.content[0].text;
233
- expect(content).toContain("SelectField");
234
- expect(content).toContain("USA");
235
- expect(content).toContain("Canada");
236
- expect(content).toContain("onChangeValue={setCountry}");
237
- });
238
- test("should generate boolean field", () => {
239
- const result = handleToolCall("terreno_generate_form_fields", {
240
- fields: [{ name: "active", type: "boolean" }],
241
- });
242
- const content = result.content[0].text;
243
- expect(content).toContain("BooleanField");
244
- expect(content).toContain("useState(false)");
245
- });
246
- test("should generate date field", () => {
247
- const result = handleToolCall("terreno_generate_form_fields", {
248
- fields: [{ name: "birthDate", type: "date" }],
249
- });
250
- const content = result.content[0].text;
251
- expect(content).toContain("DateTimeField");
252
- expect(content).toContain('mode="date"');
253
- });
254
- test("should generate multiple fields", () => {
255
- const result = handleToolCall("terreno_generate_form_fields", {
256
- fields: [
257
- { name: "name", type: "text" },
258
- { name: "email", type: "email" },
259
- { name: "age", type: "number" },
260
- ],
261
- });
262
- const content = result.content[0].text;
263
- expect(content).toContain("TextField");
264
- expect(content).toContain("EmailField");
265
- expect(content).toContain("NumberField");
266
- });
267
- });
268
- describe("terreno_validate_model_schema", () => {
269
- test("should pass valid schema", () => {
270
- const validSchema = `
271
- const schema = new mongoose.Schema({
272
- name: { type: String }
273
- }, {
274
- strict: "throw",
275
- toJSON: { virtuals: true },
276
- toObject: { virtuals: true },
277
- });
278
- addDefaultPlugins(schema);
279
- interface MyDocument extends mongoose.Document {}
280
- `;
281
- const result = handleToolCall("terreno_validate_model_schema", {
282
- schema: validSchema,
283
- });
284
- expect(result.content[0].text).toContain("✓");
285
- });
286
- test("should detect missing strict throw", () => {
287
- const schema = `
288
- const schema = new mongoose.Schema({
289
- name: { type: String }
290
- });
291
- `;
292
- const result = handleToolCall("terreno_validate_model_schema", { schema });
293
- expect(result.content[0].text).toContain("strict");
294
- });
295
- test("should detect missing virtuals", () => {
296
- const schema = `
297
- const schema = new mongoose.Schema({}, {
298
- strict: "throw"
299
- });
300
- `;
301
- const result = handleToolCall("terreno_validate_model_schema", { schema });
302
- expect(result.content[0].text).toContain("virtuals");
303
- });
304
- test("should detect missing plugins", () => {
305
- const schema = `
306
- const schema = new mongoose.Schema({}, {
307
- strict: "throw",
308
- toJSON: { virtuals: true }
309
- });
310
- `;
311
- const result = handleToolCall("terreno_validate_model_schema", { schema });
312
- expect(result.content[0].text).toContain("plugins");
313
- });
314
- test("should detect findOne usage", () => {
315
- const schema = `
316
- schema.statics.findByEmail = function(email) {
317
- return this.findOne({ email });
318
- };
319
- `;
320
- const result = handleToolCall("terreno_validate_model_schema", { schema });
321
- expect(result.content[0].text).toContain("findOne");
322
- expect(result.content[0].text).toContain("findOneOrThrow");
323
- });
324
- test("should detect Date usage", () => {
325
- const schema = `
326
- const timestamp = new Date();
327
- `;
328
- const result = handleToolCall("terreno_validate_model_schema", { schema });
329
- expect(result.content[0].text).toContain("Luxon");
330
- });
331
- });
332
- describe("unknown tool", () => {
333
- test("should return error for unknown tool", () => {
334
- const result = handleToolCall("unknown_tool", {});
335
- expect(result.content[0].text).toContain("Unknown tool");
336
- });
337
- });
338
- describe("terreno_generate_model edge cases", () => {
339
- test("should generate interface types for non-string fields", () => {
340
- const result = handleToolCall("terreno_generate_model", {
341
- fields: [
342
- { name: "count", required: true, type: "Number" },
343
- { name: "isActive", required: true, type: "Boolean" },
344
- { name: "startDate", required: false, type: "Date" },
345
- { name: "ownerId", ref: "User", required: true, type: "ObjectId" },
346
- { name: "tags", required: false, type: "Array" },
347
- ],
348
- name: "Event",
349
- });
350
- const content = result.content[0].text;
351
- expect(content).toContain("count: number");
352
- expect(content).toContain("isActive: boolean");
353
- expect(content).toContain("startDate?: Date");
354
- expect(content).toContain("ownerId: mongoose.Types.ObjectId");
355
- expect(content).toContain("tags?: unknown[]");
356
- expect(content).toContain('ref: "User"');
357
- });
358
- test("should support hasOwner and softDelete options", () => {
359
- const result = handleToolCall("terreno_generate_model", {
360
- fields: [{ name: "title", required: true, type: "String" }],
361
- hasOwner: true,
362
- name: "Article",
363
- softDelete: true,
364
- });
365
- const content = result.content[0].text;
366
- expect(content).toContain("ownerId: mongoose.Types.ObjectId");
367
- expect(content).toContain('ownerId: { type: mongoose.Schema.Types.ObjectId, ref: "User"');
368
- expect(content).toContain("isDeletedPlugin");
369
- expect(content).toContain("articleSchema.plugin(isDeletedPlugin)");
370
- });
371
- test("should support unique and default field props", () => {
372
- const result = handleToolCall("terreno_generate_model", {
373
- fields: [
374
- { name: "email", required: true, type: "String", unique: true },
375
- { default: "0", name: "count", required: false, type: "Number" },
376
- ],
377
- name: "Account",
378
- });
379
- const content = result.content[0].text;
380
- expect(content).toContain("unique: true");
381
- expect(content).toContain("default: 0");
382
- });
383
- });
384
- describe("terreno_generate_route edge cases", () => {
385
- test("should generate route with ownerFiltered", () => {
386
- const result = handleToolCall("terreno_generate_route", {
387
- modelName: "Task",
388
- ownerFiltered: true,
389
- permissions: {
390
- create: "owner",
391
- delete: "admin",
392
- list: "any",
393
- read: "authOrReadOnly",
394
- update: "authenticated",
395
- },
396
- queryFields: ["title", "status"],
397
- routePath: "/tasks",
398
- });
399
- const content = result.content[0].text;
400
- expect(content).toContain("OwnerQueryFilter");
401
- expect(content).toContain("UserDocument");
402
- expect(content).toContain("Permissions.IsOwner");
403
- expect(content).toContain("Permissions.IsAdmin");
404
- expect(content).toContain("Permissions.IsAny");
405
- expect(content).toContain("Permissions.IsAuthenticatedOrReadOnly");
406
- expect(content).toContain('queryFields: ["title","status"]');
407
- expect(content).toContain("preCreate");
408
- });
409
- });
410
- describe("terreno_generate_screen edge cases", () => {
411
- test("should fall back to empty template when type needs modelName but none given", () => {
412
- const result = handleToolCall("terreno_generate_screen", {
413
- name: "Orphan",
414
- type: "list",
415
- });
416
- const content = result.content[0].text;
417
- expect(content).toContain('Screen type "list" not fully supported');
418
- expect(content).toContain("OrphanScreen");
419
- });
420
- });
421
- describe("terreno_generate_form_fields edge cases", () => {
422
- test("should generate password field", () => {
423
- const result = handleToolCall("terreno_generate_form_fields", {
424
- fields: [{ label: "Password", name: "password", required: true, type: "password" }],
425
- });
426
- const content = result.content[0].text;
427
- expect(content).toContain("PasswordField");
428
- expect(content).toContain('label="Password"');
429
- expect(content).toContain("error={errors.password}");
430
- });
431
- test("should generate textarea field", () => {
432
- const result = handleToolCall("terreno_generate_form_fields", {
433
- fields: [{ name: "bio", type: "textarea" }],
434
- });
435
- const content = result.content[0].text;
436
- expect(content).toContain("TextArea");
437
- });
438
- test("should generate datetime field", () => {
439
- const result = handleToolCall("terreno_generate_form_fields", {
440
- fields: [{ name: "scheduledAt", type: "datetime" }],
441
- });
442
- const content = result.content[0].text;
443
- expect(content).toContain("DateTimeField");
444
- expect(content).toContain('mode="datetime"');
445
- });
446
- test("should generate select field with empty options", () => {
447
- const result = handleToolCall("terreno_generate_form_fields", {
448
- fields: [{ name: "category", type: "select" }],
449
- });
450
- const content = result.content[0].text;
451
- expect(content).toContain("SelectField");
452
- expect(content).toContain("options={[]}");
453
- });
454
- });
455
- describe("terreno_install_admin", () => {
456
- test("should generate admin panel files and instructions", () => {
457
- const result = handleToolCall("terreno_install_admin", {
458
- models: [
459
- {
460
- displayName: "Todos",
461
- listFields: ["title", "completed"],
462
- modelName: "Todo",
463
- routePath: "/todos",
464
- },
465
- {
466
- displayName: "Users",
467
- listFields: ["email"],
468
- modelName: "User",
469
- routePath: "/users",
470
- },
471
- ],
472
- });
473
- const content = result.content[0].text;
474
- expect(content).toContain("# Install Admin Panel");
475
- expect(content).toContain("frontend/app/(tabs)/admin/index.tsx");
476
- expect(content).toContain("frontend/app/(tabs)/admin/[model].tsx");
477
- expect(content).toContain("frontend/app/(tabs)/admin/[model]/create.tsx");
478
- expect(content).toContain("frontend/app/(tabs)/admin/[model]/[id].tsx");
479
- expect(content).toContain("AdminModelList");
480
- expect(content).toContain("AdminModelTable");
481
- expect(content).toContain("AdminModelForm");
482
- expect(content).toContain("@terreno/admin-backend");
483
- expect(content).toContain("@terreno/admin-frontend");
484
- expect(content).toContain("import {Todo, User} from");
485
- expect(content).toContain('displayName: "Todos"');
486
- expect(content).toContain('routePath: "/todos"');
487
- expect(content).toContain('["title","completed"]');
488
- });
489
- });
490
- describe("handleToolCall - bootstrap dispatch", () => {
491
- test("should delegate terreno_bootstrap_app to bootstrap handler", () => {
492
- const result = handleToolCall("terreno_bootstrap_app", {
493
- appDisplayName: "Dispatch App",
494
- appName: "dispatch-app",
495
- });
496
- expect(result.content[0].text).toContain("# Bootstrap Dispatch App");
497
- });
498
- test("should delegate terreno_bootstrap_ai_rules to bootstrap handler", () => {
499
- const result = handleToolCall("terreno_bootstrap_ai_rules", {
500
- appDisplayName: "Rules App",
501
- appName: "rules-app",
502
- });
503
- expect(result.content[0].text).toContain("Bootstrap AI Rules for Rules App");
504
- });
505
- });
506
- describe("terreno_search_docs and terreno_get_component_docs", () => {
507
- test("should reject terreno_search_docs when queries is not an array of strings", () => {
508
- const bad = handleToolCall("terreno_search_docs", { queries: "modelRouter" });
509
- expect(bad.content[0].text).toContain("must be an array of strings");
510
- const bad2 = handleToolCall("terreno_search_docs", { queries: [1, 2] });
511
- expect(bad2.content[0].text).toContain("must be an array of strings");
512
- });
513
- test("should run terreno_search_docs with valid arguments", () => {
514
- const ok = handleToolCall("terreno_search_docs", {
515
- packages: ["api"],
516
- queries: ["Terreno"],
517
- tokenLimit: 2000,
518
- });
519
- expect(ok.content[0].text).toContain("Terreno documentation search results");
520
- });
521
- test("should run terreno_get_component_docs with component name", () => {
522
- const out = handleToolCall("terreno_get_component_docs", { component: "Button" });
523
- expect(out.content[0].text.length).toBeGreaterThan(0);
524
- });
525
- });
526
- describe("terreno_get_upgrade_guide", () => {
527
- test("should require fromVersion and toVersion", () => {
528
- const out = handleToolCall("terreno_get_upgrade_guide", { fromVersion: "0.20.0" });
529
- expect(out.content[0].text).toContain("fromVersion");
530
- });
531
- test("should return bundled upgrade markdown for a range", () => {
532
- const out = handleToolCall("terreno_get_upgrade_guide", {
533
- fromVersion: "0.20.0",
534
- toVersion: "0.20.0",
535
- });
536
- expect(out.content[0].text).toContain("0.20.0");
537
- });
538
- });
539
- });
540
- //# sourceMappingURL=tools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=upgradeGuide.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgradeGuide.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/upgradeGuide.test.ts"],"names":[],"mappings":""}
@@ -1,22 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
- import { getUpgradeGuideMarkdown } from "../upgradeGuide.js";
3
- describe("getUpgradeGuideMarkdown", () => {
4
- test("returns bundled notes for a semver range when upgrade files exist", () => {
5
- const text = getUpgradeGuideMarkdown("0.19.0", "0.20.0");
6
- expect(text).toContain("0.20.0");
7
- expect(text).toMatch(/Upgrade to 0\.20\.0/i);
8
- });
9
- test("returns a single-version note when from and to match an existing file", () => {
10
- const text = getUpgradeGuideMarkdown("0.20.0", "0.20.0");
11
- expect(text).toContain("0.20.0");
12
- });
13
- test("returns guidance when no bundled notes match the requested range", () => {
14
- const text = getUpgradeGuideMarkdown("99.0.0", "99.1.0");
15
- expect(text).toContain("No upgrade notes found");
16
- });
17
- test("handles prerelease-style version tokens in semver keys", () => {
18
- const text = getUpgradeGuideMarkdown("0.19.0-rc.1", "0.20.0");
19
- expect(text.length).toBeGreaterThan(0);
20
- });
21
- });
22
- //# sourceMappingURL=upgradeGuide.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgradeGuide.test.js","sourceRoot":"","sources":["../../src/__tests__/upgradeGuide.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAC,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAC,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAE3D,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC7E,MAAM,IAAI,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uEAAuE,EAAE,GAAG,EAAE;QACjF,MAAM,IAAI,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC5E,MAAM,IAAI,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAAG,uBAAuB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}