dev-workflows 0.3.0 → 0.5.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/README.md +68 -21
- package/dist/bridges/types.d.ts +20 -0
- package/dist/bridges/types.d.ts.map +1 -1
- package/dist/bridges/types.js +5 -1
- package/dist/bridges/types.js.map +1 -1
- package/dist/commands/add.d.ts +26 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +517 -57
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/compile.d.ts +1 -0
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +8 -3
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/doctor.d.ts +3 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +49 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +15 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +51 -17
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +111 -22
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/watch.js +1 -1
- package/dist/commands/watch.js.map +1 -1
- package/dist/core/assets.d.ts +28 -0
- package/dist/core/assets.d.ts.map +1 -0
- package/dist/core/assets.js +169 -0
- package/dist/core/assets.js.map +1 -0
- package/dist/core/converter.d.ts +18 -0
- package/dist/core/converter.d.ts.map +1 -0
- package/dist/core/converter.js +113 -0
- package/dist/core/converter.js.map +1 -0
- package/dist/core/parser.d.ts.map +1 -1
- package/dist/core/parser.js +28 -0
- package/dist/core/parser.js.map +1 -1
- package/dist/core/settings-merge.d.ts +6 -0
- package/dist/core/settings-merge.d.ts.map +1 -0
- package/dist/core/settings-merge.js +41 -0
- package/dist/core/settings-merge.js.map +1 -0
- package/dist/utils/cache.d.ts +10 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +43 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/github.d.ts +13 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +76 -0
- package/dist/utils/github.js.map +1 -0
- package/package.json +2 -2
- package/content/blocks/nextjs-approuter.yml +0 -37
- package/content/blocks/react-conventions.yml +0 -36
- package/content/blocks/supabase-rls.yml +0 -30
- package/content/blocks/tailwind.yml +0 -28
- package/content/blocks/testing-basics.yml +0 -36
- package/content/blocks/typescript-strict.yml +0 -33
- package/dist/blocks/installer.d.ts +0 -4
- package/dist/blocks/installer.d.ts.map +0 -1
- package/dist/blocks/installer.js +0 -119
- package/dist/blocks/installer.js.map +0 -1
- package/dist/blocks/registry.d.ts +0 -18
- package/dist/blocks/registry.d.ts.map +0 -1
- package/dist/blocks/registry.js +0 -85
- package/dist/blocks/registry.js.map +0 -1
package/dist/core/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/core/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
2
|
+
[key: string]: JsonValue;
|
|
3
|
+
};
|
|
4
|
+
export declare function deepMerge(target: Record<string, JsonValue>, source: Record<string, JsonValue>): Record<string, JsonValue>;
|
|
5
|
+
export declare function mergeSettingsFile(cwd: string, hookSettings: Record<string, JsonValue>): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=settings-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-merge.d.ts","sourceRoot":"","sources":["../../src/core/settings-merge.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAuBzH;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { fileExists } from '../utils/fs.js';
|
|
4
|
+
export function deepMerge(target, source) {
|
|
5
|
+
const result = { ...target };
|
|
6
|
+
for (const key of Object.keys(source)) {
|
|
7
|
+
const sourceVal = source[key];
|
|
8
|
+
const targetVal = result[key];
|
|
9
|
+
if (Array.isArray(sourceVal) && Array.isArray(targetVal)) {
|
|
10
|
+
result[key] = [...targetVal, ...sourceVal];
|
|
11
|
+
}
|
|
12
|
+
else if (sourceVal !== null && typeof sourceVal === 'object' && !Array.isArray(sourceVal) &&
|
|
13
|
+
targetVal !== null && typeof targetVal === 'object' && !Array.isArray(targetVal)) {
|
|
14
|
+
result[key] = deepMerge(targetVal, sourceVal);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
result[key] = sourceVal;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
export async function mergeSettingsFile(cwd, hookSettings) {
|
|
23
|
+
const settingsPath = join(cwd, '.claude', 'settings.local.json');
|
|
24
|
+
let existing = {};
|
|
25
|
+
if (await fileExists(settingsPath)) {
|
|
26
|
+
try {
|
|
27
|
+
const raw = await readFile(settingsPath, 'utf-8');
|
|
28
|
+
const parsed = JSON.parse(raw);
|
|
29
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
30
|
+
existing = parsed;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Corrupted file — start fresh
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const merged = deepMerge(existing, hookSettings);
|
|
38
|
+
await mkdir(dirname(settingsPath), { recursive: true });
|
|
39
|
+
await writeFile(settingsPath, JSON.stringify(merged, null, 2) + '\n', 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=settings-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../src/core/settings-merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI5C,MAAM,UAAU,SAAS,CAAC,MAAiC,EAAE,MAAiC;IAC5F,MAAM,MAAM,GAA8B,EAAE,GAAG,MAAM,EAAE,CAAC;IAExD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;QAC7C,CAAC;aAAM,IACL,SAAS,KAAK,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;YAChF,SAAS,KAAK,IAAI,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAChF,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,SAAsC,EACtC,SAAsC,CACvC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW,EACX,YAAuC;IAEvC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;IAEjE,IAAI,QAAQ,GAA8B,EAAE,CAAC;IAC7C,IAAI,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnE,QAAQ,GAAG,MAAmC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface CacheEntry<T> {
|
|
2
|
+
data: T;
|
|
3
|
+
timestamp: number;
|
|
4
|
+
}
|
|
5
|
+
type CacheStore = Record<string, CacheEntry<unknown>>;
|
|
6
|
+
export declare function get<T>(_cwd: string, key: string, store: CacheStore): T | null;
|
|
7
|
+
export declare function getFromDisk<T>(cwd: string, key: string): Promise<T | null>;
|
|
8
|
+
export declare function set<T>(cwd: string, key: string, value: T): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAKA,UAAU,UAAU,CAAC,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AAyBtD,wBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,GAAG,IAAI,CAQ7E;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAGhF;AAED,wBAAsB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
const TTL_MS = 3_600_000; // 1 hour
|
|
4
|
+
function getCachePath(cwd) {
|
|
5
|
+
return join(cwd, '.dwf', '.cache', 'registry.json');
|
|
6
|
+
}
|
|
7
|
+
async function readStore(cwd) {
|
|
8
|
+
try {
|
|
9
|
+
const raw = await readFile(getCachePath(cwd), 'utf-8');
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
12
|
+
return parsed;
|
|
13
|
+
}
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function writeStore(cwd, store) {
|
|
21
|
+
const cachePath = getCachePath(cwd);
|
|
22
|
+
await mkdir(dirname(cachePath), { recursive: true });
|
|
23
|
+
await writeFile(cachePath, JSON.stringify(store, null, 2), 'utf-8');
|
|
24
|
+
}
|
|
25
|
+
export function get(_cwd, key, store) {
|
|
26
|
+
const entry = store[key];
|
|
27
|
+
if (!entry)
|
|
28
|
+
return null;
|
|
29
|
+
const age = Date.now() - entry.timestamp;
|
|
30
|
+
if (age > TTL_MS)
|
|
31
|
+
return null;
|
|
32
|
+
return entry.data;
|
|
33
|
+
}
|
|
34
|
+
export async function getFromDisk(cwd, key) {
|
|
35
|
+
const store = await readStore(cwd);
|
|
36
|
+
return get(cwd, key, store);
|
|
37
|
+
}
|
|
38
|
+
export async function set(cwd, key, value) {
|
|
39
|
+
const store = await readStore(cwd);
|
|
40
|
+
store[key] = { data: value, timestamp: Date.now() };
|
|
41
|
+
await writeStore(cwd, store);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,SAAS;AASnC,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,OAAO,MAAoB,CAAC;QAC9B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,KAAiB;IACtD,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,IAAY,EAAE,GAAW,EAAE,KAAiB;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAA8B,CAAC;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;IACzC,IAAI,GAAG,GAAG,MAAM;QAAE,OAAO,IAAI,CAAC;IAE9B,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAI,GAAW,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,GAAG,CAAI,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAI,GAAW,EAAE,GAAW,EAAE,KAAQ;IAC7D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACnC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACpD,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class GitHubError extends Error {
|
|
2
|
+
readonly statusCode: number;
|
|
3
|
+
constructor(message: string, statusCode: number);
|
|
4
|
+
}
|
|
5
|
+
export declare function fetchContent(contentPath: string): Promise<string>;
|
|
6
|
+
export declare function fetchRawContent(path: string): Promise<string>;
|
|
7
|
+
export interface DirectoryEntry {
|
|
8
|
+
name: string;
|
|
9
|
+
type: 'file' | 'dir';
|
|
10
|
+
}
|
|
11
|
+
export declare function listContentDirectory(contentPath: string): Promise<DirectoryEntry[]>;
|
|
12
|
+
export declare function listDirectory(path?: string): Promise<DirectoryEntry[]>;
|
|
13
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/utils/github.ts"],"names":[],"mappings":"AAKA,qBAAa,WAAY,SAAQ,KAAK;aAGlB,UAAU,EAAE,MAAM;gBADlC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM;CAKrC;AAeD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBvE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAOD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CACtB;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAgCzF;AAED,wBAAsB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAO5E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
const BRANCH = 'main';
|
|
2
|
+
const REPO = 'gpolanco/dev-workflows';
|
|
3
|
+
const RAW_BASE = `https://raw.githubusercontent.com/${REPO}/${BRANCH}/content`;
|
|
4
|
+
const API_BASE = `https://api.github.com/repos/${REPO}/contents/content`;
|
|
5
|
+
export class GitHubError extends Error {
|
|
6
|
+
statusCode;
|
|
7
|
+
constructor(message, statusCode) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.statusCode = statusCode;
|
|
10
|
+
this.name = 'GitHubError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function handleResponseError(status, path) {
|
|
14
|
+
if (status === 404) {
|
|
15
|
+
throw new GitHubError(`Content not found: ${path}`, 404);
|
|
16
|
+
}
|
|
17
|
+
if (status === 403) {
|
|
18
|
+
throw new GitHubError('GitHub API rate limit exceeded. Try again later or set a GITHUB_TOKEN environment variable.', 403);
|
|
19
|
+
}
|
|
20
|
+
throw new GitHubError(`GitHub request failed (HTTP ${String(status)})`, status);
|
|
21
|
+
}
|
|
22
|
+
export async function fetchContent(contentPath) {
|
|
23
|
+
const url = `${RAW_BASE}/${contentPath}`;
|
|
24
|
+
let response;
|
|
25
|
+
try {
|
|
26
|
+
response = await fetch(url);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
30
|
+
throw new GitHubError(`Network error fetching content: ${msg}`, 0);
|
|
31
|
+
}
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
handleResponseError(response.status, contentPath);
|
|
34
|
+
}
|
|
35
|
+
return response.text();
|
|
36
|
+
}
|
|
37
|
+
export async function fetchRawContent(path) {
|
|
38
|
+
return fetchContent(`rules/${path}.md`);
|
|
39
|
+
}
|
|
40
|
+
export async function listContentDirectory(contentPath) {
|
|
41
|
+
const url = `${API_BASE}/${contentPath}?ref=${BRANCH}`;
|
|
42
|
+
const headers = {
|
|
43
|
+
Accept: 'application/vnd.github.v3+json',
|
|
44
|
+
};
|
|
45
|
+
const token = process.env['GITHUB_TOKEN'];
|
|
46
|
+
if (token) {
|
|
47
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
48
|
+
}
|
|
49
|
+
let response;
|
|
50
|
+
try {
|
|
51
|
+
response = await fetch(url, { headers });
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
55
|
+
throw new GitHubError(`Network error listing directory: ${msg}`, 0);
|
|
56
|
+
}
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
handleResponseError(response.status, contentPath);
|
|
59
|
+
}
|
|
60
|
+
const data = (await response.json());
|
|
61
|
+
return data
|
|
62
|
+
.filter((entry) => entry.type === 'file' || entry.type === 'dir')
|
|
63
|
+
.map((entry) => ({
|
|
64
|
+
name: entry.name.replace(/\.md$/, '').replace(/\.json$/, '').replace(/\.yml$/, ''),
|
|
65
|
+
type: entry.type === 'dir' ? 'dir' : 'file',
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
export async function listDirectory(path) {
|
|
69
|
+
const contentPath = path ? `rules/${path}` : 'rules';
|
|
70
|
+
const entries = await listContentDirectory(contentPath);
|
|
71
|
+
return entries.map((entry) => ({
|
|
72
|
+
name: entry.name.replace(/\.md$/, ''),
|
|
73
|
+
type: entry.type,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/utils/github.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev-workflows",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CLI that compiles developer rules into editor-specific config files",
|
|
6
6
|
"license": "MIT",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@types/node": "^22.0.0"
|
|
54
54
|
},
|
|
55
55
|
"scripts": {
|
|
56
|
-
"prebuild": "
|
|
56
|
+
"prebuild": "cp ../../README.md README.md",
|
|
57
57
|
"build": "tsc",
|
|
58
58
|
"dev": "tsc --watch",
|
|
59
59
|
"typecheck": "tsc --noEmit",
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
id: nextjs-approuter
|
|
2
|
-
name: "Next.js App Router"
|
|
3
|
-
description: "App Router patterns, RSC, and server actions"
|
|
4
|
-
version: "0.1.0"
|
|
5
|
-
|
|
6
|
-
rules:
|
|
7
|
-
- id: nextjs-use-client-minimal
|
|
8
|
-
scope: architecture
|
|
9
|
-
severity: error
|
|
10
|
-
content: |
|
|
11
|
-
Minimize "use client" directives. Default to Server Components.
|
|
12
|
-
Only add "use client" when the component needs browser APIs,
|
|
13
|
-
event handlers, or React hooks that require client state.
|
|
14
|
-
|
|
15
|
-
- id: nextjs-server-actions
|
|
16
|
-
scope: architecture
|
|
17
|
-
severity: warning
|
|
18
|
-
content: |
|
|
19
|
-
Prefer server actions for form submissions and data mutations.
|
|
20
|
-
Define them with "use server" in a separate file or at the
|
|
21
|
-
top of an async function.
|
|
22
|
-
|
|
23
|
-
- id: nextjs-route-segments
|
|
24
|
-
scope: architecture
|
|
25
|
-
severity: error
|
|
26
|
-
content: |
|
|
27
|
-
Follow the App Router file conventions: page.tsx, layout.tsx,
|
|
28
|
-
loading.tsx, error.tsx, not-found.tsx. Do not create custom
|
|
29
|
-
routing abstractions.
|
|
30
|
-
|
|
31
|
-
- id: nextjs-no-client-fetch
|
|
32
|
-
scope: architecture
|
|
33
|
-
severity: warning
|
|
34
|
-
content: |
|
|
35
|
-
Fetch data in Server Components or server actions, not in
|
|
36
|
-
client components with useEffect. Use React Suspense for
|
|
37
|
-
loading states.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
id: react-conventions
|
|
2
|
-
name: "React Conventions"
|
|
3
|
-
description: "Hooks rules, component patterns, and naming conventions"
|
|
4
|
-
version: "0.1.0"
|
|
5
|
-
|
|
6
|
-
rules:
|
|
7
|
-
- id: react-hooks-rules
|
|
8
|
-
scope: conventions
|
|
9
|
-
severity: error
|
|
10
|
-
content: |
|
|
11
|
-
Follow the Rules of Hooks: only call hooks at the top level,
|
|
12
|
-
never inside conditions or loops. Custom hooks must start
|
|
13
|
-
with "use".
|
|
14
|
-
|
|
15
|
-
- id: react-component-naming
|
|
16
|
-
scope: conventions
|
|
17
|
-
severity: error
|
|
18
|
-
content: |
|
|
19
|
-
Use PascalCase for component names and their files.
|
|
20
|
-
Use camelCase for hook files prefixed with "use"
|
|
21
|
-
(e.g. useAuth.ts).
|
|
22
|
-
|
|
23
|
-
- id: react-prefer-composition
|
|
24
|
-
scope: conventions
|
|
25
|
-
severity: warning
|
|
26
|
-
content: |
|
|
27
|
-
Prefer composition over prop drilling. Use children,
|
|
28
|
-
render props, or context for shared behavior rather than
|
|
29
|
-
deeply nested prop chains.
|
|
30
|
-
|
|
31
|
-
- id: react-no-inline-styles
|
|
32
|
-
scope: conventions
|
|
33
|
-
severity: warning
|
|
34
|
-
content: |
|
|
35
|
-
Avoid inline styles. Use CSS modules, Tailwind classes,
|
|
36
|
-
or styled-components for styling.
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
id: supabase-rls
|
|
2
|
-
name: "Supabase RLS"
|
|
3
|
-
description: "Row-Level Security enforcement and auth patterns"
|
|
4
|
-
version: "0.1.0"
|
|
5
|
-
|
|
6
|
-
rules:
|
|
7
|
-
- id: supabase-rls-required
|
|
8
|
-
scope: security
|
|
9
|
-
severity: error
|
|
10
|
-
content: |
|
|
11
|
-
Every new table must have RLS policies before merging.
|
|
12
|
-
Enable RLS with ALTER TABLE ... ENABLE ROW LEVEL SECURITY
|
|
13
|
-
and create at least one policy per operation (SELECT, INSERT,
|
|
14
|
-
UPDATE, DELETE) as needed.
|
|
15
|
-
|
|
16
|
-
- id: supabase-auth-context
|
|
17
|
-
scope: security
|
|
18
|
-
severity: error
|
|
19
|
-
content: |
|
|
20
|
-
Always use auth.uid() in RLS policies to scope data to
|
|
21
|
-
the authenticated user. Never rely on client-provided
|
|
22
|
-
user IDs in queries.
|
|
23
|
-
|
|
24
|
-
- id: supabase-no-service-role-client
|
|
25
|
-
scope: security
|
|
26
|
-
severity: error
|
|
27
|
-
content: |
|
|
28
|
-
Never expose the service_role key to the client.
|
|
29
|
-
Use the anon key in browser code and the service_role key
|
|
30
|
-
only in server-side or admin contexts.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
id: tailwind
|
|
2
|
-
name: "Tailwind CSS"
|
|
3
|
-
description: "Utility-first CSS conventions and design tokens"
|
|
4
|
-
version: "0.1.0"
|
|
5
|
-
|
|
6
|
-
rules:
|
|
7
|
-
- id: tailwind-utility-first
|
|
8
|
-
scope: conventions
|
|
9
|
-
severity: error
|
|
10
|
-
content: |
|
|
11
|
-
Use Tailwind utility classes for all styling. Do not write
|
|
12
|
-
custom CSS unless absolutely necessary (e.g. complex
|
|
13
|
-
animations or third-party overrides).
|
|
14
|
-
|
|
15
|
-
- id: tailwind-design-tokens
|
|
16
|
-
scope: conventions
|
|
17
|
-
severity: warning
|
|
18
|
-
content: |
|
|
19
|
-
Use Tailwind's design tokens (spacing, colors, typography)
|
|
20
|
-
from the theme config. Avoid arbitrary values like
|
|
21
|
-
w-[137px]; prefer the closest token.
|
|
22
|
-
|
|
23
|
-
- id: tailwind-no-apply
|
|
24
|
-
scope: conventions
|
|
25
|
-
severity: warning
|
|
26
|
-
content: |
|
|
27
|
-
Avoid @apply in CSS files. Extract reusable patterns into
|
|
28
|
-
React components instead of creating CSS abstractions.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
id: testing-basics
|
|
2
|
-
name: "Testing Basics"
|
|
3
|
-
description: "Test naming, coverage expectations, and mock patterns"
|
|
4
|
-
version: "0.1.0"
|
|
5
|
-
|
|
6
|
-
rules:
|
|
7
|
-
- id: testing-descriptive-names
|
|
8
|
-
scope: testing
|
|
9
|
-
severity: error
|
|
10
|
-
content: |
|
|
11
|
-
Use descriptive test names that explain the expected behavior.
|
|
12
|
-
Follow the pattern: "should [expected behavior] when [condition]".
|
|
13
|
-
|
|
14
|
-
- id: testing-arrange-act-assert
|
|
15
|
-
scope: testing
|
|
16
|
-
severity: warning
|
|
17
|
-
content: |
|
|
18
|
-
Structure tests with Arrange-Act-Assert (AAA) pattern.
|
|
19
|
-
Separate setup, execution, and verification into distinct
|
|
20
|
-
sections for readability.
|
|
21
|
-
|
|
22
|
-
- id: testing-no-implementation-details
|
|
23
|
-
scope: testing
|
|
24
|
-
severity: warning
|
|
25
|
-
content: |
|
|
26
|
-
Test behavior, not implementation details. Avoid asserting
|
|
27
|
-
on internal state, private methods, or specific function calls
|
|
28
|
-
unless testing integration points.
|
|
29
|
-
|
|
30
|
-
- id: testing-mock-boundaries
|
|
31
|
-
scope: testing
|
|
32
|
-
severity: warning
|
|
33
|
-
content: |
|
|
34
|
-
Only mock at system boundaries: network requests, databases,
|
|
35
|
-
file system, and third-party services. Do not mock internal
|
|
36
|
-
modules or utility functions.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
id: typescript-strict
|
|
2
|
-
name: "TypeScript Strict"
|
|
3
|
-
description: "Strict TypeScript conventions for professional codebases"
|
|
4
|
-
version: "0.1.0"
|
|
5
|
-
|
|
6
|
-
rules:
|
|
7
|
-
- id: ts-strict-no-any
|
|
8
|
-
scope: conventions
|
|
9
|
-
severity: error
|
|
10
|
-
content: |
|
|
11
|
-
Never use `any`. Use `unknown` when the type is truly unknown,
|
|
12
|
-
then narrow with type guards.
|
|
13
|
-
|
|
14
|
-
- id: ts-strict-explicit-returns
|
|
15
|
-
scope: conventions
|
|
16
|
-
severity: warning
|
|
17
|
-
content: |
|
|
18
|
-
Always declare explicit return types on exported functions.
|
|
19
|
-
Inferred types are fine for internal/private functions.
|
|
20
|
-
|
|
21
|
-
- id: ts-strict-no-enums
|
|
22
|
-
scope: conventions
|
|
23
|
-
severity: warning
|
|
24
|
-
content: |
|
|
25
|
-
Prefer union types over enums.
|
|
26
|
-
Use `as const` objects when you need runtime values.
|
|
27
|
-
|
|
28
|
-
- id: ts-strict-no-non-null-assertion
|
|
29
|
-
scope: conventions
|
|
30
|
-
severity: error
|
|
31
|
-
content: |
|
|
32
|
-
Never use non-null assertion (!). Handle null/undefined explicitly
|
|
33
|
-
with optional chaining, nullish coalescing, or type guards.
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { BlockDefinition } from './registry.js';
|
|
2
|
-
export declare function installBlock(cwd: string, block: BlockDefinition): Promise<number>;
|
|
3
|
-
export declare function uninstallBlock(cwd: string, blockId: string): Promise<number>;
|
|
4
|
-
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/blocks/installer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAmCrD,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CvF;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgClF"}
|
package/dist/blocks/installer.js
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { parse, stringify } from 'yaml';
|
|
4
|
-
async function readRuleFile(filePath) {
|
|
5
|
-
try {
|
|
6
|
-
const raw = await readFile(filePath, 'utf-8');
|
|
7
|
-
const parsed = parse(raw);
|
|
8
|
-
if (!parsed || typeof parsed !== 'object')
|
|
9
|
-
return null;
|
|
10
|
-
const doc = parsed;
|
|
11
|
-
return {
|
|
12
|
-
scope: typeof doc['scope'] === 'string' ? doc['scope'] : '',
|
|
13
|
-
rules: Array.isArray(doc['rules']) ? doc['rules'] : [],
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function writeRuleFile(doc) {
|
|
21
|
-
return stringify(doc, { lineWidth: 0 });
|
|
22
|
-
}
|
|
23
|
-
export async function installBlock(cwd, block) {
|
|
24
|
-
const rulesDir = join(cwd, '.dwf', 'rules');
|
|
25
|
-
await mkdir(rulesDir, { recursive: true });
|
|
26
|
-
// Group block rules by scope
|
|
27
|
-
const byScope = new Map();
|
|
28
|
-
for (const rule of block.rules) {
|
|
29
|
-
const existing = byScope.get(rule.scope);
|
|
30
|
-
if (existing) {
|
|
31
|
-
existing.push(rule);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
byScope.set(rule.scope, [rule]);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
let rulesAdded = 0;
|
|
38
|
-
for (const [scope, blockRules] of byScope) {
|
|
39
|
-
const filePath = join(rulesDir, `${scope}.yml`);
|
|
40
|
-
let doc = await readRuleFile(filePath);
|
|
41
|
-
if (!doc) {
|
|
42
|
-
doc = { scope, rules: [] };
|
|
43
|
-
}
|
|
44
|
-
// Remove any existing rules from this block to avoid duplicates on re-add
|
|
45
|
-
doc.rules = doc.rules.filter((r) => r.sourceBlock !== block.id);
|
|
46
|
-
// Append new rules
|
|
47
|
-
for (const rule of blockRules) {
|
|
48
|
-
doc.rules.push({
|
|
49
|
-
id: rule.id,
|
|
50
|
-
severity: rule.severity,
|
|
51
|
-
content: rule.content,
|
|
52
|
-
sourceBlock: block.id,
|
|
53
|
-
});
|
|
54
|
-
rulesAdded++;
|
|
55
|
-
}
|
|
56
|
-
await writeFile(filePath, writeRuleFile(doc), 'utf-8');
|
|
57
|
-
}
|
|
58
|
-
// Update config.yml blocks array
|
|
59
|
-
await addBlockToConfig(cwd, block.id);
|
|
60
|
-
return rulesAdded;
|
|
61
|
-
}
|
|
62
|
-
export async function uninstallBlock(cwd, blockId) {
|
|
63
|
-
const rulesDir = join(cwd, '.dwf', 'rules');
|
|
64
|
-
let entries;
|
|
65
|
-
try {
|
|
66
|
-
const { readdir } = await import('node:fs/promises');
|
|
67
|
-
entries = await readdir(rulesDir);
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
return 0;
|
|
71
|
-
}
|
|
72
|
-
const ymlFiles = entries.filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'));
|
|
73
|
-
let rulesRemoved = 0;
|
|
74
|
-
for (const file of ymlFiles) {
|
|
75
|
-
const filePath = join(rulesDir, file);
|
|
76
|
-
const doc = await readRuleFile(filePath);
|
|
77
|
-
if (!doc)
|
|
78
|
-
continue;
|
|
79
|
-
const before = doc.rules.length;
|
|
80
|
-
doc.rules = doc.rules.filter((r) => r.sourceBlock !== blockId);
|
|
81
|
-
const removed = before - doc.rules.length;
|
|
82
|
-
if (removed > 0) {
|
|
83
|
-
rulesRemoved += removed;
|
|
84
|
-
await writeFile(filePath, writeRuleFile(doc), 'utf-8');
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Update config.yml blocks array
|
|
88
|
-
await removeBlockFromConfig(cwd, blockId);
|
|
89
|
-
return rulesRemoved;
|
|
90
|
-
}
|
|
91
|
-
async function readRawConfig(cwd) {
|
|
92
|
-
const configPath = join(cwd, '.dwf', 'config.yml');
|
|
93
|
-
const raw = await readFile(configPath, 'utf-8');
|
|
94
|
-
const parsed = parse(raw);
|
|
95
|
-
if (!parsed || typeof parsed !== 'object') {
|
|
96
|
-
throw new Error('Invalid config.yml');
|
|
97
|
-
}
|
|
98
|
-
return parsed;
|
|
99
|
-
}
|
|
100
|
-
async function writeRawConfig(cwd, doc) {
|
|
101
|
-
const configPath = join(cwd, '.dwf', 'config.yml');
|
|
102
|
-
await writeFile(configPath, stringify(doc, { lineWidth: 0 }), 'utf-8');
|
|
103
|
-
}
|
|
104
|
-
async function addBlockToConfig(cwd, blockId) {
|
|
105
|
-
const doc = await readRawConfig(cwd);
|
|
106
|
-
const blocks = Array.isArray(doc['blocks']) ? doc['blocks'] : [];
|
|
107
|
-
if (!blocks.includes(blockId)) {
|
|
108
|
-
blocks.push(blockId);
|
|
109
|
-
}
|
|
110
|
-
doc['blocks'] = blocks;
|
|
111
|
-
await writeRawConfig(cwd, doc);
|
|
112
|
-
}
|
|
113
|
-
async function removeBlockFromConfig(cwd, blockId) {
|
|
114
|
-
const doc = await readRawConfig(cwd);
|
|
115
|
-
const blocks = Array.isArray(doc['blocks']) ? doc['blocks'] : [];
|
|
116
|
-
doc['blocks'] = blocks.filter((b) => b !== blockId);
|
|
117
|
-
await writeRawConfig(cwd, doc);
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=installer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/blocks/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Rule } from '../bridges/types.js';
|
|
2
|
-
export interface BlockDefinition {
|
|
3
|
-
id: string;
|
|
4
|
-
name: string;
|
|
5
|
-
description: string;
|
|
6
|
-
version: string;
|
|
7
|
-
rules: BlockRule[];
|
|
8
|
-
}
|
|
9
|
-
export interface BlockRule {
|
|
10
|
-
id: string;
|
|
11
|
-
scope: string;
|
|
12
|
-
severity: 'error' | 'warning' | 'info';
|
|
13
|
-
content: string;
|
|
14
|
-
}
|
|
15
|
-
export declare function loadAllBlocks(blocksDir?: string): Promise<BlockDefinition[]>;
|
|
16
|
-
export declare function loadBlock(blockId: string, blocksDir?: string): Promise<BlockDefinition | null>;
|
|
17
|
-
export declare function blockRulesToRules(block: BlockDefinition): Rule[];
|
|
18
|
-
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/blocks/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAuDD,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAuBlF;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAGpG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,EAAE,CAShE"}
|