@beignet/cli 0.0.51 → 0.0.53

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 (117) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +182 -19
  3. package/dist/analysis/layers.d.ts +2 -0
  4. package/dist/analysis/layers.d.ts.map +1 -1
  5. package/dist/analysis/layers.js +9 -2
  6. package/dist/analysis/layers.js.map +1 -1
  7. package/dist/analysis/port-wiring.d.ts +4 -2
  8. package/dist/analysis/port-wiring.d.ts.map +1 -1
  9. package/dist/analysis/port-wiring.js +41 -11
  10. package/dist/analysis/port-wiring.js.map +1 -1
  11. package/dist/analysis/source-files.d.ts +15 -0
  12. package/dist/analysis/source-files.d.ts.map +1 -0
  13. package/dist/analysis/source-files.js +52 -0
  14. package/dist/analysis/source-files.js.map +1 -0
  15. package/dist/analysis/source-index.d.ts +2 -1
  16. package/dist/analysis/source-index.d.ts.map +1 -1
  17. package/dist/analysis/source-index.js +34 -5
  18. package/dist/analysis/source-index.js.map +1 -1
  19. package/dist/analysis/workspace-routes.d.ts +8 -0
  20. package/dist/analysis/workspace-routes.d.ts.map +1 -0
  21. package/dist/analysis/workspace-routes.js +291 -0
  22. package/dist/analysis/workspace-routes.js.map +1 -0
  23. package/dist/analysis/workspace.d.ts +24 -3
  24. package/dist/analysis/workspace.d.ts.map +1 -1
  25. package/dist/analysis/workspace.js +184 -43
  26. package/dist/analysis/workspace.js.map +1 -1
  27. package/dist/app-map-changes.d.ts.map +1 -1
  28. package/dist/app-map-changes.js +24 -14
  29. package/dist/app-map-changes.js.map +1 -1
  30. package/dist/app-map.d.ts.map +1 -1
  31. package/dist/app-map.js +87 -81
  32. package/dist/app-map.js.map +1 -1
  33. package/dist/check.d.ts +12 -0
  34. package/dist/check.d.ts.map +1 -1
  35. package/dist/check.js +92 -25
  36. package/dist/check.js.map +1 -1
  37. package/dist/config.d.ts +7 -0
  38. package/dist/config.d.ts.map +1 -1
  39. package/dist/config.js +19 -0
  40. package/dist/config.js.map +1 -1
  41. package/dist/git-changes.d.ts +17 -1
  42. package/dist/git-changes.d.ts.map +1 -1
  43. package/dist/git-changes.js +118 -84
  44. package/dist/git-changes.js.map +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +23 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/inspect.d.ts.map +1 -1
  49. package/dist/inspect.js +424 -129
  50. package/dist/inspect.js.map +1 -1
  51. package/dist/lint.d.ts.map +1 -1
  52. package/dist/lint.js +108 -43
  53. package/dist/lint.js.map +1 -1
  54. package/dist/make/shared.js +1 -1
  55. package/dist/make.js +18 -1
  56. package/dist/make.js.map +1 -1
  57. package/dist/mcp.js +1 -1
  58. package/dist/mcp.js.map +1 -1
  59. package/dist/provider-add.js +2 -2
  60. package/dist/provider-add.js.map +1 -1
  61. package/dist/provider-audit.d.ts.map +1 -1
  62. package/dist/provider-audit.js +22 -6
  63. package/dist/provider-audit.js.map +1 -1
  64. package/dist/templates/agents.d.ts.map +1 -1
  65. package/dist/templates/agents.js +36 -13
  66. package/dist/templates/agents.js.map +1 -1
  67. package/dist/templates/base.js +5 -5
  68. package/dist/templates/db/mysql.d.ts.map +1 -1
  69. package/dist/templates/db/mysql.js +51 -22
  70. package/dist/templates/db/mysql.js.map +1 -1
  71. package/dist/templates/db/postgres.d.ts.map +1 -1
  72. package/dist/templates/db/postgres.js +60 -20
  73. package/dist/templates/db/postgres.js.map +1 -1
  74. package/dist/templates/db/sqlite.d.ts.map +1 -1
  75. package/dist/templates/db/sqlite.js +51 -23
  76. package/dist/templates/db/sqlite.js.map +1 -1
  77. package/dist/templates/shadcn.js +1 -1
  78. package/dist/templates/shadcn.js.map +1 -1
  79. package/dist/templates/shared.js +6 -6
  80. package/dist/templates/shared.js.map +1 -1
  81. package/dist/templates/testing.d.ts.map +1 -1
  82. package/dist/templates/testing.js +7 -19
  83. package/dist/templates/testing.js.map +1 -1
  84. package/dist/test-discovery.d.ts +9 -0
  85. package/dist/test-discovery.d.ts.map +1 -0
  86. package/dist/test-discovery.js +40 -0
  87. package/dist/test-discovery.js.map +1 -0
  88. package/package.json +8 -5
  89. package/skills/app-structure/SKILL.md +74 -7
  90. package/src/analysis/layers.ts +13 -2
  91. package/src/analysis/port-wiring.ts +68 -11
  92. package/src/analysis/source-files.ts +61 -0
  93. package/src/analysis/source-index.ts +56 -4
  94. package/src/analysis/workspace-routes.ts +385 -0
  95. package/src/analysis/workspace.ts +302 -59
  96. package/src/app-map-changes.ts +41 -13
  97. package/src/app-map.ts +114 -103
  98. package/src/check.ts +115 -25
  99. package/src/config.ts +33 -0
  100. package/src/git-changes.ts +218 -86
  101. package/src/index.ts +33 -5
  102. package/src/inspect.ts +608 -156
  103. package/src/lint.ts +152 -48
  104. package/src/make/shared.ts +1 -1
  105. package/src/make.ts +31 -1
  106. package/src/mcp.ts +1 -1
  107. package/src/provider-add.ts +2 -2
  108. package/src/provider-audit.ts +30 -10
  109. package/src/templates/agents.ts +36 -13
  110. package/src/templates/base.ts +5 -5
  111. package/src/templates/db/mysql.ts +51 -22
  112. package/src/templates/db/postgres.ts +60 -20
  113. package/src/templates/db/sqlite.ts +51 -23
  114. package/src/templates/shadcn.ts +1 -1
  115. package/src/templates/shared.ts +6 -6
  116. package/src/templates/testing.ts +12 -19
  117. package/src/test-discovery.ts +53 -0
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../src/templates/db/postgres.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,2DAA2D;AAC3D,0EAA0E;AAC1E,+EAA+E;AAC/E,yEAAyE;AACzE,8DAA8D;AAC9D,4EAA4E;AAC5E,sCAAsC;AACtC,yDAAyD;AACzD,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,EAAE;AACF,6CAA6C;AAC7C,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,eAAe,CAAC,GAAoB;IAClD,OAAO;QACL,aAAa,EAAE;;;;;yCAKsB,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;;;CAG9E;QACG,QAAQ,EAAE;;;;;;;;;;;;;;;CAeb;QACG,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEb;QACG,qBAAqB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsF1B;QACG,cAAc,EAAE;;;;;;;;;;;;CAYnB;QACG,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqClB;QACG,iBAAiB,EAAE,uBAAuB,CAAC;YACzC,OAAO,EAAE;iCACkB;YAC3B,IAAI,EAAE,sEAAsE;YAC5E,WAAW,EAAE;;;;;;;;;;;;;QAaX;YACF,KAAK,EAAE,mBAAmB;SAC3B,CAAC;QACF,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDf;QACG,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCZ;QACG,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCnB;QACG,GAAG,wBAAwB;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,wBAAwB,GAAG;IAC/B,oEAAoE;IACpE,kEAAkE;IAClE,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EtB;IACC,uBAAuB,EAAE;;;;;;;;;;;;EAYzB;IACA,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+Y1B;CACD,CAAC"}
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../src/templates/db/postgres.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,2DAA2D;AAC3D,0EAA0E;AAC1E,+EAA+E;AAC/E,yEAAyE;AACzE,8DAA8D;AAC9D,4EAA4E;AAC5E,sCAAsC;AACtC,yDAAyD;AACzD,2EAA2E;AAC3E,0EAA0E;AAC1E,yEAAyE;AACzE,EAAE;AACF,6CAA6C;AAC7C,6DAA6D;AAC7D,2EAA2E;AAC3E,0EAA0E;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,UAAU,eAAe,CAAC,GAAoB;IAClD,OAAO;QACL,aAAa,EAAE;;;;;yCAKsB,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC;;;CAG9E;QACG,QAAQ,EAAE;;;;;;;;;;;;;;;CAeb;QACG,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFb;QACG,qBAAqB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsF1B;QACG,cAAc,EAAE;;;;;;;;;;;;CAYnB;QACG,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqClB;QACG,iBAAiB,EAAE,uBAAuB,CAAC;YACzC,OAAO,EAAE;iCACkB;YAC3B,IAAI,EAAE,sEAAsE;YAC5E,WAAW,EAAE;;;;;;;;;;;;;QAaX;YACF,KAAK,EAAE,mBAAmB;SAC3B,CAAC;QACF,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDf;QACG,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCZ;QACG,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCnB;QACG,GAAG,wBAAwB;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,wBAAwB,GAAG;IAC/B,oEAAoE;IACpE,kEAAkE;IAClE,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EtB;IACC,uBAAuB,EAAE;;;;;;;;;;;;EAYzB;IACA,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2a1B;CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/templates/db/sqlite.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA26BlD,wBAAgB,aAAa,IAAI,eAAe,CAE/C"}
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/templates/db/sqlite.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAu8BlD,wBAAgB,aAAa,IAAI,eAAe,CAE/C"}
@@ -39,7 +39,7 @@ export function closeDatabaseClient(): Promise<void> {
39
39
  return closePromise;
40
40
  }
41
41
  `,
42
- dbSchema: `import { index, integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
42
+ dbSchema: `import { index, integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core";
43
43
 
44
44
  export const user = sqliteTable("user", {
45
45
  id: text("id").primaryKey(),
@@ -66,27 +66,37 @@ export const session = sqliteTable("session", {
66
66
  .references(() => user.id, { onDelete: "cascade" }),
67
67
  });
68
68
 
69
- export const account = sqliteTable("account", {
70
- id: text("id").primaryKey(),
71
- accountId: text("account_id").notNull(),
72
- providerId: text("provider_id").notNull(),
73
- userId: text("user_id")
74
- .notNull()
75
- .references(() => user.id, { onDelete: "cascade" }),
76
- accessToken: text("access_token"),
77
- refreshToken: text("refresh_token"),
78
- idToken: text("id_token"),
79
- accessTokenExpiresAt: integer("access_token_expires_at", {
80
- mode: "timestamp",
81
- }),
82
- refreshTokenExpiresAt: integer("refresh_token_expires_at", {
83
- mode: "timestamp",
84
- }),
85
- scope: text("scope"),
86
- password: text("password"),
87
- createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
88
- updatedAt: integer("updated_at", { mode: "timestamp" }).notNull(),
89
- });
69
+ export const account = sqliteTable(
70
+ "account",
71
+ {
72
+ id: text("id").primaryKey(),
73
+ issuer: text("issuer").notNull(),
74
+ accountId: text("account_id").notNull(),
75
+ providerId: text("provider_id").notNull(),
76
+ userId: text("user_id")
77
+ .notNull()
78
+ .references(() => user.id, { onDelete: "cascade" }),
79
+ accessToken: text("access_token"),
80
+ refreshToken: text("refresh_token"),
81
+ idToken: text("id_token"),
82
+ accessTokenExpiresAt: integer("access_token_expires_at", {
83
+ mode: "timestamp",
84
+ }),
85
+ refreshTokenExpiresAt: integer("refresh_token_expires_at", {
86
+ mode: "timestamp",
87
+ }),
88
+ scope: text("scope"),
89
+ password: text("password"),
90
+ createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
91
+ updatedAt: integer("updated_at", { mode: "timestamp" }).notNull(),
92
+ },
93
+ (table) => [
94
+ uniqueIndex("account_issuer_accountId_uidx").on(
95
+ table.issuer,
96
+ table.accountId,
97
+ ),
98
+ ],
99
+ );
90
100
 
91
101
  export const verification = sqliteTable("verification", {
92
102
  id: text("id").primaryKey(),
@@ -449,6 +459,7 @@ export async function createTestDatabase(): Promise<TestDatabase> {
449
459
  // above, with the provider idempotency setup statements appended.
450
460
  starterMigrationSql: `CREATE TABLE \`account\` (
451
461
  \`id\` text PRIMARY KEY NOT NULL,
462
+ \`issuer\` text NOT NULL,
452
463
  \`account_id\` text NOT NULL,
453
464
  \`provider_id\` text NOT NULL,
454
465
  \`user_id\` text NOT NULL,
@@ -464,6 +475,7 @@ export async function createTestDatabase(): Promise<TestDatabase> {
464
475
  FOREIGN KEY (\`user_id\`) REFERENCES \`user\`(\`id\`) ON UPDATE no action ON DELETE cascade
465
476
  );
466
477
  --> statement-breakpoint
478
+ CREATE UNIQUE INDEX \`account_issuer_accountId_uidx\` ON \`account\` (\`issuer\`,\`account_id\`);--> statement-breakpoint
467
479
  CREATE TABLE \`session\` (
468
480
  \`id\` text PRIMARY KEY NOT NULL,
469
481
  \`expires_at\` integer NOT NULL,
@@ -552,6 +564,13 @@ CREATE INDEX IF NOT EXISTS "idempotency_records_expires_idx" ON "idempotency_rec
552
564
  "notNull": true,
553
565
  "autoincrement": false
554
566
  },
567
+ "issuer": {
568
+ "name": "issuer",
569
+ "type": "text",
570
+ "primaryKey": false,
571
+ "notNull": true,
572
+ "autoincrement": false
573
+ },
555
574
  "account_id": {
556
575
  "name": "account_id",
557
576
  "type": "text",
@@ -637,7 +656,16 @@ CREATE INDEX IF NOT EXISTS "idempotency_records_expires_idx" ON "idempotency_rec
637
656
  "autoincrement": false
638
657
  }
639
658
  },
640
- "indexes": {},
659
+ "indexes": {
660
+ "account_issuer_accountId_uidx": {
661
+ "name": "account_issuer_accountId_uidx",
662
+ "columns": [
663
+ "issuer",
664
+ "account_id"
665
+ ],
666
+ "isUnique": true
667
+ }
668
+ },
641
669
  "foreignKeys": {
642
670
  "account_user_id_user_id_fk": {
643
671
  "name": "account_user_id_user_id_fk",
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/templates/db/sqlite.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,2DAA2D;AAC3D,0EAA0E;AAC1E,+EAA+E;AAC/E,gFAAgF;AAChF,0EAA0E;AAC1E,iEAAiE;AACjE,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AAGzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,KAAK,GAAG;IACZ,aAAa,EAAE;;;;;;;;;CAShB;IACC,QAAQ,EAAE;;;;;;;;;;;;;;;CAeX;IACC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2EX;IACC,qBAAqB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFxB;IACC,cAAc,EAAE;;;;;;;;;;;;CAYjB;IACC,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8ChB;IACC,iBAAiB,EAAE,uBAAuB,CAAC;QACzC,OAAO,EAAE;;;;iCAIoB;QAC7B,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BR;QACE,WAAW,EAAE;;;;;;;;;;;;;;;;EAgBf;QACE,KAAK,EAAE,kBAAkB;KAC1B,CAAC;IACF,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDb;IACC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CV;IACC,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCjB;IACC,oEAAoE;IACpE,kEAAkE;IAClE,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2EtB;IACC,uBAAuB,EAAE;;;;;;;;;;;;EAYzB;IACA,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyZ1B;CACD,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/templates/db/sqlite.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,2DAA2D;AAC3D,0EAA0E;AAC1E,+EAA+E;AAC/E,gFAAgF;AAChF,0EAA0E;AAC1E,iEAAiE;AACjE,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AAGzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,MAAM,KAAK,GAAG;IACZ,aAAa,EAAE;;;;;;;;;CAShB;IACC,QAAQ,EAAE;;;;;;;;;;;;;;;CAeX;IACC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFX;IACC,qBAAqB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFxB;IACC,cAAc,EAAE;;;;;;;;;;;;CAYjB;IACC,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8ChB;IACC,iBAAiB,EAAE,uBAAuB,CAAC;QACzC,OAAO,EAAE;;;;iCAIoB;QAC7B,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BR;QACE,WAAW,EAAE;;;;;;;;;;;;;;;;EAgBf;QACE,KAAK,EAAE,kBAAkB;KAC1B,CAAC;IACF,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDb;IACC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CV;IACC,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCjB;IACC,oEAAoE;IACpE,kEAAkE;IAClE,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6EtB;IACC,uBAAuB,EAAE;;;;;;;;;;;;EAYzB;IACA,wBAAwB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAya1B;CACD,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -546,7 +546,7 @@ export const shadcnDependencies = {
546
546
  clsx: "^2.1.1",
547
547
  "lucide-react": "^1.16.0",
548
548
  "radix-ui": "^1.4.3",
549
- shadcn: "^4.7.0",
549
+ shadcn: "^4.19.0",
550
550
  "tailwind-merge": "^3.6.0",
551
551
  "tw-animate-css": "^1.4.0",
552
552
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shadcn.js","sourceRoot":"","sources":["../../src/templates/shadcn.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,aAAa,GAAG;;;;;;;CAOrB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;CAMhB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiIrB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEhB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGd,CAAC;AAEF,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgClB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEtB,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;CAmBf,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBf,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE;QACtD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE;QACpD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE;QACnD,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,QAAQ,EAAE;QACvD,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,EAAE;QACnD,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,UAAU,EAAE;QAC3D,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,cAAc,EAAE;QACpE,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,WAAW,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,0BAA0B,EAAE,QAAQ;IACpC,IAAI,EAAE,QAAQ;IACd,cAAc,EAAE,SAAS;IACzB,UAAU,EAAE,QAAQ;IACpB,MAAM,EAAE,QAAQ;IAChB,gBAAgB,EAAE,QAAQ;IAC1B,gBAAgB,EAAE,QAAQ;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,sBAAsB,EAAE,QAAQ;IAChC,WAAW,EAAE,QAAQ;CACtB,CAAC"}
1
+ {"version":3,"file":"shadcn.js","sourceRoot":"","sources":["../../src/templates/shadcn.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,MAAM,aAAa,GAAG;;;;;;;CAOrB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;CAMhB,CAAC;AAEF,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiIrB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEhB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuGd,CAAC;AAEF,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgClB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEtB,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;CAmBf,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBf,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BnB,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE;QACtD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE;QACpD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE;QACnD,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,QAAQ,EAAE;QACvD,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,EAAE;QACnD,EAAE,IAAI,EAAE,4BAA4B,EAAE,OAAO,EAAE,UAAU,EAAE;QAC3D,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,cAAc,EAAE;QACpE,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,WAAW,EAAE;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,0BAA0B,EAAE,QAAQ;IACpC,IAAI,EAAE,QAAQ;IACd,cAAc,EAAE,SAAS;IACzB,UAAU,EAAE,QAAQ;IACpB,MAAM,EAAE,SAAS;IACjB,gBAAgB,EAAE,QAAQ;IAC1B,gBAAgB,EAAE,QAAQ;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,sBAAsB,EAAE,QAAQ;IAChC,WAAW,EAAE,QAAQ;CACtB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export const externalVersions = {
2
2
  biome: "^2.4.14",
3
- next: "^16.2.10",
3
+ next: "^16.3.3",
4
4
  react: "^19.2.5",
5
5
  reactDom: "^19.2.5",
6
6
  tsx: "^4.22.4",
@@ -9,16 +9,16 @@ export const externalVersions = {
9
9
  typesReact: "^19.0.0",
10
10
  typesReactDom: "^19.0.0",
11
11
  zod: "^4.0.0",
12
- tanstackReactQuery: "^5.100.7",
12
+ tanstackReactQuery: "^5.102.0",
13
13
  hookformResolvers: "^5.0.0",
14
14
  reactHookForm: "^7.74.0",
15
- betterAuth: "1.6.25",
15
+ betterAuth: "1.7.1",
16
16
  bullmq: "^5.0.0",
17
17
  drizzleKit: "^0.31.10",
18
18
  drizzleOrm: "^0.45.2",
19
- inngest: "^4.12.1",
19
+ inngest: "^4.18.1",
20
20
  libsqlClient: "^0.14.0",
21
- vercelBlob: "^2.5.0",
21
+ vercelBlob: "^2.8.0",
22
22
  mysql2: "^3.12.0",
23
23
  pg: "^8.13.0",
24
24
  pglite: "^0.5.2",
@@ -26,7 +26,7 @@ export const externalVersions = {
26
26
  resend: "^6.14.0",
27
27
  sentryNode: "^10.58.0",
28
28
  stripe: "^22.2.1",
29
- nodemailer: "^9.0.1",
29
+ nodemailer: "^9.1.1",
30
30
  openFeatureServerSdk: "^1.22.0",
31
31
  typesPg: "^8.11.0",
32
32
  ioredis: "^5.0.0",
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/templates/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/templates/shared.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/templates/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,sBAAsB,EAAE,YA+YpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,YAqKpC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,YAAY,EAGlD,CAAC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/templates/testing.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,sBAAsB,EAAE,YA+YpC,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,YAwJpC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,YAAY,EAGlD,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { appTestFilePattern, configuredTestDirectoryPathKeys, configuredTestFilePathKeys, defaultAppTestRoots, } from "../test-discovery.js";
1
2
  export const testHelperTemplateFile = {
2
3
  path: "lib/beignet-test.ts",
3
4
  content: `import assert from "node:assert/strict";
@@ -405,16 +406,9 @@ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
405
406
  import path from "node:path";
406
407
  import { pathToFileURL } from "node:url";
407
408
 
408
- const defaultTestRoots = [
409
- "app",
410
- "features",
411
- "infra",
412
- "lib",
413
- "ports",
414
- "server",
415
- "tests",
416
- "src/tests",
417
- ];
409
+ const defaultTestRoots = ${JSON.stringify(defaultAppTestRoots, null, 2)};
410
+ const configuredTestDirectoryPathKeys = ${JSON.stringify(configuredTestDirectoryPathKeys)};
411
+ const configuredTestFilePathKeys = ${JSON.stringify(configuredTestFilePathKeys)};
418
412
  const ignoredDirectories = new Set([
419
413
  ".beignet-local",
420
414
  ".git",
@@ -424,7 +418,7 @@ const ignoredDirectories = new Set([
424
418
  "dist",
425
419
  "node_modules",
426
420
  ]);
427
- const testFilePattern = /\\.(test|spec)\\.[cm]?[tj]sx?$/;
421
+ const testFilePattern = /${appTestFilePattern.source}/;
428
422
 
429
423
  const configFileNames = [
430
424
  "beignet.config.ts",
@@ -529,14 +523,8 @@ async function configuredRoots(cwd: string): Promise<string[]> {
529
523
  }
530
524
  const paths = isObjectRecord(config.paths) ? config.paths : {};
531
525
  return [
532
- paths.tests,
533
- paths.features,
534
- parentPath(paths.routes),
535
- parentPath(paths.server),
536
- parentPath(paths.portWiring),
537
- parentPath(paths.ports),
538
- parentPath(paths.useCaseBuilder),
539
- parentPath(paths.routesBuilder),
526
+ ...configuredTestDirectoryPathKeys.map((key) => paths[key]),
527
+ ...configuredTestFilePathKeys.map((key) => parentPath(paths[key])),
540
528
  ].filter((root): root is string => Boolean(root) && root !== ".");
541
529
  }
542
530
 
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/templates/testing.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAiB;IAClD,IAAI,EAAE,qBAAqB;IAC3B,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4YV;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAiB;IAClD,IAAI,EAAE,4BAA4B;IAClC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkKV;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACtD,sBAAsB;IACtB,sBAAsB;CACvB,CAAC"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/templates/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,+BAA+B,EAC/B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,CAAC,MAAM,sBAAsB,GAAiB;IAClD,IAAI,EAAE,qBAAqB;IAC3B,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4YV;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAiB;IAClD,IAAI,EAAE,4BAA4B;IAClC,OAAO,EAAE;;;;;2BAKgB,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC;0CAC7B,IAAI,CAAC,SAAS,CAAC,+BAA+B,CAAC;qCACpD,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC;;;;;;;;;;2BAUpD,kBAAkB,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoInD;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACtD,sBAAsB;IACtB,sBAAsB;CACvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type BeignetPaths } from "./config.js";
2
+ export declare const defaultAppTestRoots: readonly ["app", "features", "infra", "lib", "ports", "server", "tests", "src/tests"];
3
+ export declare const configuredTestDirectoryPathKeys: readonly ["tests", "features"];
4
+ export declare const configuredTestFilePathKeys: readonly ["routes", "server", "portWiring", "ports", "useCaseBuilder", "routesBuilder"];
5
+ export declare const appTestFilePattern: RegExp;
6
+ export declare function appTestRoots(paths: BeignetPaths): string[];
7
+ export declare function isAppTestFile(file: string): boolean;
8
+ export declare function isWithinAppTestRoots(file: string, roots: readonly string[]): boolean;
9
+ //# sourceMappingURL=test-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-discovery.d.ts","sourceRoot":"","sources":["../src/test-discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,mBAAmB,uFAStB,CAAC;AAEX,eAAO,MAAM,+BAA+B,gCAGQ,CAAC;AAErD,eAAO,MAAM,0BAA0B,yFAOa,CAAC;AAErD,eAAO,MAAM,kBAAkB,QAAiC,CAAC;AAEjE,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,EAAE,CAW1D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAET"}
@@ -0,0 +1,40 @@
1
+ import path from "node:path";
2
+ import { directoryPath } from "./config.js";
3
+ export const defaultAppTestRoots = [
4
+ "app",
5
+ "features",
6
+ "infra",
7
+ "lib",
8
+ "ports",
9
+ "server",
10
+ "tests",
11
+ "src/tests",
12
+ ];
13
+ export const configuredTestDirectoryPathKeys = [
14
+ "tests",
15
+ "features",
16
+ ];
17
+ export const configuredTestFilePathKeys = [
18
+ "routes",
19
+ "server",
20
+ "portWiring",
21
+ "ports",
22
+ "useCaseBuilder",
23
+ "routesBuilder",
24
+ ];
25
+ export const appTestFilePattern = /\.(test|spec)\.[cm]?[jt]sx?$/;
26
+ export function appTestRoots(paths) {
27
+ const roots = [
28
+ ...defaultAppTestRoots,
29
+ ...configuredTestDirectoryPathKeys.map((key) => paths[key]),
30
+ ...configuredTestFilePathKeys.map((key) => directoryPath(path.posix.dirname(paths[key]))),
31
+ ];
32
+ return Array.from(new Set(roots.map(directoryPath).filter((root) => root && root !== ".")));
33
+ }
34
+ export function isAppTestFile(file) {
35
+ return appTestFilePattern.test(file);
36
+ }
37
+ export function isWithinAppTestRoots(file, roots) {
38
+ return roots.some((root) => file.startsWith(`${root}/`));
39
+ }
40
+ //# sourceMappingURL=test-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-discovery.js","sourceRoot":"","sources":["../src/test-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAqB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK;IACL,UAAU;IACV,OAAO;IACP,KAAK;IACL,OAAO;IACP,QAAQ;IACR,OAAO;IACP,WAAW;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,OAAO;IACP,UAAU;CACwC,CAAC;AAErD,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,gBAAgB;IAChB,eAAe;CACmC,CAAC;AAErD,MAAM,CAAC,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAEjE,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,KAAK,GAAG;QACZ,GAAG,mBAAmB;QACtB,GAAG,+BAA+B,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3D,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACxC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAC9C;KACF,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,KAAwB;IAExB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beignet/cli",
3
- "version": "0.0.51",
3
+ "version": "0.0.53",
4
4
  "type": "module",
5
5
  "description": "CLI for creating and maintaining Beignet apps.",
6
6
  "main": "./dist/lib.js",
@@ -33,8 +33,8 @@
33
33
  "prepack": "bun run build",
34
34
  "dev": "tsc --watch",
35
35
  "clean": "rm -rf dist coverage .turbo",
36
- "test": "bun test",
37
- "test:coverage": "bun test --coverage",
36
+ "test": "bun test --parallel=2",
37
+ "test:coverage": "bun test --parallel=2 --coverage",
38
38
  "lint": "biome check ."
39
39
  },
40
40
  "keywords": [
@@ -63,19 +63,22 @@
63
63
  "node": ">=22.12.0"
64
64
  },
65
65
  "devDependencies": {
66
+ "@beignet/web": "*",
66
67
  "@modelcontextprotocol/client": "^2.0.0",
67
- "@types/bun": "^1.3.13",
68
+ "@types/bun": "^1.4.0",
68
69
  "@types/node": "^22.0.0",
70
+ "@types/semver": "^7.8.0",
69
71
  "next-themes": "^0.4.6",
70
72
  "tsx": "^4.22.4"
71
73
  },
72
74
  "dependencies": {
73
- "@beignet/core": "^0.0.51",
75
+ "@beignet/core": "^0.0.53",
74
76
  "@clack/prompts": "^1.5.1",
75
77
  "@modelcontextprotocol/server": "^2.0.0",
76
78
  "@stricli/core": "^1.2.7",
77
79
  "diff": "^8.0.4",
78
80
  "jiti": "^2.7.0",
81
+ "semver": "^7.8.5",
79
82
  "typescript": "^5.3.0",
80
83
  "zod": "^4.2.0"
81
84
  }
@@ -8,8 +8,8 @@ description: "Maintain Beignet app structure with @beignet/cli: deterministic ap
8
8
  Use this skill when working with Beignet apps through `@beignet/cli`. Prefer
9
9
  generators and validation commands before hand-editing framework wiring.
10
10
 
11
- Beignet apps require Node.js 22.12 or newer. Bun 1.3.14 or newer is supported
12
- for Beignet commands.
11
+ Beignet apps require Node.js 22.12 or newer. Bun is optional; npm, pnpm, Yarn,
12
+ and Bun can run Beignet commands.
13
13
 
14
14
  ## Starter Sources
15
15
 
@@ -53,6 +53,12 @@ beignet make upload issues.attachment --ui
53
53
  Generators place files under the owning feature, update central registries
54
54
  when possible, and keep `doctor` clean.
55
55
 
56
+ Event schemas must output canonical JSON transport data. Use null, strings,
57
+ finite numbers, booleans, arrays, and plain objects. Keep validation
58
+ deterministic and side-effect-free, keep transforms idempotent, and represent
59
+ timestamps as strings or numbers rather than `Date` objects.
60
+ Beignet rejects payloads that would change when decoded and validated again.
61
+
56
62
  Use `make upload --ui` in full-stack apps when the upload should include a
57
63
  shared client/server constraint manifest, typed React upload client, uploader,
58
64
  and component test. Omit `--ui` for API-only or backend-only workflows.
@@ -71,6 +77,15 @@ beignet db migrate
71
77
  beignet db status
72
78
  ```
73
79
 
80
+ ## Encryption keys
81
+
82
+ `beignet encryption key` prints a fresh key for `@beignet/core/encryption`;
83
+ `--json` returns `schemaVersion` and `key`. It does not read or overwrite env
84
+ files. Keep the output out of shared logs and wire the persistent key through
85
+ server env config and `infra/port-wiring.ts`. Retain keys needed by existing
86
+ records and backups during rotation. The starter does not configure encryption
87
+ until the app needs it; no encryption generator or provider preset is required.
88
+
74
89
  ## Explicit Registration
75
90
 
76
91
  Hand-written files do not run until registered:
@@ -168,12 +183,54 @@ root at `src/client/index.ts`. Other registries and app-bound builders are not
168
183
  relocated implicitly; override each path the app has moved, such as
169
184
  `listeners`, `schedules`, `tasks`, `outbox`, and their matching builder paths.
170
185
 
186
+ ## Workspace Source Packages
187
+
188
+ An app may set `workspace.packages` to explicit relative source-package
189
+ paths, including transitive dependencies. Each included package must have a
190
+ unique manifest name, belong to the app's declared dependency graph, and use a
191
+ separate root. Read the package's own Beignet config and TypeScript config
192
+ before changing its files. Package exports must resolve to source; do not guess
193
+ source from `dist` or declaration files.
194
+
195
+ Lint follows imports and reexports across these packages using each owner's
196
+ layers. Relative imports, TypeScript aliases, and `package.json#imports` aliases
197
+ that resolve outside the configured source roots also require the owning source
198
+ package in `workspace.packages`. Aliases to installed external dependencies remain
199
+ external imports.
200
+ Shared feature names in map/explain are qualified as
201
+ `@scope/package:feature`, and source evidence remains app-relative, including
202
+ `../`. Routes/doctor follow explicit server route composition and report
203
+ unresolved workspace registration instead of executing it. Trace the exported
204
+ server or the value returned by the exported Next.js server loader; unused
205
+ factory calls do not establish registration. Verified per-file Next.js handlers
206
+ do not require central registration. AppPorts and initialPorts may be reexported
207
+ through source entrypoints, including wiring aliases used by inferred AppPorts.
208
+ Import-then-export barrels and type-only port exports are supported. Match
209
+ contracts by their resolved declaration, including loader-local aliases, rather
210
+ than assuming export names are unique across packages.
211
+
212
+ Keep startup, lifecycle provider registration, env, database commands, and
213
+ operational registries app-owned. Those doctor checks still use app conventions;
214
+ a worker-only package can run lint without pretending to expose an HTTP server.
215
+ Generators and doctor repairs stay within the selected app. Never put a sibling
216
+ package path into `paths.*` to make a generator write there. See the CLI README's
217
+ workspace source packages section for the supported scope and fixture.
218
+
171
219
  ## Lint And Doctor
172
220
 
173
221
  Start unfamiliar app work with `beignet map`. Its human output summarizes each
174
222
  feature; `beignet map --json` returns the versioned graph with source evidence,
175
223
  registration status, doctor/lint findings, and unresolved references. Use
176
224
  `--feature <name>` or `--kind route,use-case,event` to bound agent context.
225
+ The graph analyzes TypeScript (`.ts`, `.tsx`, `.mts`, and `.cts`) and
226
+ JavaScript (`.js`, `.jsx`, `.mjs`, and `.cjs`) source. Statically recognizable
227
+ Beignet declarations using ES module exports become normal concept nodes, and
228
+ CommonJS `require()` calls contribute dependency evidence. Test/spec files
229
+ under canonical and configured app test roots become test nodes.
230
+ Feature tests keep feature ownership; adjacent app, infra, server, and
231
+ top-level tests remain app-level nodes and can surface as reverse-import
232
+ consumers in changed mode. Treat those links as impact evidence, not proof of
233
+ behavioral coverage.
177
234
  After editing inside a Git worktree, use `beignet map --changed` to inspect
178
235
  directly changed concepts, reverse imports, one-hop semantic consumers, feature
179
236
  context, and unresolved evidence before running `beignet check`. The report
@@ -184,8 +241,16 @@ and does not prove correctness. Recognized guide files and root
184
241
  documentation-directory content stay non-impacting; other `.mdx` and `.txt`
185
242
  paths remain application changes. Changed files with no mapped concept appear
186
243
  as explicit gaps.
187
- The graph resolves local modules with the full TypeScript `baseUrl` and `paths`
188
- configuration. Treat `local_import_unresolved` and
244
+
245
+ `beignet check` fingerprints Git source before and after the full validation
246
+ loop. Treat `provenance.status: "stale"` as a failed result even when every
247
+ individual step passed, and rerun against the resulting source. Outside Git,
248
+ the same checks run with provenance marked unavailable; report that limitation
249
+ instead of describing the result as source-current.
250
+
251
+ The graph resolves local modules with the full `baseUrl` and `paths`
252
+ configuration from `tsconfig.json`, or `jsconfig.json` when no TypeScript
253
+ config exists. Treat `local_import_unresolved` and
189
254
  `contract_declaration_unresolved` as real blind spots to fix, not absent
190
255
  relationships. This includes direct and contract-group declarations whose
191
256
  method, path, or group prefix is dynamic. Local fluent-builder aliases and
@@ -208,8 +273,8 @@ the declaration without parsing the diagnostic message.
208
273
  and feature-root helpers must not depend back on agent adapters
209
274
  - seeds should compose factories and context ports rather than concrete infra,
210
275
  providers, UI, or runtime composition
211
- - TypeScript imports, re-exports, `require()`, import assignments, and literal
212
- dynamic imports all participate in the same graph
276
+ - JavaScript and TypeScript imports, re-exports, `require()`, import
277
+ assignments, and literal dynamic imports all participate in the same graph
213
278
  - feature-root helpers are classified and followed transitively, so they cannot
214
279
  hide a forbidden dependency; computed module references in constrained layers
215
280
  fail when lint cannot verify their destination
@@ -274,7 +339,9 @@ names, source selectors, and applicable aliases. `check` accepts optional
274
339
  `{ preflight?: boolean, preflightConnect?: boolean, connectTimeoutMs?: number, timeoutMs?: number }`.
275
340
  Connected preflight adds migration status and dependency health checks. Check
276
341
  bounds failure output, cancels the active script with the MCP request, and
277
- returns the same versioned result as `beignet check --json`. It does not apply
342
+ returns the same versioned result as `beignet check --json`, including
343
+ starting and ending source provenance. An ending fingerprint that differs from
344
+ the baseline makes the result stale and unsuccessful. It does not apply
278
345
  Beignet fixes, but app package scripts retain their normal side effects. The
279
346
  target package must declare `@beignet/core`, `@beignet/next`, or `@beignet/web`
280
347
  as a runtime dependency. The root must also contain `app-context.ts` or
@@ -5,6 +5,17 @@ import {
5
5
  normalizePath,
6
6
  type ResolvedBeignetConfig,
7
7
  } from "../config.js";
8
+ import { isAppTestFile } from "../test-discovery.js";
9
+ import { stripSourceFileExtension } from "./source-files.js";
10
+ import { type AnalysisWorkspace, projectSource } from "./workspace.js";
11
+
12
+ export function classifyWorkspaceSourcePath(
13
+ file: string,
14
+ workspace: AnalysisWorkspace,
15
+ ): SourceLayer {
16
+ const source = projectSource(workspace, file);
17
+ return classifySourcePath(source.file, source.project.config);
18
+ }
8
19
 
9
20
  export type SourceLayer =
10
21
  | "app"
@@ -190,7 +201,7 @@ export function canonicalFeatureLayerPath(
190
201
 
191
202
  function isTestSourceFile(segment: string, rest: string[]): boolean {
192
203
  const fileName = rest.at(-1) ?? segment;
193
- return /\.(?:test|spec)\.(?:ts|tsx|mts|cts)$/.test(fileName);
204
+ return isAppTestFile(fileName);
194
205
  }
195
206
 
196
207
  function featureDirectoryConvention(
@@ -233,7 +244,7 @@ function normalizeLayerSegment(segment: string): string {
233
244
  }
234
245
 
235
246
  function stripKnownExtension(filePath: string): string {
236
- return filePath.replace(/\.(c|m)?tsx?$/, "");
247
+ return stripSourceFileExtension(filePath);
237
248
  }
238
249
 
239
250
  function isTestPath(filePath: string): boolean {