youmd 0.6.21 → 0.6.27

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 (218) hide show
  1. package/dist/commands/build.d.ts.map +1 -1
  2. package/dist/commands/build.js +0 -1
  3. package/dist/commands/build.js.map +1 -1
  4. package/dist/commands/chat.d.ts.map +1 -1
  5. package/dist/commands/chat.js +283 -184
  6. package/dist/commands/chat.js.map +1 -1
  7. package/dist/commands/export.d.ts +1 -0
  8. package/dist/commands/export.d.ts.map +1 -1
  9. package/dist/commands/export.js +5 -0
  10. package/dist/commands/export.js.map +1 -1
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +21 -1
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/keys.d.ts.map +1 -1
  15. package/dist/commands/keys.js +3 -3
  16. package/dist/commands/keys.js.map +1 -1
  17. package/dist/commands/link.d.ts.map +1 -1
  18. package/dist/commands/link.js +3 -3
  19. package/dist/commands/link.js.map +1 -1
  20. package/dist/commands/login.d.ts +29 -0
  21. package/dist/commands/login.d.ts.map +1 -1
  22. package/dist/commands/login.js +256 -127
  23. package/dist/commands/login.js.map +1 -1
  24. package/dist/commands/logs.js +0 -1
  25. package/dist/commands/logs.js.map +1 -1
  26. package/dist/commands/mcp.d.ts +14 -0
  27. package/dist/commands/mcp.d.ts.map +1 -1
  28. package/dist/commands/mcp.js +284 -28
  29. package/dist/commands/mcp.js.map +1 -1
  30. package/dist/commands/okf.d.ts +12 -0
  31. package/dist/commands/okf.d.ts.map +1 -0
  32. package/dist/commands/okf.js +411 -0
  33. package/dist/commands/okf.js.map +1 -0
  34. package/dist/commands/private.d.ts.map +1 -1
  35. package/dist/commands/private.js +6 -5
  36. package/dist/commands/private.js.map +1 -1
  37. package/dist/commands/project.d.ts.map +1 -1
  38. package/dist/commands/project.js +9 -5
  39. package/dist/commands/project.js.map +1 -1
  40. package/dist/commands/publish.d.ts.map +1 -1
  41. package/dist/commands/publish.js +0 -1
  42. package/dist/commands/publish.js.map +1 -1
  43. package/dist/commands/pull.d.ts +24 -1
  44. package/dist/commands/pull.d.ts.map +1 -1
  45. package/dist/commands/pull.js +114 -14
  46. package/dist/commands/pull.js.map +1 -1
  47. package/dist/commands/push.d.ts +1 -0
  48. package/dist/commands/push.d.ts.map +1 -1
  49. package/dist/commands/push.js +33 -13
  50. package/dist/commands/push.js.map +1 -1
  51. package/dist/commands/register.d.ts +6 -0
  52. package/dist/commands/register.d.ts.map +1 -1
  53. package/dist/commands/register.js +179 -79
  54. package/dist/commands/register.js.map +1 -1
  55. package/dist/commands/skill.d.ts.map +1 -1
  56. package/dist/commands/skill.js +121 -50
  57. package/dist/commands/skill.js.map +1 -1
  58. package/dist/commands/stack.d.ts +16 -0
  59. package/dist/commands/stack.d.ts.map +1 -0
  60. package/dist/commands/stack.js +863 -0
  61. package/dist/commands/stack.js.map +1 -0
  62. package/dist/commands/status.d.ts.map +1 -1
  63. package/dist/commands/status.js +25 -5
  64. package/dist/commands/status.js.map +1 -1
  65. package/dist/commands/sync.d.ts +23 -0
  66. package/dist/commands/sync.d.ts.map +1 -1
  67. package/dist/commands/sync.js +193 -12
  68. package/dist/commands/sync.js.map +1 -1
  69. package/dist/commands/whoami.d.ts.map +1 -1
  70. package/dist/commands/whoami.js +21 -16
  71. package/dist/commands/whoami.js.map +1 -1
  72. package/dist/create.js +0 -0
  73. package/dist/index.js +64 -7
  74. package/dist/index.js.map +1 -1
  75. package/dist/lib/api.d.ts +127 -5
  76. package/dist/lib/api.d.ts.map +1 -1
  77. package/dist/lib/api.js +142 -5
  78. package/dist/lib/api.js.map +1 -1
  79. package/dist/lib/ascii.d.ts +1 -0
  80. package/dist/lib/ascii.d.ts.map +1 -1
  81. package/dist/lib/ascii.js +9 -26
  82. package/dist/lib/ascii.js.map +1 -1
  83. package/dist/lib/canonical-json.d.ts +8 -0
  84. package/dist/lib/canonical-json.d.ts.map +1 -0
  85. package/dist/lib/canonical-json.js +29 -0
  86. package/dist/lib/canonical-json.js.map +1 -0
  87. package/dist/lib/capability-router.d.ts +58 -0
  88. package/dist/lib/capability-router.d.ts.map +1 -0
  89. package/dist/lib/capability-router.js +54 -0
  90. package/dist/lib/capability-router.js.map +1 -0
  91. package/dist/lib/compiler.d.ts +32 -0
  92. package/dist/lib/compiler.d.ts.map +1 -1
  93. package/dist/lib/compiler.js +150 -0
  94. package/dist/lib/compiler.js.map +1 -1
  95. package/dist/lib/config.d.ts +71 -35
  96. package/dist/lib/config.d.ts.map +1 -1
  97. package/dist/lib/config.js +334 -124
  98. package/dist/lib/config.js.map +1 -1
  99. package/dist/lib/decompile.d.ts +6 -1
  100. package/dist/lib/decompile.d.ts.map +1 -1
  101. package/dist/lib/decompile.js +120 -11
  102. package/dist/lib/decompile.js.map +1 -1
  103. package/dist/lib/hash.d.ts.map +1 -1
  104. package/dist/lib/hash.js +2 -19
  105. package/dist/lib/hash.js.map +1 -1
  106. package/dist/lib/heartbeat.d.ts +38 -0
  107. package/dist/lib/heartbeat.d.ts.map +1 -0
  108. package/dist/lib/heartbeat.js +70 -0
  109. package/dist/lib/heartbeat.js.map +1 -0
  110. package/dist/lib/host-link.d.ts +123 -0
  111. package/dist/lib/host-link.d.ts.map +1 -0
  112. package/dist/lib/host-link.js +350 -0
  113. package/dist/lib/host-link.js.map +1 -0
  114. package/dist/lib/merge.d.ts +50 -0
  115. package/dist/lib/merge.d.ts.map +1 -0
  116. package/dist/lib/merge.js +167 -0
  117. package/dist/lib/merge.js.map +1 -0
  118. package/dist/lib/okf-bundle.d.ts +104 -0
  119. package/dist/lib/okf-bundle.d.ts.map +1 -0
  120. package/dist/lib/okf-bundle.js +473 -0
  121. package/dist/lib/okf-bundle.js.map +1 -0
  122. package/dist/lib/okf-health.d.ts +40 -0
  123. package/dist/lib/okf-health.d.ts.map +1 -0
  124. package/dist/lib/okf-health.js +152 -0
  125. package/dist/lib/okf-health.js.map +1 -0
  126. package/dist/lib/okf-stack.d.ts +47 -0
  127. package/dist/lib/okf-stack.d.ts.map +1 -0
  128. package/dist/lib/okf-stack.js +331 -0
  129. package/dist/lib/okf-stack.js.map +1 -0
  130. package/dist/lib/okf-view.d.ts +49 -0
  131. package/dist/lib/okf-view.d.ts.map +1 -0
  132. package/dist/lib/okf-view.js +197 -0
  133. package/dist/lib/okf-view.js.map +1 -0
  134. package/dist/lib/okf.d.ts +130 -0
  135. package/dist/lib/okf.d.ts.map +1 -0
  136. package/dist/lib/okf.js +263 -0
  137. package/dist/lib/okf.js.map +1 -0
  138. package/dist/lib/onboarding.d.ts +17 -0
  139. package/dist/lib/onboarding.d.ts.map +1 -1
  140. package/dist/lib/onboarding.js +224 -207
  141. package/dist/lib/onboarding.js.map +1 -1
  142. package/dist/lib/project.d.ts +5 -0
  143. package/dist/lib/project.d.ts.map +1 -1
  144. package/dist/lib/project.js +8 -0
  145. package/dist/lib/project.js.map +1 -1
  146. package/dist/lib/projectContext.d.ts +201 -0
  147. package/dist/lib/projectContext.d.ts.map +1 -0
  148. package/dist/lib/projectContext.js +597 -0
  149. package/dist/lib/projectContext.js.map +1 -0
  150. package/dist/lib/render.d.ts +38 -1
  151. package/dist/lib/render.d.ts.map +1 -1
  152. package/dist/lib/render.js +83 -18
  153. package/dist/lib/render.js.map +1 -1
  154. package/dist/lib/skill-catalog.d.ts.map +1 -1
  155. package/dist/lib/skill-catalog.js +22 -2
  156. package/dist/lib/skill-catalog.js.map +1 -1
  157. package/dist/lib/skills.d.ts +20 -5
  158. package/dist/lib/skills.d.ts.map +1 -1
  159. package/dist/lib/skills.js +116 -58
  160. package/dist/lib/skills.js.map +1 -1
  161. package/dist/lib/stackEval.d.ts +87 -0
  162. package/dist/lib/stackEval.d.ts.map +1 -0
  163. package/dist/lib/stackEval.js +233 -0
  164. package/dist/lib/stackEval.js.map +1 -0
  165. package/dist/lib/stackImprove.d.ts +49 -0
  166. package/dist/lib/stackImprove.d.ts.map +1 -0
  167. package/dist/lib/stackImprove.js +313 -0
  168. package/dist/lib/stackImprove.js.map +1 -0
  169. package/dist/lib/stackInstall.d.ts +59 -0
  170. package/dist/lib/stackInstall.d.ts.map +1 -0
  171. package/dist/lib/stackInstall.js +162 -0
  172. package/dist/lib/stackInstall.js.map +1 -0
  173. package/dist/lib/stackSafety.d.ts +126 -0
  174. package/dist/lib/stackSafety.d.ts.map +1 -0
  175. package/dist/lib/stackSafety.js +486 -0
  176. package/dist/lib/stackSafety.js.map +1 -0
  177. package/dist/lib/stackUpdate.d.ts +44 -0
  178. package/dist/lib/stackUpdate.d.ts.map +1 -0
  179. package/dist/lib/stackUpdate.js +256 -0
  180. package/dist/lib/stackUpdate.js.map +1 -0
  181. package/dist/lib/stream.d.ts +116 -0
  182. package/dist/lib/stream.d.ts.map +1 -0
  183. package/dist/lib/stream.js +368 -0
  184. package/dist/lib/stream.js.map +1 -0
  185. package/dist/lib/youstack.d.ts +219 -0
  186. package/dist/lib/youstack.d.ts.map +1 -0
  187. package/dist/lib/youstack.js +1049 -0
  188. package/dist/lib/youstack.js.map +1 -0
  189. package/dist/mcp/registry.d.ts +133 -0
  190. package/dist/mcp/registry.d.ts.map +1 -0
  191. package/dist/mcp/registry.js +833 -0
  192. package/dist/mcp/registry.js.map +1 -0
  193. package/dist/mcp/server.d.ts +106 -5
  194. package/dist/mcp/server.d.ts.map +1 -1
  195. package/dist/mcp/server.js +851 -498
  196. package/dist/mcp/server.js.map +1 -1
  197. package/dist/postinstall.js +11 -2
  198. package/dist/postinstall.js.map +1 -1
  199. package/dist/you.d.ts +1 -0
  200. package/dist/you.js +40 -4
  201. package/dist/you.js.map +1 -1
  202. package/examples/youstack-bamfstack-public/docs/quickstart.md +34 -0
  203. package/examples/youstack-bamfstack-public/prompts/creator-draft-starter.md +15 -0
  204. package/examples/youstack-bamfstack-public/skills/bamfstack-start/SKILL.md +36 -0
  205. package/examples/youstack-bamfstack-public/tests/smoke.md +19 -0
  206. package/examples/youstack-bamfstack-public/workflows/creator-growth-workflow.md +22 -0
  207. package/examples/youstack-bamfstack-public/youstack.json +172 -0
  208. package/examples/youstack-personal/docs/quickstart.md +10 -0
  209. package/examples/youstack-personal/skills/youstack-start/SKILL.md +9 -0
  210. package/examples/youstack-personal/tests/smoke.md +9 -0
  211. package/examples/youstack-personal/workflows/startup.md +7 -0
  212. package/examples/youstack-personal/youstack.json +123 -0
  213. package/package.json +3 -3
  214. package/skills/claude-md-generator.md +1 -1
  215. package/skills/meta-improve.md +8 -3
  216. package/skills/proactive-context-fill.md +1 -1
  217. package/skills/youstack-maintainer.md +128 -0
  218. package/skills/youstack-start.md +78 -0
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ /**
3
+ * stackEval.ts — deterministic golden-prompt eval runner for YouStack.
4
+ *
5
+ * From SELF-IMPROVING-SYSTEM-DESIGN.md §4 (Tier 4 enhancements):
6
+ * "youmd stack eval executes prompts/*.md against route_stack_request +
7
+ * rendered skills, diffs expected capability/route/output assertions,
8
+ * writes tests/eval-results.json with timestamps. Deterministic routing
9
+ * assertions are a lake (routeYouStackRequest is already deterministic);
10
+ * LLM-judged evals are the ocean — defer."
11
+ *
12
+ * Golden file format:
13
+ * stacks/<slug>/tests/golden.json
14
+ * { version: "golden/v1", entries: GoldenEntry[] }
15
+ *
16
+ * Results file:
17
+ * stacks/<slug>/tests/eval-results.json
18
+ * { ranAt, total, passed, failures }
19
+ */
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.goldenFilePath = goldenFilePath;
55
+ exports.evalResultsFilePath = evalResultsFilePath;
56
+ exports.readGoldenFile = readGoldenFile;
57
+ exports.writeGoldenFile = writeGoldenFile;
58
+ exports.writeEvalResults = writeEvalResults;
59
+ exports.buildInitGoldenFile = buildInitGoldenFile;
60
+ exports.runEval = runEval;
61
+ const fs = __importStar(require("fs"));
62
+ const path = __importStar(require("path"));
63
+ const youstack_1 = require("./youstack");
64
+ // ---------------------------------------------------------------------------
65
+ // Paths
66
+ // ---------------------------------------------------------------------------
67
+ function goldenFilePath(stackRootDir) {
68
+ return path.join(stackRootDir, "tests", "golden.json");
69
+ }
70
+ function evalResultsFilePath(stackRootDir) {
71
+ return path.join(stackRootDir, "tests", "eval-results.json");
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Golden file I/O
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Read and parse a golden.json file. Throws on missing or invalid file.
78
+ */
79
+ function readGoldenFile(stackRootDir) {
80
+ const filePath = goldenFilePath(stackRootDir);
81
+ if (!fs.existsSync(filePath)) {
82
+ throw new Error(`golden.json not found at ${filePath}. Run \`youmd stack eval --init\` to create it.`);
83
+ }
84
+ const raw = fs.readFileSync(filePath, "utf-8");
85
+ let parsed;
86
+ try {
87
+ parsed = JSON.parse(raw);
88
+ }
89
+ catch {
90
+ throw new Error(`golden.json is not valid JSON: ${filePath}`);
91
+ }
92
+ if (!isRecord(parsed) || parsed["version"] !== "golden/v1") {
93
+ throw new Error(`golden.json must have version: "golden/v1". Got: ${JSON.stringify(parsed["version"])}`);
94
+ }
95
+ if (!Array.isArray(parsed["entries"])) {
96
+ throw new Error(`golden.json must have an "entries" array`);
97
+ }
98
+ return parsed;
99
+ }
100
+ /**
101
+ * Write a golden.json file. Creates the tests/ directory if needed.
102
+ */
103
+ function writeGoldenFile(stackRootDir, file) {
104
+ const filePath = goldenFilePath(stackRootDir);
105
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
106
+ fs.writeFileSync(filePath, JSON.stringify(file, null, 2) + "\n");
107
+ return filePath;
108
+ }
109
+ /**
110
+ * Write eval-results.json. Creates the tests/ directory if needed.
111
+ */
112
+ function writeEvalResults(stackRootDir, results) {
113
+ const filePath = evalResultsFilePath(stackRootDir);
114
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
115
+ fs.writeFileSync(filePath, JSON.stringify(results, null, 2) + "\n");
116
+ return filePath;
117
+ }
118
+ // ---------------------------------------------------------------------------
119
+ // Example golden entries for --init
120
+ // ---------------------------------------------------------------------------
121
+ function buildInitGoldenFile(manifest) {
122
+ const slug = manifest.slug;
123
+ const name = manifest.name;
124
+ // Pull actual capability IDs from the manifest (user-declared only, not built-ins)
125
+ const firstUserCapId = manifest.capabilities?.[0]?.id ?? "manifest.inspect";
126
+ const readCapId = manifest.capabilities?.find((c) => c.mutationPolicy === "read_only" || c.localOnly)?.id ?? "manifest.inspect";
127
+ return {
128
+ version: "golden/v1",
129
+ entries: [
130
+ {
131
+ label: `inspect ${slug}`,
132
+ prompt: `inspect the ${name} stack`,
133
+ expect: {
134
+ routesTo: "manifest.inspect",
135
+ contains: ["inspect"],
136
+ },
137
+ },
138
+ {
139
+ label: `smoke check ${slug}`,
140
+ prompt: `run smoke validation on ${name}`,
141
+ expect: {
142
+ routesTo: "manifest.smoke",
143
+ contains: ["smoke"],
144
+ },
145
+ },
146
+ {
147
+ label: `first declared capability`,
148
+ prompt: `use ${firstUserCapId} for ${slug}`,
149
+ expect: {
150
+ routesTo: firstUserCapId !== readCapId ? firstUserCapId : readCapId,
151
+ contains: [firstUserCapId.split(".")[0]],
152
+ },
153
+ },
154
+ ],
155
+ };
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // Runner
159
+ // ---------------------------------------------------------------------------
160
+ function capabilityText(routeResult) {
161
+ const cap = routeResult.capability;
162
+ return [
163
+ cap.id,
164
+ cap.intent,
165
+ cap.workflow,
166
+ cap.skill,
167
+ cap.mcpTool,
168
+ cap.apiEndpoint,
169
+ ...(cap.requiredScopes || []),
170
+ ]
171
+ .filter(Boolean)
172
+ .join(" ");
173
+ }
174
+ /**
175
+ * Run all entries in a golden file against the deterministic router.
176
+ * No LLM calls — pure routing + string presence checks.
177
+ */
178
+ function runEval(manifest, goldenFile) {
179
+ const ranAt = new Date().toISOString();
180
+ const failures = [];
181
+ let passed = 0;
182
+ for (const entry of goldenFile.entries) {
183
+ const result = (0, youstack_1.routeYouStackRequest)(manifest, entry.prompt);
184
+ const text = capabilityText(result);
185
+ const textLower = text.toLowerCase();
186
+ const diff = [];
187
+ // Check routesTo
188
+ if (entry.expect.routesTo !== undefined &&
189
+ result.capability.id !== entry.expect.routesTo) {
190
+ diff.push(`routesTo: expected "${entry.expect.routesTo}", got "${result.capability.id}"`);
191
+ }
192
+ // Check contains
193
+ for (const needle of entry.expect.contains || []) {
194
+ if (!textLower.includes(needle.toLowerCase())) {
195
+ diff.push(`contains "${needle}": not found in capability text`);
196
+ }
197
+ }
198
+ // Check notContains
199
+ for (const needle of entry.expect.notContains || []) {
200
+ if (textLower.includes(needle.toLowerCase())) {
201
+ diff.push(`notContains "${needle}": unexpectedly found in capability text`);
202
+ }
203
+ }
204
+ if (diff.length > 0) {
205
+ failures.push({
206
+ label: entry.label,
207
+ prompt: entry.prompt,
208
+ expected: entry.expect,
209
+ actual: {
210
+ routedTo: result.capability.id,
211
+ capabilityText: text,
212
+ },
213
+ diff,
214
+ });
215
+ }
216
+ else {
217
+ passed++;
218
+ }
219
+ }
220
+ return {
221
+ ranAt,
222
+ total: goldenFile.entries.length,
223
+ passed,
224
+ failures,
225
+ };
226
+ }
227
+ // ---------------------------------------------------------------------------
228
+ // Helpers
229
+ // ---------------------------------------------------------------------------
230
+ function isRecord(value) {
231
+ return typeof value === "object" && value !== null && !Array.isArray(value);
232
+ }
233
+ //# sourceMappingURL=stackEval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stackEval.js","sourceRoot":"","sources":["../../src/lib/stackEval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * stackImprove.ts — L14 local stack improvement runner.
3
+ *
4
+ * Two modes:
5
+ * propose — journal-only; writes to stacks/<slug>/journal/<YYYY-MM-DD>.md
6
+ * allowed from T1 upward (requires improvement.mode != "observe").
7
+ * auto_pr — opens a PR via `gh` CLI (or prints the patch if gh not found);
8
+ * gated by T2/T3 with humanGate.required (tierAllows auto_pr).
9
+ *
10
+ * Idempotent: re-runs on the same day append under a new ## Run block rather
11
+ * than creating a second file.
12
+ *
13
+ * Key contract:
14
+ * - Never touches main branch.
15
+ * - Never runs if the manifest mode is "observe" (journal-only requires at
16
+ * least "propose").
17
+ * - Always logs to the journal; auto_pr additionally creates the branch + PR.
18
+ * - tierAllows() from stackSafety.ts is the single gate for auto_pr.
19
+ */
20
+ import type { YouStackManifest } from "./youstack";
21
+ export type ImproveMode = "propose" | "auto_pr";
22
+ export interface ImproveSummary {
23
+ /** Signals gathered from the manifest's improvement.signals list. */
24
+ signals: SignalEntry[];
25
+ /** Proposals generated (human-readable action items). */
26
+ proposals: ProposalEntry[];
27
+ }
28
+ export interface SignalEntry {
29
+ name: string;
30
+ value: string;
31
+ }
32
+ export interface ProposalEntry {
33
+ id: string;
34
+ description: string;
35
+ rationale: string;
36
+ }
37
+ export interface StackImproveResult {
38
+ mode: ImproveMode;
39
+ journalPath: string;
40
+ /** true if the entry was appended to an existing file (idempotent re-run). */
41
+ appended: boolean;
42
+ summary: ImproveSummary;
43
+ /** Only present in auto_pr mode — the pr URL or "no-gh" if gh CLI absent. */
44
+ prUrl?: string;
45
+ /** Refusal reason when the manifest contract blocks the requested mode. */
46
+ refused?: string;
47
+ }
48
+ export declare function runStackImprove(manifest: YouStackManifest, rootDir: string, mode: ImproveMode): StackImproveResult;
49
+ //# sourceMappingURL=stackImprove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stackImprove.d.ts","sourceRoot":"","sources":["../../src/lib/stackImprove.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yDAAyD;IACzD,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAwPD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,GAChB,kBAAkB,CAqDpB"}
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+ /**
3
+ * stackImprove.ts — L14 local stack improvement runner.
4
+ *
5
+ * Two modes:
6
+ * propose — journal-only; writes to stacks/<slug>/journal/<YYYY-MM-DD>.md
7
+ * allowed from T1 upward (requires improvement.mode != "observe").
8
+ * auto_pr — opens a PR via `gh` CLI (or prints the patch if gh not found);
9
+ * gated by T2/T3 with humanGate.required (tierAllows auto_pr).
10
+ *
11
+ * Idempotent: re-runs on the same day append under a new ## Run block rather
12
+ * than creating a second file.
13
+ *
14
+ * Key contract:
15
+ * - Never touches main branch.
16
+ * - Never runs if the manifest mode is "observe" (journal-only requires at
17
+ * least "propose").
18
+ * - Always logs to the journal; auto_pr additionally creates the branch + PR.
19
+ * - tierAllows() from stackSafety.ts is the single gate for auto_pr.
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ exports.runStackImprove = runStackImprove;
56
+ const fs = __importStar(require("fs"));
57
+ const path = __importStar(require("path"));
58
+ const child_process_1 = require("child_process");
59
+ const stackSafety_1 = require("./stackSafety");
60
+ // ---------------------------------------------------------------------------
61
+ // Signal gathering
62
+ // ---------------------------------------------------------------------------
63
+ function gatherSignals(manifest, rootDir) {
64
+ const signals = [];
65
+ const declaredSignals = manifest.improvement?.signals ?? [];
66
+ // Always include the declared mode as a signal.
67
+ signals.push({
68
+ name: "improvement.mode",
69
+ value: manifest.improvement?.mode ?? "observe",
70
+ });
71
+ // eval file check
72
+ const evalsDecl = manifest.improvement?.evals ?? [];
73
+ for (const evalPath of evalsDecl) {
74
+ const full = path.isAbsolute(evalPath)
75
+ ? evalPath
76
+ : path.join(rootDir, evalPath);
77
+ const exists = fs.existsSync(full);
78
+ signals.push({ name: `eval:${evalPath}`, value: exists ? "present" : "missing" });
79
+ }
80
+ // Journal entry count (approximate health of the journal)
81
+ const journalDir = path.join(rootDir, "journal");
82
+ if (fs.existsSync(journalDir)) {
83
+ const entries = fs.readdirSync(journalDir).filter((f) => f.endsWith(".md"));
84
+ signals.push({ name: "journal.entries", value: String(entries.length) });
85
+ }
86
+ else {
87
+ signals.push({ name: "journal.entries", value: "0 (no journal dir yet)" });
88
+ }
89
+ // File completeness
90
+ const files = manifest.files ?? [];
91
+ const missingFiles = files.filter((f) => {
92
+ const full = path.isAbsolute(f.path) ? f.path : path.join(rootDir, f.path);
93
+ return f.required && !fs.existsSync(full);
94
+ });
95
+ if (missingFiles.length > 0) {
96
+ signals.push({ name: "missing.required.files", value: missingFiles.map((f) => f.path).join(", ") });
97
+ }
98
+ else if (files.length > 0) {
99
+ signals.push({ name: "required.files", value: `all ${files.length} present` });
100
+ }
101
+ // Capability count
102
+ const caps = manifest.capabilities ?? [];
103
+ signals.push({ name: "capabilities.count", value: String(caps.length) });
104
+ // Declared signals from the manifest (capture them as-is; real implementations
105
+ // would resolve these against activity logs, journal entries, etc.)
106
+ for (const sig of declaredSignals) {
107
+ if (!signals.find((s) => s.name === sig)) {
108
+ signals.push({ name: sig, value: "declared (not yet instrumented)" });
109
+ }
110
+ }
111
+ return signals;
112
+ }
113
+ // ---------------------------------------------------------------------------
114
+ // Proposal generation
115
+ // ---------------------------------------------------------------------------
116
+ function generateProposals(manifest, signals) {
117
+ const proposals = [];
118
+ // Missing required files
119
+ const missingFilesSig = signals.find((s) => s.name === "missing.required.files");
120
+ if (missingFilesSig) {
121
+ proposals.push({
122
+ id: "fill-missing-files",
123
+ description: `Add missing required files: ${missingFilesSig.value}`,
124
+ rationale: "Required files declared in the manifest are not present on disk.",
125
+ });
126
+ }
127
+ // No evals declared
128
+ if (!manifest.improvement?.evals || manifest.improvement.evals.length === 0) {
129
+ proposals.push({
130
+ id: "add-evals",
131
+ description: 'Add improvement.evals to the manifest (e.g. "youmd stack smoke", "youmd stack eval")',
132
+ rationale: "Evals gate auto-apply; without them, the stack cannot safely self-apply changes.",
133
+ });
134
+ }
135
+ // Missing evals files
136
+ const missingEvals = signals.filter((s) => s.name.startsWith("eval:") && s.value === "missing");
137
+ for (const sig of missingEvals) {
138
+ proposals.push({
139
+ id: `create-eval-${sig.name.replace("eval:", "").replace(/\W+/g, "-")}`,
140
+ description: `Create the declared eval file: ${sig.name.replace("eval:", "")}`,
141
+ rationale: "The eval is declared in improvement.evals but the file does not exist.",
142
+ });
143
+ }
144
+ // No capabilities
145
+ if ((manifest.capabilities?.length ?? 0) === 0) {
146
+ proposals.push({
147
+ id: "declare-capabilities",
148
+ description: "Declare at least one capability in the manifest",
149
+ rationale: "No capabilities means youmd stack route cannot match any request.",
150
+ });
151
+ }
152
+ // Observe mode warning
153
+ if (manifest.improvement?.mode === "observe") {
154
+ proposals.push({
155
+ id: "upgrade-improvement-mode",
156
+ description: 'Consider upgrading improvement.mode from "observe" to "propose" to enable journal writes',
157
+ rationale: 'Mode "observe" prevents any journal writes, including proposals.',
158
+ });
159
+ }
160
+ return proposals;
161
+ }
162
+ // ---------------------------------------------------------------------------
163
+ // Journal writing
164
+ // ---------------------------------------------------------------------------
165
+ function utcDate() {
166
+ return new Date().toISOString().slice(0, 10);
167
+ }
168
+ function utcTimestamp() {
169
+ return new Date().toISOString();
170
+ }
171
+ function journalFilePath(rootDir) {
172
+ const journalDir = path.join(rootDir, "journal");
173
+ return path.join(journalDir, `${utcDate()}.md`);
174
+ }
175
+ function renderJournalEntry(summary, mode, runTs) {
176
+ const lines = [];
177
+ lines.push(`## Run — ${runTs}`);
178
+ lines.push(`Mode: ${mode}`);
179
+ lines.push("");
180
+ lines.push("### Signals");
181
+ for (const sig of summary.signals) {
182
+ lines.push(`- **${sig.name}**: ${sig.value}`);
183
+ }
184
+ lines.push("");
185
+ lines.push("### Proposals");
186
+ if (summary.proposals.length === 0) {
187
+ lines.push("No proposals generated.");
188
+ }
189
+ else {
190
+ for (const p of summary.proposals) {
191
+ lines.push(`#### ${p.id}`);
192
+ lines.push(`> ${p.description}`);
193
+ lines.push(`> *Rationale:* ${p.rationale}`);
194
+ lines.push("");
195
+ }
196
+ }
197
+ lines.push("---");
198
+ lines.push("");
199
+ return lines.join("\n");
200
+ }
201
+ function ensureJournalFile(journalPath, slug) {
202
+ const journalDir = path.dirname(journalPath);
203
+ if (!fs.existsSync(journalDir)) {
204
+ fs.mkdirSync(journalDir, { recursive: true });
205
+ }
206
+ const existed = fs.existsSync(journalPath);
207
+ if (!existed) {
208
+ const header = `# Stack Journal — ${slug}\n\nDate: ${utcDate()}\n\n`;
209
+ fs.writeFileSync(journalPath, header, "utf-8");
210
+ }
211
+ return { existed };
212
+ }
213
+ // ---------------------------------------------------------------------------
214
+ // auto_pr implementation
215
+ // ---------------------------------------------------------------------------
216
+ function ghAvailable() {
217
+ try {
218
+ (0, child_process_1.execFileSync)("gh", ["--version"], { stdio: "ignore" });
219
+ return true;
220
+ }
221
+ catch {
222
+ return false;
223
+ }
224
+ }
225
+ function renderPatchText(summary, slug) {
226
+ const lines = [];
227
+ lines.push(`# Stack Improvement Proposals — ${slug}`);
228
+ lines.push(`Generated: ${utcTimestamp()}`);
229
+ lines.push("");
230
+ for (const p of summary.proposals) {
231
+ lines.push(`## ${p.id}`);
232
+ lines.push(`**Action:** ${p.description}`);
233
+ lines.push(`**Rationale:** ${p.rationale}`);
234
+ lines.push("");
235
+ }
236
+ return lines.join("\n");
237
+ }
238
+ function openAutoPr(rootDir, slug, summary, journalPath) {
239
+ if (!ghAvailable()) {
240
+ // Print patch to stdout; caller surfaces it.
241
+ return "no-gh";
242
+ }
243
+ const branch = `stack-improve/${slug}/${utcDate()}`;
244
+ // Attempt to create the branch and push the journal.
245
+ try {
246
+ // Create branch from current HEAD (never modifies main directly).
247
+ (0, child_process_1.execSync)(`git checkout -b "${branch}"`, { cwd: rootDir, stdio: "pipe" });
248
+ (0, child_process_1.execSync)(`git add "${journalPath}"`, { cwd: rootDir, stdio: "pipe" });
249
+ (0, child_process_1.execSync)(`git commit -m "feat(stack): ${slug} improvement proposals ${utcDate()}"`, { cwd: rootDir, stdio: "pipe" });
250
+ (0, child_process_1.execSync)(`git push origin "${branch}"`, { cwd: rootDir, stdio: "pipe" });
251
+ const prTitle = `stack-improve: ${slug} ${utcDate()}`;
252
+ const prBody = `Auto-generated by \`youmd stack improve --mode auto_pr\`.\n\n${renderPatchText(summary, slug)}`;
253
+ const result = (0, child_process_1.execSync)(`gh pr create --title "${prTitle}" --body "${prBody.replace(/"/g, '\\"')}" --base main --head "${branch}"`, { cwd: rootDir, encoding: "utf-8" });
254
+ return result.trim();
255
+ }
256
+ catch (err) {
257
+ // Return a descriptive error string; caller surfaces it.
258
+ return `pr-failed: ${err instanceof Error ? err.message : String(err)}`;
259
+ }
260
+ }
261
+ // ---------------------------------------------------------------------------
262
+ // Main entry point
263
+ // ---------------------------------------------------------------------------
264
+ function runStackImprove(manifest, rootDir, mode) {
265
+ // ── Gate 1: mode must be at least "propose" in the manifest ──────────
266
+ const declaredMode = manifest.improvement?.mode ?? "observe";
267
+ if (declaredMode === "observe") {
268
+ return {
269
+ mode,
270
+ journalPath: journalFilePath(rootDir),
271
+ appended: false,
272
+ summary: { signals: [], proposals: [] },
273
+ refused: `improvement.mode is "observe" in the manifest; journal writes require at least "propose"`,
274
+ };
275
+ }
276
+ // ── Gate 2: auto_pr requires tierAllows("auto_pr") ───────────────────
277
+ if (mode === "auto_pr") {
278
+ const contract = (0, stackSafety_1.parseSafetyContract)(manifest);
279
+ if (!contract || !(0, stackSafety_1.tierAllows)(contract, "auto_pr")) {
280
+ const tier = contract?.tier ?? "(no safety contract)";
281
+ return {
282
+ mode,
283
+ journalPath: journalFilePath(rootDir),
284
+ appended: false,
285
+ summary: { signals: [], proposals: [] },
286
+ refused: `auto_pr blocked: tier ${tier} does not allow auto_pr (requires T2 with humanGate.required, or T3)`,
287
+ };
288
+ }
289
+ }
290
+ // ── Gather signals + proposals ────────────────────────────────────────
291
+ const signals = gatherSignals(manifest, rootDir);
292
+ const proposals = generateProposals(manifest, signals);
293
+ const summary = { signals, proposals };
294
+ const runTs = utcTimestamp();
295
+ // ── Write journal ─────────────────────────────────────────────────────
296
+ const journalPath = journalFilePath(rootDir);
297
+ const { existed } = ensureJournalFile(journalPath, manifest.slug);
298
+ const entry = renderJournalEntry(summary, mode, runTs);
299
+ fs.appendFileSync(journalPath, entry, "utf-8");
300
+ // ── auto_pr branch ───────────────────────────────────────────────────
301
+ let prUrl;
302
+ if (mode === "auto_pr") {
303
+ prUrl = openAutoPr(rootDir, manifest.slug, summary, journalPath);
304
+ }
305
+ return {
306
+ mode,
307
+ journalPath,
308
+ appended: existed,
309
+ summary,
310
+ prUrl,
311
+ };
312
+ }
313
+ //# sourceMappingURL=stackImprove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stackImprove.js","sourceRoot":"","sources":["../../src/lib/stackImprove.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkSH,0CAyDC;AAzVD,uCAAyB;AACzB,2CAA6B;AAC7B,iDAAuD;AAEvD,+CAAgE;AAsChE,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,aAAa,CAAC,QAA0B,EAAE,OAAe;IAChE,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC;IAE5D,gDAAgD;IAChD,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,IAAI,SAAS;KAC/C,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;IACpD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACpC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,0DAA0D;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,KAAK,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,mBAAmB;IACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEzE,+EAA+E;IAC/E,oEAAoE;IACpE,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,SAAS,iBAAiB,CACxB,QAA0B,EAC1B,OAAsB;IAEtB,MAAM,SAAS,GAAoB,EAAE,CAAC;IAEtC,yBAAyB;IACzB,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC;IACjF,IAAI,eAAe,EAAE,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,oBAAoB;YACxB,WAAW,EAAE,+BAA+B,eAAe,CAAC,KAAK,EAAE;YACnE,SAAS,EAAE,kEAAkE;SAC9E,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5E,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,WAAW;YACf,WAAW,EAAE,sFAAsF;YACnG,SAAS,EAAE,kFAAkF;SAC9F,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAC3D,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,eAAe,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;YACvE,WAAW,EAAE,kCAAkC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;YAC9E,SAAS,EAAE,wEAAwE;SACpF,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,sBAAsB;YAC1B,WAAW,EAAE,iDAAiD;YAC9D,SAAS,EAAE,mEAAmE;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB;IACvB,IAAI,QAAQ,CAAC,WAAW,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7C,SAAS,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,0BAA0B;YAC9B,WAAW,EAAE,0FAA0F;YACvG,SAAS,EAAE,kEAAkE;SAC9E,CAAC,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,OAAO;IACd,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAuB,EAAE,IAAiB,EAAE,KAAa;IACnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmB,EAAE,IAAY;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,qBAAqB,IAAI,aAAa,OAAO,EAAE,MAAM,CAAC;QACrE,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,IAAA,4BAAY,EAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAuB,EAAE,IAAY;IAC5D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,cAAc,YAAY,EAAE,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CACjB,OAAe,EACf,IAAY,EACZ,OAAuB,EACvB,WAAmB;IAEnB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACnB,6CAA6C;QAC7C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC;IAEpD,qDAAqD;IACrD,IAAI,CAAC;QACH,kEAAkE;QAClE,IAAA,wBAAQ,EAAC,oBAAoB,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,IAAA,wBAAQ,EAAC,YAAY,WAAW,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,IAAA,wBAAQ,EACN,+BAA+B,IAAI,0BAA0B,OAAO,EAAE,GAAG,EACzE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAChC,CAAC;QACF,IAAA,wBAAQ,EAAC,oBAAoB,MAAM,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEzE,MAAM,OAAO,GAAG,kBAAkB,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC;QACtD,MAAM,MAAM,GAAG,gEAAgE,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;QAChH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EACrB,yBAAyB,OAAO,aAAa,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,yBAAyB,MAAM,GAAG,EAC1G,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CACpC,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,yDAAyD;QACzD,OAAO,cAAc,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAgB,eAAe,CAC7B,QAA0B,EAC1B,OAAe,EACf,IAAiB;IAEjB,wEAAwE;IACxE,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,IAAI,IAAI,SAAS,CAAC;IAC7D,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI;YACJ,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC;YACrC,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;YACvC,OAAO,EAAE,0FAA0F;SACpG,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAA,iCAAmB,EAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAA,wBAAU,EAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,sBAAsB,CAAC;YACtD,OAAO;gBACL,IAAI;gBACJ,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC;gBACrC,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;gBACvC,OAAO,EAAE,yBAAyB,IAAI,sEAAsE;aAC7G,CAAC;QACJ,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,OAAO,GAAmB,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,yEAAyE;IACzE,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACvD,EAAE,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAE/C,wEAAwE;IACxE,IAAI,KAAyB,CAAC;IAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,IAAI;QACJ,WAAW;QACX,QAAQ,EAAE,OAAO;QACjB,OAAO;QACP,KAAK;KACN,CAAC;AACJ,CAAC"}