@sixfactors-ai/codeloop 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/dist/__tests__/integration/skill-board.test.d.ts +1 -0
- package/dist/__tests__/integration/skill-board.test.js +76 -0
- package/dist/__tests__/integration/skill-board.test.js.map +1 -0
- package/dist/__tests__/integration/tdd-planning.test.d.ts +1 -0
- package/dist/__tests__/integration/tdd-planning.test.js +41 -0
- package/dist/__tests__/integration/tdd-planning.test.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +115 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.js +113 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +177 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.js +95 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/__tests__/board.test.d.ts +1 -0
- package/dist/lib/__tests__/board.test.js +220 -0
- package/dist/lib/__tests__/board.test.js.map +1 -0
- package/dist/lib/__tests__/scaffold.test.d.ts +1 -0
- package/dist/lib/__tests__/scaffold.test.js +39 -0
- package/dist/lib/__tests__/scaffold.test.js.map +1 -0
- package/dist/lib/__tests__/serve.test.d.ts +1 -0
- package/dist/lib/__tests__/serve.test.js +57 -0
- package/dist/lib/__tests__/serve.test.js.map +1 -0
- package/dist/lib/__tests__/server.test.d.ts +1 -0
- package/dist/lib/__tests__/server.test.js +100 -0
- package/dist/lib/__tests__/server.test.js.map +1 -0
- package/dist/lib/__tests__/smoke.test.d.ts +1 -0
- package/dist/lib/__tests__/smoke.test.js +7 -0
- package/dist/lib/__tests__/smoke.test.js.map +1 -0
- package/dist/lib/board.d.ts +38 -0
- package/dist/lib/board.js +86 -0
- package/dist/lib/board.js.map +1 -0
- package/dist/lib/detect.d.ts +13 -0
- package/dist/lib/detect.js +60 -0
- package/dist/lib/detect.js.map +1 -0
- package/dist/lib/scaffold.d.ts +8 -0
- package/dist/lib/scaffold.js +105 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/server.d.ts +5 -0
- package/dist/lib/server.js +125 -0
- package/dist/lib/server.js.map +1 -0
- package/dist/lib/version.d.ts +10 -0
- package/dist/lib/version.js +27 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/ui/404.html +1 -0
- package/dist/ui/_next/static/XkK-IaWE1h2_WYJHhUKNa/_buildManifest.js +1 -0
- package/dist/ui/_next/static/XkK-IaWE1h2_WYJHhUKNa/_ssgManifest.js +1 -0
- package/dist/ui/_next/static/chunks/255-54d3085ce94738a4.js +1 -0
- package/dist/ui/_next/static/chunks/423-bb541b7ae2733575.js +1 -0
- package/dist/ui/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
- package/dist/ui/_next/static/chunks/app/_not-found/page-d6bc774f7acb716e.js +1 -0
- package/dist/ui/_next/static/chunks/app/layout-e5fc8e78e1c8da95.js +1 -0
- package/dist/ui/_next/static/chunks/app/page-a1867b0e8c871ff8.js +1 -0
- package/dist/ui/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
- package/dist/ui/_next/static/chunks/main-49fd204fc9037ea3.js +1 -0
- package/dist/ui/_next/static/chunks/main-app-c46afa2f48f3aaef.js +1 -0
- package/dist/ui/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
- package/dist/ui/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
- package/dist/ui/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dist/ui/_next/static/chunks/webpack-4a462cecab786e93.js +1 -0
- package/dist/ui/_next/static/css/721d4a8588775f36.css +1 -0
- package/dist/ui/index.html +1 -0
- package/dist/ui/index.txt +19 -0
- package/package.json +53 -0
- package/starters/generic.yaml +45 -0
- package/starters/go.yaml +47 -0
- package/starters/node-typescript.yaml +56 -0
- package/starters/python.yaml +50 -0
- package/templates/codeloop/board.json +5 -0
- package/templates/codeloop/gotchas.md +13 -0
- package/templates/codeloop/patterns.md +15 -0
- package/templates/codeloop/principles.md +49 -0
- package/templates/codeloop/rules.md +23 -0
- package/templates/commands/commit.md +245 -0
- package/templates/commands/manage.md +77 -0
- package/templates/commands/plan.md +83 -0
- package/templates/commands/reflect.md +93 -0
- package/templates/tasks/todo.md +3 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { streamSSE } from 'hono/streaming';
|
|
3
|
+
import { cors } from 'hono/cors';
|
|
4
|
+
import { existsSync, readFileSync } from 'fs';
|
|
5
|
+
import { join, extname } from 'path';
|
|
6
|
+
import { loadBoard, saveBoard, addTask, updateTask, deleteTask, getTask, } from './board.js';
|
|
7
|
+
const MIME_TYPES = {
|
|
8
|
+
'.html': 'text/html',
|
|
9
|
+
'.js': 'application/javascript',
|
|
10
|
+
'.css': 'text/css',
|
|
11
|
+
'.json': 'application/json',
|
|
12
|
+
'.png': 'image/png',
|
|
13
|
+
'.svg': 'image/svg+xml',
|
|
14
|
+
'.ico': 'image/x-icon',
|
|
15
|
+
'.txt': 'text/plain',
|
|
16
|
+
};
|
|
17
|
+
export function createApp(projectDir, uiDir) {
|
|
18
|
+
const app = new Hono();
|
|
19
|
+
app.use('*', cors());
|
|
20
|
+
// Track SSE clients for broadcasting
|
|
21
|
+
const sseClients = new Set();
|
|
22
|
+
function broadcast() {
|
|
23
|
+
const board = loadBoard(projectDir);
|
|
24
|
+
for (const send of sseClients) {
|
|
25
|
+
send(board);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// GET /api/board — full board
|
|
29
|
+
app.get('/api/board', (c) => {
|
|
30
|
+
const board = loadBoard(projectDir);
|
|
31
|
+
return c.json(board);
|
|
32
|
+
});
|
|
33
|
+
// POST /api/tasks — create task
|
|
34
|
+
app.post('/api/tasks', async (c) => {
|
|
35
|
+
const body = await c.req.json();
|
|
36
|
+
let board = loadBoard(projectDir);
|
|
37
|
+
board = addTask(board, body);
|
|
38
|
+
saveBoard(projectDir, board);
|
|
39
|
+
const task = board.tasks[board.tasks.length - 1];
|
|
40
|
+
broadcast();
|
|
41
|
+
return c.json(task, 201);
|
|
42
|
+
});
|
|
43
|
+
// PATCH /api/tasks/:id — update task
|
|
44
|
+
app.patch('/api/tasks/:id', async (c) => {
|
|
45
|
+
const id = c.req.param('id');
|
|
46
|
+
const patch = await c.req.json();
|
|
47
|
+
let board = loadBoard(projectDir);
|
|
48
|
+
try {
|
|
49
|
+
board = updateTask(board, id, patch);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
return c.json({ error: e.message }, 404);
|
|
53
|
+
}
|
|
54
|
+
saveBoard(projectDir, board);
|
|
55
|
+
const task = getTask(board, id);
|
|
56
|
+
broadcast();
|
|
57
|
+
return c.json(task);
|
|
58
|
+
});
|
|
59
|
+
// DELETE /api/tasks/:id — remove task
|
|
60
|
+
app.delete('/api/tasks/:id', (c) => {
|
|
61
|
+
const id = c.req.param('id');
|
|
62
|
+
let board = loadBoard(projectDir);
|
|
63
|
+
try {
|
|
64
|
+
board = deleteTask(board, id);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
return c.json({ error: e.message }, 404);
|
|
68
|
+
}
|
|
69
|
+
saveBoard(projectDir, board);
|
|
70
|
+
broadcast();
|
|
71
|
+
return c.json({ ok: true });
|
|
72
|
+
});
|
|
73
|
+
// GET /api/events — SSE stream
|
|
74
|
+
app.get('/api/events', (c) => {
|
|
75
|
+
return streamSSE(c, async (stream) => {
|
|
76
|
+
// Send initial board state
|
|
77
|
+
const board = loadBoard(projectDir);
|
|
78
|
+
await stream.writeSSE({ data: JSON.stringify(board), event: 'board' });
|
|
79
|
+
// Register for broadcasts
|
|
80
|
+
const handler = async (board) => {
|
|
81
|
+
try {
|
|
82
|
+
await stream.writeSSE({ data: JSON.stringify(board), event: 'board' });
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Client disconnected
|
|
86
|
+
sseClients.delete(handler);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
sseClients.add(handler);
|
|
90
|
+
// Keep alive until client disconnects
|
|
91
|
+
await new Promise((resolve) => {
|
|
92
|
+
stream.onAbort(() => {
|
|
93
|
+
sseClients.delete(handler);
|
|
94
|
+
resolve();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
// Static file serving for the UI
|
|
100
|
+
if (uiDir) {
|
|
101
|
+
app.get('*', (c) => {
|
|
102
|
+
const urlPath = c.req.path === '/' ? '/index.html' : c.req.path;
|
|
103
|
+
const filePath = join(uiDir, urlPath);
|
|
104
|
+
if (existsSync(filePath)) {
|
|
105
|
+
const content = readFileSync(filePath);
|
|
106
|
+
const ext = extname(filePath);
|
|
107
|
+
const mime = MIME_TYPES[ext] || 'application/octet-stream';
|
|
108
|
+
return new Response(content, {
|
|
109
|
+
headers: { 'Content-Type': mime },
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// SPA fallback — serve index.html for unmatched routes
|
|
113
|
+
const indexPath = join(uiDir, 'index.html');
|
|
114
|
+
if (existsSync(indexPath)) {
|
|
115
|
+
const content = readFileSync(indexPath);
|
|
116
|
+
return new Response(content, {
|
|
117
|
+
headers: { 'Content-Type': 'text/html' },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return c.text('Not found', 404);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return { app, broadcast };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/lib/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two semver-style version strings.
|
|
3
|
+
* Returns: -1 if a < b, 0 if equal, 1 if a > b
|
|
4
|
+
*/
|
|
5
|
+
export declare function compareVersions(a: string, b: string): -1 | 0 | 1;
|
|
6
|
+
/**
|
|
7
|
+
* Parse version from a codeloop-version comment in file content.
|
|
8
|
+
* Also supports legacy flywheel-version for backward compatibility.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseVersion(content: string): string | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare two semver-style version strings.
|
|
3
|
+
* Returns: -1 if a < b, 0 if equal, 1 if a > b
|
|
4
|
+
*/
|
|
5
|
+
export function compareVersions(a, b) {
|
|
6
|
+
const partsA = a.split('.').map(Number);
|
|
7
|
+
const partsB = b.split('.').map(Number);
|
|
8
|
+
const len = Math.max(partsA.length, partsB.length);
|
|
9
|
+
for (let i = 0; i < len; i++) {
|
|
10
|
+
const numA = partsA[i] ?? 0;
|
|
11
|
+
const numB = partsB[i] ?? 0;
|
|
12
|
+
if (numA < numB)
|
|
13
|
+
return -1;
|
|
14
|
+
if (numA > numB)
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Parse version from a codeloop-version comment in file content.
|
|
21
|
+
* Also supports legacy flywheel-version for backward compatibility.
|
|
22
|
+
*/
|
|
23
|
+
export function parseVersion(content) {
|
|
24
|
+
const match = content.match(/<!--\s*(?:codeloop|flywheel)-version:\s*([\d.]+)\s*-->/);
|
|
25
|
+
return match ? match[1] : null;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC,CAAC;QAC3B,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC"}
|
package/dist/ui/404.html
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><!--XkK_IaWE1h2_WYJHhUKNa--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/721d4a8588775f36.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-4a462cecab786e93.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-54d3085ce94738a4.js" async=""></script><script src="/_next/static/chunks/main-app-c46afa2f48f3aaef.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Codeloop Board</title><meta name="description" content="Visual kanban board for codeloop"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-4a462cecab786e93.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/css/721d4a8588775f36.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"XkK-IaWE1h2_WYJHhUKNa\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/721d4a8588775f36.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],null],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Codeloop Board\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Visual kanban board for codeloop\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
self.__BUILD_MANIFEST=function(e,r,t){return{__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:2,errorRate:1e-4,numBits:39,numHashes:14,bitArray:[0,1,1,0,r,e,e,r,r,e,e,r,e,e,e,r,r,e,e,e,e,r,e,r,r,r,r,e,e,e,r,e,r,e,r,e,e,e,r]},__routerFilterDynamic:{numItems:r,errorRate:1e-4,numBits:r,numHashes:null,bitArray:[]},"/_error":["static/chunks/pages/_error-cb2a52f75f2162e2.js"],sortedPages:["/_app","/_error"]}}(1,0,1e-4),self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()
|