@hcgstudio/ogma 0.0.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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +155 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/defineOgmaReview.d.ts +3 -0
  8. package/dist/defineOgmaReview.d.ts.map +1 -0
  9. package/dist/defineOgmaReview.js +4 -0
  10. package/dist/defineOgmaReview.js.map +1 -0
  11. package/dist/index.d.ts +5 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +4 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/node/project.d.ts +18 -0
  16. package/dist/node/project.d.ts.map +1 -0
  17. package/dist/node/project.js +104 -0
  18. package/dist/node/project.js.map +1 -0
  19. package/dist/node/server.d.ts +21 -0
  20. package/dist/node/server.d.ts.map +1 -0
  21. package/dist/node/server.js +476 -0
  22. package/dist/node/server.js.map +1 -0
  23. package/dist/node/templates.d.ts +5 -0
  24. package/dist/node/templates.d.ts.map +1 -0
  25. package/dist/node/templates.js +145 -0
  26. package/dist/node/templates.js.map +1 -0
  27. package/dist/types.d.ts +100 -0
  28. package/dist/types.d.ts.map +1 -0
  29. package/dist/types.js +2 -0
  30. package/dist/types.js.map +1 -0
  31. package/dist/viewer/OgmaReviewApp.d.ts +7 -0
  32. package/dist/viewer/OgmaReviewApp.d.ts.map +1 -0
  33. package/dist/viewer/OgmaReviewApp.js +387 -0
  34. package/dist/viewer/OgmaReviewApp.js.map +1 -0
  35. package/dist/viewer/client.d.ts +2 -0
  36. package/dist/viewer/client.d.ts.map +1 -0
  37. package/dist/viewer/client.js +13 -0
  38. package/dist/viewer/client.js.map +1 -0
  39. package/dist/viewer/defaultReview.d.ts +4 -0
  40. package/dist/viewer/defaultReview.d.ts.map +1 -0
  41. package/dist/viewer/defaultReview.js +55 -0
  42. package/dist/viewer/defaultReview.js.map +1 -0
  43. package/dist/viewer/normalizeReviewModule.d.ts +3 -0
  44. package/dist/viewer/normalizeReviewModule.d.ts.map +1 -0
  45. package/dist/viewer/normalizeReviewModule.js +58 -0
  46. package/dist/viewer/normalizeReviewModule.js.map +1 -0
  47. package/package.json +47 -0
  48. package/src/cli.ts +194 -0
  49. package/src/defineOgmaReview.ts +5 -0
  50. package/src/index.ts +17 -0
  51. package/src/node/project.ts +143 -0
  52. package/src/node/server.ts +598 -0
  53. package/src/node/templates.ts +148 -0
  54. package/src/types.ts +111 -0
  55. package/src/viewer/OgmaReviewApp.tsx +1099 -0
  56. package/src/viewer/client.tsx +18 -0
  57. package/src/viewer/defaultReview.tsx +168 -0
  58. package/src/viewer/normalizeReviewModule.ts +87 -0
  59. package/src/viewer/styles.css +1140 -0
  60. package/src/viewer/virtual.d.ts +11 -0
@@ -0,0 +1,476 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createRequire } from 'node:module';
3
+ import { readFile, writeFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { createServer } from 'vite';
7
+ import { ensureOgmaProject } from './project.js';
8
+ import { DEFAULT_SKILL_URL } from './templates.js';
9
+ function toPosixPath(value) {
10
+ return value.split(path.sep).join('/');
11
+ }
12
+ function fsImportSpecifier(value) {
13
+ return `/@fs/${toPosixPath(value)}`;
14
+ }
15
+ function isObject(value) {
16
+ return typeof value === 'object' && value !== null;
17
+ }
18
+ function nowIso() {
19
+ return new Date().toISOString();
20
+ }
21
+ function emptySession() {
22
+ return {
23
+ reviewId: 'ogma-review',
24
+ annotations: [],
25
+ updatedAt: nowIso()
26
+ };
27
+ }
28
+ async function readPackageVersion(packageRoot) {
29
+ try {
30
+ const manifest = JSON.parse(await readFile(path.join(packageRoot, 'package.json'), 'utf8'));
31
+ return manifest.version ?? '0.0.0';
32
+ }
33
+ catch {
34
+ return '0.0.0';
35
+ }
36
+ }
37
+ async function readRequestBody(request) {
38
+ const chunks = [];
39
+ for await (const chunk of request) {
40
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
41
+ }
42
+ return Buffer.concat(chunks).toString('utf8');
43
+ }
44
+ function sendJson(response, statusCode, value) {
45
+ response.statusCode = statusCode;
46
+ response.setHeader('content-type', 'application/json; charset=utf-8');
47
+ response.end(`${JSON.stringify(value, null, 2)}\n`);
48
+ }
49
+ function sendText(response, statusCode, value, contentType = 'text/plain') {
50
+ response.statusCode = statusCode;
51
+ response.setHeader('content-type', `${contentType}; charset=utf-8`);
52
+ response.end(value);
53
+ }
54
+ function isStatus(value) {
55
+ return value === 'open' || value === 'queued' || value === 'addressed';
56
+ }
57
+ function sanitizeAnnotation(value) {
58
+ if (!isObject(value)) {
59
+ return null;
60
+ }
61
+ const id = typeof value.id === 'string' ? value.id : '';
62
+ const screenId = typeof value.screenId === 'string' ? value.screenId : '';
63
+ const statusValue = isStatus(value.status) ? value.status : 'open';
64
+ if (!id || !screenId) {
65
+ return null;
66
+ }
67
+ return {
68
+ id,
69
+ screenId,
70
+ x: typeof value.x === 'number' ? value.x : 50,
71
+ y: typeof value.y === 'number' ? value.y : 50,
72
+ title: typeof value.title === 'string' ? value.title : 'Untitled feedback',
73
+ detail: typeof value.detail === 'string' ? value.detail : '',
74
+ status: statusValue,
75
+ action: typeof value.action === 'string' ? value.action : 'Update the referenced JSX screen.',
76
+ createdAt: typeof value.createdAt === 'string' ? value.createdAt : nowIso(),
77
+ updatedAt: typeof value.updatedAt === 'string' ? value.updatedAt : nowIso()
78
+ };
79
+ }
80
+ function sanitizeSession(value) {
81
+ if (!isObject(value)) {
82
+ return emptySession();
83
+ }
84
+ const annotations = Array.isArray(value.annotations)
85
+ ? value.annotations
86
+ .map((annotation) => sanitizeAnnotation(annotation))
87
+ .filter((annotation) => annotation !== null)
88
+ : [];
89
+ return {
90
+ reviewId: typeof value.reviewId === 'string' ? value.reviewId : 'ogma-review',
91
+ annotations,
92
+ updatedAt: typeof value.updatedAt === 'string' ? value.updatedAt : nowIso()
93
+ };
94
+ }
95
+ async function readSession(project) {
96
+ try {
97
+ return sanitizeSession(JSON.parse(await readFile(project.sessionPath, 'utf8')));
98
+ }
99
+ catch {
100
+ const session = emptySession();
101
+ await writeSession(project, session);
102
+ return session;
103
+ }
104
+ }
105
+ async function writeSession(project, session) {
106
+ await writeFile(project.sessionPath, `${JSON.stringify(session, null, 2)}\n`, 'utf8');
107
+ await appendHistory(project, session);
108
+ }
109
+ function countByStatus(annotations) {
110
+ return {
111
+ addressed: annotations.filter((annotation) => annotation.status === 'addressed').length,
112
+ open: annotations.filter((annotation) => annotation.status === 'open').length,
113
+ queued: annotations.filter((annotation) => annotation.status === 'queued').length
114
+ };
115
+ }
116
+ async function readHistory(project) {
117
+ try {
118
+ const value = JSON.parse(await readFile(project.historyPath, 'utf8'));
119
+ return Array.isArray(value) ? value : [];
120
+ }
121
+ catch {
122
+ return [];
123
+ }
124
+ }
125
+ async function appendHistory(project, session) {
126
+ const history = await readHistory(project);
127
+ const entry = {
128
+ id: `${Date.now()}`,
129
+ annotationCount: session.annotations.length,
130
+ counts: countByStatus(session.annotations),
131
+ reviewId: session.reviewId,
132
+ updatedAt: session.updatedAt
133
+ };
134
+ history.push(entry);
135
+ await writeFile(project.historyPath, `${JSON.stringify(history.slice(-50), null, 2)}\n`, 'utf8');
136
+ }
137
+ function buildFeedbackExport(session, reviewUrl) {
138
+ return {
139
+ reviewId: session.reviewId,
140
+ generatedAt: nowIso(),
141
+ reviewUrl,
142
+ annotations: session.annotations.map((annotation) => ({
143
+ id: annotation.id,
144
+ screenId: annotation.screenId,
145
+ title: annotation.title,
146
+ detail: annotation.detail,
147
+ status: annotation.status,
148
+ action: annotation.action,
149
+ location: {
150
+ x: annotation.x,
151
+ y: annotation.y
152
+ }
153
+ }))
154
+ };
155
+ }
156
+ function sessionFromFeedbackExport(value) {
157
+ if (!isObject(value) || !Array.isArray(value.annotations)) {
158
+ return emptySession();
159
+ }
160
+ const timestamp = nowIso();
161
+ const annotations = value.annotations
162
+ .map((item) => {
163
+ if (!isObject(item)) {
164
+ return null;
165
+ }
166
+ return sanitizeAnnotation({
167
+ id: item.id,
168
+ screenId: item.screenId,
169
+ x: isObject(item.location) && typeof item.location.x === 'number' ? item.location.x : 50,
170
+ y: isObject(item.location) && typeof item.location.y === 'number' ? item.location.y : 50,
171
+ title: item.title,
172
+ detail: item.detail,
173
+ status: item.status,
174
+ action: item.action,
175
+ createdAt: timestamp,
176
+ updatedAt: timestamp
177
+ });
178
+ })
179
+ .filter((annotation) => annotation !== null);
180
+ return {
181
+ reviewId: typeof value.reviewId === 'string' ? value.reviewId : 'ogma-review',
182
+ annotations,
183
+ updatedAt: timestamp
184
+ };
185
+ }
186
+ function sanitizeSnapshot(value, reviewUrl) {
187
+ const timestamp = nowIso();
188
+ if (!isObject(value)) {
189
+ return {
190
+ id: `${Date.now()}`,
191
+ annotations: [],
192
+ createdAt: timestamp,
193
+ reviewId: 'ogma-review',
194
+ reviewUrl,
195
+ screenId: 'unknown',
196
+ viewportMode: 'desktop'
197
+ };
198
+ }
199
+ const annotations = Array.isArray(value.annotations)
200
+ ? value.annotations
201
+ .map((annotation) => sanitizeAnnotation(annotation))
202
+ .filter((annotation) => annotation !== null)
203
+ : [];
204
+ return {
205
+ id: typeof value.id === 'string' ? value.id : `${Date.now()}`,
206
+ annotations,
207
+ createdAt: typeof value.createdAt === 'string' ? value.createdAt : timestamp,
208
+ reviewId: typeof value.reviewId === 'string' ? value.reviewId : 'ogma-review',
209
+ reviewUrl,
210
+ screenId: typeof value.screenId === 'string' ? value.screenId : 'unknown',
211
+ viewportMode: typeof value.viewportMode === 'string' ? value.viewportMode : 'desktop'
212
+ };
213
+ }
214
+ function createIndexHtml() {
215
+ return `<!doctype html>
216
+ <html lang="en">
217
+ <head>
218
+ <meta charset="UTF-8" />
219
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
220
+ <title>Ogma Review</title>
221
+ </head>
222
+ <body>
223
+ <div id="ogma-root"></div>
224
+ <script type="module" src="/src/viewer/client.tsx"></script>
225
+ </body>
226
+ </html>
227
+ `;
228
+ }
229
+ function createRuntimePlugin({ config, packageRoot, project, status }) {
230
+ const sourceRoot = path.join(packageRoot, 'src');
231
+ const designModuleId = 'virtual:ogma-design';
232
+ const configModuleId = 'virtual:ogma-config';
233
+ const resolvedDesignModuleId = `\0${designModuleId}`;
234
+ const resolvedConfigModuleId = `\0${configModuleId}`;
235
+ return {
236
+ name: 'ogma-runtime',
237
+ resolveId(id) {
238
+ if (id === designModuleId) {
239
+ return resolvedDesignModuleId;
240
+ }
241
+ if (id === configModuleId) {
242
+ return resolvedConfigModuleId;
243
+ }
244
+ return null;
245
+ },
246
+ load(id) {
247
+ if (id === resolvedDesignModuleId) {
248
+ const reviewImport = fsImportSpecifier(project.designEntry);
249
+ const notesImport = `${fsImportSpecifier(project.notesPath)}?raw`;
250
+ const normalizerImport = fsImportSpecifier(path.join(sourceRoot, 'viewer/normalizeReviewModule.ts'));
251
+ return [
252
+ `import * as reviewModule from ${JSON.stringify(reviewImport)};`,
253
+ `import productNotes from ${JSON.stringify(notesImport)};`,
254
+ `import { normalizeReviewModule } from ${JSON.stringify(normalizerImport)};`,
255
+ 'export const review = normalizeReviewModule(reviewModule, productNotes);'
256
+ ].join('\n');
257
+ }
258
+ if (id === resolvedConfigModuleId) {
259
+ return `export const runtimeConfig = ${JSON.stringify(config, null, 2)};`;
260
+ }
261
+ return null;
262
+ },
263
+ configureServer(server) {
264
+ server.middlewares.use(async (request, response, next) => {
265
+ try {
266
+ await handleRequest({ next, project, request, response, server, status });
267
+ }
268
+ catch (error) {
269
+ sendJson(response, 500, {
270
+ error: error instanceof Error ? error.message : String(error)
271
+ });
272
+ }
273
+ });
274
+ }
275
+ };
276
+ }
277
+ async function handleRequest({ next, project, request, response, server, status }) {
278
+ const url = new URL(request.url ?? '/', 'http://ogma.local');
279
+ if (request.method === 'GET' && (url.pathname === '/' || url.pathname === '/review')) {
280
+ const html = await server.transformIndexHtml(url.pathname, createIndexHtml());
281
+ sendText(response, 200, html, 'text/html');
282
+ return;
283
+ }
284
+ if (!url.pathname.startsWith('/api/ogma')) {
285
+ next();
286
+ return;
287
+ }
288
+ if (request.method === 'GET' && url.pathname === '/api/ogma/status') {
289
+ sendJson(response, 200, status);
290
+ return;
291
+ }
292
+ if (request.method === 'GET' && url.pathname === '/api/ogma/session') {
293
+ sendJson(response, 200, await readSession(project));
294
+ return;
295
+ }
296
+ if (request.method === 'PUT' && url.pathname === '/api/ogma/session') {
297
+ const session = sanitizeSession(JSON.parse(await readRequestBody(request)));
298
+ await writeSession(project, session);
299
+ sendJson(response, 200, session);
300
+ return;
301
+ }
302
+ if (request.method === 'GET' && url.pathname === '/api/ogma/feedback') {
303
+ sendJson(response, 200, buildFeedbackExport(await readSession(project), status.reviewUrl));
304
+ return;
305
+ }
306
+ if (request.method === 'PUT' && url.pathname === '/api/ogma/feedback') {
307
+ const session = sessionFromFeedbackExport(JSON.parse(await readRequestBody(request)));
308
+ await writeSession(project, session);
309
+ sendJson(response, 200, session);
310
+ return;
311
+ }
312
+ if (request.method === 'POST' && url.pathname === '/api/ogma/feedback/export') {
313
+ const exportData = buildFeedbackExport(await readSession(project), status.reviewUrl);
314
+ await writeFile(project.feedbackPath, `${JSON.stringify(exportData, null, 2)}\n`, 'utf8');
315
+ sendJson(response, 200, {
316
+ path: project.feedbackPath,
317
+ feedback: exportData
318
+ });
319
+ return;
320
+ }
321
+ if (request.method === 'GET' && url.pathname === '/api/ogma/history') {
322
+ sendJson(response, 200, await readHistory(project));
323
+ return;
324
+ }
325
+ if (request.method === 'POST' && url.pathname === '/api/ogma/snapshots') {
326
+ const snapshot = sanitizeSnapshot(JSON.parse(await readRequestBody(request)), status.reviewUrl);
327
+ const fileName = `${snapshot.createdAt.replace(/[^0-9a-z]/gi, '-')}-${snapshot.screenId}.json`;
328
+ const snapshotPath = path.join(project.snapshotsDir, fileName);
329
+ await writeFile(snapshotPath, `${JSON.stringify(snapshot, null, 2)}\n`, 'utf8');
330
+ sendJson(response, 200, {
331
+ path: snapshotPath,
332
+ snapshot
333
+ });
334
+ return;
335
+ }
336
+ sendJson(response, 404, {
337
+ error: `Unknown Ogma API route: ${request.method ?? 'GET'} ${url.pathname}`
338
+ });
339
+ }
340
+ function openBrowser(url) {
341
+ const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
342
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
343
+ const child = spawn(command, args, {
344
+ detached: true,
345
+ stdio: 'ignore'
346
+ });
347
+ child.unref();
348
+ }
349
+ function resolveReviewUrl(server) {
350
+ const localUrl = server.resolvedUrls?.local[0] ?? 'http://localhost:4317/';
351
+ return new URL('/review', localUrl).toString();
352
+ }
353
+ export function getPackageRootFromImportMeta(metaUrl) {
354
+ return path.dirname(path.dirname(fileURLToPath(metaUrl)));
355
+ }
356
+ export async function startOgmaServer(options) {
357
+ const project = await ensureOgmaProject({
358
+ cwd: options.cwd,
359
+ review: options.review
360
+ });
361
+ const requireFromPackage = createRequire(path.join(options.packageRoot, 'package.json'));
362
+ const version = await readPackageVersion(options.packageRoot);
363
+ const startedAt = nowIso();
364
+ const runtimeConfig = {
365
+ cwd: options.cwd,
366
+ dataDir: project.dataDir,
367
+ defaultDesignDir: project.defaultDesignDir,
368
+ reviewUrl: `http://localhost:${options.port}/review`,
369
+ skillUrl: options.skillUrl ?? DEFAULT_SKILL_URL,
370
+ serverStartedAt: startedAt
371
+ };
372
+ const status = {
373
+ packageName: '@hcgstudio/ogma',
374
+ version,
375
+ cwd: options.cwd,
376
+ dataDir: project.dataDir,
377
+ designEntry: project.designEntry,
378
+ historyPath: project.historyPath,
379
+ notesPath: project.notesPath,
380
+ reviewUrl: runtimeConfig.reviewUrl,
381
+ skillUrl: runtimeConfig.skillUrl,
382
+ snapshotsDir: project.snapshotsDir,
383
+ serverStartedAt: startedAt
384
+ };
385
+ const server = await createServer({
386
+ appType: 'custom',
387
+ clearScreen: false,
388
+ plugins: [
389
+ createRuntimePlugin({
390
+ config: runtimeConfig,
391
+ packageRoot: options.packageRoot,
392
+ project,
393
+ status
394
+ })
395
+ ],
396
+ resolve: {
397
+ alias: [
398
+ {
399
+ find: '@hcgstudio/ogma/styles.css',
400
+ replacement: path.join(options.packageRoot, 'src/viewer/styles.css')
401
+ },
402
+ {
403
+ find: '@hcgstudio/ogma',
404
+ replacement: path.join(options.packageRoot, 'src/index.ts')
405
+ },
406
+ {
407
+ find: 'react/jsx-runtime',
408
+ replacement: requireFromPackage.resolve('react/jsx-runtime')
409
+ },
410
+ {
411
+ find: 'react/jsx-dev-runtime',
412
+ replacement: requireFromPackage.resolve('react/jsx-dev-runtime')
413
+ },
414
+ {
415
+ find: 'react-dom/client',
416
+ replacement: requireFromPackage.resolve('react-dom/client')
417
+ },
418
+ {
419
+ find: 'react',
420
+ replacement: requireFromPackage.resolve('react')
421
+ },
422
+ {
423
+ find: 'lucide-react',
424
+ replacement: requireFromPackage.resolve('lucide-react')
425
+ }
426
+ ],
427
+ dedupe: ['@hcgstudio/ogma', 'react', 'react-dom', 'lucide-react']
428
+ },
429
+ root: options.packageRoot,
430
+ server: {
431
+ fs: {
432
+ allow: [options.cwd, options.packageRoot, path.dirname(project.designEntry), project.dataDir]
433
+ },
434
+ host: options.host,
435
+ port: options.port,
436
+ strictPort: false
437
+ }
438
+ });
439
+ await server.listen();
440
+ runtimeConfig.reviewUrl = resolveReviewUrl(server);
441
+ status.reviewUrl = runtimeConfig.reviewUrl;
442
+ console.log('');
443
+ console.log('Ogma review server ready');
444
+ console.log(` Review URL: ${status.reviewUrl}`);
445
+ console.log(` Skill URL: ${status.skillUrl}`);
446
+ console.log(` Designs: ${project.designEntry}`);
447
+ console.log(` Notes: ${project.notesPath}`);
448
+ console.log(` Feedback: ${project.sessionPath}`);
449
+ console.log(` History: ${project.historyPath}`);
450
+ console.log('');
451
+ if (options.open) {
452
+ openBrowser(status.reviewUrl);
453
+ }
454
+ return {
455
+ project,
456
+ reviewUrl: status.reviewUrl,
457
+ server,
458
+ status
459
+ };
460
+ }
461
+ export async function assertPackageInstalledFromCwd(cwd) {
462
+ const require = createRequire(path.join(cwd, 'package.json'));
463
+ const missing = [];
464
+ for (const specifier of ['react', 'react-dom/client', 'vite']) {
465
+ try {
466
+ require.resolve(specifier);
467
+ }
468
+ catch {
469
+ missing.push(specifier);
470
+ }
471
+ }
472
+ if (missing.length > 0) {
473
+ throw new Error(`Missing runtime dependencies: ${missing.join(', ')}. Run npm install -D @hcgstudio/ogma react react-dom vite.`);
474
+ }
475
+ }
476
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/node/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const DEFAULT_SKILL_URL = "https://raw.githubusercontent.com/hcgstudio/ogma/main/docs/skills/ogma/SKILL.md";
2
+ export declare const DEFAULT_DESIGN_DIR = "designs/ogma";
3
+ export declare const DEFAULT_REVIEW_SOURCE = "import { defineOgmaReview, type OgmaPrototypeScreenProps } from '@hcgstudio/ogma';\n\nfunction DashboardPrototype() {\n return (\n <div className=\"ogma-demo-screen\">\n <aside className=\"ogma-demo-sidebar\">\n <div className=\"ogma-demo-brand\">O</div>\n <span className=\"ogma-demo-nav is-active\">Overview</span>\n <span className=\"ogma-demo-nav\">Signals</span>\n <span className=\"ogma-demo-nav\">Queue</span>\n <span className=\"ogma-demo-nav\">Settings</span>\n </aside>\n <main className=\"ogma-demo-content\">\n <div className=\"ogma-demo-header\">\n <div>\n <p>Dashboard</p>\n <h2>Atlas Brief</h2>\n </div>\n <button type=\"button\">Review ready</button>\n </div>\n <div className=\"ogma-demo-grid\">\n <section className=\"ogma-demo-card is-wide\">\n <div className=\"ogma-demo-card-title\" />\n <div className=\"ogma-demo-chart\">\n {[42, 68, 53, 81, 61, 75, 88].map((value) => (\n <span key={value} style={{ height: `${value}%` }} />\n ))}\n </div>\n </section>\n <section className=\"ogma-demo-card is-accent\">\n <strong>91%</strong>\n <p>Review confidence</p>\n </section>\n <section className=\"ogma-demo-card\">\n <div className=\"ogma-demo-list-row\" />\n <div className=\"ogma-demo-list-row is-medium\" />\n <div className=\"ogma-demo-list-row is-short\" />\n </section>\n <section className=\"ogma-demo-card is-action\">\n <strong>2</strong>\n <p>Copy edits before approval</p>\n </section>\n </div>\n </main>\n </div>\n );\n}\n\nfunction DesignSpecPrototype({ screen }: OgmaPrototypeScreenProps) {\n return (\n <div className=\"ogma-spec-screen\">\n <header>\n <p>{screen.title}</p>\n <h2>Decision System</h2>\n </header>\n <div className=\"ogma-spec-grid\">\n {['Information density', 'Review confidence', 'Agent handoff', 'Mobile parity'].map(\n (item, index) => (\n <section key={item}>\n <span>{`0${index + 1}`}</span>\n <h3>{item}</h3>\n <p>Prototype state prepared for pinned reviewer feedback and agent follow-up.</p>\n </section>\n )\n )}\n </div>\n </div>\n );\n}\n\nfunction MobileNavigationPrototype() {\n return (\n <div className=\"ogma-mobile-screen\">\n <div className=\"ogma-phone\">\n <header>\n <span>Ogma</span>\n <button type=\"button\">New</button>\n </header>\n <main>\n <section>\n <p>Mobile nav</p>\n <h2>Design queue</h2>\n </section>\n <div className=\"ogma-phone-list\">\n <span />\n <span />\n <span />\n </div>\n </main>\n <nav>\n <span className=\"is-active\" />\n <span />\n <span />\n </nav>\n </div>\n </div>\n );\n}\n\nexport default defineOgmaReview({\n title: 'Ogma starter review',\n description: 'Replace these JSX screens with the product states the reviewer should inspect.',\n metadata: {\n agent: 'starter',\n iteration: '0',\n source: 'designs/ogma/review.tsx'\n },\n screens: [\n {\n id: 'dashboard',\n title: 'Dashboard',\n description: 'Desktop review surface',\n component: DashboardPrototype\n },\n {\n id: 'design-spec',\n title: 'Design spec',\n description: 'Design rationale and product decisions',\n component: DesignSpecPrototype\n },\n {\n id: 'mobile-navigation',\n title: 'Mobile nav',\n description: 'Compact navigation state',\n component: MobileNavigationPrototype,\n width: 390\n }\n ]\n});\n";
4
+ export declare const DEFAULT_PRODUCT_NOTES = "# Product Design Notes\n\n## Intent\n\nReplace this starter note with product-specific design rationale, interaction states, and open decisions.\n\n## Review Loop\n\n- Keep JSX prototype screens in this directory.\n- Keep reviewer feedback IDs, such as OG-001, in agent change summaries.\n- Update this file whenever the product direction changes.\n";
5
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/node/templates.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,oFACqD,CAAC;AAEpF,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,qBAAqB,s4HAiIjC,CAAC;AAEF,eAAO,MAAM,qBAAqB,kWAWjC,CAAC"}
@@ -0,0 +1,145 @@
1
+ export const DEFAULT_SKILL_URL = 'https://raw.githubusercontent.com/hcgstudio/ogma/main/docs/skills/ogma/SKILL.md';
2
+ export const DEFAULT_DESIGN_DIR = 'designs/ogma';
3
+ export const DEFAULT_REVIEW_SOURCE = `import { defineOgmaReview, type OgmaPrototypeScreenProps } from '@hcgstudio/ogma';
4
+
5
+ function DashboardPrototype() {
6
+ return (
7
+ <div className="ogma-demo-screen">
8
+ <aside className="ogma-demo-sidebar">
9
+ <div className="ogma-demo-brand">O</div>
10
+ <span className="ogma-demo-nav is-active">Overview</span>
11
+ <span className="ogma-demo-nav">Signals</span>
12
+ <span className="ogma-demo-nav">Queue</span>
13
+ <span className="ogma-demo-nav">Settings</span>
14
+ </aside>
15
+ <main className="ogma-demo-content">
16
+ <div className="ogma-demo-header">
17
+ <div>
18
+ <p>Dashboard</p>
19
+ <h2>Atlas Brief</h2>
20
+ </div>
21
+ <button type="button">Review ready</button>
22
+ </div>
23
+ <div className="ogma-demo-grid">
24
+ <section className="ogma-demo-card is-wide">
25
+ <div className="ogma-demo-card-title" />
26
+ <div className="ogma-demo-chart">
27
+ {[42, 68, 53, 81, 61, 75, 88].map((value) => (
28
+ <span key={value} style={{ height: \`\${value}%\` }} />
29
+ ))}
30
+ </div>
31
+ </section>
32
+ <section className="ogma-demo-card is-accent">
33
+ <strong>91%</strong>
34
+ <p>Review confidence</p>
35
+ </section>
36
+ <section className="ogma-demo-card">
37
+ <div className="ogma-demo-list-row" />
38
+ <div className="ogma-demo-list-row is-medium" />
39
+ <div className="ogma-demo-list-row is-short" />
40
+ </section>
41
+ <section className="ogma-demo-card is-action">
42
+ <strong>2</strong>
43
+ <p>Copy edits before approval</p>
44
+ </section>
45
+ </div>
46
+ </main>
47
+ </div>
48
+ );
49
+ }
50
+
51
+ function DesignSpecPrototype({ screen }: OgmaPrototypeScreenProps) {
52
+ return (
53
+ <div className="ogma-spec-screen">
54
+ <header>
55
+ <p>{screen.title}</p>
56
+ <h2>Decision System</h2>
57
+ </header>
58
+ <div className="ogma-spec-grid">
59
+ {['Information density', 'Review confidence', 'Agent handoff', 'Mobile parity'].map(
60
+ (item, index) => (
61
+ <section key={item}>
62
+ <span>{\`0\${index + 1}\`}</span>
63
+ <h3>{item}</h3>
64
+ <p>Prototype state prepared for pinned reviewer feedback and agent follow-up.</p>
65
+ </section>
66
+ )
67
+ )}
68
+ </div>
69
+ </div>
70
+ );
71
+ }
72
+
73
+ function MobileNavigationPrototype() {
74
+ return (
75
+ <div className="ogma-mobile-screen">
76
+ <div className="ogma-phone">
77
+ <header>
78
+ <span>Ogma</span>
79
+ <button type="button">New</button>
80
+ </header>
81
+ <main>
82
+ <section>
83
+ <p>Mobile nav</p>
84
+ <h2>Design queue</h2>
85
+ </section>
86
+ <div className="ogma-phone-list">
87
+ <span />
88
+ <span />
89
+ <span />
90
+ </div>
91
+ </main>
92
+ <nav>
93
+ <span className="is-active" />
94
+ <span />
95
+ <span />
96
+ </nav>
97
+ </div>
98
+ </div>
99
+ );
100
+ }
101
+
102
+ export default defineOgmaReview({
103
+ title: 'Ogma starter review',
104
+ description: 'Replace these JSX screens with the product states the reviewer should inspect.',
105
+ metadata: {
106
+ agent: 'starter',
107
+ iteration: '0',
108
+ source: 'designs/ogma/review.tsx'
109
+ },
110
+ screens: [
111
+ {
112
+ id: 'dashboard',
113
+ title: 'Dashboard',
114
+ description: 'Desktop review surface',
115
+ component: DashboardPrototype
116
+ },
117
+ {
118
+ id: 'design-spec',
119
+ title: 'Design spec',
120
+ description: 'Design rationale and product decisions',
121
+ component: DesignSpecPrototype
122
+ },
123
+ {
124
+ id: 'mobile-navigation',
125
+ title: 'Mobile nav',
126
+ description: 'Compact navigation state',
127
+ component: MobileNavigationPrototype,
128
+ width: 390
129
+ }
130
+ ]
131
+ });
132
+ `;
133
+ export const DEFAULT_PRODUCT_NOTES = `# Product Design Notes
134
+
135
+ ## Intent
136
+
137
+ Replace this starter note with product-specific design rationale, interaction states, and open decisions.
138
+
139
+ ## Review Loop
140
+
141
+ - Keep JSX prototype screens in this directory.
142
+ - Keep reviewer feedback IDs, such as OG-001, in agent change summaries.
143
+ - Update this file whenever the product direction changes.
144
+ `;
145
+ //# sourceMappingURL=templates.js.map