@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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +214 -0
  3. package/dist/__tests__/integration/skill-board.test.d.ts +1 -0
  4. package/dist/__tests__/integration/skill-board.test.js +76 -0
  5. package/dist/__tests__/integration/skill-board.test.js.map +1 -0
  6. package/dist/__tests__/integration/tdd-planning.test.d.ts +1 -0
  7. package/dist/__tests__/integration/tdd-planning.test.js +41 -0
  8. package/dist/__tests__/integration/tdd-planning.test.js.map +1 -0
  9. package/dist/commands/init.d.ts +2 -0
  10. package/dist/commands/init.js +115 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/serve.d.ts +7 -0
  13. package/dist/commands/serve.js +113 -0
  14. package/dist/commands/serve.js.map +1 -0
  15. package/dist/commands/status.d.ts +2 -0
  16. package/dist/commands/status.js +177 -0
  17. package/dist/commands/status.js.map +1 -0
  18. package/dist/commands/update.d.ts +2 -0
  19. package/dist/commands/update.js +95 -0
  20. package/dist/commands/update.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.js +17 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/lib/__tests__/board.test.d.ts +1 -0
  25. package/dist/lib/__tests__/board.test.js +220 -0
  26. package/dist/lib/__tests__/board.test.js.map +1 -0
  27. package/dist/lib/__tests__/scaffold.test.d.ts +1 -0
  28. package/dist/lib/__tests__/scaffold.test.js +39 -0
  29. package/dist/lib/__tests__/scaffold.test.js.map +1 -0
  30. package/dist/lib/__tests__/serve.test.d.ts +1 -0
  31. package/dist/lib/__tests__/serve.test.js +57 -0
  32. package/dist/lib/__tests__/serve.test.js.map +1 -0
  33. package/dist/lib/__tests__/server.test.d.ts +1 -0
  34. package/dist/lib/__tests__/server.test.js +100 -0
  35. package/dist/lib/__tests__/server.test.js.map +1 -0
  36. package/dist/lib/__tests__/smoke.test.d.ts +1 -0
  37. package/dist/lib/__tests__/smoke.test.js +7 -0
  38. package/dist/lib/__tests__/smoke.test.js.map +1 -0
  39. package/dist/lib/board.d.ts +38 -0
  40. package/dist/lib/board.js +86 -0
  41. package/dist/lib/board.js.map +1 -0
  42. package/dist/lib/detect.d.ts +13 -0
  43. package/dist/lib/detect.js +60 -0
  44. package/dist/lib/detect.js.map +1 -0
  45. package/dist/lib/scaffold.d.ts +8 -0
  46. package/dist/lib/scaffold.js +105 -0
  47. package/dist/lib/scaffold.js.map +1 -0
  48. package/dist/lib/server.d.ts +5 -0
  49. package/dist/lib/server.js +125 -0
  50. package/dist/lib/server.js.map +1 -0
  51. package/dist/lib/version.d.ts +10 -0
  52. package/dist/lib/version.js +27 -0
  53. package/dist/lib/version.js.map +1 -0
  54. package/dist/ui/404.html +1 -0
  55. package/dist/ui/_next/static/XkK-IaWE1h2_WYJHhUKNa/_buildManifest.js +1 -0
  56. package/dist/ui/_next/static/XkK-IaWE1h2_WYJHhUKNa/_ssgManifest.js +1 -0
  57. package/dist/ui/_next/static/chunks/255-54d3085ce94738a4.js +1 -0
  58. package/dist/ui/_next/static/chunks/423-bb541b7ae2733575.js +1 -0
  59. package/dist/ui/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
  60. package/dist/ui/_next/static/chunks/app/_not-found/page-d6bc774f7acb716e.js +1 -0
  61. package/dist/ui/_next/static/chunks/app/layout-e5fc8e78e1c8da95.js +1 -0
  62. package/dist/ui/_next/static/chunks/app/page-a1867b0e8c871ff8.js +1 -0
  63. package/dist/ui/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
  64. package/dist/ui/_next/static/chunks/main-49fd204fc9037ea3.js +1 -0
  65. package/dist/ui/_next/static/chunks/main-app-c46afa2f48f3aaef.js +1 -0
  66. package/dist/ui/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
  67. package/dist/ui/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
  68. package/dist/ui/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  69. package/dist/ui/_next/static/chunks/webpack-4a462cecab786e93.js +1 -0
  70. package/dist/ui/_next/static/css/721d4a8588775f36.css +1 -0
  71. package/dist/ui/index.html +1 -0
  72. package/dist/ui/index.txt +19 -0
  73. package/package.json +53 -0
  74. package/starters/generic.yaml +45 -0
  75. package/starters/go.yaml +47 -0
  76. package/starters/node-typescript.yaml +56 -0
  77. package/starters/python.yaml +50 -0
  78. package/templates/codeloop/board.json +5 -0
  79. package/templates/codeloop/gotchas.md +13 -0
  80. package/templates/codeloop/patterns.md +15 -0
  81. package/templates/codeloop/principles.md +49 -0
  82. package/templates/codeloop/rules.md +23 -0
  83. package/templates/commands/commit.md +245 -0
  84. package/templates/commands/manage.md +77 -0
  85. package/templates/commands/plan.md +83 -0
  86. package/templates/commands/reflect.md +93 -0
  87. 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"}
@@ -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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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()