maestro-flow 0.3.45 → 0.3.47
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/.claude/agents/ui-design-agent.md +1 -0
- package/.claude/agents/workflow-executor.md +3 -0
- package/.claude/commands/learn-decompose.md +91 -146
- package/.claude/commands/learn-follow.md +102 -137
- package/.claude/commands/learn-investigate.md +102 -167
- package/.claude/commands/learn-retro.md +100 -243
- package/.claude/commands/learn-second-opinion.md +95 -135
- package/.claude/commands/maestro-amend.md +95 -232
- package/.claude/commands/maestro-analyze.md +1 -6
- package/.claude/commands/maestro-collab.md +104 -265
- package/.claude/commands/maestro-composer.md +113 -293
- package/.claude/commands/maestro-execute.md +11 -17
- package/.claude/commands/maestro-impeccable.md +89 -0
- package/.claude/commands/maestro-plan.md +1 -6
- package/.claude/commands/maestro-player.md +111 -340
- package/.claude/commands/maestro-quick.md +9 -0
- package/.claude/commands/maestro-ralph-execute.md +167 -210
- package/.claude/commands/maestro-ralph.md +245 -426
- package/.claude/commands/maestro-tools-register.md +28 -7
- package/.claude/commands/maestro-ui-codify.md +13 -0
- package/.claude/commands/maestro-ui-craft.md +364 -0
- package/.claude/commands/maestro-ui-design.md +12 -1
- package/.claude/commands/maestro-verify.md +12 -13
- package/.claude/commands/maestro.md +142 -72
- package/.claude/commands/manage-knowhow-capture.md +45 -161
- package/.claude/commands/quality-auto-test.md +9 -0
- package/.claude/commands/quality-debug.md +11 -24
- package/.claude/commands/quality-refactor.md +9 -0
- package/.claude/commands/quality-review.md +5 -13
- package/.claude/commands/quality-test.md +5 -0
- package/.claude/commands/spec-add.md +1 -1
- package/.claude/commands/spec-load.md +3 -2
- package/.claude/skills/maestro-help/SKILL.md +264 -0
- package/.claude/skills/maestro-help/index/catalog.json +182 -0
- package/.claude/skills/maestro-help/phases/01-parse-intent.md +122 -0
- package/.claude/skills/maestro-help/phases/02-search-present.md +181 -0
- package/.claude/skills/maestro-help/phases/03-workflow-guide.md +186 -0
- package/.claude/skills/maestro-impeccable/SKILL.md +169 -0
- package/.codex/agents/team-supervisor.toml +40 -0
- package/.codex/agents/team-worker.toml +63 -0
- package/.codex/skills/learn-decompose/SKILL.md +1 -1
- package/.codex/skills/learn-investigate/SKILL.md +2 -1
- package/.codex/skills/maestro/SKILL.md +278 -313
- package/.codex/skills/maestro-analyze/SKILL.md +126 -417
- package/.codex/skills/maestro-brainstorm/SKILL.md +129 -451
- package/.codex/skills/maestro-collab/SKILL.md +134 -547
- package/.codex/skills/maestro-execute/SKILL.md +4 -2
- package/.codex/skills/maestro-help/SKILL.md +213 -0
- package/.codex/skills/maestro-help/catalog.json +182 -0
- package/.codex/skills/maestro-impeccable/SKILL.md +112 -0
- package/.codex/skills/maestro-plan/SKILL.md +88 -437
- package/.codex/skills/maestro-player/SKILL.md +191 -333
- package/.codex/skills/maestro-quick/SKILL.md +2 -0
- package/.codex/skills/maestro-ralph/SKILL.md +307 -710
- package/.codex/skills/maestro-roadmap/SKILL.md +201 -518
- package/.codex/skills/maestro-tools-register/SKILL.md +29 -7
- package/.codex/skills/maestro-ui-codify/SKILL.md +1 -0
- package/.codex/skills/maestro-ui-craft/SKILL.md +341 -0
- package/.codex/skills/maestro-ui-design/SKILL.md +10 -0
- package/.codex/skills/maestro-verify/SKILL.md +116 -409
- package/.codex/skills/manage-knowhow-capture/SKILL.md +18 -3
- package/.codex/skills/quality-auto-test/SKILL.md +145 -443
- package/.codex/skills/quality-debug/SKILL.md +2 -1
- package/.codex/skills/quality-refactor/SKILL.md +1 -1
- package/.codex/skills/quality-review/SKILL.md +1 -1
- package/.codex/skills/quality-test/SKILL.md +229 -507
- package/.codex/skills/spec-add/SKILL.md +1 -1
- package/README.md +4 -1
- package/README.zh-CN.md +3 -1
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js +3 -0
- package/dashboard/dist-server/dashboard/src/server/agents/codex-cli-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/index.js +5 -3
- package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/board-state.integration.test.js +3 -3
- package/dashboard/dist-server/dashboard/src/server/routes/board-state.integration.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/index.js +14 -5
- package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/install.js +110 -1
- package/dashboard/dist-server/dashboard/src/server/routes/install.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/maestro-coordinate.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/server/routes/maestro-coordinate.js +181 -0
- package/dashboard/dist-server/dashboard/src/server/routes/maestro-coordinate.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/routes/settings.js +56 -0
- package/dashboard/dist-server/dashboard/src/server/routes/settings.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +2 -0
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +2 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/fs-watcher.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/server/state/fs-watcher.js +58 -0
- package/dashboard/dist-server/dashboard/src/server/state/fs-watcher.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js +2 -2
- package/dashboard/dist-server/dashboard/src/server/wiki/spec-entry-parser.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +2 -0
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +3 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.d.ts +7 -2
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js +7 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js +9 -9
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/maestro-session-types.d.ts +113 -0
- package/dashboard/dist-server/dashboard/src/shared/maestro-session-types.js +6 -0
- package/dashboard/dist-server/dashboard/src/shared/maestro-session-types.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/shared/types.d.ts +4 -3
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dist/src/agents/cli-agent-runner.d.ts.map +1 -1
- package/dist/src/agents/cli-agent-runner.js +1 -3
- package/dist/src/agents/cli-agent-runner.js.map +1 -1
- package/dist/src/agents/cli-history-store.d.ts +5 -0
- package/dist/src/agents/cli-history-store.d.ts.map +1 -1
- package/dist/src/agents/cli-history-store.js +65 -13
- package/dist/src/agents/cli-history-store.js.map +1 -1
- package/dist/src/cli.js +13 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/command-help.d.ts +3 -0
- package/dist/src/commands/command-help.d.ts.map +1 -0
- package/dist/src/commands/command-help.js +60 -0
- package/dist/src/commands/command-help.js.map +1 -0
- package/dist/src/commands/config.d.ts.map +1 -1
- package/dist/src/commands/config.js +17 -0
- package/dist/src/commands/config.js.map +1 -1
- package/dist/src/commands/delegate.d.ts.map +1 -1
- package/dist/src/commands/delegate.js +12 -2
- package/dist/src/commands/delegate.js.map +1 -1
- package/dist/src/commands/impeccable.d.ts +10 -0
- package/dist/src/commands/impeccable.d.ts.map +1 -0
- package/dist/src/commands/impeccable.js +181 -0
- package/dist/src/commands/impeccable.js.map +1 -0
- package/dist/src/commands/knowhow.d.ts.map +1 -1
- package/dist/src/commands/knowhow.js +7 -4
- package/dist/src/commands/knowhow.js.map +1 -1
- package/dist/src/commands/spec.js +1 -1
- package/dist/src/commands/spec.js.map +1 -1
- package/dist/src/commands/wiki.d.ts.map +1 -1
- package/dist/src/commands/wiki.js +5 -1
- package/dist/src/commands/wiki.js.map +1 -1
- package/dist/src/config/cli-tools-config.d.ts.map +1 -1
- package/dist/src/config/cli-tools-config.js +10 -7
- package/dist/src/config/cli-tools-config.js.map +1 -1
- package/dist/src/core/addon-registry.d.ts +31 -0
- package/dist/src/core/addon-registry.d.ts.map +1 -0
- package/dist/src/core/addon-registry.js +28 -0
- package/dist/src/core/addon-registry.js.map +1 -0
- package/dist/src/hooks/plugins/spec-injection-plugin.js +9 -4
- package/dist/src/hooks/plugins/spec-injection-plugin.js.map +1 -1
- package/dist/src/hooks/spec-injector.js +2 -2
- package/dist/src/hooks/spec-injector.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/tools/impeccable/critique-storage.d.ts +28 -0
- package/dist/src/tools/impeccable/critique-storage.d.ts.map +1 -0
- package/dist/src/tools/impeccable/critique-storage.js +120 -0
- package/dist/src/tools/impeccable/critique-storage.js.map +1 -0
- package/dist/src/tools/impeccable/design-parser.d.ts +90 -0
- package/dist/src/tools/impeccable/design-parser.d.ts.map +1 -0
- package/dist/src/tools/impeccable/design-parser.js +696 -0
- package/dist/src/tools/impeccable/design-parser.js.map +1 -0
- package/dist/src/tools/impeccable/detect-csp.d.ts +6 -0
- package/dist/src/tools/impeccable/detect-csp.d.ts.map +1 -0
- package/dist/src/tools/impeccable/detect-csp.js +130 -0
- package/dist/src/tools/impeccable/detect-csp.js.map +1 -0
- package/dist/src/tools/impeccable/is-generated.d.ts +4 -0
- package/dist/src/tools/impeccable/is-generated.d.ts.map +1 -0
- package/dist/src/tools/impeccable/is-generated.js +56 -0
- package/dist/src/tools/impeccable/is-generated.js.map +1 -0
- package/dist/src/tools/impeccable/live/accept.d.ts +50 -0
- package/dist/src/tools/impeccable/live/accept.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/accept.js +556 -0
- package/dist/src/tools/impeccable/live/accept.js.map +1 -0
- package/dist/src/tools/impeccable/live/bootstrap.d.ts +2 -0
- package/dist/src/tools/impeccable/live/bootstrap.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/bootstrap.js +244 -0
- package/dist/src/tools/impeccable/live/bootstrap.js.map +1 -0
- package/dist/src/tools/impeccable/live/complete.d.ts +7 -0
- package/dist/src/tools/impeccable/live/complete.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/complete.js +67 -0
- package/dist/src/tools/impeccable/live/complete.js.map +1 -0
- package/dist/src/tools/impeccable/live/completion.d.ts +24 -0
- package/dist/src/tools/impeccable/live/completion.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/completion.js +26 -0
- package/dist/src/tools/impeccable/live/completion.js.map +1 -0
- package/dist/src/tools/impeccable/live/inject.d.ts +41 -0
- package/dist/src/tools/impeccable/live/inject.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/inject.js +394 -0
- package/dist/src/tools/impeccable/live/inject.js.map +1 -0
- package/dist/src/tools/impeccable/live/poll.d.ts +24 -0
- package/dist/src/tools/impeccable/live/poll.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/poll.js +180 -0
- package/dist/src/tools/impeccable/live/poll.js.map +1 -0
- package/dist/src/tools/impeccable/live/resume.d.ts +5 -0
- package/dist/src/tools/impeccable/live/resume.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/resume.js +30 -0
- package/dist/src/tools/impeccable/live/resume.js.map +1 -0
- package/dist/src/tools/impeccable/live/server.d.ts +6 -0
- package/dist/src/tools/impeccable/live/server.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/server.js +867 -0
- package/dist/src/tools/impeccable/live/server.js.map +1 -0
- package/dist/src/tools/impeccable/live/session-store.d.ts +72 -0
- package/dist/src/tools/impeccable/live/session-store.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/session-store.js +281 -0
- package/dist/src/tools/impeccable/live/session-store.js.map +1 -0
- package/dist/src/tools/impeccable/live/static/live-browser-session.js +123 -0
- package/dist/src/tools/impeccable/live/static/live-browser.js +4860 -0
- package/dist/src/tools/impeccable/live/static/modern-screenshot.umd.js +14 -0
- package/dist/src/tools/impeccable/live/status.d.ts +2 -0
- package/dist/src/tools/impeccable/live/status.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/status.js +52 -0
- package/dist/src/tools/impeccable/live/status.js.map +1 -0
- package/dist/src/tools/impeccable/live/wrap.d.ts +33 -0
- package/dist/src/tools/impeccable/live/wrap.d.ts.map +1 -0
- package/dist/src/tools/impeccable/live/wrap.js +572 -0
- package/dist/src/tools/impeccable/live/wrap.js.map +1 -0
- package/dist/src/tools/impeccable/load-context.d.ts +13 -0
- package/dist/src/tools/impeccable/load-context.d.ts.map +1 -0
- package/dist/src/tools/impeccable/load-context.js +79 -0
- package/dist/src/tools/impeccable/load-context.js.map +1 -0
- package/dist/src/tools/impeccable/paths.d.ts +34 -0
- package/dist/src/tools/impeccable/paths.d.ts.map +1 -0
- package/dist/src/tools/impeccable/paths.js +102 -0
- package/dist/src/tools/impeccable/paths.js.map +1 -0
- package/dist/src/tools/spec-entry-parser.d.ts +1 -1
- package/dist/src/tools/spec-entry-parser.d.ts.map +1 -1
- package/dist/src/tools/spec-entry-parser.js +1 -1
- package/dist/src/tools/spec-entry-parser.js.map +1 -1
- package/dist/src/tools/spec-init.d.ts.map +1 -1
- package/dist/src/tools/spec-init.js +26 -1
- package/dist/src/tools/spec-init.js.map +1 -1
- package/dist/src/tools/spec-loader.d.ts +1 -1
- package/dist/src/tools/spec-loader.d.ts.map +1 -1
- package/dist/src/tools/spec-loader.js +2 -0
- package/dist/src/tools/spec-loader.js.map +1 -1
- package/dist/src/tools/store-knowhow.d.ts.map +1 -1
- package/dist/src/tools/store-knowhow.js +15 -6
- package/dist/src/tools/store-knowhow.js.map +1 -1
- package/package.json +5 -3
- package/workflows/claude-instructions.md +17 -5
- package/workflows/cli-tools-usage.md +10 -3
- package/workflows/delegate-usage.md +3 -2
- package/workflows/impeccable/adapt.md +190 -0
- package/workflows/impeccable/animate.md +175 -0
- package/workflows/impeccable/audit.md +133 -0
- package/workflows/impeccable/bolder.md +113 -0
- package/workflows/impeccable/brand.md +118 -0
- package/workflows/impeccable/clarify.md +174 -0
- package/workflows/impeccable/codex.md +105 -0
- package/workflows/impeccable/cognitive-load.md +106 -0
- package/workflows/impeccable/color-and-contrast.md +105 -0
- package/workflows/impeccable/colorize.md +154 -0
- package/workflows/impeccable/craft.md +123 -0
- package/workflows/impeccable/critique.md +261 -0
- package/workflows/impeccable/delight.md +302 -0
- package/workflows/impeccable/distill.md +111 -0
- package/workflows/impeccable/document.md +439 -0
- package/workflows/impeccable/extract.md +69 -0
- package/workflows/impeccable/harden.md +347 -0
- package/workflows/impeccable/heuristics-scoring.md +234 -0
- package/workflows/impeccable/interaction-design.md +195 -0
- package/workflows/impeccable/layout.md +141 -0
- package/workflows/impeccable/live.md +622 -0
- package/workflows/impeccable/motion-design.md +109 -0
- package/workflows/impeccable/onboard.md +234 -0
- package/workflows/impeccable/optimize.md +258 -0
- package/workflows/impeccable/overdrive.md +130 -0
- package/workflows/impeccable/personas.md +179 -0
- package/workflows/impeccable/polish.md +242 -0
- package/workflows/impeccable/product.md +62 -0
- package/workflows/impeccable/quieter.md +99 -0
- package/workflows/impeccable/responsive-design.md +114 -0
- package/workflows/impeccable/shape.md +165 -0
- package/workflows/impeccable/spatial-design.md +100 -0
- package/workflows/impeccable/teach.md +168 -0
- package/workflows/impeccable/typeset.md +124 -0
- package/workflows/impeccable/typography.md +159 -0
- package/workflows/impeccable/ux-writing.md +107 -0
- package/workflows/impeccable.md +164 -0
- package/workflows/maestro.md +7 -3
- package/workflows/skill-authoring.md +265 -0
- package/workflows/specs-add.md +3 -2
- package/workflows/specs-load.md +2 -1
- package/workflows/specs-setup.md +21 -1
- package/workflows/tools-spec.md +20 -13
- package/.claude/commands/maestro-link-coordinate.md +0 -71
- package/.codex/skills/maestro-link-coordinate/SKILL.md +0 -257
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// Copyright 2024 Paul Bakaus (https://github.com/pbakaus/impeccable)
|
|
2
|
+
// Licensed under the Apache License, Version 2.0
|
|
3
|
+
// Modifications: Converted to TypeScript, adapted for maestro CLI architecture.
|
|
4
|
+
/**
|
|
5
|
+
* CLI entry point: prepare everything needed to enter the live variant poll loop.
|
|
6
|
+
*
|
|
7
|
+
* Does (all in one command):
|
|
8
|
+
* 1. Check .workflow/impeccable/live/config.json (returns config_missing if first-ever run)
|
|
9
|
+
* 2. Start the live server in the background (or reuse a running one)
|
|
10
|
+
* 3. Inject the browser script tag into the project's entry file
|
|
11
|
+
* 4. Read PRODUCT.md / DESIGN.md for project context
|
|
12
|
+
* 5. Print a single JSON blob with everything the agent needs
|
|
13
|
+
*
|
|
14
|
+
* After this, the agent's only remaining steps are:
|
|
15
|
+
* - Open the project's live dev/preview URL in the browser (optional)
|
|
16
|
+
* - Enter the poll loop: maestro impeccable live-poll
|
|
17
|
+
*
|
|
18
|
+
* Converted from live.mjs to TypeScript.
|
|
19
|
+
*/
|
|
20
|
+
import fs from 'node:fs';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import { loadContext } from '../load-context.js';
|
|
23
|
+
import { readLiveServerInfo } from '../paths.js';
|
|
24
|
+
import { injectCli, resolveFiles } from './inject.js';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Drift-heal scan
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
const SCAN_ROOTS = ['public', 'src', 'app', 'pages'];
|
|
29
|
+
const IGNORE_DIRS = new Set([
|
|
30
|
+
'node_modules', '.git', '.next', '.nuxt', '.svelte-kit', '.astro',
|
|
31
|
+
'.turbo', '.vercel', '.cache', 'coverage', 'dist', 'build',
|
|
32
|
+
]);
|
|
33
|
+
function scanForDrift(rootDir, resolvedFiles, config) {
|
|
34
|
+
const resolvedSet = new Set(resolvedFiles.map((f) => f.split(path.sep).join('/')));
|
|
35
|
+
// Files matching the user's `exclude` globs are intentional omissions,
|
|
36
|
+
// not drift. Compile them to regexes so the orphan list stays signal.
|
|
37
|
+
const userExcludeRegexes = (Array.isArray(config.exclude) ? config.exclude : [])
|
|
38
|
+
.map((p) => globToRegex(p));
|
|
39
|
+
const isUserExcluded = (rel) => userExcludeRegexes.some((re) => re.test(rel));
|
|
40
|
+
const orphans = [];
|
|
41
|
+
const walk = (dir, relBase) => {
|
|
42
|
+
let entries;
|
|
43
|
+
try {
|
|
44
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
for (const e of entries) {
|
|
50
|
+
const rel = relBase ? `${relBase}/${e.name}` : e.name;
|
|
51
|
+
if (e.isDirectory()) {
|
|
52
|
+
if (IGNORE_DIRS.has(e.name) || e.name.startsWith('.'))
|
|
53
|
+
continue;
|
|
54
|
+
walk(path.join(dir, e.name), rel);
|
|
55
|
+
}
|
|
56
|
+
else if (e.isFile() && e.name.endsWith('.html')) {
|
|
57
|
+
if (resolvedSet.has(rel))
|
|
58
|
+
continue;
|
|
59
|
+
if (isUserExcluded(rel))
|
|
60
|
+
continue;
|
|
61
|
+
orphans.push(rel);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
for (const root of SCAN_ROOTS) {
|
|
66
|
+
const abs = path.join(rootDir, root);
|
|
67
|
+
if (fs.existsSync(abs) && fs.statSync(abs).isDirectory()) {
|
|
68
|
+
walk(abs, root);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (orphans.length === 0)
|
|
72
|
+
return null;
|
|
73
|
+
const capped = orphans.slice(0, 20);
|
|
74
|
+
return {
|
|
75
|
+
orphans: capped,
|
|
76
|
+
orphanCount: orphans.length,
|
|
77
|
+
hint: `${orphans.length} HTML file(s) exist but aren't in config.files. Consider adding them, or use a glob pattern like "public/**/*.html".`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Same glob-to-regex mapping used by inject.ts. Kept inline here
|
|
82
|
+
* to avoid circular imports. The two must stay in sync.
|
|
83
|
+
*/
|
|
84
|
+
function globToRegex(pattern) {
|
|
85
|
+
let re = '';
|
|
86
|
+
let i = 0;
|
|
87
|
+
while (i < pattern.length) {
|
|
88
|
+
const c = pattern[i];
|
|
89
|
+
if (c === '*') {
|
|
90
|
+
if (pattern[i + 1] === '*') {
|
|
91
|
+
if (pattern[i + 2] === '/') {
|
|
92
|
+
re += '(?:.*/)?';
|
|
93
|
+
i += 3;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
re += '.*';
|
|
97
|
+
i += 2;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
re += '[^/]*';
|
|
102
|
+
i += 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (c === '?') {
|
|
106
|
+
re += '[^/]';
|
|
107
|
+
i += 1;
|
|
108
|
+
}
|
|
109
|
+
else if (/[.+^${}()|[\]\\]/.test(c)) {
|
|
110
|
+
re += '\\' + c;
|
|
111
|
+
i += 1;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
re += c;
|
|
115
|
+
i += 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return new RegExp('^' + re + '$');
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// Helpers
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
function safeParse(out) {
|
|
124
|
+
try {
|
|
125
|
+
return JSON.parse(String(out).trim());
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Return server info for the running live server, starting one if needed.
|
|
133
|
+
*/
|
|
134
|
+
async function ensureServerRunning() {
|
|
135
|
+
// Try to reuse an existing server
|
|
136
|
+
try {
|
|
137
|
+
const record = readLiveServerInfo(process.cwd());
|
|
138
|
+
const existing = record?.info;
|
|
139
|
+
if (existing && existing.pid) {
|
|
140
|
+
try {
|
|
141
|
+
process.kill(existing.pid, 0); // throws if dead
|
|
142
|
+
return existing;
|
|
143
|
+
}
|
|
144
|
+
catch { /* stale PID file — the server script will clean it up */ }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch { /* no PID file */ }
|
|
148
|
+
// Start a new server via serverCli in background mode
|
|
149
|
+
try {
|
|
150
|
+
const { serverCli } = await import('./server.js');
|
|
151
|
+
// Capture output by temporarily replacing console.log
|
|
152
|
+
let captured = '';
|
|
153
|
+
const origLog = console.log;
|
|
154
|
+
console.log = (...args) => { captured += args.map(String).join(' ') + '\n'; };
|
|
155
|
+
try {
|
|
156
|
+
await serverCli(undefined, { background: true });
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// background mode spawns a child and exits; errors are printed to stderr
|
|
160
|
+
}
|
|
161
|
+
console.log = origLog;
|
|
162
|
+
const parsed = safeParse(captured.trim());
|
|
163
|
+
if (parsed && parsed.port && parsed.token) {
|
|
164
|
+
return parsed;
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
// Main
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
export async function bootstrapCli() {
|
|
176
|
+
// 1. Check config (fail fast if missing — no point starting anything else)
|
|
177
|
+
let checkResult = null;
|
|
178
|
+
// Capture injectCli --check output
|
|
179
|
+
let checkCaptured = '';
|
|
180
|
+
const origLog = console.log;
|
|
181
|
+
console.log = (...args) => { checkCaptured += args.map(String).join(' '); };
|
|
182
|
+
try {
|
|
183
|
+
await injectCli({ check: true });
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// injectCli may exit(1) for missing config — that's expected
|
|
187
|
+
}
|
|
188
|
+
console.log = origLog;
|
|
189
|
+
checkResult = safeParse(checkCaptured);
|
|
190
|
+
if (!checkResult || !checkResult.ok) {
|
|
191
|
+
console.log(JSON.stringify(checkResult || { ok: false, error: 'check_failed', raw: checkCaptured }));
|
|
192
|
+
process.exit(0);
|
|
193
|
+
}
|
|
194
|
+
// 2. Start server (or reuse existing)
|
|
195
|
+
const serverInfo = await ensureServerRunning();
|
|
196
|
+
if (!serverInfo) {
|
|
197
|
+
console.log(JSON.stringify({ ok: false, error: 'server_start_failed' }));
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
// 3. Inject the script tag at the current port
|
|
201
|
+
let injectCaptured = '';
|
|
202
|
+
console.log = (...args) => { injectCaptured += args.map(String).join(' '); };
|
|
203
|
+
try {
|
|
204
|
+
await injectCli({ port: String(serverInfo.port) });
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// injectCli exits(1) on failure
|
|
208
|
+
}
|
|
209
|
+
console.log = origLog;
|
|
210
|
+
const injectResult = safeParse(injectCaptured);
|
|
211
|
+
if (!injectResult || !injectResult.ok) {
|
|
212
|
+
console.log(JSON.stringify({
|
|
213
|
+
ok: false,
|
|
214
|
+
error: 'inject_failed',
|
|
215
|
+
detail: injectResult || injectCaptured,
|
|
216
|
+
serverPort: serverInfo.port,
|
|
217
|
+
}));
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
// 4. Load PRODUCT.md + DESIGN.md context (auto-migrates legacy .impeccable.md)
|
|
221
|
+
const ctx = loadContext(process.cwd());
|
|
222
|
+
// 5. Compute drift-heal: compare resolved inject targets against the
|
|
223
|
+
// project's HTML files. Orphans are HTML files not covered by config.
|
|
224
|
+
// Warning only — the agent decides whether to act.
|
|
225
|
+
const config = checkResult.config;
|
|
226
|
+
const resolvedFiles = resolveFiles(process.cwd(), config);
|
|
227
|
+
const drift = scanForDrift(process.cwd(), resolvedFiles, config);
|
|
228
|
+
// 6. Emit everything the agent needs
|
|
229
|
+
console.log(JSON.stringify({
|
|
230
|
+
ok: true,
|
|
231
|
+
serverPort: serverInfo.port,
|
|
232
|
+
serverToken: serverInfo.token,
|
|
233
|
+
pageFiles: resolvedFiles,
|
|
234
|
+
configDrift: drift,
|
|
235
|
+
hasProduct: ctx.hasProduct,
|
|
236
|
+
product: ctx.product,
|
|
237
|
+
productPath: ctx.productPath,
|
|
238
|
+
hasDesign: ctx.hasDesign,
|
|
239
|
+
design: ctx.design,
|
|
240
|
+
designPath: ctx.designPath,
|
|
241
|
+
migrated: ctx.migrated,
|
|
242
|
+
}, null, 2));
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../../src/tools/impeccable/live/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../../../src/tools/impeccable/live/complete.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAMD,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CnE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Copyright 2024 Paul Bakaus (https://github.com/pbakaus/impeccable)
|
|
2
|
+
// Licensed under the Apache License, Version 2.0
|
|
3
|
+
// Modifications: Converted to TypeScript, adapted for maestro CLI architecture.
|
|
4
|
+
/**
|
|
5
|
+
* Canonical durable completion acknowledgement for Impeccable live sessions.
|
|
6
|
+
*/
|
|
7
|
+
import { createLiveSessionStore } from './session-store.js';
|
|
8
|
+
import { readLiveServerInfo } from '../paths.js';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// CLI entry point
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
export async function completeCli(opts) {
|
|
13
|
+
const store = createLiveSessionStore({ cwd: process.cwd(), sessionId: opts.id });
|
|
14
|
+
const status = opts.discarded === true
|
|
15
|
+
? 'discarded'
|
|
16
|
+
: opts.error
|
|
17
|
+
? 'agent_error'
|
|
18
|
+
: 'complete';
|
|
19
|
+
const message = typeof opts.error === 'string' ? opts.error : 'unknown error';
|
|
20
|
+
const serverInfo = readServerInfo();
|
|
21
|
+
const serverResult = serverInfo
|
|
22
|
+
? await completeThroughServer(serverInfo, {
|
|
23
|
+
id: opts.id,
|
|
24
|
+
status,
|
|
25
|
+
message,
|
|
26
|
+
})
|
|
27
|
+
: null;
|
|
28
|
+
if (serverResult?.ok) {
|
|
29
|
+
const snapshot = store.getSnapshot(opts.id, { includeCompleted: true });
|
|
30
|
+
console.log(JSON.stringify({ ok: true, id: opts.id, phase: snapshot?.phase || status, snapshot }, null, 2));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const event = status === 'discarded'
|
|
34
|
+
? { type: 'discarded', id: opts.id }
|
|
35
|
+
: status === 'agent_error'
|
|
36
|
+
? { type: 'agent_error', id: opts.id, message }
|
|
37
|
+
: { type: 'complete', id: opts.id };
|
|
38
|
+
const snapshot = store.appendEvent(event);
|
|
39
|
+
console.log(JSON.stringify({ ok: true, id: opts.id, phase: snapshot.phase, snapshot }, null, 2));
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Server helpers
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
function readServerInfo() {
|
|
45
|
+
return readLiveServerInfo(process.cwd())?.info || null;
|
|
46
|
+
}
|
|
47
|
+
async function completeThroughServer(info, args) {
|
|
48
|
+
const type = args.status === 'discarded'
|
|
49
|
+
? 'discarded'
|
|
50
|
+
: args.status === 'agent_error'
|
|
51
|
+
? 'error'
|
|
52
|
+
: 'complete';
|
|
53
|
+
try {
|
|
54
|
+
const res = await fetch(`http://localhost:${info.port}/poll`, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: { 'Content-Type': 'application/json' },
|
|
57
|
+
body: JSON.stringify({ token: info.token, id: args.id, type, message: args.message }),
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok)
|
|
60
|
+
return null;
|
|
61
|
+
return (await res.json());
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=complete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../../../src/tools/impeccable/live/complete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion type mapping for Impeccable live-session accept results.
|
|
3
|
+
*/
|
|
4
|
+
export type EventType = string;
|
|
5
|
+
export interface AcceptResult {
|
|
6
|
+
handled?: boolean;
|
|
7
|
+
carbonize?: boolean;
|
|
8
|
+
mode?: string;
|
|
9
|
+
error?: string;
|
|
10
|
+
file?: string;
|
|
11
|
+
}
|
|
12
|
+
export type CompletionType = 'discarded' | 'error' | 'agent_done' | 'complete';
|
|
13
|
+
export interface CompletionAck {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
type: CompletionType;
|
|
16
|
+
final?: boolean;
|
|
17
|
+
requiresComplete?: boolean;
|
|
18
|
+
nextCommand?: string;
|
|
19
|
+
message?: string;
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function completionTypeForAcceptResult(eventType: EventType, acceptResult: AcceptResult | undefined): CompletionType;
|
|
23
|
+
export declare function completionAckForAcceptResult(eventId: string, completionType: CompletionType, acceptResult: AcceptResult | undefined): CompletionAck;
|
|
24
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../../../src/tools/impeccable/live/completion.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,GAAG,SAAS,GACrC,cAAc,CAMhB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,GAAG,SAAS,GACrC,aAAa,CAUf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Copyright 2024 Paul Bakaus (https://github.com/pbakaus/impeccable)
|
|
2
|
+
// Licensed under the Apache License, Version 2.0
|
|
3
|
+
// Modifications: Converted to TypeScript, adapted for maestro CLI architecture.
|
|
4
|
+
export function completionTypeForAcceptResult(eventType, acceptResult) {
|
|
5
|
+
if (eventType === 'discard')
|
|
6
|
+
return acceptResult?.handled === true ? 'discarded' : 'error';
|
|
7
|
+
if (acceptResult?.handled === true && acceptResult?.carbonize === true)
|
|
8
|
+
return 'agent_done';
|
|
9
|
+
if (acceptResult?.handled === true)
|
|
10
|
+
return 'complete';
|
|
11
|
+
if (acceptResult?.mode === 'error')
|
|
12
|
+
return 'error';
|
|
13
|
+
return 'agent_done';
|
|
14
|
+
}
|
|
15
|
+
export function completionAckForAcceptResult(eventId, completionType, acceptResult) {
|
|
16
|
+
const ack = { ok: true, type: completionType };
|
|
17
|
+
if (acceptResult?.handled === true && acceptResult?.carbonize === true) {
|
|
18
|
+
ack.final = false;
|
|
19
|
+
ack.requiresComplete = true;
|
|
20
|
+
ack.nextCommand = `live-complete --id ${eventId}`;
|
|
21
|
+
ack.message =
|
|
22
|
+
'Carbonize cleanup must be verified, then the session must be completed explicitly before polling again.';
|
|
23
|
+
}
|
|
24
|
+
return ack;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../../../src/tools/impeccable/live/completion.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,iDAAiD;AACjD,gFAAgF;AA4BhF,MAAM,UAAU,6BAA6B,CAC3C,SAAoB,EACpB,YAAsC;IAEtC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3F,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI,IAAI,YAAY,EAAE,SAAS,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAC5F,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,YAAY,EAAE,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACnD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,OAAe,EACf,cAA8B,EAC9B,YAAsC;IAEtC,MAAM,GAAG,GAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IAC9D,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI,IAAI,YAAY,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC;QACvE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;QAClB,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC5B,GAAG,CAAC,WAAW,GAAG,sBAAsB,OAAO,EAAE,CAAC;QAClD,GAAG,CAAC,OAAO;YACT,yGAAyG,CAAC;IAC9G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
interface InjectOpts {
|
|
2
|
+
port?: string;
|
|
3
|
+
remove?: boolean;
|
|
4
|
+
check?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface LiveConfig {
|
|
7
|
+
files: string[];
|
|
8
|
+
exclude?: string[];
|
|
9
|
+
insertBefore?: string;
|
|
10
|
+
insertAfter?: string;
|
|
11
|
+
commentSyntax: 'html' | 'jsx';
|
|
12
|
+
cspChecked?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function injectCli(opts?: InjectOpts): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Expand config.files (which may contain glob patterns) into a literal list
|
|
17
|
+
* of existing file paths relative to rootDir. Literal entries pass through;
|
|
18
|
+
* glob patterns are expanded via fs.globSync. HARD_EXCLUDES and config.exclude
|
|
19
|
+
* are applied as filters. Duplicates are removed. Order is preserved by
|
|
20
|
+
* first appearance.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveFiles(rootDir: string, config: LiveConfig): string[];
|
|
23
|
+
declare function validateConfig(cfg: LiveConfig): void;
|
|
24
|
+
export declare function buildTagBlock(syntax: string, port: number): string;
|
|
25
|
+
export declare function insertTag(content: string, config: LiveConfig, port: number): string;
|
|
26
|
+
/**
|
|
27
|
+
* Remove the live script block. Matches either HTML or JSX comment markers
|
|
28
|
+
* regardless of config (so stale tags from a wrong config can still be cleaned).
|
|
29
|
+
*
|
|
30
|
+
* Indent-preserving: captures any whitespace immediately preceding the opener
|
|
31
|
+
* marker and re-emits it in place of the removed block. `insertTag` inserted
|
|
32
|
+
* the block *after* the original line's indent and *before* the anchor (e.g.
|
|
33
|
+
* `</body>`), which moved the indent onto the opener line and left the anchor
|
|
34
|
+
* unindented. Replacing the whole block (plus its trailing newline) with just
|
|
35
|
+
* the captured indent hands the indent back to the anchor that follows.
|
|
36
|
+
*/
|
|
37
|
+
export declare function removeTag(content: string, _syntax: string): string;
|
|
38
|
+
export declare function patchCspMeta(content: string, port: number): string;
|
|
39
|
+
export declare function revertCspMeta(content: string): string;
|
|
40
|
+
export { validateConfig };
|
|
41
|
+
//# sourceMappingURL=inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../../../../../src/tools/impeccable/live/inject.ts"],"names":[],"mappings":"AAiCA,UAAU,UAAU;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAeD,wBAAsB,SAAS,CAAC,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFpE;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAuC1E;AA+CD,iBAAS,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAyB7C;AAKD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBnF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUlE;AAmED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAyClE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAyBrD;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|