@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.
- package/.next/standalone/node_modules/.pnpm/tiktoken@1.0.22/node_modules/tiktoken/tiktoken_bg.wasm +0 -0
- package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
- package/.next/standalone/packages/ui/.next/app-path-routes-manifest.json +1 -1
- package/.next/standalone/packages/ui/.next/build-manifest.json +4 -5
- package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -28
- package/.next/standalone/packages/ui/.next/routes-manifest.json +8 -6
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page/build-manifest.json +2 -3
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found/page/build-manifest.json +2 -3
- package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js +3 -3
- package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +16 -16
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +16 -16
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +5 -5
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route/app-paths-manifest.json +3 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route/build-manifest.json +11 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js +7 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js.nft.json +1 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route_client-reference-manifest.js +2 -0
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/page/build-manifest.json +2 -3
- package/.next/standalone/packages/ui/.next/server/app/page.js +3 -3
- package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page/build-manifest.json +2 -3
- package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js +3 -3
- package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/page/build-manifest.json +2 -3
- package/.next/standalone/packages/ui/.next/server/app/specs/page.js +3 -3
- package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page/build-manifest.json +2 -3
- package/.next/standalone/packages/ui/.next/server/app/stats/page.js +3 -3
- package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page_client-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/app-paths-manifest.json +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/730ea_ui__next-internal_server_app_api_specs_[id]_status_route_actions_5d700407.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/{[root-of-the-server]__d169fe70._.js → [root-of-the-server]__175bef84._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__3971eae5._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__6bca1621._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__87a3475a._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__9f0f4c0b._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__c1c9f5f5._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/{[root-of-the-server]__f4ea2112._.js → [root-of-the-server]__c6689757._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__cd1fb0a2._.js +4 -0
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__e2071b2e._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/e0876_tiktoken_3efea2dc._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__1d0c2012._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__c65aedd0._.js → [root-of-the-server]__299c81cc._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__3fffdda5._.js → [root-of-the-server]__41f5b5c0._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__eefaabd3._.js → [root-of-the-server]__5ca2e973._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__7f55abaa._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__9d8d3fd6._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/{[root-of-the-server]__e5891e5a._.js → [root-of-the-server]__cbbbfb5d._.js} +2 -2
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__e79a982a._.js +7 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__ff03fc1e._.js +7 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_000dd317._.js +1 -1
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_6cd9a5e0._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_b483c9fe._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_b5040d31._.js +5 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_e1889307._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/node_modules__pnpm_9710705b._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_loading_tsx_9304a706._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_specs_specs-client_tsx_0bb8f8f8._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_specs-nav-sidebar_tsx_8237ed13._.js +3 -0
- package/.next/standalone/packages/ui/.next/server/middleware-build-manifest.js +2 -3
- package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
- package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/061e3819fd59154d.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/148ab58e68b383da.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/5f97d665a4d9dc62.js +3 -0
- package/.next/standalone/packages/ui/.next/static/chunks/9b54fc05b02c39e6.css +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/9b7b7024c39c5f99.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/{f2151fb88f8fc70a.js → ae50cdf3322e1d02.js} +1 -1
- package/.next/standalone/packages/ui/.next/static/chunks/c0fe4c94c7282ac0.js +4 -0
- package/.next/standalone/packages/ui/.next/static/chunks/d79bf953f0dfb650.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/e50fb8d0b728cd35.js +5 -0
- package/.next/standalone/packages/ui/.next/static/chunks/e6e238dbf1d3e740.js +1 -0
- package/.next/standalone/packages/ui/.next/static/chunks/turbopack-9cc79aa1b34ffcbe.js +3 -0
- package/.next/standalone/packages/ui/package.json +1 -1
- package/.next/standalone/packages/ui/src/app/api/specs/[id]/status/route.ts +122 -0
- package/.next/standalone/packages/ui/src/app/globals.css +10 -0
- package/.next/standalone/packages/ui/src/app/specs/page.tsx +2 -2
- package/.next/standalone/packages/ui/src/app/specs/specs-client.tsx +352 -113
- package/.next/standalone/packages/ui/src/lib/db/service-queries.ts +23 -0
- package/.next/standalone/packages/ui/src/lib/specs/sources/filesystem-source.ts +46 -6
- package/.next/standalone/packages/ui/tsconfig.json +2 -1
- package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
- package/.next/standalone/packages/ui/vitest.config.ts +1 -0
- package/.next/static/chunks/061e3819fd59154d.js +1 -0
- package/.next/static/chunks/148ab58e68b383da.js +1 -0
- package/.next/static/chunks/5f97d665a4d9dc62.js +3 -0
- package/.next/static/chunks/9b54fc05b02c39e6.css +1 -0
- package/.next/static/chunks/9b7b7024c39c5f99.js +1 -0
- package/.next/static/chunks/{f2151fb88f8fc70a.js → ae50cdf3322e1d02.js} +1 -1
- package/.next/static/chunks/c0fe4c94c7282ac0.js +4 -0
- package/.next/static/chunks/d79bf953f0dfb650.js +1 -0
- package/.next/static/chunks/e50fb8d0b728cd35.js +5 -0
- package/.next/static/chunks/e6e238dbf1d3e740.js +1 -0
- package/.next/static/chunks/turbopack-9cc79aa1b34ffcbe.js +3 -0
- package/package.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/board/page/app-paths-manifest.json +0 -3
- package/.next/standalone/packages/ui/.next/server/app/board/page/build-manifest.json +0 -18
- package/.next/standalone/packages/ui/.next/server/app/board/page/next-font-manifest.json +0 -6
- package/.next/standalone/packages/ui/.next/server/app/board/page/react-loadable-manifest.json +0 -1
- package/.next/standalone/packages/ui/.next/server/app/board/page.js +0 -20
- package/.next/standalone/packages/ui/.next/server/app/board/page.js.nft.json +0 -1
- package/.next/standalone/packages/ui/.next/server/app/board/page_client-reference-manifest.js +0 -2
- package/.next/standalone/packages/ui/.next/server/app/board.html +0 -1
- package/.next/standalone/packages/ui/.next/server/app/board.meta +0 -14
- package/.next/standalone/packages/ui/.next/server/app/board.rsc +0 -41
- package/.next/standalone/packages/ui/.next/server/app/board.segments/_full.segment.rsc +0 -41
- package/.next/standalone/packages/ui/.next/server/app/board.segments/_index.segment.rsc +0 -26
- package/.next/standalone/packages/ui/.next/server/app/board.segments/_tree.segment.rsc +0 -9
- package/.next/standalone/packages/ui/.next/server/app/board.segments/board/__PAGE__.segment.rsc +0 -9
- package/.next/standalone/packages/ui/.next/server/app/board.segments/board.segment.rsc +0 -8
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__003ee184._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__21119265._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__6ec5cafb._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__7acaa6ec._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/[root-of-the-server]__a2c55ffb._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/6e9bd_next_dist_7af75658._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__4b343655._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__68015eee._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b161f033._.js +0 -7
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__b50fa24c._.js +0 -7
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_4f2c4868._.js +0 -4
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_64a39e38._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_a527620e._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_d7e4bd50._.js +0 -5
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/_f8b2190a._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui__next-internal_server_app_board_page_actions_c5a3cb3c.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_board_loading_tsx_03dfd70d._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_app_board_page_tsx_9415dc46._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_components_ui_input_tsx_190a7701._.js +0 -3
- package/.next/standalone/packages/ui/.next/server/chunks/ssr/packages_ui_src_d725c10c._.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/107411d1a2f4b31d.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/17ac52d909def83e.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/212881511f73fc12.js +0 -5
- package/.next/standalone/packages/ui/.next/static/chunks/5057c3e1e7e13ca3.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/5c2072ad938de8ed.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/5d646f493d4c6928.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/88f695d32910a4ac.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/c210559fdfe60fef.js +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/df1731c03abf1aee.css +0 -1
- package/.next/standalone/packages/ui/.next/static/chunks/e237e00fd3a84178.js +0 -3
- package/.next/standalone/packages/ui/.next/static/chunks/ebd89051637b9a47.js +0 -4
- package/.next/standalone/packages/ui/.next/static/chunks/turbopack-7450632b40b2e378.js +0 -3
- package/.next/standalone/packages/ui/src/app/board/board-client.tsx +0 -162
- package/.next/standalone/packages/ui/src/app/board/loading.tsx +0 -43
- package/.next/standalone/packages/ui/src/app/board/page.tsx +0 -18
- package/.next/static/chunks/107411d1a2f4b31d.js +0 -1
- package/.next/static/chunks/17ac52d909def83e.js +0 -1
- package/.next/static/chunks/212881511f73fc12.js +0 -5
- package/.next/static/chunks/5057c3e1e7e13ca3.js +0 -1
- package/.next/static/chunks/5c2072ad938de8ed.js +0 -1
- package/.next/static/chunks/5d646f493d4c6928.js +0 -1
- package/.next/static/chunks/88f695d32910a4ac.js +0 -1
- package/.next/static/chunks/c210559fdfe60fef.js +0 -1
- package/.next/static/chunks/df1731c03abf1aee.css +0 -1
- package/.next/static/chunks/e237e00fd3a84178.js +0 -3
- package/.next/static/chunks/ebd89051637b9a47.js +0 -4
- package/.next/static/chunks/turbopack-7450632b40b2e378.js +0 -3
- /package/.next/standalone/packages/ui/.next/server/app/{board/page → api/specs/[id]/status/route}/server-reference-manifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/server/app/{board/page.js.map → api/specs/[id]/status/route.js.map} +0 -0
- /package/.next/standalone/packages/ui/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_buildManifest.js +0 -0
- /package/.next/standalone/packages/ui/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_ssgManifest.js +0 -0
- /package/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_buildManifest.js +0 -0
- /package/.next/static/{Wuxh-xmlQh_NqvIbobfYH → 18365Lfcsz3xqXCT_JLBo}/_clientMiddlewareManifest.json +0 -0
- /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 {
|
|
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
|
-
|
|
13
|
+
getSpecsWithMetadata(),
|
|
14
14
|
getStats(),
|
|
15
15
|
]);
|
|
16
16
|
|