@leanspec/ui 0.2.5-dev.20251119025751 → 0.2.5-dev.20251119062438

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 (200) hide show
  1. package/.next/standalone/node_modules/.pnpm/tiktoken@1.0.22/node_modules/tiktoken/tiktoken_bg.wasm +0 -0
  2. package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
  3. package/.next/standalone/packages/ui/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/packages/ui/.next/build-manifest.json +4 -5
  5. package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -28
  6. package/.next/standalone/packages/ui/.next/routes-manifest.json +8 -6
  7. package/.next/standalone/packages/ui/.next/server/app/_global-error/page/build-manifest.json +2 -3
  8. package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js +1 -1
  9. package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js.nft.json +1 -1
  10. package/.next/standalone/packages/ui/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
  12. package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
  13. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  14. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next/standalone/packages/ui/.next/server/app/_not-found/page/build-manifest.json +2 -3
  18. package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js +3 -3
  19. package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js.nft.json +1 -1
  20. package/.next/standalone/packages/ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
  22. package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +16 -16
  23. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
  24. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  25. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
  26. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  27. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +5 -5
  28. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js +1 -1
  29. package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js.nft.json +1 -1
  30. package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js +1 -1
  31. package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js.nft.json +1 -1
  32. package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js +1 -1
  33. package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js.nft.json +1 -1
  34. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js +1 -1
  35. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js.nft.json +1 -1
  36. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js +1 -1
  37. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js.nft.json +1 -1
  38. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route/app-paths-manifest.json +3 -0
  39. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route/build-manifest.json +11 -0
  40. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js +7 -0
  41. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js.nft.json +1 -0
  42. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route_client-reference-manifest.js +2 -0
  43. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js +1 -1
  44. package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js.nft.json +1 -1
  45. package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js +1 -1
  46. package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js.nft.json +1 -1
  47. package/.next/standalone/packages/ui/.next/server/app/page/build-manifest.json +2 -3
  48. package/.next/standalone/packages/ui/.next/server/app/page.js +3 -3
  49. package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
  50. package/.next/standalone/packages/ui/.next/server/app/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page/build-manifest.json +2 -3
  52. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js +3 -3
  53. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js.nft.json +1 -1
  54. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/packages/ui/.next/server/app/specs/page/build-manifest.json +2 -3
  56. package/.next/standalone/packages/ui/.next/server/app/specs/page.js +3 -3
  57. package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
  58. package/.next/standalone/packages/ui/.next/server/app/specs/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/packages/ui/.next/server/app/stats/page/build-manifest.json +2 -3
  60. package/.next/standalone/packages/ui/.next/server/app/stats/page.js +3 -3
  61. package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
  62. package/.next/standalone/packages/ui/.next/server/app/stats/page_client-reference-manifest.js +1 -1
  63. package/.next/standalone/packages/ui/.next/server/app-paths-manifest.json +1 -1
  64. package/.next/standalone/packages/ui/.next/server/chunks/730ea_ui__next-internal_server_app_api_specs_[id]_status_route_actions_5d700407.js +3 -0
  65. package/.next/standalone/packages/ui/.next/server/chunks/{[root-of-the-server]__d169fe70._.js → [root-of-the-server]__175bef84._.js} +2 -2
  66. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3971eae5._.js +3 -0
  67. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__6bca1621._.js +3 -0
  68. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__87a3475a._.js +3 -0
  69. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__9f0f4c0b._.js +3 -0
  70. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__c1c9f5f5._.js +3 -0
  71. package/.next/standalone/packages/ui/.next/server/chunks/{[root-of-the-server]__f4ea2112._.js → [root-of-the-server]__c6689757._.js} +2 -2
  72. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__cd1fb0a2._.js +4 -0
  73. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__e2071b2e._.js +3 -0
  74. package/.next/standalone/packages/ui/.next/server/chunks/e0876_tiktoken_3efea2dc._.js +3 -0
  75. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__1d0c2012._.js +1 -1
  76. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__c65aedd0._.js → [root-of-the-server]__299c81cc._.js} +2 -2
  77. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__3fffdda5._.js → [root-of-the-server]__41f5b5c0._.js} +2 -2
  78. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__eefaabd3._.js → [root-of-the-server]__5ca2e973._.js} +2 -2
  79. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__7f55abaa._.js +1 -1
  80. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__9d8d3fd6._.js +3 -0
  81. package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__e5891e5a._.js → [root-of-the-server]__cbbbfb5d._.js} +2 -2
  82. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__e79a982a._.js +7 -0
  83. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__ff03fc1e._.js +7 -0
  84. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_000dd317._.js +1 -1
  85. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_6cd9a5e0._.js +3 -0
  86. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_b483c9fe._.js +3 -0
  87. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_b5040d31._.js +5 -0
  88. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_e1889307._.js +3 -0
  89. package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_9710705b._.js +3 -0
  90. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_loading_tsx_9304a706._.js +3 -0
  91. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_specs_specs-client_tsx_0bb8f8f8._.js +3 -0
  92. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_specs-nav-sidebar_tsx_8237ed13._.js +3 -0
  93. package/.next/standalone/packages/ui/.next/server/middleware-build-manifest.js +2 -3
  94. package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
  95. package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
  96. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
  97. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
  98. package/.next/standalone/packages/ui/.next/static/chunks/061e3819fd59154d.js +1 -0
  99. package/.next/standalone/packages/ui/.next/static/chunks/148ab58e68b383da.js +1 -0
  100. package/.next/standalone/packages/ui/.next/static/chunks/5f97d665a4d9dc62.js +3 -0
  101. package/.next/standalone/packages/ui/.next/static/chunks/9b54fc05b02c39e6.css +1 -0
  102. package/.next/standalone/packages/ui/.next/static/chunks/9b7b7024c39c5f99.js +1 -0
  103. package/.next/standalone/packages/ui/.next/static/chunks/{f2151fb88f8fc70a.js → ae50cdf3322e1d02.js} +1 -1
  104. package/.next/standalone/packages/ui/.next/static/chunks/c0fe4c94c7282ac0.js +4 -0
  105. package/.next/standalone/packages/ui/.next/static/chunks/d79bf953f0dfb650.js +1 -0
  106. package/.next/standalone/packages/ui/.next/static/chunks/e50fb8d0b728cd35.js +5 -0
  107. package/.next/standalone/packages/ui/.next/static/chunks/e6e238dbf1d3e740.js +1 -0
  108. package/.next/standalone/packages/ui/.next/static/chunks/turbopack-9cc79aa1b34ffcbe.js +3 -0
  109. package/.next/standalone/packages/ui/package.json +1 -1
  110. package/.next/standalone/packages/ui/src/app/api/specs/[id]/status/route.ts +122 -0
  111. package/.next/standalone/packages/ui/src/app/globals.css +10 -0
  112. package/.next/standalone/packages/ui/src/app/specs/page.tsx +2 -2
  113. package/.next/standalone/packages/ui/src/app/specs/specs-client.tsx +352 -113
  114. package/.next/standalone/packages/ui/src/lib/db/service-queries.ts +23 -0
  115. package/.next/standalone/packages/ui/src/lib/specs/sources/filesystem-source.ts +46 -6
  116. package/.next/standalone/packages/ui/tsconfig.json +2 -1
  117. package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
  118. package/.next/standalone/packages/ui/vitest.config.ts +1 -0
  119. package/.next/static/chunks/061e3819fd59154d.js +1 -0
  120. package/.next/static/chunks/148ab58e68b383da.js +1 -0
  121. package/.next/static/chunks/5f97d665a4d9dc62.js +3 -0
  122. package/.next/static/chunks/9b54fc05b02c39e6.css +1 -0
  123. package/.next/static/chunks/9b7b7024c39c5f99.js +1 -0
  124. package/.next/static/chunks/{f2151fb88f8fc70a.js → ae50cdf3322e1d02.js} +1 -1
  125. package/.next/static/chunks/c0fe4c94c7282ac0.js +4 -0
  126. package/.next/static/chunks/d79bf953f0dfb650.js +1 -0
  127. package/.next/static/chunks/e50fb8d0b728cd35.js +5 -0
  128. package/.next/static/chunks/e6e238dbf1d3e740.js +1 -0
  129. package/.next/static/chunks/turbopack-9cc79aa1b34ffcbe.js +3 -0
  130. package/package.json +1 -1
  131. package/.next/standalone/packages/ui/.next/server/app/board/page/app-paths-manifest.json +0 -3
  132. package/.next/standalone/packages/ui/.next/server/app/board/page/build-manifest.json +0 -18
  133. package/.next/standalone/packages/ui/.next/server/app/board/page/next-font-manifest.json +0 -6
  134. package/.next/standalone/packages/ui/.next/server/app/board/page/react-loadable-manifest.json +0 -1
  135. package/.next/standalone/packages/ui/.next/server/app/board/page.js +0 -20
  136. package/.next/standalone/packages/ui/.next/server/app/board/page.js.nft.json +0 -1
  137. package/.next/standalone/packages/ui/.next/server/app/board/page_client-reference-manifest.js +0 -2
  138. package/.next/standalone/packages/ui/.next/server/app/board.html +0 -1
  139. package/.next/standalone/packages/ui/.next/server/app/board.meta +0 -14
  140. package/.next/standalone/packages/ui/.next/server/app/board.rsc +0 -41
  141. package/.next/standalone/packages/ui/.next/server/app/board.segments/_full.segment.rsc +0 -41
  142. package/.next/standalone/packages/ui/.next/server/app/board.segments/_index.segment.rsc +0 -26
  143. package/.next/standalone/packages/ui/.next/server/app/board.segments/_tree.segment.rsc +0 -9
  144. package/.next/standalone/packages/ui/.next/server/app/board.segments/board/__PAGE__.segment.rsc +0 -9
  145. package/.next/standalone/packages/ui/.next/server/app/board.segments/board.segment.rsc +0 -8
  146. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__003ee184._.js +0 -3
  147. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__21119265._.js +0 -3
  148. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__6ec5cafb._.js +0 -3
  149. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__7acaa6ec._.js +0 -3
  150. package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__a2c55ffb._.js +0 -3
  151. package/.next/standalone/packages/ui/.next/server/chunks/ssr/6e9bd_next_dist_7af75658._.js +0 -3
  152. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__4b343655._.js +0 -3
  153. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__68015eee._.js +0 -3
  154. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b161f033._.js +0 -7
  155. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b50fa24c._.js +0 -7
  156. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_4f2c4868._.js +0 -4
  157. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_64a39e38._.js +0 -3
  158. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_a527620e._.js +0 -3
  159. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_d7e4bd50._.js +0 -5
  160. package/.next/standalone/packages/ui/.next/server/chunks/ssr/_f8b2190a._.js +0 -3
  161. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui__next-internal_server_app_board_page_actions_c5a3cb3c.js +0 -3
  162. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_board_loading_tsx_03dfd70d._.js +0 -3
  163. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_board_page_tsx_9415dc46._.js +0 -3
  164. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_ui_input_tsx_190a7701._.js +0 -3
  165. package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_d725c10c._.js +0 -3
  166. package/.next/standalone/packages/ui/.next/static/chunks/107411d1a2f4b31d.js +0 -1
  167. package/.next/standalone/packages/ui/.next/static/chunks/17ac52d909def83e.js +0 -1
  168. package/.next/standalone/packages/ui/.next/static/chunks/212881511f73fc12.js +0 -5
  169. package/.next/standalone/packages/ui/.next/static/chunks/5057c3e1e7e13ca3.js +0 -1
  170. package/.next/standalone/packages/ui/.next/static/chunks/5c2072ad938de8ed.js +0 -1
  171. package/.next/standalone/packages/ui/.next/static/chunks/5d646f493d4c6928.js +0 -1
  172. package/.next/standalone/packages/ui/.next/static/chunks/88f695d32910a4ac.js +0 -1
  173. package/.next/standalone/packages/ui/.next/static/chunks/c210559fdfe60fef.js +0 -1
  174. package/.next/standalone/packages/ui/.next/static/chunks/df1731c03abf1aee.css +0 -1
  175. package/.next/standalone/packages/ui/.next/static/chunks/e237e00fd3a84178.js +0 -3
  176. package/.next/standalone/packages/ui/.next/static/chunks/ebd89051637b9a47.js +0 -4
  177. package/.next/standalone/packages/ui/.next/static/chunks/turbopack-7450632b40b2e378.js +0 -3
  178. package/.next/standalone/packages/ui/src/app/board/board-client.tsx +0 -162
  179. package/.next/standalone/packages/ui/src/app/board/loading.tsx +0 -43
  180. package/.next/standalone/packages/ui/src/app/board/page.tsx +0 -18
  181. package/.next/static/chunks/107411d1a2f4b31d.js +0 -1
  182. package/.next/static/chunks/17ac52d909def83e.js +0 -1
  183. package/.next/static/chunks/212881511f73fc12.js +0 -5
  184. package/.next/static/chunks/5057c3e1e7e13ca3.js +0 -1
  185. package/.next/static/chunks/5c2072ad938de8ed.js +0 -1
  186. package/.next/static/chunks/5d646f493d4c6928.js +0 -1
  187. package/.next/static/chunks/88f695d32910a4ac.js +0 -1
  188. package/.next/static/chunks/c210559fdfe60fef.js +0 -1
  189. package/.next/static/chunks/df1731c03abf1aee.css +0 -1
  190. package/.next/static/chunks/e237e00fd3a84178.js +0 -3
  191. package/.next/static/chunks/ebd89051637b9a47.js +0 -4
  192. package/.next/static/chunks/turbopack-7450632b40b2e378.js +0 -3
  193. /package/.next/standalone/packages/ui/.next/server/app/{board/page → api/specs/[id]/status/route}/server-reference-manifest.json +0 -0
  194. /package/.next/standalone/packages/ui/.next/server/app/{board/page.js.map → api/specs/[id]/status/route.js.map} +0 -0
  195. /package/.next/standalone/packages/ui/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_buildManifest.js +0 -0
  196. /package/.next/standalone/packages/ui/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_clientMiddlewareManifest.json +0 -0
  197. /package/.next/standalone/packages/ui/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_ssgManifest.js +0 -0
  198. /package/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_buildManifest.js +0 -0
  199. /package/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_clientMiddlewareManifest.json +0 -0
  200. /package/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_ssgManifest.js +0 -0
@@ -0,0 +1,122 @@
1
+ /**
2
+ * PATCH /api/specs/[id]/status - Update a spec's status (filesystem mode)
3
+ */
4
+
5
+ import { NextResponse } from 'next/server';
6
+ import path from 'node:path';
7
+ import { readFile, writeFile } from 'node:fs/promises';
8
+ import { existsSync } from 'node:fs';
9
+ import { createUpdatedFrontmatter } from '@leanspec/core';
10
+
11
+ const ALLOWED_STATUSES = ['planned', 'in-progress', 'complete', 'archived'] as const;
12
+ type AllowedStatus = (typeof ALLOWED_STATUSES)[number];
13
+
14
+ function resolveProjectRoot(): string {
15
+ if (process.env.LEANSPEC_REPO_ROOT) {
16
+ return process.env.LEANSPEC_REPO_ROOT;
17
+ }
18
+
19
+ let currentDir = process.cwd();
20
+ for (let i = 0; i < 6; i++) {
21
+ if (existsSync(path.join(currentDir, '.lean-spec'))) {
22
+ return currentDir;
23
+ }
24
+ const parentDir = path.resolve(currentDir, '..');
25
+ if (parentDir === currentDir) {
26
+ break;
27
+ }
28
+ currentDir = parentDir;
29
+ }
30
+
31
+ // Fallback to repo root relative to UI package
32
+ return path.resolve(process.cwd(), '..', '..');
33
+ }
34
+
35
+ const PROJECT_ROOT = resolveProjectRoot();
36
+
37
+ /**
38
+ * Find spec directory by identifier (number or name)
39
+ */
40
+ async function findSpecDirectory(specIdentifier: string): Promise<string | null> {
41
+ const specsDir = path.join(PROJECT_ROOT, 'specs');
42
+
43
+ if (!existsSync(specsDir)) {
44
+ return null;
45
+ }
46
+
47
+ const { readdir } = await import('node:fs/promises');
48
+ const entries = await readdir(specsDir, { withFileTypes: true });
49
+
50
+ // Match by spec number or full directory name
51
+ const specPattern = /^(\d{2,})-/;
52
+ const specNum = parseInt(specIdentifier.split('-')[0], 10);
53
+
54
+ for (const entry of entries) {
55
+ if (!entry.isDirectory()) continue;
56
+
57
+ // Match by full name or by spec number
58
+ if (entry.name === specIdentifier) {
59
+ return path.join(specsDir, entry.name);
60
+ }
61
+
62
+ if (!isNaN(specNum) && specPattern.test(entry.name)) {
63
+ const dirNum = parseInt(entry.name.split('-')[0], 10);
64
+ if (dirNum === specNum) {
65
+ return path.join(specsDir, entry.name);
66
+ }
67
+ }
68
+ }
69
+
70
+ return null;
71
+ }
72
+
73
+ export async function PATCH(
74
+ request: Request,
75
+ { params }: { params: Promise<{ id: string }> }
76
+ ) {
77
+ try {
78
+ const { id } = await params;
79
+ if (!id) {
80
+ return NextResponse.json({ error: 'Spec id is required' }, { status: 400 });
81
+ }
82
+
83
+ let payload: { status?: AllowedStatus } = {};
84
+ try {
85
+ payload = await request.json();
86
+ } catch {
87
+ return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 });
88
+ }
89
+
90
+ const { status } = payload;
91
+ if (!status || !ALLOWED_STATUSES.includes(status)) {
92
+ return NextResponse.json({ error: 'Invalid status value' }, { status: 400 });
93
+ }
94
+
95
+ const specIdentifier = decodeURIComponent(id);
96
+ const specDir = await findSpecDirectory(specIdentifier);
97
+
98
+ if (!specDir) {
99
+ return NextResponse.json({ error: 'Spec not found' }, { status: 404 });
100
+ }
101
+
102
+ const readmePath = path.join(specDir, 'README.md');
103
+
104
+ if (!existsSync(readmePath)) {
105
+ return NextResponse.json({ error: 'Spec README.md not found' }, { status: 404 });
106
+ }
107
+
108
+ // Read current content
109
+ const currentContent = await readFile(readmePath, 'utf-8');
110
+
111
+ // Update frontmatter using @leanspec/core
112
+ const { content: updatedContent } = createUpdatedFrontmatter(currentContent, { status });
113
+
114
+ // Write back to file
115
+ await writeFile(readmePath, updatedContent, 'utf-8');
116
+
117
+ return NextResponse.json({ success: true });
118
+ } catch (error) {
119
+ console.error('Failed to update spec status:', error);
120
+ return NextResponse.json({ error: 'Failed to update spec status' }, { status: 500 });
121
+ }
122
+ }
@@ -528,4 +528,14 @@ html.changing-theme * {
528
528
  .overflow-x-hidden {
529
529
  overflow-x: hidden !important;
530
530
  }
531
+
532
+ /* Vertical text for collapsed columns (ADO-style) */
533
+ .writing-mode-vertical-rl {
534
+ writing-mode: vertical-rl;
535
+ }
536
+
537
+ .vertical-text {
538
+ writing-mode: vertical-rl;
539
+ transform: rotate(180deg);
540
+ }
531
541
  }
@@ -2,7 +2,7 @@
2
2
  * Specs page - Browse all LeanSpec specifications with list/board switcher
3
3
  */
4
4
 
5
- import { getSpecs, getStats } from '@/lib/db/service-queries';
5
+ import { getSpecsWithMetadata, getStats } from '@/lib/db/service-queries';
6
6
  import { SpecsClient } from './specs-client';
7
7
 
8
8
  // Force dynamic rendering - this page needs runtime data
@@ -10,7 +10,7 @@ export const dynamic = 'force-dynamic';
10
10
 
11
11
  export default async function SpecsPage() {
12
12
  const [specs, stats] = await Promise.all([
13
- getSpecs(),
13
+ getSpecsWithMetadata(),
14
14
  getStats(),
15
15
  ]);
16
16