agentbrief 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/briefs/code-reviewer/brief.yaml +8 -0
- package/briefs/code-reviewer/knowledge/review-standards.md +32 -0
- package/briefs/code-reviewer/personality.md +19 -0
- package/briefs/code-reviewer/skills/architecture-review/SKILL.md +76 -0
- package/briefs/code-reviewer/skills/review-process/SKILL.md +41 -0
- package/briefs/code-reviewer/skills/verification/SKILL.md +47 -0
- package/briefs/data-analyst/brief.yaml +8 -0
- package/briefs/data-analyst/knowledge/metrics-reference.md +43 -0
- package/briefs/data-analyst/personality.md +23 -0
- package/briefs/data-analyst/skills/metrics-framework/SKILL.md +90 -0
- package/briefs/data-analyst/skills/sql-query-builder/SKILL.md +115 -0
- package/briefs/devops-sre/brief.yaml +12 -0
- package/briefs/devops-sre/knowledge/runbook.md +69 -0
- package/briefs/devops-sre/personality.md +18 -0
- package/briefs/devops-sre/skills/ci-cd-github-actions/SKILL.md +114 -0
- package/briefs/devops-sre/skills/monitoring-observability/SKILL.md +394 -0
- package/briefs/devops-sre/skills/systematic-debugging/SKILL.md +46 -0
- package/briefs/devops-sre/skills/verification/SKILL.md +47 -0
- package/briefs/frontend-design/brief.yaml +8 -0
- package/briefs/frontend-design/knowledge/design-principles.md +43 -0
- package/briefs/frontend-design/personality.md +19 -0
- package/briefs/frontend-design/skills/design-review-checklist/SKILL.md +151 -0
- package/briefs/frontend-design/skills/web-design-guidelines/SKILL.md +39 -0
- package/briefs/fullstack-dev/brief.yaml +9 -0
- package/briefs/fullstack-dev/personality.md +18 -0
- package/briefs/growth-engineer/brief.yaml +8 -0
- package/briefs/growth-engineer/knowledge/growth-framework.md +83 -0
- package/briefs/growth-engineer/personality.md +19 -0
- package/briefs/growth-engineer/skills/analytics-setup/SKILL.md +109 -0
- package/briefs/growth-engineer/skills/brainstorming/SKILL.md +55 -0
- package/briefs/growth-engineer/skills/content-strategy/SKILL.md +93 -0
- package/briefs/growth-engineer/skills/seo-audit/SKILL.md +412 -0
- package/briefs/growth-engineer/skills/seo-audit/evals/evals.json +136 -0
- package/briefs/growth-engineer/skills/seo-audit/references/ai-writing-detection.md +200 -0
- package/briefs/nextjs-fullstack/brief.yaml +12 -0
- package/briefs/nextjs-fullstack/knowledge/conventions.md +57 -0
- package/briefs/nextjs-fullstack/personality.md +19 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/SKILL.md +153 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/async-patterns.md +87 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/bundling.md +180 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/data-patterns.md +297 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/debug-tricks.md +105 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/directives.md +73 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/error-handling.md +227 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/file-conventions.md +140 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/font.md +245 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/functions.md +108 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/hydration-error.md +91 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/image.md +173 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/metadata.md +301 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/parallel-routes.md +287 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/route-handlers.md +146 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/rsc-boundaries.md +159 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/runtime-selection.md +39 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/scripts.md +141 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/self-hosting.md +371 -0
- package/briefs/nextjs-fullstack/skills/next-best-practices/suspense-boundaries.md +67 -0
- package/briefs/nextjs-fullstack/skills/tdd/SKILL.md +53 -0
- package/briefs/product-manager/brief.yaml +8 -0
- package/briefs/product-manager/knowledge/pm-toolkit.md +51 -0
- package/briefs/product-manager/personality.md +19 -0
- package/briefs/product-manager/skills/brainstorming/SKILL.md +55 -0
- package/briefs/product-manager/skills/specification/SKILL.md +76 -0
- package/briefs/qa-engineer/brief.yaml +11 -0
- package/briefs/qa-engineer/knowledge/testing-patterns.md +54 -0
- package/briefs/qa-engineer/personality.md +24 -0
- package/briefs/qa-engineer/skills/qa-test-and-fix/SKILL.md +101 -0
- package/briefs/qa-engineer/skills/regression-testing/SKILL.md +95 -0
- package/briefs/security-auditor/brief.yaml +12 -0
- package/briefs/security-auditor/knowledge/code-patterns.md +49 -0
- package/briefs/security-auditor/knowledge/owasp-cheatsheet.md +75 -0
- package/briefs/security-auditor/personality.md +23 -0
- package/briefs/security-auditor/skills/security-review/SKILL.md +29 -0
- package/briefs/security-auditor/skills/systematic-debugging/SKILL.md +46 -0
- package/briefs/security-auditor/skills/verification/SKILL.md +47 -0
- package/briefs/startup-builder/brief.yaml +8 -0
- package/briefs/startup-builder/knowledge/startup-phases.md +64 -0
- package/briefs/startup-builder/personality.md +18 -0
- package/briefs/startup-builder/skills/ceo-review/SKILL.md +95 -0
- package/briefs/startup-builder/skills/launch-strategy/SKILL.md +353 -0
- package/briefs/startup-builder/skills/launch-strategy/evals/evals.json +91 -0
- package/briefs/startup-builder/skills/tdd/SKILL.md +53 -0
- package/briefs/startup-builder/skills/verification/SKILL.md +47 -0
- package/briefs/startup-kit/brief.yaml +9 -0
- package/briefs/startup-kit/personality.md +18 -0
- package/briefs/tech-writer/brief.yaml +8 -0
- package/briefs/tech-writer/knowledge/style-guide.md +54 -0
- package/briefs/tech-writer/personality.md +19 -0
- package/briefs/tech-writer/skills/api-documentation/SKILL.md +390 -0
- package/briefs/tech-writer/skills/plan-and-execute/SKILL.md +54 -0
- package/briefs/tech-writer/skills/release-notes/SKILL.md +77 -0
- package/briefs/typescript-strict/brief.yaml +8 -0
- package/briefs/typescript-strict/knowledge/type-patterns.md +117 -0
- package/briefs/typescript-strict/personality.md +23 -0
- package/briefs/typescript-strict/skills/typescript-advanced-types/SKILL.md +717 -0
- package/dist/brief.d.ts +13 -0
- package/dist/brief.d.ts.map +1 -0
- package/dist/brief.js +90 -0
- package/dist/brief.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +180 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler.d.ts +25 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +253 -0
- package/dist/compiler.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +255 -0
- package/dist/index.js.map +1 -0
- package/dist/injector.d.ts +17 -0
- package/dist/injector.d.ts.map +1 -0
- package/dist/injector.js +76 -0
- package/dist/injector.js.map +1 -0
- package/dist/lock.d.ts +8 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +50 -0
- package/dist/lock.js.map +1 -0
- package/dist/resolver.d.ts +24 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +135 -0
- package/dist/resolver.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
- package/registry.yaml +91 -0
- package/templates/default/brief.yaml +7 -0
- package/templates/default/knowledge/.gitkeep +0 -0
- package/templates/default/personality.md +12 -0
- package/templates/security/brief.yaml +6 -0
- package/templates/security/knowledge/.gitkeep +0 -0
- package/templates/security/personality.md +20 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { cp, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import yaml from "js-yaml";
|
|
6
|
+
import { loadBrief, loadPersonality, loadSkillMetas } from "./brief.js";
|
|
7
|
+
import { compile } from "./compiler.js";
|
|
8
|
+
import { eject as ejectFromFiles, inject } from "./injector.js";
|
|
9
|
+
import { addEntry, cleanBriefData, readLock, removeEntry } from "./lock.js";
|
|
10
|
+
import { listRegistry, resolveGitHub, resolveSource } from "./resolver.js";
|
|
11
|
+
import { FILE_ENGINES } from "./types.js";
|
|
12
|
+
export { loadBrief, loadPersonality, loadSkillMetas } from "./brief.js";
|
|
13
|
+
export { compile } from "./compiler.js";
|
|
14
|
+
export { eject as ejectFromFiles, inject } from "./injector.js";
|
|
15
|
+
export { readLock } from "./lock.js";
|
|
16
|
+
export { listRegistry, resolveSource } from "./resolver.js";
|
|
17
|
+
export { ENGINE_FILES } from "./types.js";
|
|
18
|
+
export async function use(opts) {
|
|
19
|
+
const projectDir = resolve(opts.projectDir || ".");
|
|
20
|
+
// 1. Resolve source → local path
|
|
21
|
+
const resolved = await resolveSource(opts.source);
|
|
22
|
+
// 2. Load brief spec + personality
|
|
23
|
+
const spec = await loadBrief(resolved.path);
|
|
24
|
+
const personality = await loadPersonality(resolved.path, spec);
|
|
25
|
+
const briefDataDir = join(projectDir, ".agentbrief", spec.name);
|
|
26
|
+
// 3. Resolve extends — collect knowledge and skills from extended briefs
|
|
27
|
+
if (spec.extends && spec.extends.length > 0) {
|
|
28
|
+
for (const ext of spec.extends) {
|
|
29
|
+
const extResolved = await resolveSource(ext);
|
|
30
|
+
const extSpec = await loadBrief(extResolved.path);
|
|
31
|
+
// Copy extended brief's knowledge (dedup by name)
|
|
32
|
+
if (extSpec.knowledge) {
|
|
33
|
+
const knowledgeDir = join(briefDataDir, "knowledge");
|
|
34
|
+
await mkdir(knowledgeDir, { recursive: true });
|
|
35
|
+
for (const k of extSpec.knowledge) {
|
|
36
|
+
const src = join(extResolved.path, k);
|
|
37
|
+
if (!existsSync(src))
|
|
38
|
+
continue;
|
|
39
|
+
if (statSync(src).isDirectory()) {
|
|
40
|
+
for (const child of readdirSync(src)) {
|
|
41
|
+
const target = join(knowledgeDir, child);
|
|
42
|
+
if (!existsSync(target))
|
|
43
|
+
await cp(join(src, child), target, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const target = join(knowledgeDir, k);
|
|
48
|
+
if (!existsSync(target))
|
|
49
|
+
await cp(src, target, { recursive: true });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Copy extended brief's skills (dedup by skill dir name)
|
|
54
|
+
if (extSpec.skills) {
|
|
55
|
+
const skillsDir = join(briefDataDir, "skills");
|
|
56
|
+
await mkdir(skillsDir, { recursive: true });
|
|
57
|
+
for (const s of extSpec.skills) {
|
|
58
|
+
const src = join(extResolved.path, s);
|
|
59
|
+
if (!existsSync(src) || !statSync(src).isDirectory())
|
|
60
|
+
continue;
|
|
61
|
+
for (const child of readdirSync(src)) {
|
|
62
|
+
const target = join(skillsDir, child);
|
|
63
|
+
if (!existsSync(target))
|
|
64
|
+
await cp(join(src, child), target, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// 4. Copy own knowledge files
|
|
71
|
+
if (spec.knowledge && spec.knowledge.length > 0) {
|
|
72
|
+
const knowledgeDir = join(briefDataDir, "knowledge");
|
|
73
|
+
await mkdir(knowledgeDir, { recursive: true });
|
|
74
|
+
for (const k of spec.knowledge) {
|
|
75
|
+
const src = join(resolved.path, k);
|
|
76
|
+
if (!existsSync(src))
|
|
77
|
+
continue;
|
|
78
|
+
if (statSync(src).isDirectory()) {
|
|
79
|
+
// Copy directory contents (not the directory itself) to avoid double-nesting
|
|
80
|
+
for (const child of readdirSync(src)) {
|
|
81
|
+
await cp(join(src, child), join(knowledgeDir, child), { recursive: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
await cp(src, join(knowledgeDir, k), { recursive: true });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// 5. Copy own skills (local + remote), overriding extended if same name
|
|
90
|
+
if (spec.skills && spec.skills.length > 0) {
|
|
91
|
+
const skillsDir = join(briefDataDir, "skills");
|
|
92
|
+
await mkdir(skillsDir, { recursive: true });
|
|
93
|
+
for (const s of spec.skills) {
|
|
94
|
+
if (s.startsWith("github:")) {
|
|
95
|
+
const resolvedSkill = await resolveGitHub(s);
|
|
96
|
+
const skillName = resolvedSkill.path.split("/").filter(Boolean).pop() || "skill";
|
|
97
|
+
await cp(resolvedSkill.path, join(skillsDir, skillName), { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const src = join(resolved.path, s);
|
|
101
|
+
if (!existsSync(src) || !statSync(src).isDirectory())
|
|
102
|
+
continue;
|
|
103
|
+
for (const child of readdirSync(src)) {
|
|
104
|
+
await cp(join(src, child), join(skillsDir, child), { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 5. Load skill metadata from deployed skills directory
|
|
110
|
+
const deployedSkillsDir = join(briefDataDir, "skills");
|
|
111
|
+
const skillMetas = existsSync(deployedSkillsDir)
|
|
112
|
+
? await loadSkillMetas(briefDataDir, { ...spec, skills: ["skills/"] })
|
|
113
|
+
: [];
|
|
114
|
+
// 6. Compile per engine target (with skill metadata)
|
|
115
|
+
// If extends brought in skills, ensure compiler knows about them
|
|
116
|
+
const compileSpec = skillMetas.length > 0 && !spec.skills?.length ? { ...spec, skills: ["skills/"] } : spec;
|
|
117
|
+
const contentMap = {};
|
|
118
|
+
for (const [file, engines] of Object.entries(FILE_ENGINES)) {
|
|
119
|
+
contentMap[file] = compile({ spec: compileSpec, personality, engine: engines[0], skillMetas });
|
|
120
|
+
}
|
|
121
|
+
// 6. Inject per-engine content into instruction files
|
|
122
|
+
const injectedFiles = await inject({ projectDir, briefName: spec.name, content: contentMap });
|
|
123
|
+
// 7. Update lock file
|
|
124
|
+
await addEntry(projectDir, {
|
|
125
|
+
name: spec.name,
|
|
126
|
+
source: resolved.original,
|
|
127
|
+
version: spec.version,
|
|
128
|
+
ref: resolved.ref,
|
|
129
|
+
sha: resolved.sha,
|
|
130
|
+
applied_at: new Date().toISOString(),
|
|
131
|
+
});
|
|
132
|
+
// Count CLAUDE.md lines for context bloat warning
|
|
133
|
+
const claudeMdPath = join(projectDir, "CLAUDE.md");
|
|
134
|
+
const claudeLines = existsSync(claudeMdPath) ? (await readFile(claudeMdPath, "utf-8")).split("\n").length : 0;
|
|
135
|
+
return {
|
|
136
|
+
name: spec.name,
|
|
137
|
+
version: spec.version,
|
|
138
|
+
description: spec.description,
|
|
139
|
+
knowledgeCount: spec.knowledge?.length ?? 0,
|
|
140
|
+
skillsCount: spec.skills?.length ?? 0,
|
|
141
|
+
files: injectedFiles,
|
|
142
|
+
claudeLines,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export async function eject(name, projectDir) {
|
|
146
|
+
const dir = resolve(projectDir || ".");
|
|
147
|
+
const ejectedFiles = await ejectFromFiles(dir, name);
|
|
148
|
+
await cleanBriefData(dir, name);
|
|
149
|
+
await removeEntry(dir, name);
|
|
150
|
+
return { name, files: ejectedFiles };
|
|
151
|
+
}
|
|
152
|
+
// ── list ────────────────────────────────────────────────
|
|
153
|
+
export async function list(projectDir) {
|
|
154
|
+
const dir = resolve(projectDir || ".");
|
|
155
|
+
const lock = await readLock(dir);
|
|
156
|
+
return lock.briefs;
|
|
157
|
+
}
|
|
158
|
+
export async function init(opts) {
|
|
159
|
+
const targetDir = resolve(opts.dir);
|
|
160
|
+
await mkdir(targetDir, { recursive: true });
|
|
161
|
+
if (opts.template) {
|
|
162
|
+
// Copy from template directory
|
|
163
|
+
const pkgRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
164
|
+
const templateDir = join(pkgRoot, "templates", opts.template);
|
|
165
|
+
if (!existsSync(templateDir)) {
|
|
166
|
+
throw new Error(`Template "${opts.template}" not found. Available templates are in the templates/ directory.`);
|
|
167
|
+
}
|
|
168
|
+
await cp(templateDir, targetDir, { recursive: true });
|
|
169
|
+
// Rewrite brief.yaml with user's name and description
|
|
170
|
+
const briefPath = join(targetDir, "brief.yaml");
|
|
171
|
+
if (existsSync(briefPath)) {
|
|
172
|
+
const raw = await readFile(briefPath, "utf-8");
|
|
173
|
+
const spec = yaml.load(raw);
|
|
174
|
+
spec.name = opts.name;
|
|
175
|
+
if (opts.description)
|
|
176
|
+
spec.description = opts.description;
|
|
177
|
+
await writeFile(briefPath, yaml.dump(spec, { lineWidth: 120 }), "utf-8");
|
|
178
|
+
}
|
|
179
|
+
return targetDir;
|
|
180
|
+
}
|
|
181
|
+
// Default scaffolding (no template)
|
|
182
|
+
const spec = {
|
|
183
|
+
name: opts.name,
|
|
184
|
+
version: "0.1.0",
|
|
185
|
+
description: opts.description || `${opts.name} agent brief`,
|
|
186
|
+
personality: "personality.md",
|
|
187
|
+
knowledge: ["knowledge/"],
|
|
188
|
+
skills: [],
|
|
189
|
+
};
|
|
190
|
+
await writeFile(join(targetDir, "brief.yaml"), yaml.dump(spec, { lineWidth: 120 }), "utf-8");
|
|
191
|
+
await writeFile(join(targetDir, "personality.md"), [
|
|
192
|
+
`# ${opts.name}`,
|
|
193
|
+
"",
|
|
194
|
+
"## Role",
|
|
195
|
+
"",
|
|
196
|
+
"Describe the role and responsibilities of this agent.",
|
|
197
|
+
"",
|
|
198
|
+
"## Tone & Style",
|
|
199
|
+
"",
|
|
200
|
+
"Describe the communication style, tone, and language preferences.",
|
|
201
|
+
"",
|
|
202
|
+
"## Constraints",
|
|
203
|
+
"",
|
|
204
|
+
"- List behavioral constraints here",
|
|
205
|
+
"- Things the agent must not do",
|
|
206
|
+
"",
|
|
207
|
+
].join("\n"), "utf-8");
|
|
208
|
+
await mkdir(join(targetDir, "knowledge"), { recursive: true });
|
|
209
|
+
await writeFile(join(targetDir, "knowledge", ".gitkeep"), "", "utf-8");
|
|
210
|
+
return targetDir;
|
|
211
|
+
}
|
|
212
|
+
// ── show ────────────────────────────────────────────────
|
|
213
|
+
/**
|
|
214
|
+
* Extract the injected content for a brief from CLAUDE.md.
|
|
215
|
+
* Returns the content between markers, or null if not found.
|
|
216
|
+
*/
|
|
217
|
+
export async function show(name, projectDir) {
|
|
218
|
+
const dir = resolve(projectDir || ".");
|
|
219
|
+
const filePath = join(dir, "CLAUDE.md");
|
|
220
|
+
if (!existsSync(filePath))
|
|
221
|
+
return null;
|
|
222
|
+
const content = await readFile(filePath, "utf-8");
|
|
223
|
+
const startMarker = `<!-- agentbrief:${name}:start -->`;
|
|
224
|
+
const endMarker = `<!-- agentbrief:${name}:end -->`;
|
|
225
|
+
const startIdx = content.indexOf(startMarker);
|
|
226
|
+
const endIdx = content.indexOf(endMarker);
|
|
227
|
+
if (startIdx === -1 || endIdx === -1)
|
|
228
|
+
return null;
|
|
229
|
+
return content.slice(startIdx + startMarker.length, endIdx).trim();
|
|
230
|
+
}
|
|
231
|
+
export async function update(opts) {
|
|
232
|
+
const dir = resolve(opts.projectDir || ".");
|
|
233
|
+
const lock = await readLock(dir);
|
|
234
|
+
const toUpdate = opts.name ? lock.briefs.filter((b) => b.name === opts.name) : lock.briefs;
|
|
235
|
+
const results = [];
|
|
236
|
+
for (const entry of toUpdate) {
|
|
237
|
+
const result = await use({ source: entry.source, projectDir: dir });
|
|
238
|
+
results.push(result);
|
|
239
|
+
}
|
|
240
|
+
return results;
|
|
241
|
+
}
|
|
242
|
+
export async function search(query) {
|
|
243
|
+
const registry = await listRegistry();
|
|
244
|
+
const entries = Object.entries(registry).map(([name, entry]) => ({
|
|
245
|
+
name,
|
|
246
|
+
source: entry.source,
|
|
247
|
+
description: entry.description || "",
|
|
248
|
+
trust: entry.trust,
|
|
249
|
+
}));
|
|
250
|
+
if (!query)
|
|
251
|
+
return entries;
|
|
252
|
+
const q = query.toLowerCase();
|
|
253
|
+
return entries.filter((e) => e.name.includes(q) || e.description.toLowerCase().includes(q));
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface InjectOpts {
|
|
2
|
+
projectDir: string;
|
|
3
|
+
briefName: string;
|
|
4
|
+
/** Single string (same for all engines) or per-engine-file map */
|
|
5
|
+
content: string | Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Inject compiled brief content into all engine instruction files.
|
|
9
|
+
* Returns the list of files that were written.
|
|
10
|
+
*/
|
|
11
|
+
export declare function inject(opts: InjectOpts): Promise<string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Remove injected brief content from all engine instruction files.
|
|
14
|
+
* Returns the list of files that were modified.
|
|
15
|
+
*/
|
|
16
|
+
export declare function eject(projectDir: string, briefName: string): Promise<string[]>;
|
|
17
|
+
//# sourceMappingURL=injector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../src/injector.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBhE;AA8BD;;;GAGG;AACH,wBAAsB,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBpF"}
|
package/dist/injector.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { ENGINE_FILES } from "./types.js";
|
|
5
|
+
const MARKER_START = (name) => `<!-- agentbrief:${name}:start -->`;
|
|
6
|
+
const MARKER_END = (name) => `<!-- agentbrief:${name}:end -->`;
|
|
7
|
+
/**
|
|
8
|
+
* Inject compiled brief content into all engine instruction files.
|
|
9
|
+
* Returns the list of files that were written.
|
|
10
|
+
*/
|
|
11
|
+
export async function inject(opts) {
|
|
12
|
+
const { projectDir, briefName, content } = opts;
|
|
13
|
+
// Deduplicate file paths (opencode and codex both use AGENTS.md)
|
|
14
|
+
const uniqueFiles = [...new Set(Object.values(ENGINE_FILES))];
|
|
15
|
+
const injected = [];
|
|
16
|
+
for (const file of uniqueFiles) {
|
|
17
|
+
const fileContent = typeof content === "string" ? content : (content[file] ?? Object.values(content)[0]);
|
|
18
|
+
const wrapped = `${MARKER_START(briefName)}\n${fileContent}\n${MARKER_END(briefName)}`;
|
|
19
|
+
const filePath = join(projectDir, file);
|
|
20
|
+
await injectIntoFile(filePath, briefName, wrapped);
|
|
21
|
+
injected.push(file);
|
|
22
|
+
}
|
|
23
|
+
return injected;
|
|
24
|
+
}
|
|
25
|
+
async function injectIntoFile(filePath, briefName, wrapped) {
|
|
26
|
+
let existing = "";
|
|
27
|
+
if (existsSync(filePath)) {
|
|
28
|
+
existing = await readFile(filePath, "utf-8");
|
|
29
|
+
}
|
|
30
|
+
const startMarker = MARKER_START(briefName);
|
|
31
|
+
const endMarker = MARKER_END(briefName);
|
|
32
|
+
const startIdx = existing.indexOf(startMarker);
|
|
33
|
+
const endIdx = existing.indexOf(endMarker);
|
|
34
|
+
let result;
|
|
35
|
+
if (startIdx !== -1 && endIdx !== -1) {
|
|
36
|
+
// Replace existing injection
|
|
37
|
+
result = existing.slice(0, startIdx) + wrapped + existing.slice(endIdx + endMarker.length);
|
|
38
|
+
}
|
|
39
|
+
else if (existing.trim()) {
|
|
40
|
+
// Append to existing file
|
|
41
|
+
result = `${existing.trimEnd()}\n\n${wrapped}\n`;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// New file
|
|
45
|
+
result = `${wrapped}\n`;
|
|
46
|
+
}
|
|
47
|
+
await writeFile(filePath, result, "utf-8");
|
|
48
|
+
}
|
|
49
|
+
// ── Eject ───────────────────────────────────────────────
|
|
50
|
+
/**
|
|
51
|
+
* Remove injected brief content from all engine instruction files.
|
|
52
|
+
* Returns the list of files that were modified.
|
|
53
|
+
*/
|
|
54
|
+
export async function eject(projectDir, briefName) {
|
|
55
|
+
const uniqueFiles = [...new Set(Object.values(ENGINE_FILES))];
|
|
56
|
+
const ejected = [];
|
|
57
|
+
for (const file of uniqueFiles) {
|
|
58
|
+
const filePath = join(projectDir, file);
|
|
59
|
+
if (!existsSync(filePath))
|
|
60
|
+
continue;
|
|
61
|
+
const content = await readFile(filePath, "utf-8");
|
|
62
|
+
const startMarker = MARKER_START(briefName);
|
|
63
|
+
const endMarker = MARKER_END(briefName);
|
|
64
|
+
const startIdx = content.indexOf(startMarker);
|
|
65
|
+
const endIdx = content.indexOf(endMarker);
|
|
66
|
+
if (startIdx === -1 || endIdx === -1)
|
|
67
|
+
continue;
|
|
68
|
+
const before = content.slice(0, startIdx);
|
|
69
|
+
const after = content.slice(endIdx + endMarker.length);
|
|
70
|
+
const cleaned = (before + after).replace(/\n{3,}/g, "\n\n").trim();
|
|
71
|
+
await writeFile(filePath, cleaned ? `${cleaned}\n` : "", "utf-8");
|
|
72
|
+
ejected.push(file);
|
|
73
|
+
}
|
|
74
|
+
return ejected;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injector.js","sourceRoot":"","sources":["../src/injector.ts"],"names":[],"mappings":"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"}
|
package/dist/lock.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LockEntry, LockFile } from "./types.js";
|
|
2
|
+
export declare function readLock(projectDir: string): Promise<LockFile>;
|
|
3
|
+
export declare function writeLock(projectDir: string, lock: LockFile): Promise<void>;
|
|
4
|
+
export declare function addEntry(projectDir: string, entry: LockEntry): Promise<void>;
|
|
5
|
+
export declare function removeEntry(projectDir: string, name: string): Promise<boolean>;
|
|
6
|
+
/** Remove copied knowledge/skills for a brief */
|
|
7
|
+
export declare function cleanBriefData(projectDir: string, name: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAStD,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAOpE;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF;AAED,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOpF;AAED,iDAAiD;AACjD,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpF"}
|
package/dist/lock.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import yaml from "js-yaml";
|
|
5
|
+
const BRIEF_DIR = ".agentbrief";
|
|
6
|
+
const LOCK_FILE = "lock.yaml";
|
|
7
|
+
function lockPath(projectDir) {
|
|
8
|
+
return join(projectDir, BRIEF_DIR, LOCK_FILE);
|
|
9
|
+
}
|
|
10
|
+
export async function readLock(projectDir) {
|
|
11
|
+
const p = lockPath(projectDir);
|
|
12
|
+
if (!existsSync(p)) {
|
|
13
|
+
return { version: 1, briefs: [] };
|
|
14
|
+
}
|
|
15
|
+
const content = await readFile(p, "utf-8");
|
|
16
|
+
return yaml.load(content) || { version: 1, briefs: [] };
|
|
17
|
+
}
|
|
18
|
+
export async function writeLock(projectDir, lock) {
|
|
19
|
+
const dir = join(projectDir, BRIEF_DIR);
|
|
20
|
+
await mkdir(dir, { recursive: true });
|
|
21
|
+
await writeFile(lockPath(projectDir), yaml.dump(lock, { lineWidth: 120 }), "utf-8");
|
|
22
|
+
}
|
|
23
|
+
export async function addEntry(projectDir, entry) {
|
|
24
|
+
const lock = await readLock(projectDir);
|
|
25
|
+
const idx = lock.briefs.findIndex((b) => b.name === entry.name);
|
|
26
|
+
if (idx !== -1) {
|
|
27
|
+
lock.briefs[idx] = entry;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
lock.briefs.push(entry);
|
|
31
|
+
}
|
|
32
|
+
await writeLock(projectDir, lock);
|
|
33
|
+
}
|
|
34
|
+
export async function removeEntry(projectDir, name) {
|
|
35
|
+
const lock = await readLock(projectDir);
|
|
36
|
+
const idx = lock.briefs.findIndex((b) => b.name === name);
|
|
37
|
+
if (idx === -1)
|
|
38
|
+
return false;
|
|
39
|
+
lock.briefs.splice(idx, 1);
|
|
40
|
+
await writeLock(projectDir, lock);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/** Remove copied knowledge/skills for a brief */
|
|
44
|
+
export async function cleanBriefData(projectDir, name) {
|
|
45
|
+
const dataDir = join(projectDir, BRIEF_DIR, name);
|
|
46
|
+
if (existsSync(dataDir)) {
|
|
47
|
+
await rm(dataDir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=lock.js.map
|
package/dist/lock.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BriefSource, Registry } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a brief source string to a local directory path.
|
|
4
|
+
*
|
|
5
|
+
* Supported formats:
|
|
6
|
+
* - Registry name: `security-auditor` (looked up in registry.yaml)
|
|
7
|
+
* - Local path: `./my-brief`, `../briefs/x`, `/absolute/path`
|
|
8
|
+
* - GitHub: `github:owner/repo`, `github:owner/repo@v1.0`, `github:owner/repo/subdir`
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveSource(source: string): Promise<BriefSource>;
|
|
11
|
+
export interface ParsedGitHubRef {
|
|
12
|
+
owner: string;
|
|
13
|
+
repo: string;
|
|
14
|
+
ref?: string;
|
|
15
|
+
subdir?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function parseGitHubSource(source: string): ParsedGitHubRef;
|
|
18
|
+
export declare function resolveGitHub(source: string): Promise<BriefSource>;
|
|
19
|
+
export declare function loadRegistry(): Promise<Registry>;
|
|
20
|
+
/**
|
|
21
|
+
* List all entries in the registry.
|
|
22
|
+
*/
|
|
23
|
+
export declare function listRegistry(): Promise<Registry>;
|
|
24
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAIxD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAexE;AAiBD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAyBjE;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCxE;AAMD,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAWtD;AAqBD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAEtD"}
|
package/dist/resolver.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { mkdir, readFile } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { dirname, join, resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import yaml from "js-yaml";
|
|
8
|
+
const CACHE_DIR = join(homedir(), ".agentbrief", "cache");
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a brief source string to a local directory path.
|
|
11
|
+
*
|
|
12
|
+
* Supported formats:
|
|
13
|
+
* - Registry name: `security-auditor` (looked up in registry.yaml)
|
|
14
|
+
* - Local path: `./my-brief`, `../briefs/x`, `/absolute/path`
|
|
15
|
+
* - GitHub: `github:owner/repo`, `github:owner/repo@v1.0`, `github:owner/repo/subdir`
|
|
16
|
+
*/
|
|
17
|
+
export async function resolveSource(source) {
|
|
18
|
+
if (source.startsWith("./") || source.startsWith("../") || source.startsWith("/")) {
|
|
19
|
+
return resolveLocal(source);
|
|
20
|
+
}
|
|
21
|
+
if (source.startsWith("github:")) {
|
|
22
|
+
return resolveGitHub(source);
|
|
23
|
+
}
|
|
24
|
+
// Try registry lookup for bare names (e.g., "security-auditor")
|
|
25
|
+
const registryResult = await resolveFromRegistry(source);
|
|
26
|
+
if (registryResult) {
|
|
27
|
+
return registryResult;
|
|
28
|
+
}
|
|
29
|
+
throw new Error(`Unknown brief: "${source}". Use a registry name (e.g., security-auditor), local path (./my-brief), or GitHub reference (github:owner/repo).`);
|
|
30
|
+
}
|
|
31
|
+
// ── Local ───────────────────────────────────────────────
|
|
32
|
+
function resolveLocal(source) {
|
|
33
|
+
const absPath = resolve(source);
|
|
34
|
+
if (!existsSync(absPath)) {
|
|
35
|
+
throw new Error(`Brief directory not found: ${absPath}`);
|
|
36
|
+
}
|
|
37
|
+
if (!existsSync(join(absPath, "brief.yaml"))) {
|
|
38
|
+
throw new Error(`No brief.yaml found in: ${absPath}`);
|
|
39
|
+
}
|
|
40
|
+
return { type: "local", path: absPath, original: source };
|
|
41
|
+
}
|
|
42
|
+
export function parseGitHubSource(source) {
|
|
43
|
+
const raw = source.slice("github:".length); // strip prefix
|
|
44
|
+
let main;
|
|
45
|
+
let ref;
|
|
46
|
+
const atIdx = raw.indexOf("@");
|
|
47
|
+
if (atIdx !== -1) {
|
|
48
|
+
main = raw.slice(0, atIdx);
|
|
49
|
+
ref = raw.slice(atIdx + 1);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
main = raw;
|
|
53
|
+
}
|
|
54
|
+
const parts = main.split("/");
|
|
55
|
+
if (parts.length < 2) {
|
|
56
|
+
throw new Error(`Invalid GitHub source: "${source}". Expected github:owner/repo`);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
owner: parts[0],
|
|
60
|
+
repo: parts[1],
|
|
61
|
+
ref,
|
|
62
|
+
subdir: parts.length > 2 ? parts.slice(2).join("/") : undefined,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export async function resolveGitHub(source) {
|
|
66
|
+
const { owner, repo, ref, subdir } = parseGitHubSource(source);
|
|
67
|
+
const repoUrl = `https://github.com/${owner}/${repo}.git`;
|
|
68
|
+
const cacheKey = `${owner}/${repo}/${ref || "HEAD"}`;
|
|
69
|
+
const cacheDir = join(CACHE_DIR, cacheKey);
|
|
70
|
+
await mkdir(cacheDir, { recursive: true });
|
|
71
|
+
if (!existsSync(join(cacheDir, ".git"))) {
|
|
72
|
+
// Fresh clone
|
|
73
|
+
const args = ["git", "clone", "--depth", "1"];
|
|
74
|
+
if (ref)
|
|
75
|
+
args.push("--branch", ref);
|
|
76
|
+
args.push(repoUrl, cacheDir);
|
|
77
|
+
execSync(args.join(" "), { stdio: "pipe" });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Update existing cache
|
|
81
|
+
execSync("git fetch --depth 1 && git reset --hard FETCH_HEAD", {
|
|
82
|
+
cwd: cacheDir,
|
|
83
|
+
stdio: "pipe",
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
let sha;
|
|
87
|
+
try {
|
|
88
|
+
sha = execSync("git rev-parse HEAD", { cwd: cacheDir, encoding: "utf-8" }).trim();
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// non-critical
|
|
92
|
+
}
|
|
93
|
+
const briefPath = subdir ? join(cacheDir, subdir) : cacheDir;
|
|
94
|
+
if (!existsSync(join(briefPath, "brief.yaml"))) {
|
|
95
|
+
throw new Error(`No brief.yaml found in ${source} (resolved to ${briefPath})`);
|
|
96
|
+
}
|
|
97
|
+
return { type: "github", path: briefPath, original: source, ref, sha };
|
|
98
|
+
}
|
|
99
|
+
// ── Registry ───────────────────────────────────────────
|
|
100
|
+
let registryCache = null;
|
|
101
|
+
export async function loadRegistry() {
|
|
102
|
+
if (registryCache)
|
|
103
|
+
return registryCache;
|
|
104
|
+
const pkgRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
105
|
+
const registryPath = join(pkgRoot, "registry.yaml");
|
|
106
|
+
if (!existsSync(registryPath))
|
|
107
|
+
return {};
|
|
108
|
+
const raw = await readFile(registryPath, "utf-8");
|
|
109
|
+
registryCache = yaml.load(raw) || {};
|
|
110
|
+
return registryCache;
|
|
111
|
+
}
|
|
112
|
+
async function resolveFromRegistry(name) {
|
|
113
|
+
const registry = await loadRegistry();
|
|
114
|
+
const entry = registry[name];
|
|
115
|
+
if (!entry)
|
|
116
|
+
return null;
|
|
117
|
+
// Official briefs: use built-in copy from briefs/ directory (no network needed)
|
|
118
|
+
if (entry.trust === "official") {
|
|
119
|
+
const pkgRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
120
|
+
const builtinPath = join(pkgRoot, "briefs", name);
|
|
121
|
+
if (existsSync(builtinPath) && existsSync(join(builtinPath, "brief.yaml"))) {
|
|
122
|
+
return { type: "registry", path: builtinPath, original: name };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Verified/community briefs: resolve via GitHub
|
|
126
|
+
const resolved = await resolveGitHub(entry.source);
|
|
127
|
+
return { ...resolved, type: "registry", original: name };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* List all entries in the registry.
|
|
131
|
+
*/
|
|
132
|
+
export async function listRegistry() {
|
|
133
|
+
return loadRegistry();
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,SAAS,CAAC;AAG3B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IACjD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,gEAAgE;IAChE,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,cAAc,EAAE,CAAC;QACpB,OAAO,cAAc,CAAC;IACvB,CAAC;IACD,MAAM,IAAI,KAAK,CACd,mBAAmB,MAAM,oHAAoH,CAC7I,CAAC;AACH,CAAC;AAED,2DAA2D;AAE3D,SAAS,YAAY,CAAC,MAAc;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC3D,CAAC;AAWD,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe;IAE3D,IAAI,IAAY,CAAC;IACjB,IAAI,GAAuB,CAAC;IAE5B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACP,IAAI,GAAG,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,+BAA+B,CAAC,CAAC;IACnF,CAAC;IAED,OAAO;QACN,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACf,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACd,GAAG;QACH,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IACjD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,sBAAsB,KAAK,IAAI,IAAI,MAAM,CAAC;IAC1D,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE3C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACzC,cAAc;QACd,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9C,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACP,wBAAwB;QACxB,QAAQ,CAAC,oDAAoD,EAAE;YAC9D,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,MAAM;SACb,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,GAAuB,CAAC;IAC5B,IAAI,CAAC;QACJ,GAAG,GAAG,QAAQ,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACR,eAAe;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,iBAAiB,SAAS,GAAG,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACxE,CAAC;AAED,0DAA0D;AAE1D,IAAI,aAAa,GAAoB,IAAI,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IAExC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEpD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAClD,aAAa,GAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAc,IAAI,EAAE,CAAC;IACnD,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,gFAAgF;IAChF,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC;IACF,CAAC;IAED,gDAAgD;IAChD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,OAAO,YAAY,EAAE,CAAC;AACvB,CAAC"}
|