diff --git a/.agentkit/engines/node/src/__tests__/__fixtures__/explicit-domains-project.yaml b/.agentkit/engines/node/src/__tests__/__fixtures__/explicit-domains-project.yaml new file mode 100644 index 00000000..224f5051 --- /dev/null +++ b/.agentkit/engines/node/src/__tests__/__fixtures__/explicit-domains-project.yaml @@ -0,0 +1,25 @@ +name: explicit-domains-test +githubSlug: test-org/explicit-domains-test +description: Explicit domain override fixture for domain filtering tests. +phase: active +stack: + languages: [typescript, csharp, rust] + packageManager: pnpm + nodeVersion: lts/* + frameworks: + frontend: [] + backend: [node.js] + css: [] + orm: none + database: [none] + search: none + messaging: [none] +domains: + rules: [typescript, security] +automation: + languageProfile: + mode: configured + diagnostics: off + inferFrom: + frameworks: true + tests: true diff --git a/.agentkit/engines/node/src/__tests__/__fixtures__/fullstack-project.yaml b/.agentkit/engines/node/src/__tests__/__fixtures__/fullstack-project.yaml new file mode 100644 index 00000000..8494b7a8 --- /dev/null +++ b/.agentkit/engines/node/src/__tests__/__fixtures__/fullstack-project.yaml @@ -0,0 +1,23 @@ +name: fullstack-test +githubSlug: test-org/fullstack-test +description: Full-stack fixture for domain filtering tests. +phase: active +stack: + languages: [typescript, csharp, rust, solidity] + packageManager: pnpm + nodeVersion: lts/* + frameworks: + frontend: [] + backend: [node.js, asp.net-core, axum] + css: [] + orm: none + database: [none] + search: none + messaging: [none] +automation: + languageProfile: + mode: configured + diagnostics: off + inferFrom: + frameworks: true + tests: true diff --git a/.agentkit/engines/node/src/__tests__/__fixtures__/heuristic-project.yaml b/.agentkit/engines/node/src/__tests__/__fixtures__/heuristic-project.yaml new file mode 100644 index 00000000..7030fc1c --- /dev/null +++ b/.agentkit/engines/node/src/__tests__/__fixtures__/heuristic-project.yaml @@ -0,0 +1,23 @@ +name: heuristic-test +githubSlug: test-org/heuristic-test +description: Heuristic mode fixture — all domains should be included (backward compat). +phase: active +stack: + languages: [javascript] + packageManager: pnpm + nodeVersion: lts/* + frameworks: + frontend: [] + backend: [node.js] + css: [] + orm: none + database: [none] + search: none + messaging: [none] +automation: + languageProfile: + mode: heuristic + diagnostics: off + inferFrom: + frameworks: true + tests: true diff --git a/.agentkit/engines/node/src/__tests__/__fixtures__/js-only-project.yaml b/.agentkit/engines/node/src/__tests__/__fixtures__/js-only-project.yaml new file mode 100644 index 00000000..4db170e0 --- /dev/null +++ b/.agentkit/engines/node/src/__tests__/__fixtures__/js-only-project.yaml @@ -0,0 +1,23 @@ +name: js-only-test +githubSlug: test-org/js-only-test +description: JS-only fixture for domain filtering tests. +phase: active +stack: + languages: [javascript] + packageManager: pnpm + nodeVersion: lts/* + frameworks: + frontend: [] + backend: [node.js] + css: [] + orm: none + database: [none] + search: none + messaging: [none] +automation: + languageProfile: + mode: configured + diagnostics: off + inferFrom: + frameworks: true + tests: true diff --git a/.agentkit/engines/node/src/__tests__/generation.test.mjs b/.agentkit/engines/node/src/__tests__/generation.test.mjs new file mode 100644 index 00000000..ae902fbd --- /dev/null +++ b/.agentkit/engines/node/src/__tests__/generation.test.mjs @@ -0,0 +1,297 @@ +/** + * Phase 6 — Domain filtering tests + * + * Tests that filterDomainsByStack correctly filters rule domains based on: + * 1. js-only project (mode: configured, languages: [javascript]) + * 2. fullstack project (typescript + dotnet + rust + solidity) + * 3. explicit domains.rules override (only listed domains regardless of stack) + * 4. heuristic mode (all domains — backward compat) + */ +import { readFileSync } from 'fs'; +import yaml from 'js-yaml'; +import { dirname, resolve } from 'path'; +import { describe, expect, it } from 'vitest'; +import { filterDomainsByStack, filterTechStacks } from '../template-utils.mjs'; + +const FIXTURES_DIR = resolve(import.meta.dirname, '__fixtures__'); +const AGENTKIT_ROOT = resolve(import.meta.dirname, '..', '..', '..', '..'); + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function loadFixture(name) { + return yaml.load(readFileSync(resolve(FIXTURES_DIR, name), 'utf-8')); +} + +function loadRulesSpec() { + return yaml.load(readFileSync(resolve(AGENTKIT_ROOT, 'spec', 'rules.yaml'), 'utf-8')); +} + +/** + * Build a minimal vars object matching what flattenProjectYaml + language inference + * produces for a given project.yaml fixture. + * Only the fields used by filterDomainsByStack are populated. + */ +function buildVarsFromFixture(project) { + const langs = (project?.stack?.languages || []).map((l) => l.trim().toLowerCase()); + const mode = project?.automation?.languageProfile?.mode || 'hybrid'; + + const hasLanguageTypeScript = langs.some((l) => l === 'typescript' || l === 'ts'); + const hasLanguageJavaScript = langs.some((l) => l === 'javascript' || l === 'js'); + const hasLanguageJsLike = hasLanguageTypeScript || hasLanguageJavaScript; + const hasLanguageRust = langs.includes('rust'); + const hasLanguagePython = langs.includes('python'); + const hasLanguageDotnet = langs.some((l) => ['csharp', 'c#', 'dotnet', '.net'].includes(l)); + const hasLanguageBlockchain = langs.some((l) => ['solidity', 'blockchain'].includes(l)); + + const hasConfiguredLanguages = langs.length > 0; + + let hasLanguageJsLikeEffective; + let hasLanguagePythonEffective; + let hasLanguageDotnetEffective; + let hasLanguageRustEffective; + + if (mode === 'configured') { + hasLanguageJsLikeEffective = hasConfiguredLanguages && hasLanguageJsLike; + hasLanguagePythonEffective = hasConfiguredLanguages && hasLanguagePython; + hasLanguageDotnetEffective = hasConfiguredLanguages && hasLanguageDotnet; + hasLanguageRustEffective = hasConfiguredLanguages && hasLanguageRust; + } else if (mode === 'heuristic') { + // heuristic: inferred from frameworks/tests (we set to false for these unit tests + // since we have no framework/test signals in fixtures — real engine would infer) + hasLanguageJsLikeEffective = hasLanguageJsLike; + hasLanguagePythonEffective = hasLanguagePython; + hasLanguageDotnetEffective = hasLanguageDotnet; + hasLanguageRustEffective = hasLanguageRust; + } else { + // hybrid: use configured if present, else inferred + hasLanguageJsLikeEffective = hasConfiguredLanguages ? hasLanguageJsLike : false; + hasLanguagePythonEffective = hasConfiguredLanguages ? hasLanguagePython : false; + hasLanguageDotnetEffective = hasConfiguredLanguages ? hasLanguageDotnet : false; + hasLanguageRustEffective = hasConfiguredLanguages ? hasLanguageRust : false; + } + + return { + languageProfileMode: mode, + hasLanguageJsLikeEffective, + hasLanguagePythonEffective, + hasLanguageDotnetEffective, + hasLanguageRustEffective, + hasLanguageBlockchain, + hasInfra: false, + }; +} + +function domainNames(rules) { + return new Set(rules.map((r) => r.domain)); +} + +// Universal domains that must always be present +const UNIVERSAL_DOMAINS = [ + 'security', + 'testing', + 'git-workflow', + 'documentation', + 'ci-cd', + 'dependency-management', + 'agent-conduct', + 'template-protection', +]; + +// --------------------------------------------------------------------------- +// Scenario 1 — JS-only project (mode: configured, languages: [javascript]) +// --------------------------------------------------------------------------- +describe('filterDomainsByStack — js-only project', () => { + const project = loadFixture('js-only-project.yaml'); + const rulesSpec = loadRulesSpec(); + const vars = buildVarsFromFixture(project); + const filtered = filterDomainsByStack(rulesSpec.rules, vars, project); + const names = domainNames(filtered); + + it('includes the typescript domain for a javascript project', () => { + expect(names.has('typescript')).toBe(true); + }); + + it('includes all universal domains', () => { + for (const d of UNIVERSAL_DOMAINS) { + expect(names.has(d), `expected universal domain "${d}" to be present`).toBe(true); + } + }); + + it('excludes dotnet — not in stack', () => { + expect(names.has('dotnet')).toBe(false); + }); + + it('excludes rust — not in stack', () => { + expect(names.has('rust')).toBe(false); + }); + + it('excludes python — not in stack', () => { + expect(names.has('python')).toBe(false); + }); + + it('excludes blockchain — not in stack', () => { + expect(names.has('blockchain')).toBe(false); + }); +}); + +// --------------------------------------------------------------------------- +// Scenario 2 — Fullstack project (typescript + dotnet + rust + solidity) +// --------------------------------------------------------------------------- +describe('filterDomainsByStack — fullstack project', () => { + const project = loadFixture('fullstack-project.yaml'); + const rulesSpec = loadRulesSpec(); + const vars = buildVarsFromFixture(project); + const filtered = filterDomainsByStack(rulesSpec.rules, vars, project); + const names = domainNames(filtered); + + it('includes typescript', () => { + expect(names.has('typescript')).toBe(true); + }); + + it('includes dotnet', () => { + expect(names.has('dotnet')).toBe(true); + }); + + it('includes rust', () => { + expect(names.has('rust')).toBe(true); + }); + + it('includes blockchain', () => { + expect(names.has('blockchain')).toBe(true); + }); + + it('includes all universal domains', () => { + for (const d of UNIVERSAL_DOMAINS) { + expect(names.has(d), `expected universal domain "${d}" to be present`).toBe(true); + } + }); + + it('excludes python — not in stack', () => { + expect(names.has('python')).toBe(false); + }); +}); + +// --------------------------------------------------------------------------- +// Scenario 3 — Explicit domains.rules override (only [typescript, security]) +// --------------------------------------------------------------------------- +describe('filterDomainsByStack — explicit domains.rules override', () => { + const project = loadFixture('explicit-domains-project.yaml'); + const rulesSpec = loadRulesSpec(); + const vars = buildVarsFromFixture(project); + const filtered = filterDomainsByStack(rulesSpec.rules, vars, project); + const names = domainNames(filtered); + + it('includes typescript — in explicit list', () => { + expect(names.has('typescript')).toBe(true); + }); + + it('includes security — in explicit list', () => { + expect(names.has('security')).toBe(true); + }); + + it('excludes testing — not in explicit list even though universal', () => { + expect(names.has('testing')).toBe(false); + }); + + it('excludes dotnet — not in explicit list despite being in stack', () => { + expect(names.has('dotnet')).toBe(false); + }); + + it('excludes rust — not in explicit list despite being in stack', () => { + expect(names.has('rust')).toBe(false); + }); + + it('has exactly 2 domains', () => { + expect(filtered.length).toBe(2); + }); +}); + +// --------------------------------------------------------------------------- +// Scenario 4 — Heuristic mode (backward compat: all domains included) +// --------------------------------------------------------------------------- +describe('filterDomainsByStack — heuristic mode (backward compat)', () => { + const project = loadFixture('heuristic-project.yaml'); + const rulesSpec = loadRulesSpec(); + const vars = buildVarsFromFixture(project); + const filtered = filterDomainsByStack(rulesSpec.rules, vars, project); + const names = domainNames(filtered); + + it('returns all domains from rules.yaml (no filtering)', () => { + expect(filtered.length).toBe(rulesSpec.rules.length); + }); + + it('includes typescript', () => { + expect(names.has('typescript')).toBe(true); + }); + + it('includes rust (even though not in stack)', () => { + expect(names.has('rust')).toBe(true); + }); + + it('includes python (even though not in stack)', () => { + expect(names.has('python')).toBe(true); + }); + + it('includes dotnet (even though not in stack)', () => { + expect(names.has('dotnet')).toBe(true); + }); +}); + +// --------------------------------------------------------------------------- +// filterTechStacks — basic coverage +// --------------------------------------------------------------------------- +describe('filterTechStacks', () => { + const stacks = [ + { name: 'node' }, + { name: 'dotnet' }, + { name: 'rust' }, + { name: 'python' }, + { name: 'custom-tool' }, // unknown — always kept + ]; + + it('keeps only node stack for a JS-only project', () => { + const vars = { + languageProfileMode: 'configured', + hasLanguageJsLikeEffective: true, + hasLanguageDotnetEffective: false, + hasLanguageRustEffective: false, + hasLanguagePythonEffective: false, + }; + const result = filterTechStacks(stacks, vars); + const names = result.map((s) => s.name); + expect(names).toContain('node'); + expect(names).not.toContain('dotnet'); + expect(names).not.toContain('rust'); + expect(names).not.toContain('python'); + expect(names).toContain('custom-tool'); // unknown always kept + }); + + it('keeps all stacks in heuristic mode', () => { + const vars = { languageProfileMode: 'heuristic' }; + const result = filterTechStacks(stacks, vars); + expect(result.length).toBe(stacks.length); + }); + + it('keeps dotnet and node for a fullstack JS+dotnet project', () => { + const vars = { + languageProfileMode: 'configured', + hasLanguageJsLikeEffective: true, + hasLanguageDotnetEffective: true, + hasLanguageRustEffective: false, + hasLanguagePythonEffective: false, + }; + const result = filterTechStacks(stacks, vars); + const names = result.map((s) => s.name); + expect(names).toContain('node'); + expect(names).toContain('dotnet'); + expect(names).not.toContain('rust'); + expect(names).not.toContain('python'); + }); + + it('returns empty array when stacks is null', () => { + const vars = { languageProfileMode: 'configured' }; + expect(filterTechStacks(null, vars)).toEqual([]); + }); +}); diff --git a/.agentkit/engines/node/src/__tests__/sync-integration.test.mjs b/.agentkit/engines/node/src/__tests__/sync-integration.test.mjs index 45fb5920..fe7c532e 100644 --- a/.agentkit/engines/node/src/__tests__/sync-integration.test.mjs +++ b/.agentkit/engines/node/src/__tests__/sync-integration.test.mjs @@ -681,7 +681,7 @@ describe('--quiet, --verbose, --no-clean, --diff flags', () => { try { await runSync({ agentkitRoot: AGENTKIT_ROOT, projectRoot, flags: { diff: true } }); const out = log.join('\n'); - expect(out).toContain('[retort:sync] Diff mode'); + expect(out).toContain('[agentkit:sync] Diff mode'); expect(out).toContain('create '); expect(out).toContain('Diff:'); expect(existsSync(join(projectRoot, 'CONTRIBUTING.md'))).toBe(false); @@ -958,13 +958,16 @@ describe('syncLanguageInstructions — generic, multi-platform dynamic generatio expect(existsSync(resolve(projectRoot, '.github', 'instructions', 'languages'))).toBe(true); }); - it('generates one file per rules.yaml domain under copilot output', { timeout: 15000 }, () => { + it('generates active stack domains under copilot output', { timeout: 15000 }, () => { const files = collectFiles(resolve(projectRoot, '.github', 'instructions', 'languages')); + // Retort spec declares [javascript, yaml, markdown] with mode: configured + // typescript + all universal domains should be present expect(files.some((f) => f.endsWith('typescript.md'))).toBe(true); - expect(files.some((f) => f.endsWith('rust.md'))).toBe(true); - expect(files.some((f) => f.endsWith('python.md'))).toBe(true); expect(files.some((f) => f.endsWith('security.md'))).toBe(true); expect(files.some((f) => f.endsWith('testing.md'))).toBe(true); + // rust/python not in stack — should be absent + expect(files.some((f) => f.endsWith('rust.md'))).toBe(false); + expect(files.some((f) => f.endsWith('python.md'))).toBe(false); }); it('generates languages/README.md for copilot target', () => { @@ -982,13 +985,10 @@ describe('syncLanguageInstructions — generic, multi-platform dynamic generatio expect(content).toContain('GENERATED by Retort'); }); - it('domain-specific template is used for rust.md', () => { - const content = readFileSync( - resolve(projectRoot, '.github', 'instructions', 'languages', 'rust.md'), - 'utf-8' - ); - expect(content).toContain('Rust'); - expect(content).toContain('GENERATED by Retort'); + it('rust.md is absent for a JS-only project', () => { + expect( + existsSync(resolve(projectRoot, '.github', 'instructions', 'languages', 'rust.md')) + ).toBe(false); }); it('ruleConventions from rules.yaml are injected into domain files', () => { @@ -1055,11 +1055,13 @@ describe('syncLanguageInstructions — claude target output (.claude/rules/langu expect(existsSync(resolve(projectRoot, '.claude', 'rules', 'languages'))).toBe(true); }); - it('generates one file per rules.yaml domain under claude output', { timeout: 15000 }, () => { + it('generates active stack domains under claude output', { timeout: 15000 }, () => { const files = collectFiles(resolve(projectRoot, '.claude', 'rules', 'languages')); + // Retort spec: [javascript] → typescript + universal domains present expect(files.some((f) => f.endsWith('typescript.md'))).toBe(true); - expect(files.some((f) => f.endsWith('rust.md'))).toBe(true); expect(files.some((f) => f.endsWith('testing.md'))).toBe(true); + // rust not in stack — should be absent + expect(files.some((f) => f.endsWith('rust.md'))).toBe(false); }); it('claude language files contain GENERATED header', () => { @@ -1114,7 +1116,7 @@ describe('syncEditorTheme (brand-driven editor theme)', () => { readFileSync(resolve(projectRoot, '.vscode', 'settings.json'), 'utf-8') ); expect(settings['_agentkit_theme']).toBeDefined(); - expect(settings['_agentkit_theme'].brand).toBe('Retort'); + expect(settings['_agentkit_theme'].brand).toBe('AgentKit Forge'); expect(settings['_agentkit_theme'].mode).toBe('both'); expect(settings['_agentkit_theme'].version).toBe('1.0.0'); }); @@ -1133,7 +1135,7 @@ describe('syncEditorTheme (brand-driven editor theme)', () => { expect(existsSync(settingsPath)).toBe(true); const settings = JSON.parse(readFileSync(settingsPath, 'utf-8')); expect(settings['workbench.colorCustomizations']).toBeDefined(); - expect(settings['_agentkit_theme'].brand).toBe('Retort'); + expect(settings['_agentkit_theme'].brand).toBe('AgentKit Forge'); }); it('generates .windsurf/settings.json with theme colors', () => { @@ -1141,7 +1143,7 @@ describe('syncEditorTheme (brand-driven editor theme)', () => { expect(existsSync(settingsPath)).toBe(true); const settings = JSON.parse(readFileSync(settingsPath, 'utf-8')); expect(settings['workbench.colorCustomizations']).toBeDefined(); - expect(settings['_agentkit_theme'].brand).toBe('Retort'); + expect(settings['_agentkit_theme'].brand).toBe('AgentKit Forge'); }); it('resolved colors are valid hex values', () => { @@ -1197,7 +1199,7 @@ describe('syncEditorTheme — pre-existing settings.json merge', () => { ); expect(settings['workbench.colorCustomizations']).toBeDefined(); expect(settings['_agentkit_theme']).toBeDefined(); - expect(settings['_agentkit_theme'].brand).toBe('Retort'); + expect(settings['_agentkit_theme'].brand).toBe('AgentKit Forge'); }); it('preserves original user-defined keys after merge', () => { diff --git a/.agentkit/engines/node/src/check.mjs b/.agentkit/engines/node/src/check.mjs index f1974b21..88243763 100644 --- a/.agentkit/engines/node/src/check.mjs +++ b/.agentkit/engines/node/src/check.mjs @@ -23,27 +23,6 @@ import { commandExists, execCommand, formatDuration, isValidCommand } from './ru * @param {string} projectRoot - Project root path * @returns {string} Command to run */ -/** - * Detect the package manager in use for a project. - * Checks package.json#packageManager first, then falls back to lockfile detection. - * @param {string} projectRoot - * @param {object} [pkg] - Already-parsed package.json (optional, avoids re-read) - * @returns {'pnpm'|'yarn'|'npm'} - */ -function detectPackageManager(projectRoot, pkg) { - // 1. Explicit declaration in package.json - const pmField = pkg?.packageManager; - if (typeof pmField === 'string') { - if (pmField.startsWith('pnpm')) return 'pnpm'; - if (pmField.startsWith('yarn')) return 'yarn'; - if (pmField.startsWith('npm')) return 'npm'; - } - // 2. Lockfile heuristic - if (existsSync(resolve(projectRoot, 'pnpm-lock.yaml'))) return 'pnpm'; - if (existsSync(resolve(projectRoot, 'yarn.lock'))) return 'yarn'; - return 'npm'; -} - function resolveTypecheckCommand(stack, projectRoot) { if (stack.name !== 'node' || !stack.typecheck || !projectRoot) return stack.typecheck; try { @@ -52,10 +31,35 @@ function resolveTypecheckCommand(stack, projectRoot) { const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')); const script = pkg.scripts?.typecheck; if (typeof script !== 'string' || !script.trim()) return stack.typecheck; - if (/^node\s+-e\s+/.test(script.trim())) return script.trim(); - const pm = detectPackageManager(projectRoot, pkg); - // pnpm and yarn can run scripts without the `run` sub-command - return pm === 'npm' ? 'npm run typecheck' : `${pm} typecheck`; + const trimmed = script.trim(); + // If the script is a simple node one-liner, run it directly to avoid + // depending on a package manager binary being present. + if (/^node\s+-e\s+/.test(trimmed)) return trimmed; + + // Otherwise, prefer running the script via the project's package manager. + // Detect package manager by lockfile + available executable, then fall + // back to any available PM, and finally to the configured stack.typecheck. + let pm = null; + if (existsSync(resolve(projectRoot, 'pnpm-lock.yaml')) && commandExists('pnpm')) { + pm = 'pnpm'; + } else if (existsSync(resolve(projectRoot, 'package-lock.json')) && commandExists('npm')) { + pm = 'npm'; + } else if (existsSync(resolve(projectRoot, 'yarn.lock')) && commandExists('yarn')) { + pm = 'yarn'; + } else if (commandExists('pnpm')) { + pm = 'pnpm'; + } else if (commandExists('npm')) { + pm = 'npm'; + } else if (commandExists('yarn')) { + pm = 'yarn'; + } + + if (pm === 'yarn') return 'yarn typecheck'; + if (pm) return `${pm} run typecheck`; + + // If we can't determine a usable package manager, fall back to the + // stack-configured command, which might be a direct executable. + return stack.typecheck; } catch { /* ignore */ } @@ -112,7 +116,9 @@ function buildSteps(stack, flags, agentkitRoot, projectRoot) { if (stack.typecheck) { const typecheckCmd = resolveTypecheckCommand(stack, projectRoot); if (!isValidCommand(typecheckCmd)) { - console.warn(`[agentkit:check] Skipping invalid typecheck command: ${typecheckCmd}`); + console.warn( + `[agentkit:check] Skipping invalid typecheck command: ${typecheckCmd} (resolved from: ${stack.typecheck})` + ); } else { steps.push({ name: 'typecheck', diff --git a/.agentkit/engines/node/src/cli.mjs b/.agentkit/engines/node/src/cli.mjs index 655f344d..2f46a2d1 100644 --- a/.agentkit/engines/node/src/cli.mjs +++ b/.agentkit/engines/node/src/cli.mjs @@ -8,6 +8,7 @@ import { existsSync, readFileSync } from 'fs'; import { parseArgs } from 'node:util'; import { dirname, resolve } from 'path'; import { fileURLToPath } from 'url'; +import { VALID_COMMANDS } from './commands-registry.mjs'; // Lazy-loaded after ensureDependencies() — js-yaml may not be installed yet let yaml; @@ -26,34 +27,8 @@ try { /* fallback to 0.0.0 */ } -const VALID_COMMANDS = [ - 'init', - 'sync', - 'validate', - 'discover', - 'spec-validate', - 'orchestrate', - 'plan', - 'check', - 'review', - 'handoff', - 'healthcheck', - 'cost', - 'project-review', - 'import-issues', - 'backlog', - 'sync-backlog', - 'add', - 'remove', - 'list', - 'features', - 'tasks', - 'delegate', - 'doctor', - 'scaffold', - 'preflight', - 'analyze-agents', -]; +// Re-export for callers that import from cli.mjs directly +export { VALID_COMMANDS } from './commands-registry.mjs'; // Workflow commands with runtime handlers const WORKFLOW_COMMANDS = ['orchestrate', 'plan', 'check', 'review', 'handoff', 'healthcheck']; @@ -492,12 +467,13 @@ async function main() { process.exit(1); } - // Early --help check before dependency installation to avoid side effects. - if (commandArgs.includes('--help') || commandArgs.includes('-h')) { + // Short-circuit help for subcommands before dependency checks and dynamic imports. + if (Array.isArray(commandArgs) && commandArgs.some((arg) => arg === '--help' || arg === '-h')) { showHelp(); process.exit(0); } + if (!ensureDependencies(AGENTKIT_ROOT)) { process.exit(1); } diff --git a/.agentkit/engines/node/src/commands-registry.mjs b/.agentkit/engines/node/src/commands-registry.mjs new file mode 100644 index 00000000..288dab7c --- /dev/null +++ b/.agentkit/engines/node/src/commands-registry.mjs @@ -0,0 +1,52 @@ +/** + * Retort — Command Registry + * Single source of truth for CLI command names. + * Imported by both cli.mjs (routing) and validate.mjs (parity check). + */ + +/** All commands the CLI recognises. Keep in sync with commands.yaml. */ +export const VALID_COMMANDS = [ + 'init', + 'sync', + 'validate', + 'discover', + 'spec-validate', + 'orchestrate', + 'plan', + 'check', + 'review', + 'handoff', + 'healthcheck', + 'cost', + 'project-review', + 'import-issues', + 'backlog', + 'sync-backlog', + 'add', + 'remove', + 'list', + 'features', + 'tasks', + 'delegate', + 'doctor', + 'scaffold', + 'preflight', + 'analyze-agents', + 'cicd-optimize', +]; + +/** + * CLI-only commands intentionally absent from the user-facing commands.yaml spec. + * These are framework internals, not slash commands. + */ +export const FRAMEWORK_COMMANDS = new Set([ + 'validate', + 'spec-validate', + 'add', + 'remove', + 'list', + 'tasks', + 'delegate', + 'features', + 'init', +]); diff --git a/.agentkit/engines/node/src/doctor.mjs b/.agentkit/engines/node/src/doctor.mjs index e08093b6..a3baf93a 100644 --- a/.agentkit/engines/node/src/doctor.mjs +++ b/.agentkit/engines/node/src/doctor.mjs @@ -1,5 +1,5 @@ /** - * Retort — Doctor + * AgentKit Forge — Doctor * Repository diagnostics and setup checks. */ import { execSync } from 'child_process'; @@ -312,8 +312,10 @@ export async function runDoctor({ agentkitRoot, projectRoot, flags = {} }) { if (existsSync(gitattrsPath)) { const gitattrs = readFileSync(gitattrsPath, 'utf-8'); const hasMarkers = - gitattrs.includes('# >>> Retort merge drivers') && - gitattrs.includes('# <<< Retort merge drivers'); + (gitattrs.includes('# >>> Retort merge drivers') || + gitattrs.includes('# >>> AgentKit Forge merge drivers')) && + (gitattrs.includes('# <<< Retort merge drivers') || + gitattrs.includes('# <<< AgentKit Forge merge drivers')); const hasMergeRules = gitattrs.includes('merge=agentkit-generated'); if (!hasMergeRules) { diff --git a/.agentkit/engines/node/src/init.mjs b/.agentkit/engines/node/src/init.mjs index faa7d282..d3fb01e3 100644 --- a/.agentkit/engines/node/src/init.mjs +++ b/.agentkit/engines/node/src/init.mjs @@ -9,6 +9,7 @@ * --non-interactive Skip prompts, use auto-detected defaults * --ci Alias for --non-interactive * --preset minimal | full | team | infra + * --dry-run Show what would be generated without writing files */ import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; import yaml from 'js-yaml'; @@ -192,6 +193,7 @@ function applyExternalKnowledgeFlags(project, flags = {}) { export async function runInit({ agentkitRoot, projectRoot, flags }) { const force = flags.force || false; + const dryRun = flags['dry-run'] || false; const nonInteractive = flags['non-interactive'] || flags.ci || false; const preset = flags.preset || null; const rawRepoName = flags.repoName ?? basename(projectRoot); @@ -246,6 +248,7 @@ export async function runInit({ agentkitRoot, projectRoot, flags }) { if (nonInteractive || process.env.CI) { console.log('[agentkit:init] Non-interactive mode — using auto-detected defaults.'); applyPresetDefaults(project, preset); + applyDetectedKitDefaults(project, report); const presetDef = preset ? PRESETS[preset] : PRESETS.full; return await finalizeInit({ agentkitRoot, @@ -255,6 +258,7 @@ export async function runInit({ agentkitRoot, projectRoot, flags }) { renderTargets: presetDef.renderTargets, featurePreset: presetDef.featurePreset || 'standard', force, + dryRun, }); } @@ -262,6 +266,7 @@ export async function runInit({ agentkitRoot, projectRoot, flags }) { if (preset) { console.log(`[agentkit:init] Using preset: ${PRESETS[preset].label}`); applyPresetDefaults(project, preset); + applyDetectedKitDefaults(project, report); return await finalizeInit({ agentkitRoot, projectRoot, @@ -270,6 +275,7 @@ export async function runInit({ agentkitRoot, projectRoot, flags }) { renderTargets: PRESETS[preset].renderTargets, featurePreset: PRESETS[preset].featurePreset || 'standard', force, + dryRun, }); } @@ -281,6 +287,7 @@ export async function runInit({ agentkitRoot, projectRoot, flags }) { console.warn( '[agentkit:init] @clack/prompts not available — falling back to non-interactive mode.' ); + applyDetectedKitDefaults(project, report); return await finalizeInit({ agentkitRoot, projectRoot, @@ -289,11 +296,79 @@ export async function runInit({ agentkitRoot, projectRoot, flags }) { renderTargets: PRESETS.full.renderTargets, featurePreset: 'standard', force, + dryRun, }); } clack.intro('Retort — Project Setup'); + // --- Kit detection display --- + const STACK_TO_DOMAIN = { + javascript: 'typescript', + typescript: 'typescript', + node: 'typescript', + csharp: 'dotnet', + dotnet: 'dotnet', + rust: 'rust', + python: 'python', + solidity: 'blockchain', + blockchain: 'blockchain', + }; + const UNIVERSAL_KIT_NAMES = [ + 'security', + 'testing', + 'git-workflow', + 'documentation', + 'ci-cd', + 'dependency-management', + 'agent-conduct', + ]; + + const detectedLangDomains = new Set(); + for (const stack of report.techStacks) { + const domain = STACK_TO_DOMAIN[(stack.name || '').toLowerCase()]; + if (domain) detectedLangDomains.add(domain); + } + const iacDetectedFromReport = !!detectIacTool(report); + + const kitSummaryLines = []; + if (detectedLangDomains.size > 0) { + kitSummaryLines.push('Language kits (auto-detected from stack):'); + for (const d of detectedLangDomains) kitSummaryLines.push(` ✓ ${d}`); + } else { + kitSummaryLines.push('Language kits: none detected'); + } + kitSummaryLines.push(''); + kitSummaryLines.push('Universal kits (always included):'); + kitSummaryLines.push(` ✓ ${UNIVERSAL_KIT_NAMES.join(', ')}`); + if (iacDetectedFromReport) kitSummaryLines.push(' ✓ iac (detected from infra/)'); + clack.note(kitSummaryLines.join('\n'), 'Kit detection — nothing forced'); + + // --- Optional kit selection --- + const optionalKitChoices = await clack.multiselect({ + message: 'Additional kits to activate (space to toggle)', + options: [ + { + value: 'iac', + label: 'iac — Terraform / Bicep / Pulumi', + hint: iacDetectedFromReport ? 'auto-detected' : 'no infra/ directory found', + }, + { value: 'finops', label: 'finops — Azure cost tracking' }, + { value: 'ai-cost-ops', label: 'ai-cost-ops — LLM token budgets' }, + ], + initialValues: iacDetectedFromReport ? ['iac'] : [], + required: false, + }); + + if (clack.isCancel(optionalKitChoices)) { + clack.cancel('Init cancelled.'); + process.exit(0); + } + + const selectedOptionalKits = Array.isArray(optionalKitChoices) ? optionalKitChoices : []; + // Persist kit selections to project for sync engine consumption + applyKitSelections(project, report, selectedOptionalKits); + // --- Phase 1: Project Identity --- const identity = await clack.group({ name: () => @@ -670,6 +745,7 @@ export async function runInit({ agentkitRoot, projectRoot, flags }) { featurePreset, enabledFeatures, force, + dryRun, }); } @@ -686,7 +762,38 @@ async function finalizeInit({ featurePreset, enabledFeatures, force, + dryRun = false, }) { + // --- Dry-run: show plan without writing --- + if (dryRun) { + const langs = project.stack?.languages || []; + const mode = project.automation?.languageProfile?.mode || 'configured'; + const features = []; + if (project.features?.aiCostOps) features.push('ai-cost-ops'); + if (project.features?.finops) features.push('finops'); + const featureInfo = enabledFeatures + ? `${enabledFeatures.length} features (custom)` + : featurePreset + ? `preset: ${featurePreset}` + : 'default features'; + + console.log('\n[agentkit:init] DRY-RUN — no files will be written\n'); + console.log(` Repo name: ${repoName}`); + console.log(` Languages: ${langs.join(', ') || 'none'}`); + console.log(` Language mode: ${mode}`); + console.log( + ` Features: ${featureInfo}${features.length ? ' + ' + features.join(', ') : ''}` + ); + console.log(` Render targets: ${renderTargets.join(', ')}`); + console.log(''); + console.log(' Would write:'); + console.log(` .agentkit/overlays/${repoName}/settings.yaml`); + console.log(' .agentkit/spec/project.yaml'); + console.log(' .agentkit-repo'); + console.log(' (+ all sync outputs for configured render targets)'); + console.log('\n Run without --dry-run to generate.\n'); + return; + } // 1. Copy __TEMPLATE__ overlay const templateDir = resolve(agentkitRoot, 'overlays', '__TEMPLATE__'); const overlayDir = resolve(agentkitRoot, 'overlays', repoName); @@ -985,6 +1092,48 @@ function writeProjectYaml(filePath, project) { // Detection helpers // --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// Kit helpers +// --------------------------------------------------------------------------- + +/** + * Applies kit defaults to project based on auto-detected stack. + * Used by non-interactive / preset / fallback paths so they get the same + * language-profile configuration as the interactive wizard. + */ +function applyDetectedKitDefaults(project, report) { + project.automation = project.automation || {}; + project.automation.languageProfile = project.automation.languageProfile || {}; + // Non-interactive defaults to 'hybrid' so heuristic detection still works + if (!project.automation.languageProfile.mode) { + project.automation.languageProfile.mode = 'hybrid'; + } +} + +/** + * Persists interactive kit selections to the project object for project.yaml. + * Called after the optional-kit multiselect prompt. + */ +function applyKitSelections(project, report, selectedOptionalKits) { + project.automation = project.automation || {}; + project.automation.languageProfile = project.automation.languageProfile || {}; + project.automation.languageProfile.mode = 'configured'; + + if (selectedOptionalKits.includes('ai-cost-ops')) { + project.features = project.features || {}; + project.features.aiCostOps = true; + } + if (selectedOptionalKits.includes('finops')) { + project.features = project.features || {}; + project.features.finops = true; + } + if (selectedOptionalKits.includes('iac') && !detectIacTool(report)) { + // User explicitly opted into iac but no IaC tool was detected — default to terraform + project.deployment = project.deployment || {}; + if (!project.deployment.iacTool) project.deployment.iacTool = 'terraform'; + } +} + function detectCloudProvider(report) { if (report.infrastructure.includes('bicep')) return 'azure'; if (report.infrastructure.includes('terraform')) return null; diff --git a/.agentkit/engines/node/src/propose-skill.mjs b/.agentkit/engines/node/src/propose-skill.mjs new file mode 100644 index 00000000..867134c9 --- /dev/null +++ b/.agentkit/engines/node/src/propose-skill.mjs @@ -0,0 +1,105 @@ +/** + * AgentKit Forge — propose-skill + * + * Promotes a local skill from .agents/skills// to org-meta/skills// + * by creating a branch and copying the SKILL.md file. + * + * Usage: + * node propose-skill.mjs + * pnpm ak:propose-skill + * + * What it does: + * 1. Reads the skill from {projectRoot}/.agents/skills//SKILL.md + * 2. Resolves the org-meta path (ORG_META_PATH env var or ~/repos/org-meta) + * 3. Creates a new git branch: feat/propose-skill- + * 4. Copies the SKILL.md to org-meta/skills//SKILL.md + * 5. Prints instructions for the next steps (commit, push, PR) + */ +import { execFileSync } from 'child_process'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { dirname, join, resolve } from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function log(msg) { + process.stdout.write(msg + '\n'); +} + +function err(msg) { + process.stderr.write(`[propose-skill] Error: ${msg}\n`); + process.exit(1); +} + +function resolveOrgMetaPath() { + return process.env.ORG_META_PATH + ? resolve(process.env.ORG_META_PATH) + : resolve(process.env.HOME || process.env.USERPROFILE || '~', 'repos', 'org-meta'); +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +const skillName = process.argv[2]; + +if (!skillName || skillName.startsWith('-')) { + log('Usage: pnpm ak:propose-skill '); + log(''); + log('Promotes a local skill from .agents/skills// to org-meta/skills//.'); + log('The skill must exist in the current repo and NOT already be in skills.yaml.'); + process.exit(0); +} + +const projectRoot = process.cwd(); +const localSkillPath = join(projectRoot, '.agents', 'skills', skillName, 'SKILL.md'); + +if (!existsSync(localSkillPath)) { + err(`Skill '${skillName}' not found at ${localSkillPath}`); +} + +const orgMetaRoot = resolveOrgMetaPath(); +if (!existsSync(orgMetaRoot)) { + err(`org-meta not found at ${orgMetaRoot}. Set ORG_META_PATH env var to override.`); +} + +const destDir = join(orgMetaRoot, 'skills', skillName); +const destPath = join(destDir, 'SKILL.md'); + +if (existsSync(destPath)) { + log(`[propose-skill] '${skillName}' already exists in org-meta at ${destPath}`); + log('If you want to update it, edit the file directly and open a PR in org-meta.'); + process.exit(0); +} + +// Read the local skill content +const content = readFileSync(localSkillPath, 'utf-8'); + +// Create branch in org-meta +const branchName = `feat/propose-skill-${skillName}`; +log(`[propose-skill] Creating branch '${branchName}' in org-meta...`); +try { + execFileSync('git', ['checkout', '-b', branchName], { cwd: orgMetaRoot, stdio: 'pipe' }); +} catch (e) { + err(`Failed to create branch: ${e?.message ?? e}`); +} + +// Write the skill file +mkdirSync(destDir, { recursive: true }); +writeFileSync(destPath, content, 'utf-8'); +log(`[propose-skill] Wrote ${destPath}`); + +// Print next steps +log(''); +log('Next steps:'); +log(` cd ${orgMetaRoot}`); +log(` git add skills/${skillName}/SKILL.md`); +log(` git commit -m "feat(skills): propose ${skillName} from downstream repo"`); +log(` git push -u origin ${branchName}`); +log(' # Then open a PR against org-meta main'); +log(''); +log(`Once merged, add '${skillName}' to .agentkit/spec/skills.yaml with source: org-meta.`); diff --git a/.agentkit/engines/node/src/spec-validator.mjs b/.agentkit/engines/node/src/spec-validator.mjs index bf02ad0d..7a7b644f 100644 --- a/.agentkit/engines/node/src/spec-validator.mjs +++ b/.agentkit/engines/node/src/spec-validator.mjs @@ -120,7 +120,7 @@ const agentSchema = { // --------------------------------------------------------------------------- // Schema: commands.yaml // --------------------------------------------------------------------------- -const VALID_COMMAND_TYPES = ['workflow', 'team', 'utility']; +const VALID_COMMAND_TYPES = ['workflow', 'team', 'utility', 'framework']; const VALID_TOOLS = [ 'Read', 'Write', diff --git a/.agentkit/engines/node/src/synchronize.mjs b/.agentkit/engines/node/src/synchronize.mjs index 1958b679..8cd62c65 100644 --- a/.agentkit/engines/node/src/synchronize.mjs +++ b/.agentkit/engines/node/src/synchronize.mjs @@ -29,6 +29,7 @@ import { import { categorizeFile, computeProjectCompleteness, + filterDomainsByStack, flattenProjectYaml, formatCommandFlags, insertHeader, @@ -479,6 +480,8 @@ ${GITATTR_START} # GENERATED by Retort v${version} — regenerated on every sync. # These custom merge drivers auto-resolve conflicts on framework-managed files. # Driver "agentkit-generated" accepts the incoming (upstream/theirs) version. +# Only scaffold:always files are listed — scaffold:managed files (CLAUDE.md, +# settings.json, etc.) are intentionally excluded so user edits are preserved. # # To activate locally, run: # git config merge.agentkit-generated.name "Accept upstream for generated files" @@ -486,19 +489,43 @@ ${GITATTR_START} # # Or use: scripts/resolve-merge.sh -# --- Generated agent/skill/prompt packs (always accept upstream) --- -.agents/skills/**/SKILL.md merge=agentkit-generated +# --- Claude Code: agents, commands, rules, hooks, skills --- +.claude/agents/*.md merge=agentkit-generated +.claude/commands/*.md merge=agentkit-generated +.claude/rules/**/*.md merge=agentkit-generated +.claude/hooks/*.sh merge=agentkit-generated +.claude/hooks/*.ps1 merge=agentkit-generated +.claude/skills/**/SKILL.md merge=agentkit-generated + +# --- Cursor: commands and rules --- +.cursor/commands/*.md merge=agentkit-generated +.cursor/rules/**/*.md merge=agentkit-generated + +# --- Windsurf: commands, rules, and workflows --- +.windsurf/commands/*.md merge=agentkit-generated +.windsurf/rules/**/*.md merge=agentkit-generated +.windsurf/workflows/*.yml merge=agentkit-generated + +# --- Cline rules --- +.clinerules/**/*.md merge=agentkit-generated + +# --- Roo rules --- +.roo/rules/**/*.md merge=agentkit-generated + +# --- GitHub Copilot: instructions, agents, chatmodes, prompts --- +.github/instructions/**/*.md merge=agentkit-generated .github/agents/*.agent.md merge=agentkit-generated .github/chatmodes/*.chatmode.md merge=agentkit-generated .github/prompts/*.prompt.md merge=agentkit-generated - -# --- Generated doc indexes (always accept upstream) --- -docs/*/README.md merge=agentkit-generated - -# --- Generated config files (always accept upstream) --- .github/copilot-instructions.md merge=agentkit-generated .github/PULL_REQUEST_TEMPLATE.md merge=agentkit-generated +# --- Agent skills packs --- +.agents/skills/**/SKILL.md merge=agentkit-generated + +# --- Generated doc indexes --- +docs/*/README.md merge=agentkit-generated + # --- Lock files (accept upstream, regenerate after merge) --- pnpm-lock.yaml merge=agentkit-generated .agentkit/pnpm-lock.yaml merge=agentkit-generated @@ -1280,6 +1307,124 @@ async function syncCodexSkills(templatesDir, tmpDir, vars, version, repoName, co } } +// --------------------------------------------------------------------------- +// Org-meta skill distribution + uptake detection +// --------------------------------------------------------------------------- + +/** + * Resolves the path to the org-meta skills directory. + * Priority: ORG_META_PATH env var → ~/repos/org-meta (default) + * + * @returns {string} + */ +function resolveOrgMetaSkillsDir() { + const base = process.env.ORG_META_PATH + ? resolve(process.env.ORG_META_PATH) + : resolve(process.env.HOME || process.env.USERPROFILE || '~', 'repos', 'org-meta'); + return join(base, 'skills'); +} + +/** + * Copies org-meta skills (source: org-meta) into tmpDir/.agents/skills//SKILL.md. + * Non-destructive: if the skill already exists in projectRoot with different content, + * the file is NOT written to tmpDir — the local version is preserved. + * + * @param {string} tmpDir - Temp directory for sync output + * @param {string} projectRoot - Actual project root (for diffing existing files) + * @param {object} skillsSpec - Parsed skills.yaml + * @param {function} log - Logger + */ +async function syncOrgMetaSkills(tmpDir, projectRoot, skillsSpec, log) { + const orgMetaSkillsDir = resolveOrgMetaSkillsDir(); + if (!existsSync(orgMetaSkillsDir)) { + log(`[agentkit:sync] org-meta skills: directory not found at ${orgMetaSkillsDir} — skipping`); + return; + } + + const orgMetaSkills = (skillsSpec.skills || []).filter((s) => s.source === 'org-meta'); + + for (const skill of orgMetaSkills) { + const srcPath = join(orgMetaSkillsDir, skill.name, 'SKILL.md'); + if (!existsSync(srcPath)) { + log(`[agentkit:sync] org-meta skill '${skill.name}' not found at ${srcPath} — skipping`); + continue; + } + + const destRelPath = join('.agents', 'skills', skill.name, 'SKILL.md'); + const destProjectPath = join(projectRoot, destRelPath); + + // If local version exists and differs, preserve it (non-destructive) + if (existsSync(destProjectPath)) { + const localContent = readFileSync(destProjectPath, 'utf-8'); + const srcContent = readFileSync(srcPath, 'utf-8'); + if (localContent !== srcContent) { + log( + `[agentkit:sync] org-meta skill '${skill.name}' differs from local — preserving local copy` + ); + continue; + } + } + + const content = readFileSync(srcPath, 'utf-8'); + await writeOutput(join(tmpDir, destRelPath), content); + } +} + +/** + * Scans projectRoot/.agents/skills/ for skill directories not listed in skills.yaml. + * Appends unknown skill names to .agents/skills/_unknown/report.md in tmpDir. + * This is the non-destructive uptake mechanism — unknown skills are never overwritten, + * only reported. Use `pnpm ak:propose-skill ` to promote them to org-meta. + * + * @param {string} tmpDir - Temp directory for sync output + * @param {string} projectRoot - Actual project root (for reading existing skills) + * @param {object} skillsSpec - Parsed skills.yaml + * @param {string} syncDate - ISO date string (YYYY-MM-DD) + * @param {function} log - Logger + */ +async function syncUnknownSkillsReport(tmpDir, projectRoot, skillsSpec, syncDate, log) { + const localSkillsDir = join(projectRoot, '.agents', 'skills'); + if (!existsSync(localSkillsDir)) return; + + const knownNames = new Set((skillsSpec.skills || []).map((s) => s.name)); + let entries; + try { + entries = await readdir(localSkillsDir, { withFileTypes: true }); + } catch { + return; + } + + const unknownSkills = entries + .filter((e) => e.isDirectory() && e.name !== '_unknown' && !knownNames.has(e.name)) + .map((e) => e.name); + + if (unknownSkills.length === 0) return; + + log( + `[agentkit:sync] Found ${unknownSkills.length} local skill(s) not in skills.yaml: ${unknownSkills.join(', ')}` + ); + + const reportPath = join(tmpDir, '.agents', 'skills', '_unknown', 'report.md'); + + // Read existing report from projectRoot (if any) to append rather than replace + const existingReportPath = join(projectRoot, '.agents', 'skills', '_unknown', 'report.md'); + let existingContent = ''; + if (existsSync(existingReportPath)) { + existingContent = readFileSync(existingReportPath, 'utf-8'); + } + + // Build new entries (only skills not already listed in the report) + const newEntries = unknownSkills.filter((name) => !existingContent.includes(`| \`${name}\``)); + if (newEntries.length === 0) return; + + const header = existingContent + ? '' + : `# Unknown Skills — Uptake Candidates\n\nSkills found in \`.agents/skills/\` that are not in \`skills.yaml\`.\n\nTo promote a skill: \`pnpm ak:propose-skill \`\n\n| Skill | First Seen | Action |\n|-------|------------|--------|\n`; + + const rows = newEntries.map((name) => `| \`${name}\` | ${syncDate} | pending |\n`).join(''); + await writeOutput(reportPath, existingContent + header + rows); +} + // --------------------------------------------------------------------------- // Warp sync helper // --------------------------------------------------------------------------- @@ -1777,6 +1922,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { const rulesSpec = readYaml(resolve(agentkitRoot, 'spec', 'rules.yaml')) || {}; const settingsSpec = readYaml(resolve(agentkitRoot, 'spec', 'settings.yaml')) || {}; const agentsSpec = readYaml(resolve(agentkitRoot, 'spec', 'agents.yaml')) || {}; + const skillsSpec = readYaml(resolve(agentkitRoot, 'spec', 'skills.yaml')) || {}; const docsSpec = readYaml(resolve(agentkitRoot, 'spec', 'docs.yaml')) || {}; const sectionsSpec = readYaml(resolve(agentkitRoot, 'spec', 'sections.yaml')) || {}; const projectSpec = readYaml(resolve(agentkitRoot, 'spec', 'project.yaml')); @@ -1864,7 +2010,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { commandPrefix: overlaySettings.commandPrefix || null, syncDate: new Date().toISOString().slice(0, 10), lastModel: process.env.AGENTKIT_LAST_MODEL || 'sync-engine', - lastAgent: process.env.AGENTKIT_LAST_AGENT || 'agentkit-forge', + lastAgent: process.env.AGENTKIT_LAST_AGENT || 'retort', // Branch protection defaults — ensure generated scripts produce valid // JSON even when project.yaml omits the branchProtection section. bpRequiredReviewCount: projectVars.bpRequiredReviewCount ?? '1', @@ -1935,6 +2081,15 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { vars.teamsList = buildTeamsList(rawTeams); vars.hasTeams = rawTeams.length > 0; + // Filter rule domains to those matching the active language stack. + // Universal domains (security, testing, git-workflow, etc.) are always included. + // heuristic mode keeps all domains for backward compatibility. + // An explicit `domains.rules` list in project.yaml overrides auto-detection. + const filteredRulesSpec = { + ...rulesSpec, + rules: filterDomainsByStack(rulesSpec.rules, vars, projectSpec), + }; + // Resolve render targets — determines which tool outputs to generate let targets = resolveRenderTargets(overlaySettings.renderTargets, flags); @@ -2055,7 +2210,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { version, headerRepoName, agentsSpec, - rulesSpec + filteredRulesSpec ), syncDirectCopy( templatesDir, @@ -2088,7 +2243,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { vars, version, headerRepoName, - rulesSpec, + filteredRulesSpec, '.claude/rules/languages', 'claude' ) @@ -2119,7 +2274,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { vars, version, headerRepoName, - rulesSpec, + filteredRulesSpec, '.cursor/rules/languages', 'cursor' ) @@ -2168,7 +2323,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { vars, version, headerRepoName, - rulesSpec, + filteredRulesSpec, '.windsurf/rules/languages', 'windsurf' ) @@ -2202,7 +2357,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { version, headerRepoName, agentsSpec, - rulesSpec + filteredRulesSpec ), syncCopilotChatModes( templatesDir, @@ -2222,7 +2377,7 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { vars, version, headerRepoName, - rulesSpec, + filteredRulesSpec, '.github/instructions/languages', 'copilot' ) @@ -2236,7 +2391,9 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { if (targets.has('codex')) { gatedTasks.push( - syncCodexSkills(templatesDir, tmpDir, vars, version, headerRepoName, commandsSpec) + syncCodexSkills(templatesDir, tmpDir, vars, version, headerRepoName, commandsSpec), + syncOrgMetaSkills(tmpDir, projectRoot, skillsSpec, log), + syncUnknownSkillsReport(tmpDir, projectRoot, skillsSpec, vars.syncDate, log) ); } @@ -2247,14 +2404,14 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { if (targets.has('cline')) { if (isFeatureEnabled('coding-rules', vars)) { gatedTasks.push( - syncClineRules(templatesDir, tmpDir, vars, version, headerRepoName, rulesSpec), + syncClineRules(templatesDir, tmpDir, vars, version, headerRepoName, filteredRulesSpec), syncLanguageInstructions( templatesDir, tmpDir, vars, version, headerRepoName, - rulesSpec, + filteredRulesSpec, '.clinerules/languages', 'cline' ) @@ -2265,14 +2422,14 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { if (targets.has('roo')) { if (isFeatureEnabled('coding-rules', vars)) { gatedTasks.push( - syncRooRules(templatesDir, tmpDir, vars, version, headerRepoName, rulesSpec), + syncRooRules(templatesDir, tmpDir, vars, version, headerRepoName, filteredRulesSpec), syncLanguageInstructions( templatesDir, tmpDir, vars, version, headerRepoName, - rulesSpec, + filteredRulesSpec, '.roo/rules/languages', 'roo' ) @@ -2598,6 +2755,24 @@ export async function runSync({ agentkitRoot, projectRoot, flags }) { } } + // Content-hash guard: skip write if content is identical to the existing file. + // This prevents mtime churn on generated files that haven't logically changed, + // reducing adopter merge-conflict counts on framework-update merges. + if (existsSync(destFile)) { + const newHash = newManifestFiles[normalizedRel]?.hash; + if (newHash) { + const existingContent = await readFile(destFile); + const existingHash = createHash('sha256') + .update(existingContent) + .digest('hex') + .slice(0, 12); + if (existingHash === newHash) { + logVerbose(` unchanged ${normalizedRel} (content identical, skipping write)`); + return; + } + } + } + try { await ensureDir(dirname(destFile)); await cp(srcFile, destFile, { force: true, recursive: false }); diff --git a/.agentkit/engines/node/src/template-utils.mjs b/.agentkit/engines/node/src/template-utils.mjs index f47b50b9..c9460b23 100644 --- a/.agentkit/engines/node/src/template-utils.mjs +++ b/.agentkit/engines/node/src/template-utils.mjs @@ -718,7 +718,22 @@ export function getCommentStyle(ext) { export function insertHeader(content, ext, version, repoName) { const header = getGeneratedHeader(version, repoName, ext); if (!header) return content; // JSON / template — no comment syntax - if (content.includes('GENERATED by Retort')) return content; // already present + if (content.includes('GENERATED by Retort')) return content; // already present (current) + + // Replace legacy AgentKit Forge header with current Retort header rather than + // prepending a second header — keeps generated files clean after the rename. + if (content.includes('GENERATED by AgentKit Forge')) { + // Strip all contiguous comment lines at the start (the old header block) + const lines = content.split('\n'); + const commentPrefixes = [' + + + +# cicd-optimize + +CI/CD pipeline and local hook optimizer. Audits GitHub Actions workflows, pre-commit/stop hooks, and test configurations for speed bottlenecks. Identifies caching gaps, sequential jobs that could parallelize, missing path filters, redundant installs, and slow hook steps. Produces a prioritized list of improvements with estimated time savings per fix. + +## Usage + +Invoke this skill when you need to perform the `cicd-optimize` operation. + +## Role + +You are the **CI/CD Optimization Agent**. Analyse this project's CI/CD pipelines and local hooks for speed bottlenecks. Produce a prioritized report with concrete, copy-paste-ready fixes. + +## Step 1 — Inventory + +Collect all CI/CD surface area: + +- `.github/workflows/*.yml` — list each workflow, its triggers, jobs, and steps +- `.claude/hooks/` — list each hook file and its purpose +- `package.json` scripts: `lint`, `test`, `build`, `typecheck` +- Test framework config: `vitest.config.*`, `jest.config.*`, `pytest.ini`, `Cargo.toml [profile.test]` +- Lock files: `pnpm-lock.yaml`, `Cargo.lock`, `poetry.lock` + +## Step 2 — Bottleneck Detection + +For each workflow, check: + +### Caching + +- [ ] Node modules cached? (`actions/cache` with `node_modules` or `pnpm store`) +- [ ] Cargo registry cached? (`~/.cargo/registry` and `target/`) +- [ ] pip/poetry cached? (`~/.cache/pip`) +- [ ] Docker layer cache used? (`cache-from: type=gha`) + +### Parallelization + +- [ ] Jobs that depend on each other but don't need to — should they be parallel? +- [ ] Test suites that could use matrix strategy or `--pool` (vitest), `pytest-xdist`, `cargo nextest` +- [ ] Lint and typecheck run sequentially when they're independent + +### Trigger efficiency + +- [ ] Workflows triggered on `push` to all branches — should use `paths:` filters +- [ ] PR workflows trigger on `push` AND `pull_request` — often redundant +- [ ] Scheduled workflows running more frequently than needed + +### Install efficiency + +- [ ] `npm install` / `pnpm install` without `--frozen-lockfile` (slower) +- [ ] Install steps duplicated across jobs (should use artifacts or caching) +- [ ] `node_modules` copied between jobs instead of restored from cache + +### Hook efficiency + +- [ ] Stop hook runs tests or full builds (should be lint-only with file-change gating) +- [ ] Pre-commit hook runs expensive operations without caching +- [ ] Hooks run regardless of which files changed + +## Step 3 — Test Suite Speed + +Check for parallelization opportunities: + +- vitest: `--pool=threads` or `--pool=forks`, `--reporter=verbose` adding noise +- pytest: `pytest-xdist` (`-n auto`), test isolation issues +- cargo: `cargo nextest` (2-3x faster than `cargo test`) +- jest: `--maxWorkers` configuration + +## Step 4 — Report + +Produce a table sorted by estimated time savings (highest first): + +| # | Area | Issue | Fix | Est. saving | +| --- | ---- | ----- | --- | ----------- | +| 1 | ... | ... | ... | ~Xs per run | + +Then provide **Ready-to-apply fixes** — code blocks for each high-impact change, in order. For workflow changes, show the exact YAML diff. For hook changes, show the exact shell change. For config changes, show the file and the new content. + +## Rules + +1. Only suggest changes with clear, measurable benefit. Skip micro-optimisations. +2. Preserve correctness — never suggest removing a cache that would break reproducibility. +3. Flag any changes that require secrets or environment variables. +4. If a fix requires a new dependency (e.g. cargo-nextest), note the install command. + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused changes +- Maintain backwards compatibility +- Include tests for behavioral changes +- Never expose secrets or credentials +- Follow the project's established patterns diff --git a/.agents/skills/handoff/SKILL.md b/.agents/skills/handoff/SKILL.md index 34884389..0c1bfeca 100644 --- a/.agents/skills/handoff/SKILL.md +++ b/.agents/skills/handoff/SKILL.md @@ -1,15 +1,15 @@ --- name: 'handoff' description: 'Generates a structured handoff document for the current session. Captures what was accomplished, what remains, open questions, and context needed by the next session or developer. Writes to docs/ai_handoffs/.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Codex agent skill definition. # Docs: https://developers.openai.com/codex/guides/agents-md --- - - + + # handoff @@ -45,7 +45,7 @@ Invoke this skill when you need to perform the `handoff` operation. ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.agents/skills/healthcheck/SKILL.md b/.agents/skills/healthcheck/SKILL.md index 0a1db9f6..4215b488 100644 --- a/.agents/skills/healthcheck/SKILL.md +++ b/.agents/skills/healthcheck/SKILL.md @@ -1,15 +1,15 @@ --- name: 'healthcheck' description: 'Performs a comprehensive health check of the repository: validates builds, runs tests, checks linting, verifies configuration files, and reports on the overall state of the codebase across all detected tech stacks.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Codex agent skill definition. # Docs: https://developers.openai.com/codex/guides/agents-md --- - - + + # healthcheck @@ -45,7 +45,7 @@ Invoke this skill when you need to perform the `healthcheck` operation. ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.agents/skills/init/SKILL.md b/.agents/skills/init/SKILL.md new file mode 100644 index 00000000..220ddb3b --- /dev/null +++ b/.agents/skills/init/SKILL.md @@ -0,0 +1,79 @@ +--- +name: 'init' +description: 'Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing.' +generated_by: 'retort' +last_model: 'sync-engine' +last_updated: '2026-03-20' +# Format: YAML frontmatter + Markdown body. Codex agent skill definition. +# Docs: https://developers.openai.com/codex/guides/agents-md +--- + + + + + +# init + +Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing. + +## Usage + +Invoke this skill when you need to perform the `init` operation. + +## Role + +You are the **Init Agent**. Guide users through initialising a new Retort project in the current repository. + +## How to Initialise + +Run the init command from the repository root: + +```bash +node .agentkit/engines/node/src/cli.mjs init +``` + +Or if pnpm is available: + +```bash +pnpm -C .agentkit agentkit:init +``` + +## Flags + +| Flag | Effect | +| ------------------- | ------------------------------------------------------ | +| `--dry-run` | Show what would be generated without writing any files | +| `--non-interactive` | Skip prompts, use auto-detected defaults | +| `--preset ` | Use a preset: minimal, full, team, infra | +| `--force` | Overwrite existing overlay configuration | +| `--repoName ` | Override the detected repository name | + +## Kit Selection + +During interactive init, Retort detects your tech stack and shows which +language kits will be activated (typescript, dotnet, rust, python, blockchain). +Universal kits (security, testing, git-workflow, documentation, ci-cd, +dependency-management, agent-conduct) are always included. + +Optional kits (iac, finops, ai-cost-ops) are presented for explicit opt-in. + +## Post-Init + +1. Review the generated `spec/project.yaml` — fill in any `null` fields +2. Run `/sync` to regenerate all AI tool configurations +3. Run `/validate` to verify generated outputs are well-formed +4. Commit both the spec and generated outputs together + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused changes +- Maintain backwards compatibility +- Include tests for behavioral changes +- Never expose secrets or credentials +- Follow the project's established patterns diff --git a/.agents/skills/project-review/SKILL.md b/.agents/skills/project-review/SKILL.md index 97427cb9..754900aa 100644 --- a/.agents/skills/project-review/SKILL.md +++ b/.agents/skills/project-review/SKILL.md @@ -1,15 +1,15 @@ --- name: 'project-review' description: 'Comprehensive production-grade project review and assessment. Systematically analyzes code quality, architecture, security, UX, performance, documentation, and feature completeness. Produces structured findings with a prioritized roadmap organized into implementation waves.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Codex agent skill definition. # Docs: https://developers.openai.com/codex/guides/agents-md --- - - + + # project-review @@ -44,7 +44,7 @@ Invoke this skill when you need to perform the `project-review` operation. ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.ai/README.md b/.ai/README.md index 82fc9d29..2efc7b79 100644 --- a/.ai/README.md +++ b/.ai/README.md @@ -1,5 +1,5 @@ - - + + # .ai — Tool-Agnostic AI Rules diff --git a/.ai/continuerules b/.ai/continuerules index 4581b275..0a7b7d68 100644 --- a/.ai/continuerules +++ b/.ai/continuerules @@ -1,3 +1,6 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync Follow UNIFIED_AGENT_TEAMS.md and CLAUDE.md. Use /discover → /healthcheck → /plan → implement → /check → /review. Never modify .env, secrets, or credential files. diff --git a/.ai/cursorrules b/.ai/cursorrules index d5e79dbd..1eab0fe5 100644 --- a/.ai/cursorrules +++ b/.ai/cursorrules @@ -1,3 +1,6 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync Follow UNIFIED_AGENT_TEAMS.md and CLAUDE.md. Use /discover → /healthcheck → /plan → implement → /check → /review. Never modify .env, secrets, or credential files. diff --git a/.ai/windsurfrules b/.ai/windsurfrules index 4581b275..0a7b7d68 100644 --- a/.ai/windsurfrules +++ b/.ai/windsurfrules @@ -1,3 +1,6 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync Follow UNIFIED_AGENT_TEAMS.md and CLAUDE.md. Use /discover → /healthcheck → /plan → implement → /check → /review. Never modify .env, secrets, or credential files. diff --git a/.claude/commands/handoff.md b/.claude/commands/handoff.md index 735d32e5..132f0247 100644 --- a/.claude/commands/handoff.md +++ b/.claude/commands/handoff.md @@ -1,15 +1,15 @@ --- description: 'Write a session handoff summary for continuity between sessions' allowed-tools: Bash(git *), Bash(mkdir *) -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Claude slash command. # Docs: https://docs.anthropic.com/en/docs/claude-code/memory#slash-commands --- - - + + # Session Handoff diff --git a/.claude/commands/healthcheck.md b/.claude/commands/healthcheck.md index fce20fb7..28fda0a2 100644 --- a/.claude/commands/healthcheck.md +++ b/.claude/commands/healthcheck.md @@ -1,15 +1,15 @@ --- description: 'Pre-flight validation — verify build, lint, typecheck, and tests all pass' allowed-tools: Bash(git *), Bash(npm *), Bash(pnpm *), Bash(npx *), Bash(dotnet *), Bash(cargo *), Bash(python *), Bash(pip *), Bash(pytest *), Bash(go *) -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Claude slash command. # Docs: https://docs.anthropic.com/en/docs/claude-code/memory#slash-commands --- - - + + # Healthcheck diff --git a/.claude/commands/project-review.md b/.claude/commands/project-review.md index 5dc66183..a1c976ab 100644 --- a/.claude/commands/project-review.md +++ b/.claude/commands/project-review.md @@ -1,7 +1,7 @@ --- description: 'Comprehensive production-grade project review and assessment' allowed-tools: Read, Glob, Grep, Bash, Bash(gh issue create*), Bash(gh issue list*), Bash(gh issue view*), Bash(linear *), WebSearch, WebFetch -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Claude slash command. @@ -123,7 +123,7 @@ Propose updates to: ## Template & Generated-Format Issue Filing -During Phase 1c analysis, any finding that targets a **generated file** (contains ` + + + +# cicd-optimize + +CI/CD pipeline and local hook optimizer. Audits GitHub Actions workflows, pre-commit/stop hooks, and test configurations for speed bottlenecks. Identifies caching gaps, sequential jobs that could parallelize, missing path filters, redundant installs, and slow hook steps. Produces a prioritized list of improvements with estimated time savings per fix. + +## Usage + +Invoke this skill when you need to perform the `cicd-optimize` operation. + +## Role + +You are the **CI/CD Optimization Agent**. Analyse this project's CI/CD pipelines and local hooks for speed bottlenecks. Produce a prioritized report with concrete, copy-paste-ready fixes. + +## Step 1 — Inventory + +Collect all CI/CD surface area: + +- `.github/workflows/*.yml` — list each workflow, its triggers, jobs, and steps +- `.claude/hooks/` — list each hook file and its purpose +- `package.json` scripts: `lint`, `test`, `build`, `typecheck` +- Test framework config: `vitest.config.*`, `jest.config.*`, `pytest.ini`, `Cargo.toml [profile.test]` +- Lock files: `pnpm-lock.yaml`, `Cargo.lock`, `poetry.lock` + +## Step 2 — Bottleneck Detection + +For each workflow, check: + +### Caching + +- [ ] Node modules cached? (`actions/cache` with `node_modules` or `pnpm store`) +- [ ] Cargo registry cached? (`~/.cargo/registry` and `target/`) +- [ ] pip/poetry cached? (`~/.cache/pip`) +- [ ] Docker layer cache used? (`cache-from: type=gha`) + +### Parallelization + +- [ ] Jobs that depend on each other but don't need to — should they be parallel? +- [ ] Test suites that could use matrix strategy or `--pool` (vitest), `pytest-xdist`, `cargo nextest` +- [ ] Lint and typecheck run sequentially when they're independent + +### Trigger efficiency + +- [ ] Workflows triggered on `push` to all branches — should use `paths:` filters +- [ ] PR workflows trigger on `push` AND `pull_request` — often redundant +- [ ] Scheduled workflows running more frequently than needed + +### Install efficiency + +- [ ] `npm install` / `pnpm install` without `--frozen-lockfile` (slower) +- [ ] Install steps duplicated across jobs (should use artifacts or caching) +- [ ] `node_modules` copied between jobs instead of restored from cache + +### Hook efficiency + +- [ ] Stop hook runs tests or full builds (should be lint-only with file-change gating) +- [ ] Pre-commit hook runs expensive operations without caching +- [ ] Hooks run regardless of which files changed + +## Step 3 — Test Suite Speed + +Check for parallelization opportunities: + +- vitest: `--pool=threads` or `--pool=forks`, `--reporter=verbose` adding noise +- pytest: `pytest-xdist` (`-n auto`), test isolation issues +- cargo: `cargo nextest` (2-3x faster than `cargo test`) +- jest: `--maxWorkers` configuration + +## Step 4 — Report + +Produce a table sorted by estimated time savings (highest first): + +| # | Area | Issue | Fix | Est. saving | +| --- | ---- | ----- | --- | ----------- | +| 1 | ... | ... | ... | ~Xs per run | + +Then provide **Ready-to-apply fixes** — code blocks for each high-impact change, in order. For workflow changes, show the exact YAML diff. For hook changes, show the exact shell change. For config changes, show the file and the new content. + +## Rules + +1. Only suggest changes with clear, measurable benefit. Skip micro-optimisations. +2. Preserve correctness — never suggest removing a cache that would break reproducibility. +3. Flag any changes that require secrets or environment variables. +4. If a fix requires a new dependency (e.g. cargo-nextest), note the install command. + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused changes +- Maintain backwards compatibility +- Include tests for behavioral changes +- Never expose secrets or credentials +- Follow the project's established patterns diff --git a/.claude/skills/handoff/SKILL.md b/.claude/skills/handoff/SKILL.md index 1dbda2d0..d26953cc 100644 --- a/.claude/skills/handoff/SKILL.md +++ b/.claude/skills/handoff/SKILL.md @@ -1,15 +1,15 @@ --- name: 'handoff' description: 'Generates a structured handoff document for the current session. Captures what was accomplished, what remains, open questions, and context needed by the next session or developer. Writes to docs/ai_handoffs/.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Claude skill definition. # Docs: https://docs.anthropic.com/en/docs/claude-code/memory --- - - + + # handoff @@ -54,7 +54,7 @@ what has been reviewed or executed. ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.claude/skills/healthcheck/SKILL.md b/.claude/skills/healthcheck/SKILL.md index 8450e481..3d1f86d2 100644 --- a/.claude/skills/healthcheck/SKILL.md +++ b/.claude/skills/healthcheck/SKILL.md @@ -1,15 +1,15 @@ --- name: 'healthcheck' description: 'Performs a comprehensive health check of the repository: validates builds, runs tests, checks linting, verifies configuration files, and reports on the overall state of the codebase across all detected tech stacks.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Claude skill definition. # Docs: https://docs.anthropic.com/en/docs/claude-code/memory --- - - + + # healthcheck @@ -54,7 +54,7 @@ what has been reviewed or executed. ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.claude/skills/init/SKILL.md b/.claude/skills/init/SKILL.md new file mode 100644 index 00000000..10b3cb4d --- /dev/null +++ b/.claude/skills/init/SKILL.md @@ -0,0 +1,79 @@ +--- +name: 'init' +description: 'Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing.' +generated_by: 'retort' +last_model: 'sync-engine' +last_updated: '2026-03-20' +# Format: YAML frontmatter + Markdown body. Claude skill definition. +# Docs: https://docs.anthropic.com/en/docs/claude-code/memory +--- + + + + + +# init + +Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing. + +## Usage + +Invoke this skill when you need to perform the `init` operation. + +## Role + +You are the **Init Agent**. Guide users through initialising a new Retort project in the current repository. + +## How to Initialise + +Run the init command from the repository root: + +```bash +node .agentkit/engines/node/src/cli.mjs init +``` + +Or if pnpm is available: + +```bash +pnpm -C .agentkit agentkit:init +``` + +## Flags + +| Flag | Effect | +| ------------------- | ------------------------------------------------------ | +| `--dry-run` | Show what would be generated without writing any files | +| `--non-interactive` | Skip prompts, use auto-detected defaults | +| `--preset ` | Use a preset: minimal, full, team, infra | +| `--force` | Overwrite existing overlay configuration | +| `--repoName ` | Override the detected repository name | + +## Kit Selection + +During interactive init, Retort detects your tech stack and shows which +language kits will be activated (typescript, dotnet, rust, python, blockchain). +Universal kits (security, testing, git-workflow, documentation, ci-cd, +dependency-management, agent-conduct) are always included. + +Optional kits (iac, finops, ai-cost-ops) are presented for explicit opt-in. + +## Post-Init + +1. Review the generated `spec/project.yaml` — fill in any `null` fields +2. Run `/sync` to regenerate all AI tool configurations +3. Run `/validate` to verify generated outputs are well-formed +4. Commit both the spec and generated outputs together + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused changes +- Maintain backwards compatibility +- Include tests for behavioral changes +- Never expose secrets or credentials +- Follow the project's established patterns diff --git a/.claude/skills/project-review/SKILL.md b/.claude/skills/project-review/SKILL.md index 8c07d74d..0d800ee4 100644 --- a/.claude/skills/project-review/SKILL.md +++ b/.claude/skills/project-review/SKILL.md @@ -1,15 +1,15 @@ --- name: 'project-review' description: 'Comprehensive production-grade project review and assessment. Systematically analyzes code quality, architecture, security, UX, performance, documentation, and feature completeness. Produces structured findings with a prioritized roadmap organized into implementation waves.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-05' # Format: YAML frontmatter + Markdown body. Claude skill definition. # Docs: https://docs.anthropic.com/en/docs/claude-code/memory --- - - + + # project-review @@ -53,7 +53,7 @@ what has been reviewed or executed. ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.claude/worktrees/focused-colden/.agentkit/.manifest.json b/.claude/worktrees/focused-colden/.agentkit/.manifest.json deleted file mode 100644 index 3fb43dd8..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.manifest.json +++ /dev/null @@ -1,1873 +0,0 @@ -{ - "generatedAt": "2026-03-17T06:36:41.261Z", - "version": "3.1.0", - "repoName": "agentkit-forge", - "files": { - ".agents/skills/analyze-agents/SKILL.md": { - "hash": "e42eee25c9fd" - }, - ".agents/skills/brand/SKILL.md": { - "hash": "4f819e2e0d69" - }, - ".agents/skills/cost-centres/SKILL.md": { - "hash": "3140d48f16b0" - }, - ".agentkit/state/orchestrator.json.template": { - "hash": "b70e87b7211b" - }, - ".agents/skills/deploy/SKILL.md": { - "hash": "2e1330fd693e" - }, - ".agentkit/state/schema.json": { - "hash": "b47a7efcd922" - }, - ".agents/skills/build/SKILL.md": { - "hash": "d325dae8f934" - }, - ".agents/skills/backlog/SKILL.md": { - "hash": "2dc8e5c1d39b" - }, - ".agents/skills/check/SKILL.md": { - "hash": "fc46476bca7b" - }, - ".agents/skills/feature-flow/SKILL.md": { - "hash": "ec9b155a84e6" - }, - ".agents/skills/expand/SKILL.md": { - "hash": "d9883bcc8f88" - }, - ".agents/skills/discover/SKILL.md": { - "hash": "9ac71caf6992" - }, - ".agents/skills/cost/SKILL.md": { - "hash": "834badf6646b" - }, - ".agents/skills/document-history/SKILL.md": { - "hash": "e82dbff8c514" - }, - ".agents/skills/import-issues/SKILL.md": { - "hash": "e2d105f8b201" - }, - ".agents/skills/orchestrate/SKILL.md": { - "hash": "2b6c677c66a3" - }, - ".agents/skills/feature-configure/SKILL.md": { - "hash": "c11f2cc3273b" - }, - ".agents/skills/infra-eval/SKILL.md": { - "hash": "37505d91a1c5" - }, - ".agents/skills/feature-review/SKILL.md": { - "hash": "da38a280ec45" - }, - ".agents/skills/doctor/SKILL.md": { - "hash": "9d9e7ffcaf71" - }, - ".agents/skills/project-status/SKILL.md": { - "hash": "9a47cc64914b" - }, - ".agents/skills/format/SKILL.md": { - "hash": "0cdb87886f36" - }, - ".agents/skills/preflight/SKILL.md": { - "hash": "85c05dc2c072" - }, - ".agents/skills/plan/SKILL.md": { - "hash": "71c44b0ef7b1" - }, - ".agents/skills/review/SKILL.md": { - "hash": "00b236ee680f" - }, - ".agents/skills/security/SKILL.md": { - "hash": "3127f1e216c9" - }, - ".agents/skills/start/SKILL.md": { - "hash": "f0cd8fd39b4a" - }, - ".agents/skills/scaffold/SKILL.md": { - "hash": "ff8fb03eecd2" - }, - ".agents/skills/validate/SKILL.md": { - "hash": "30bc2a0427be" - }, - ".agents/skills/test/SKILL.md": { - "hash": "3c02bdac8593" - }, - ".agents/skills/sync-backlog/SKILL.md": { - "hash": "6a3ad80bff8d" - }, - ".claude/agents/adoption-strategist.md": { - "hash": "e0f5197c5140" - }, - ".ai/continuerules": { - "hash": "2d40023b7c45" - }, - ".agents/skills/sync/SKILL.md": { - "hash": "c25161dc8913" - }, - ".claude/agents/backend.md": { - "hash": "738bca85b556" - }, - ".ai/cursorrules": { - "hash": "32f8f48220f6" - }, - ".claude/agents/cost-ops-monitor.md": { - "hash": "9f195cfb5ab3" - }, - ".ai/README.md": { - "hash": "608c681edb4e" - }, - ".claude/agents/content-strategist.md": { - "hash": "bdea95fbdc97" - }, - ".claude/agents/brand-guardian.md": { - "hash": "06321324ad8c" - }, - ".claude/agents/coverage-tracker.md": { - "hash": "faf2173529c5" - }, - ".claude/agents/devops.md": { - "hash": "8623979399e3" - }, - ".claude/agents/dependency-watcher.md": { - "hash": "1317fdcdbdc6" - }, - ".claude/agents/environment-manager.md": { - "hash": "7630c0856682" - }, - ".claude/agents/data.md": { - "hash": "95222b841a68" - }, - ".ai/windsurfrules": { - "hash": "2d40023b7c45" - }, - ".claude/agents/expansion-analyst.md": { - "hash": "1acec03026a0" - }, - ".claude/agents/feature-ops.md": { - "hash": "f7a55b2e0a57" - }, - ".claude/agents/frontend.md": { - "hash": "2e553b7926ef" - }, - ".claude/agents/flow-designer.md": { - "hash": "0e0423753fd8" - }, - ".claude/agents/growth-analyst.md": { - "hash": "f8eec3b1e625" - }, - ".claude/agents/impact-assessor.md": { - "hash": "86fdde8309c2" - }, - ".claude/agents/input-clarifier.md": { - "hash": "10e22accb2c0" - }, - ".claude/agents/infra.md": { - "hash": "49829cf96e63" - }, - ".claude/agents/model-economist.md": { - "hash": "87e470197ac4" - }, - ".claude/agents/integration-tester.md": { - "hash": "9c537deec75e" - }, - ".claude/agents/governance-advisor.md": { - "hash": "6fde5c50bf67" - }, - ".claude/agents/grant-hunter.md": { - "hash": "906ddfa7eeb1" - }, - ".claude/agents/mission-definer.md": { - "hash": "530ef4249f0b" - }, - ".claude/agents/portfolio-analyst.md": { - "hash": "b85f4d82d325" - }, - ".claude/agents/prompt-engineer.md": { - "hash": "3f98b589828e" - }, - ".claude/agents/release-manager.md": { - "hash": "74293815fa62" - }, - ".claude/agents/product-manager.md": { - "hash": "ae255ee14143" - }, - ".claude/agents/project-shipper.md": { - "hash": "627257130af4" - }, - ".claude/agents/release-coordinator.md": { - "hash": "df573b60959d" - }, - ".claude/agents/roadmap-tracker.md": { - "hash": "89ddfff0b104" - }, - ".claude/agents/role-architect.md": { - "hash": "ff8dfe28ea56" - }, - ".claude/agents/retrospective-analyst.md": { - "hash": "ee7cdb422865" - }, - ".claude/agents/security-auditor.md": { - "hash": "1cbf3ad0f91d" - }, - ".claude/agents/spec-compliance-auditor.md": { - "hash": "177cc631b0a2" - }, - ".claude/agents/team-validator.md": { - "hash": "bee9c68baeac" - }, - ".claude/agents/test-lead.md": { - "hash": "45e8abd92aaf" - }, - ".claude/agents/token-efficiency-engineer.md": { - "hash": "c5e07b99dbc3" - }, - ".claude/commands/backlog.md": { - "hash": "22a8d07575b3" - }, - ".claude/agents/vendor-arbitrage-analyst.md": { - "hash": "48daa9f47218" - }, - ".claude/agents/ui-designer.md": { - "hash": "a3e99552415f" - }, - ".claude/commands/brand.md": { - "hash": "472c7438a795" - }, - ".claude/commands/check.md": { - "hash": "ca6dd1de5d9a" - }, - ".claude/commands/cost-centres.md": { - "hash": "07ead7d1c63f" - }, - ".claude/commands/build.md": { - "hash": "fee9680802e1" - }, - ".claude/commands/cost.md": { - "hash": "2392989dddaa" - }, - ".claude/commands/doctor.md": { - "hash": "8fa0fd26e893" - }, - ".claude/commands/deploy.md": { - "hash": "adc2c2629b09" - }, - ".claude/commands/discover.md": { - "hash": "8fe679961a27" - }, - ".claude/commands/expand.md": { - "hash": "f3b8f79ccd05" - }, - ".claude/commands/document-history.md": { - "hash": "c99673f9ae3c" - }, - ".claude/commands/feature-configure.md": { - "hash": "ee21aacdcd29" - }, - ".claude/commands/feature-flow.md": { - "hash": "d1b8207a2a5a" - }, - ".claude/commands/feature-review.md": { - "hash": "fced358b99eb" - }, - ".claude/commands/import-issues.md": { - "hash": "6331f512f2b8" - }, - ".claude/commands/infra-eval.md": { - "hash": "8a58ea808952" - }, - ".claude/commands/format.md": { - "hash": "a3f0eee9b52e" - }, - ".claude/commands/orchestrate.md": { - "hash": "574c6938b38d" - }, - ".claude/commands/plan.md": { - "hash": "0eca590818b3" - }, - ".claude/commands/project-status.md": { - "hash": "0565edacffae" - }, - ".claude/commands/preflight.md": { - "hash": "4a65b6271bd6" - }, - ".claude/commands/scaffold.md": { - "hash": "4b3cd870e0fc" - }, - ".claude/commands/security.md": { - "hash": "5efa63762b04" - }, - ".claude/commands/review.md": { - "hash": "e32bc6f663ab" - }, - ".claude/commands/start.md": { - "hash": "d172290d22db" - }, - ".claude/commands/sync-backlog.md": { - "hash": "2352a7d04323" - }, - ".claude/commands/sync.md": { - "hash": "efd3cfb56eed" - }, - ".claude/commands/team-cost-ops.md": { - "hash": "812a2d58a81e" - }, - ".claude/commands/team-backend.md": { - "hash": "f7e4f2d9d9b7" - }, - ".claude/commands/team-devops.md": { - "hash": "715a51cc4892" - }, - ".claude/commands/team-data.md": { - "hash": "ac4681cf9293" - }, - ".claude/commands/team-docs.md": { - "hash": "3deff18a07e9" - }, - ".claude/commands/team-infra.md": { - "hash": "436ecc831ca4" - }, - ".claude/commands/team-forge.md": { - "hash": "ff14d00c8c6c" - }, - ".claude/commands/team-frontend.md": { - "hash": "93f516367115" - }, - ".claude/commands/team-security.md": { - "hash": "39f9d0c7d438" - }, - ".claude/commands/team-quality.md": { - "hash": "201199588ab2" - }, - ".claude/commands/team-testing.md": { - "hash": "0d04836de633" - }, - ".claude/commands/team-strategic-ops.md": { - "hash": "5c65b47e2d4f" - }, - ".claude/hooks/budget-guard-check.sh": { - "hash": "4fabe38fe963" - }, - ".claude/commands/validate.md": { - "hash": "db126df15cad" - }, - ".claude/commands/team-product.md": { - "hash": "d0388844667d" - }, - ".claude/hooks/guard-destructive-commands.ps1": { - "hash": "55a58d211c2c" - }, - ".claude/hooks/guard-destructive-commands.sh": { - "hash": "155b707b2af0" - }, - ".claude/commands/test.md": { - "hash": "dff6e64066e4" - }, - ".claude/hooks/pre-push-validate.sh": { - "hash": "86db6d107d60" - }, - ".claude/hooks/protect-sensitive.ps1": { - "hash": "59c32beeb28b" - }, - ".claude/hooks/protect-sensitive.sh": { - "hash": "f064ddda7879" - }, - ".claude/hooks/protect-templates.sh": { - "hash": "04a1d69ea578" - }, - ".claude/hooks/protect-templates.ps1": { - "hash": "0b14c70ee6ef" - }, - ".claude/hooks/session-start.sh": { - "hash": "bf976e3ffb1a" - }, - ".claude/hooks/stop-build-check.ps1": { - "hash": "16d00d311940" - }, - ".claude/hooks/warn-uncommitted.ps1": { - "hash": "e01cd78b2c17" - }, - ".claude/hooks/stop-build-check.sh": { - "hash": "8aecebcef7b7" - }, - ".claude/hooks/warn-uncommitted.sh": { - "hash": "b224fa6b1b1f" - }, - ".claude/rules/blockchain.md": { - "hash": "6ebb3c6166c1" - }, - ".claude/hooks/session-start.ps1": { - "hash": "7d50dcf043f4" - }, - ".claude/rules/documentation.md": { - "hash": "041b08cabcc0" - }, - ".claude/rules/agent-conduct.md": { - "hash": "a9204d8e7dc4" - }, - ".claude/rules/ci-cd.md": { - "hash": "4eb972787de8" - }, - ".claude/rules/git-workflow.md": { - "hash": "16df971f4442" - }, - ".claude/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".claude/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".claude/rules/dependency-management.md": { - "hash": "d0089754e232" - }, - ".claude/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".claude/rules/dotnet.md": { - "hash": "afd3bc539ab3" - }, - ".claude/rules/iac.md": { - "hash": "7389f06f50fe" - }, - ".claude/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".claude/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".claude/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".claude/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".claude/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".claude/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".claude/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".claude/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".claude/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".claude/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".claude/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".claude/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".claude/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".claude/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".claude/rules/quality.md": { - "hash": "478859ffbb93" - }, - ".claude/rules/rust.md": { - "hash": "653b8dfb73b5" - }, - ".claude/rules/template-protection.md": { - "hash": "e0eca318e94b" - }, - ".claude/rules/testing.md": { - "hash": "3e7853b624e1" - }, - ".claude/skills/brand/SKILL.md": { - "hash": "b4de2f51b106" - }, - ".claude/settings.json": { - "hash": "b5f6aee20306" - }, - ".claude/skills/backlog/SKILL.md": { - "hash": "de8c81512467" - }, - ".claude/rules/typescript.md": { - "hash": "1b050804b6ef" - }, - ".claude/skills/analyze-agents/SKILL.md": { - "hash": "3d77831e022a" - }, - ".claude/skills/cost/SKILL.md": { - "hash": "7276c4052975" - }, - ".claude/rules/python.md": { - "hash": "842f7d201c27" - }, - ".claude/skills/build/SKILL.md": { - "hash": "77448a90e59b" - }, - ".claude/skills/check/SKILL.md": { - "hash": "6d7d38148af5" - }, - ".claude/skills/deploy/SKILL.md": { - "hash": "f5cbd6d04c02" - }, - ".claude/rules/security.md": { - "hash": "3ed7f09d1ad0" - }, - ".claude/skills/cost-centres/SKILL.md": { - "hash": "738667d8716f" - }, - ".claude/skills/discover/SKILL.md": { - "hash": "ef2e7d50b511" - }, - ".claude/skills/expand/SKILL.md": { - "hash": "fd58b1775fd1" - }, - ".claude/skills/doctor/SKILL.md": { - "hash": "310dce98d8f4" - }, - ".claude/skills/feature-configure/SKILL.md": { - "hash": "4320cc00be36" - }, - ".claude/skills/feature-flow/SKILL.md": { - "hash": "cd75ad612f63" - }, - ".claude/skills/document-history/SKILL.md": { - "hash": "074d8a3cab21" - }, - ".claude/skills/format/SKILL.md": { - "hash": "3f2951d68edf" - }, - ".claude/skills/import-issues/SKILL.md": { - "hash": "7fb72bc4c4a2" - }, - ".claude/skills/plan/SKILL.md": { - "hash": "28fd3cc22953" - }, - ".claude/skills/orchestrate/SKILL.md": { - "hash": "8950d5dbb641" - }, - ".claude/skills/preflight/SKILL.md": { - "hash": "b6ad1a083bac" - }, - ".claude/skills/project-status/SKILL.md": { - "hash": "8df33d0cb8c9" - }, - ".claude/skills/infra-eval/SKILL.md": { - "hash": "7a4eedae11b3" - }, - ".claude/skills/review/SKILL.md": { - "hash": "8386eb6c97ee" - }, - ".claude/skills/start/SKILL.md": { - "hash": "a987a611b567" - }, - ".claude/skills/scaffold/SKILL.md": { - "hash": "9291d71bc86b" - }, - ".claude/skills/security/SKILL.md": { - "hash": "1520feb2bf97" - }, - ".claude/skills/feature-review/SKILL.md": { - "hash": "b556218af259" - }, - ".claude/skills/sync/SKILL.md": { - "hash": "19de7f1cc4cb" - }, - ".claude/skills/test/SKILL.md": { - "hash": "21da74147f13" - }, - ".claude/skills/sync-backlog/SKILL.md": { - "hash": "cea14e0c67fc" - }, - ".clinerules/agent-conduct.md": { - "hash": "58310e525ade" - }, - ".claude/skills/validate/SKILL.md": { - "hash": "112b57703063" - }, - ".clinerules/ai-cost-ops.md": { - "hash": "464c1fde7714" - }, - ".clinerules/blockchain.md": { - "hash": "21750f5c565c" - }, - ".clinerules/ci-cd.md": { - "hash": "d6b6698178f3" - }, - ".clinerules/dependency-management.md": { - "hash": "909464fb0495" - }, - ".clinerules/documentation.md": { - "hash": "a947fca57aca" - }, - ".clinerules/dotnet.md": { - "hash": "d978b656d898" - }, - ".clinerules/finops.md": { - "hash": "c02b0486012f" - }, - ".clinerules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".clinerules/git-workflow.md": { - "hash": "0ce8ea97c321" - }, - ".clinerules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".clinerules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".clinerules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".clinerules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".clinerules/iac.md": { - "hash": "12318597c6ca" - }, - ".clinerules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".clinerules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".clinerules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".clinerules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".clinerules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".clinerules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".clinerules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".clinerules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".clinerules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".clinerules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".clinerules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".clinerules/python.md": { - "hash": "0d1ed61bb8dc" - }, - ".clinerules/rust.md": { - "hash": "dc2f173fa092" - }, - ".clinerules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".clinerules/security.md": { - "hash": "9cefb19e63e5" - }, - ".clinerules/testing.md": { - "hash": "fba2f07c5a5b" - }, - ".clinerules/template-protection.md": { - "hash": "ea83904b6713" - }, - ".cursor/commands/analyze-agents.md": { - "hash": "024e3cec1f56" - }, - ".cursor/commands/backlog.md": { - "hash": "c6b5aa7de695" - }, - ".cursor/commands/brand.md": { - "hash": "63960929d9fc" - }, - ".cursor/commands/build.md": { - "hash": "74cc820e6fc1" - }, - ".clinerules/typescript.md": { - "hash": "c77f9043197a" - }, - ".cursor/commands/check.md": { - "hash": "9373b3fca5ff" - }, - ".cursor/commands/cost-centres.md": { - "hash": "143856799eda" - }, - ".cursor/commands/cost.md": { - "hash": "9c338e5f33b1" - }, - ".cursor/commands/deploy.md": { - "hash": "cd5b2f461cd7" - }, - ".cursor/commands/document-history.md": { - "hash": "975b4458c2c1" - }, - ".cursor/commands/feature-configure.md": { - "hash": "9b071a084415" - }, - ".cursor/commands/expand.md": { - "hash": "089462f22f52" - }, - ".cursor/commands/doctor.md": { - "hash": "c619f9e3b1e6" - }, - ".cursor/commands/feature-flow.md": { - "hash": "7d7a302552c6" - }, - ".cursor/commands/discover.md": { - "hash": "60be19c91420" - }, - ".cursor/commands/feature-review.md": { - "hash": "021c98874605" - }, - ".cursor/commands/format.md": { - "hash": "5be0e24ce07a" - }, - ".cursor/commands/import-issues.md": { - "hash": "2acded7ac4fa" - }, - ".cursor/commands/infra-eval.md": { - "hash": "313ed28d7c7f" - }, - ".cursor/commands/orchestrate.md": { - "hash": "e2f5928cdb2f" - }, - ".cursor/commands/plan.md": { - "hash": "0af99fb78d12" - }, - ".cursor/commands/preflight.md": { - "hash": "6d1a97bd57d5" - }, - ".cursor/commands/project-status.md": { - "hash": "7a0056181045" - }, - ".cursor/commands/review.md": { - "hash": "e1853e4abdb9" - }, - ".cursor/commands/scaffold.md": { - "hash": "69986b1530cf" - }, - ".cursor/commands/sync-backlog.md": { - "hash": "a6282eab6689" - }, - ".cursor/commands/sync.md": { - "hash": "513bea4ea974" - }, - ".cursor/commands/test.md": { - "hash": "0f83a2bdea71" - }, - ".cursor/commands/security.md": { - "hash": "1a4e4a4d8cf6" - }, - ".cursor/commands/start.md": { - "hash": "a72ec5c139fe" - }, - ".cursor/commands/validate.md": { - "hash": "5bc457b26628" - }, - ".cursor/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".cursor/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".cursor/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".cursor/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".cursor/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".cursor/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".cursor/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".cursor/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".cursor/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".cursor/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".cursor/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".cursor/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".cursor/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".cursor/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".cursor/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".cursor/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".cursor/rules/orchestrate.mdc": { - "hash": "9853913b4857" - }, - ".cursor/rules/project-context.mdc": { - "hash": "dd6859b78404" - }, - ".cursor/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".cursor/rules/security.mdc": { - "hash": "24c286e725a3" - }, - ".cursor/rules/team-backend.mdc": { - "hash": "66c7510720e1" - }, - ".cursor/rules/team-cost-ops.mdc": { - "hash": "545aecedca0b" - }, - ".cursor/rules/team-data.mdc": { - "hash": "412987c5fb0e" - }, - ".cursor/rules/team-devops.mdc": { - "hash": "0fe62d640199" - }, - ".cursor/rules/team-forge.mdc": { - "hash": "a238f2cc330b" - }, - ".cursor/rules/team-frontend.mdc": { - "hash": "82a998fe0de5" - }, - ".cursor/rules/team-docs.mdc": { - "hash": "b0ccc30e6b77" - }, - ".cursor/rules/team-infra.mdc": { - "hash": "d5f6f094dc30" - }, - ".cursor/rules/team-product.mdc": { - "hash": "153f579d8b04" - }, - ".cursor/rules/team-security.mdc": { - "hash": "9778f59babaa" - }, - ".cursor/rules/team-quality.mdc": { - "hash": "f70002d21c69" - }, - ".cursor/rules/team-testing.mdc": { - "hash": "e5e949b5a9ad" - }, - ".editorconfig": { - "hash": "fa09dda3d2e2" - }, - ".cursor/rules/team-strategic-ops.mdc": { - "hash": "00d0e2e368e4" - }, - ".gemini/styleguide.md": { - "hash": "b3f330f5df8f" - }, - ".gemini/config.yaml": { - "hash": "8f50c65f25fb" - }, - ".github/agents/adoption-strategist.agent.md": { - "hash": "5d2836dcb475" - }, - ".gitattributes": { - "hash": "90af26762384" - }, - ".github/agents/brand-guardian.agent.md": { - "hash": "c2461a9a8466" - }, - ".github/agents/content-strategist.agent.md": { - "hash": "c2544a299b60" - }, - ".github/agents/backend.agent.md": { - "hash": "0d127baccf58" - }, - ".github/agents/cost-ops-monitor.agent.md": { - "hash": "4188ea493644" - }, - ".github/agents/coverage-tracker.agent.md": { - "hash": "0ec9cd09509b" - }, - ".github/agents/dependency-watcher.agent.md": { - "hash": "e85baf4d0d46" - }, - ".github/agents/environment-manager.agent.md": { - "hash": "d2e9a801a5e5" - }, - ".github/agents/devops.agent.md": { - "hash": "ffe4f3317ec8" - }, - ".github/agents/flow-designer.agent.md": { - "hash": "d09c5f1d7cd2" - }, - ".github/agents/expansion-analyst.agent.md": { - "hash": "45e7e34e7877" - }, - ".github/agents/data.agent.md": { - "hash": "a55f855de262" - }, - ".github/agents/feature-ops.agent.md": { - "hash": "c4ba3dc907f6" - }, - ".github/agents/frontend.agent.md": { - "hash": "778677e3a2f1" - }, - ".github/agents/grant-hunter.agent.md": { - "hash": "7d849df31023" - }, - ".github/agents/governance-advisor.agent.md": { - "hash": "35e92bcae9d0" - }, - ".github/agents/infra.agent.md": { - "hash": "8c8d3a4f1adf" - }, - ".github/agents/input-clarifier.agent.md": { - "hash": "63f969a72bc4" - }, - ".github/agents/growth-analyst.agent.md": { - "hash": "25e3b42da3aa" - }, - ".github/agents/mission-definer.agent.md": { - "hash": "4ba6262d5eb8" - }, - ".github/agents/portfolio-analyst.agent.md": { - "hash": "fa3fe9e48a52" - }, - ".github/agents/integration-tester.agent.md": { - "hash": "b34beafad1bd" - }, - ".github/agents/impact-assessor.agent.md": { - "hash": "98a4559e208d" - }, - ".github/agents/model-economist.agent.md": { - "hash": "b3ea5f80581d" - }, - ".github/agents/project-shipper.agent.md": { - "hash": "93e8ef14bb8f" - }, - ".github/agents/product-manager.agent.md": { - "hash": "9d3da17ae6f3" - }, - ".github/agents/prompt-engineer.agent.md": { - "hash": "778f224899a3" - }, - ".github/agents/release-coordinator.agent.md": { - "hash": "dfa94cb6ff6f" - }, - ".github/agents/release-manager.agent.md": { - "hash": "e58484632ca0" - }, - ".github/agents/retrospective-analyst.agent.md": { - "hash": "143b2fd6c727" - }, - ".github/agents/spec-compliance-auditor.agent.md": { - "hash": "e2b66fe05d2b" - }, - ".github/agents/roadmap-tracker.agent.md": { - "hash": "0fdd8e9b7985" - }, - ".github/agents/role-architect.agent.md": { - "hash": "217b0f7d6bc5" - }, - ".github/agents/security-auditor.agent.md": { - "hash": "1f8a11a72b17" - }, - ".github/agents/team-validator.agent.md": { - "hash": "046b30086c5b" - }, - ".github/agents/token-efficiency-engineer.agent.md": { - "hash": "12997f39f2cb" - }, - ".github/agents/test-lead.agent.md": { - "hash": "6561c9a0a1c2" - }, - ".github/agents/vendor-arbitrage-analyst.agent.md": { - "hash": "627c29b70357" - }, - ".github/ai-framework-ci.yml": { - "hash": "d33ebabcb073" - }, - ".github/agents/ui-designer.agent.md": { - "hash": "337cddf83447" - }, - ".github/chatmodes/team-backend.chatmode.md": { - "hash": "ac8f69b82220" - }, - ".github/chatmodes/team-data.chatmode.md": { - "hash": "0afb7a28f351" - }, - ".github/chatmodes/team-cost-ops.chatmode.md": { - "hash": "121bbf207ca4" - }, - ".github/chatmodes/team-frontend.chatmode.md": { - "hash": "cce72ab3a795" - }, - ".github/chatmodes/team-devops.chatmode.md": { - "hash": "978de914aab8" - }, - ".github/chatmodes/team-docs.chatmode.md": { - "hash": "c204bd1f1788" - }, - ".github/chatmodes/team-forge.chatmode.md": { - "hash": "b04f7d8a9d9a" - }, - ".github/chatmodes/team-product.chatmode.md": { - "hash": "03428a19c477" - }, - ".github/chatmodes/team-quality.chatmode.md": { - "hash": "7bc2b2f277e1" - }, - ".github/chatmodes/team-infra.chatmode.md": { - "hash": "5850b3a37256" - }, - ".github/chatmodes/team-strategic-ops.chatmode.md": { - "hash": "8b337da42662" - }, - ".github/chatmodes/team-security.chatmode.md": { - "hash": "09342e8fc4bc" - }, - ".github/chatmodes/team-testing.chatmode.md": { - "hash": "074a36442ca2" - }, - ".github/CODEOWNERS": { - "hash": "ccf003556232" - }, - ".github/instructions/code-verify.md": { - "hash": "f82d9d55fc86" - }, - ".github/copilot-instructions.md": { - "hash": "c8bb26bb2cba" - }, - ".github/instructions/docs.md": { - "hash": "dca898c99b6c" - }, - ".github/instructions/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".github/instructions/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".github/instructions/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".github/instructions/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".github/instructions/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".github/instructions/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".github/instructions/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".github/instructions/languages/python.md": { - "hash": "63b439981bbc" - }, - ".github/instructions/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".github/instructions/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".github/instructions/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".github/instructions/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".github/instructions/languages/security.md": { - "hash": "1c73e7635578" - }, - ".github/instructions/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".github/instructions/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".github/instructions/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".github/instructions/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".github/instructions/marketing.md": { - "hash": "84860c42a466" - }, - ".github/instructions/quality.md": { - "hash": "d2d93df02537" - }, - ".github/instructions/performance.md": { - "hash": "4f8cd32aeb7e" - }, - ".github/ISSUE_TEMPLATE/bug_report.yml": { - "hash": "0b7c12b0e1bb" - }, - ".github/instructions/testing.md": { - "hash": "ee3e0d11b01b" - }, - ".github/instructions/README.md": { - "hash": "a79739379379" - }, - ".github/prompts/analyze-agents.prompt.md": { - "hash": "19e1dc8432f0" - }, - ".github/prompts/backlog.prompt.md": { - "hash": "45f1abd24d72" - }, - ".github/ISSUE_TEMPLATE/config.yml": { - "hash": "47344ff5c32c" - }, - ".github/prompts/brand.prompt.md": { - "hash": "0c6c0002f942" - }, - ".github/ISSUE_TEMPLATE/feature_request.yml": { - "hash": "79e7e3da99d0" - }, - ".github/prompts/check.prompt.md": { - "hash": "cc0bdba2f08f" - }, - ".github/prompts/cost-centres.prompt.md": { - "hash": "6baa174774e6" - }, - ".github/prompts/build.prompt.md": { - "hash": "046bffc8791e" - }, - ".github/prompts/cost.prompt.md": { - "hash": "8d2d9868723a" - }, - ".github/prompts/discover.prompt.md": { - "hash": "e04bdf639b4a" - }, - ".github/prompts/doctor.prompt.md": { - "hash": "1dad8d876f62" - }, - ".github/prompts/deploy.prompt.md": { - "hash": "fc9569e74c5d" - }, - ".github/prompts/document-history.prompt.md": { - "hash": "d9f170e31ace" - }, - ".github/prompts/feature-configure.prompt.md": { - "hash": "ce35b4c465e6" - }, - ".github/prompts/feature-review.prompt.md": { - "hash": "cf81881f51f5" - }, - ".github/prompts/format.prompt.md": { - "hash": "94a0505df23e" - }, - ".github/prompts/expand.prompt.md": { - "hash": "ff9445bec477" - }, - ".github/prompts/feature-flow.prompt.md": { - "hash": "b82d78500eb3" - }, - ".github/prompts/import-issues.prompt.md": { - "hash": "4b2701705479" - }, - ".github/prompts/infra-eval.prompt.md": { - "hash": "a8b15916f960" - }, - ".github/prompts/orchestrate.prompt.md": { - "hash": "63451784c289" - }, - ".github/prompts/preflight.prompt.md": { - "hash": "52dcd9cbf075" - }, - ".github/prompts/project-status.prompt.md": { - "hash": "328769323130" - }, - ".github/prompts/review.prompt.md": { - "hash": "94016ba6950b" - }, - ".github/prompts/scaffold.prompt.md": { - "hash": "22240d89615d" - }, - ".github/prompts/plan.prompt.md": { - "hash": "69797faa11a4" - }, - ".github/prompts/security.prompt.md": { - "hash": "953693049d80" - }, - ".github/prompts/start.prompt.md": { - "hash": "97357c17d8fe" - }, - ".github/prompts/test.prompt.md": { - "hash": "871f38d6af82" - }, - ".github/PULL_REQUEST_TEMPLATE.md": { - "hash": "10b91e98a082" - }, - ".github/prompts/sync-backlog.prompt.md": { - "hash": "9cea7fd68060" - }, - ".github/prompts/validate.prompt.md": { - "hash": "028479c6d2e2" - }, - ".github/scripts/README.md": { - "hash": "3124e25a7cfa" - }, - ".github/prompts/sync.prompt.md": { - "hash": "7e7773332996" - }, - ".github/scripts/resolve-merge.ps1": { - "hash": "0cd5d9407b89" - }, - ".github/scripts/setup-branch-protection.ps1": { - "hash": "160cb7bb55b1" - }, - ".github/scripts/resolve-merge.sh": { - "hash": "7ce68cb84a3a" - }, - ".github/scripts/setup-branch-protection.sh": { - "hash": "6eb664b21ee4" - }, - ".github/workflows/coverage-report.yml": { - "hash": "80dafccc5b8f" - }, - ".github/workflows/breaking-change-detection.yml": { - "hash": "bcd2f5c2e450" - }, - ".github/workflows/documentation-validation.yml": { - "hash": "01abb4c23ec9" - }, - ".github/workflows/documentation-quality.yml": { - "hash": "6088b2095f59" - }, - ".github/workflows/dependency-audit.yml": { - "hash": "fc376b5eef06" - }, - ".github/workflows/pr-validation.yml": { - "hash": "2c316a51ea66" - }, - ".github/workflows/retrospective-quality.yml": { - "hash": "74474e570115" - }, - ".gitmessage": { - "hash": "3f5666033096" - }, - ".markdownlint.json": { - "hash": "afe70a444035" - }, - ".prettierrc": { - "hash": "7288d28eacd8" - }, - ".roo/rules/ai-cost-ops.md": { - "hash": "2c38e075d4db" - }, - ".roo/rules/agent-conduct.md": { - "hash": "1f4b060a86eb" - }, - ".roo/rules/blockchain.md": { - "hash": "205b3ca13935" - }, - ".roo/rules/ci-cd.md": { - "hash": "56d669134c88" - }, - ".roo/rules/dependency-management.md": { - "hash": "10ec56bb6292" - }, - ".roo/rules/documentation.md": { - "hash": "ff90f251ce71" - }, - ".roo/rules/dotnet.md": { - "hash": "8b8461bcf286" - }, - ".roo/rules/finops.md": { - "hash": "17a63264e7b1" - }, - ".roo/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".roo/rules/iac.md": { - "hash": "2024c73bc61a" - }, - ".roo/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".roo/rules/git-workflow.md": { - "hash": "ae185cb50c40" - }, - ".roo/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".roo/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".roo/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".roo/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".roo/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".roo/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".roo/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".roo/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".roo/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".roo/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".roo/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".roo/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".roo/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".roo/rules/python.md": { - "hash": "7b9a642b9197" - }, - ".roo/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".roo/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".roo/rules/rust.md": { - "hash": "f68627a539a3" - }, - ".roo/rules/security.md": { - "hash": "a05714124061" - }, - ".roo/rules/testing.md": { - "hash": "f420798449b7" - }, - ".roo/rules/typescript.md": { - "hash": "5bff848ce5b6" - }, - ".vscode/settings.json": { - "hash": "4af945c89151" - }, - ".roo/rules/template-protection.md": { - "hash": "2097e8899fab" - }, - ".windsurf/commands/backlog.md": { - "hash": "68b4263fc444" - }, - ".vscode/extensions.json": { - "hash": "dd20fd0751ba" - }, - ".windsurf/commands/analyze-agents.md": { - "hash": "371f6c3bd7d5" - }, - ".windsurf/commands/brand.md": { - "hash": "1eb99e2c4883" - }, - ".windsurf/commands/build.md": { - "hash": "7fc64a835712" - }, - ".windsurf/commands/check.md": { - "hash": "780d7cb5ba53" - }, - ".windsurf/commands/cost-centres.md": { - "hash": "16f70ee610a8" - }, - ".windsurf/commands/cost.md": { - "hash": "6b9a7ee00d03" - }, - ".windsurf/commands/deploy.md": { - "hash": "bb64704796af" - }, - ".windsurf/commands/discover.md": { - "hash": "438676ab6872" - }, - ".windsurf/commands/document-history.md": { - "hash": "57554e0ae8d7" - }, - ".windsurf/commands/doctor.md": { - "hash": "e40703581729" - }, - ".windsurf/commands/format.md": { - "hash": "10cda487929d" - }, - ".windsurf/commands/expand.md": { - "hash": "62310f81603e" - }, - ".windsurf/commands/feature-configure.md": { - "hash": "31f4a7a16fe7" - }, - ".windsurf/commands/feature-review.md": { - "hash": "9c212c4c7afe" - }, - ".windsurf/commands/infra-eval.md": { - "hash": "359a364a00e5" - }, - ".windsurf/commands/feature-flow.md": { - "hash": "840122cc19aa" - }, - ".windsurf/commands/import-issues.md": { - "hash": "9b714f3d4b02" - }, - ".windsurf/commands/orchestrate.md": { - "hash": "1d9602ce2908" - }, - ".windsurf/commands/preflight.md": { - "hash": "2d35df2ccd8e" - }, - ".windsurf/commands/plan.md": { - "hash": "0bf8e69458de" - }, - ".windsurf/commands/security.md": { - "hash": "4878d4daa234" - }, - ".windsurf/commands/project-status.md": { - "hash": "a85e72f6794e" - }, - ".windsurf/commands/review.md": { - "hash": "ebd187ab3d06" - }, - ".windsurf/commands/start.md": { - "hash": "7cc5267d9274" - }, - ".windsurf/commands/scaffold.md": { - "hash": "c57cd1471acf" - }, - ".windsurf/commands/sync-backlog.md": { - "hash": "bf720daf3704" - }, - ".windsurf/commands/sync.md": { - "hash": "d4678bf06724" - }, - ".windsurf/commands/validate.md": { - "hash": "02d1c93720c5" - }, - ".windsurf/commands/test.md": { - "hash": "73463ed24c36" - }, - ".windsurf/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".windsurf/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".windsurf/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".windsurf/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".windsurf/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".windsurf/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".windsurf/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".windsurf/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".windsurf/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".windsurf/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".windsurf/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".windsurf/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".windsurf/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".windsurf/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".windsurf/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".windsurf/rules/project.md": { - "hash": "cc8ae6d95221" - }, - ".windsurf/rules/orchestrate.md": { - "hash": "0eea9715c9db" - }, - ".windsurf/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".windsurf/rules/security.md": { - "hash": "6a39548b2255" - }, - ".windsurf/rules/team-backend.md": { - "hash": "ec288e9b54ce" - }, - ".windsurf/rules/team-cost-ops.md": { - "hash": "69db0e22010d" - }, - ".windsurf/rules/team-devops.md": { - "hash": "06c93f75dcd3" - }, - ".windsurf/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".windsurf/rules/team-data.md": { - "hash": "2fa55fd04223" - }, - ".windsurf/rules/team-frontend.md": { - "hash": "e9a5f425646d" - }, - ".windsurf/rules/team-docs.md": { - "hash": "f019d83abc58" - }, - ".windsurf/rules/team-forge.md": { - "hash": "13f5fa696b1d" - }, - ".windsurf/rules/team-infra.md": { - "hash": "fb977ea917c1" - }, - ".windsurf/rules/team-quality.md": { - "hash": "afb908c98b76" - }, - ".windsurf/rules/team-product.md": { - "hash": "81f4929e42f3" - }, - ".windsurf/rules/team-security.md": { - "hash": "a7c778d35665" - }, - ".windsurf/rules/team-testing.md": { - "hash": "505b7caae49d" - }, - ".windsurf/rules/team-strategic-ops.md": { - "hash": "c1d8c4f33abe" - }, - "AGENTS.md": { - "hash": "911950e72f75" - }, - ".windsurf/workflows/full-assessment.yml": { - "hash": "57d1220ee8ac" - }, - "CHANGELOG.md": { - "hash": "8cb5a19628b1" - }, - ".windsurf/workflows/phase-execution.yml": { - "hash": "81054e1a3272" - }, - "AGENT_TEAMS.md": { - "hash": "725ada7d289f" - }, - "CONTRIBUTING.md": { - "hash": "afd7d3c16416" - }, - "AGENT_BACKLOG.md": { - "hash": "8eecc5cbe45f" - }, - "docs/api/01_overview.md": { - "hash": "342e9d07b13f" - }, - "docs/api/03_authentication.md": { - "hash": "26ef4da3ef56" - }, - "CLAUDE.md": { - "hash": "4e7b5fb72c4c" - }, - "docs/api/02_endpoints.md": { - "hash": "43eb1cc5a21f" - }, - "docs/api/04_examples.md": { - "hash": "7c21b7bcf311" - }, - "COMMAND_GUIDE.md": { - "hash": "4600c6725f0d" - }, - "docs/api/05_errors.md": { - "hash": "ed2e5a6e94ed" - }, - "docs/api/06_versioning.md": { - "hash": "bd878ba8a2f6" - }, - "docs/agents/agent-team-matrix.md": { - "hash": "09345b713ca1" - }, - "docs/api/README.md": { - "hash": "5a266ea2df82" - }, - "docs/architecture/01_overview.md": { - "hash": "df6efc6fda78" - }, - "docs/architecture/decisions/01-adopt-agentkit-forge.md": { - "hash": "552c1023dcf2" - }, - "docs/architecture/decisions/02-fallback-policy-tokens-problem.md": { - "hash": "31295d24794e" - }, - "docs/architecture/decisions/05-dependency-supply-chain-detection-tooling.md": { - "hash": "6ccff01874c7" - }, - "docs/architecture/decisions/06-code-quality-maintainability-signal-tooling.md": { - "hash": "3fb3fc9fd6ff" - }, - "docs/architecture/decisions/03-tooling-strategy.md": { - "hash": "b2700e569966" - }, - "docs/architecture/decisions/04-static-security-analysis-depth-tooling.md": { - "hash": "998c41843f21" - }, - "docs/architecture/decisions/README.md": { - "hash": "28b5d189b354" - }, - "docs/architecture/diagrams/.gitkeep": { - "hash": "64edc5f9f589" - }, - "docs/architecture/diagrams/README.md": { - "hash": "782485a4f5ef" - }, - "docs/architecture/README.md": { - "hash": "a867a017c8a0" - }, - "docs/architecture/specs/01_functional_spec.md": { - "hash": "cb36564f8ddd" - }, - "docs/architecture/specs/02_technical_spec.md": { - "hash": "b603c83e06d5" - }, - "docs/architecture/specs/03_api_spec.md": { - "hash": "d5a1811ddc75" - }, - "docs/engineering/02_coding_standards.md": { - "hash": "cf4473c84515" - }, - "docs/architecture/specs/README.md": { - "hash": "7c4e52efbd0d" - }, - "docs/engineering/01_setup.md": { - "hash": "225879d37c28" - }, - "docs/engineering/03_testing.md": { - "hash": "7cbc67b07b25" - }, - "docs/architecture/specs/04_data_models.md": { - "hash": "a77400c5387c" - }, - "docs/engineering/06_pr_documentation.md": { - "hash": "74d9c99fc82a" - }, - "docs/history/.index.json": { - "hash": "7beb781687f2" - }, - "docs/engineering/04_git_workflow.md": { - "hash": "8621780ffdcb" - }, - "docs/engineering/05_security.md": { - "hash": "b2fd1574733d" - }, - "docs/engineering/07_changelog.md": { - "hash": "945e28ab8b34" - }, - "docs/history/bug-fixes/README.md": { - "hash": "78dcabc86f74" - }, - "docs/history/bug-fixes/TEMPLATE-bugfix.md": { - "hash": "7873d84034ec" - }, - "docs/history/features/README.md": { - "hash": "7a6b10981688" - }, - "docs/history/implementations/README.md": { - "hash": "938114ecc966" - }, - "docs/engineering/README.md": { - "hash": "35afee261b38" - }, - "docs/history/issues/TEMPLATE-issue.md": { - "hash": "b133cb73cdc5" - }, - "docs/history/issues/README.md": { - "hash": "3e5d149f1a6c" - }, - "docs/history/implementations/TEMPLATE-implementation.md": { - "hash": "d4b4ad9bf6cc" - }, - "docs/history/features/TEMPLATE-feature.md": { - "hash": "c704b2662b57" - }, - "docs/history/migrations/README.md": { - "hash": "7b023cecc53d" - }, - "docs/history/lessons-learned/TEMPLATE-lesson.md": { - "hash": "810fcf97423b" - }, - "docs/history/lessons-learned/README.md": { - "hash": "b21e63388be4" - }, - "docs/history/migrations/TEMPLATE-migration.md": { - "hash": "97272242bd4e" - }, - "docs/history/README.md": { - "hash": "8feb37cbe0c0" - }, - "docs/integrations/01_external_apis.md": { - "hash": "17bc92567b46" - }, - "docs/integrations/02_webhooks.md": { - "hash": "b9e1b977bf00" - }, - "docs/operations/01_deployment.md": { - "hash": "8fc948f3e280" - }, - "docs/integrations/03_sdk.md": { - "hash": "c05a8a69392d" - }, - "docs/operations/02_monitoring.md": { - "hash": "0d1c7d4a021e" - }, - "docs/integrations/README.md": { - "hash": "105308932223" - }, - "docs/operations/04_troubleshooting.md": { - "hash": "a8c0364e80c9" - }, - "docs/operations/05_slos_slis.md": { - "hash": "2cbf5f2188dd" - }, - "docs/product/01_prd.md": { - "hash": "80c041b82e0d" - }, - "docs/planning/TEMPLATE-plan.md": { - "hash": "305534965f0e" - }, - "docs/operations/03_incident_response.md": { - "hash": "549b6f418202" - }, - "docs/operations/README.md": { - "hash": "62c405f25743" - }, - "docs/product/02_user_stories.md": { - "hash": "fce181fc7087" - }, - "docs/product/04_personas.md": { - "hash": "609113c06c69" - }, - "docs/product/03_roadmap.md": { - "hash": "c24ab738099b" - }, - "docs/product/README.md": { - "hash": "43db13443d26" - }, - "docs/README.md": { - "hash": "0a5900bf46af" - }, - "docs/reference/03_changelog.md": { - "hash": "4bd7c9e727aa" - }, - "docs/reference/04_contributing.md": { - "hash": "b33e1d721718" - }, - "MIGRATIONS.md": { - "hash": "e880b3edb24c" - }, - "docs/reference/02_faq.md": { - "hash": "ac95d6fb41ec" - }, - "docs/reference/01_glossary.md": { - "hash": "2f571539f2ff" - }, - "GEMINI.md": { - "hash": "a59e2d67b8dd" - }, - "docs/reference/README.md": { - "hash": "c09171b9b8a1" - }, - "QUALITY_GATES.md": { - "hash": "e3158c924e6e" - }, - "RUNBOOK_AI.md": { - "hash": "2a0d351455dc" - }, - "scripts/consolidate-branches.sh": { - "hash": "f345de274644" - }, - "scripts/create-doc.ps1": { - "hash": "207501b71fe6" - }, - "scripts/resolve-merge.ps1": { - "hash": "1ae33673ef63" - }, - "scripts/consolidate-branches.ps1": { - "hash": "767265430308" - }, - "scripts/analyze-agents.sh": { - "hash": "dfd5f15e5267" - }, - "scripts/analyze-agents.ps1": { - "hash": "e66c881de65a" - }, - "scripts/resolve-merge.sh": { - "hash": "29048f9dc59d" - }, - "scripts/setup-agentkit-branch-governance.ps1": { - "hash": "ac356d29ce05" - }, - "scripts/check-documentation-requirement.sh": { - "hash": "0604d65be8db" - }, - "scripts/setup-agentkit-branch-governance.sh": { - "hash": "cecf99c1c59a" - }, - "scripts/sync-issues.sh": { - "hash": "5728f842fda3" - }, - "scripts/create-doc.sh": { - "hash": "c170336b69e0" - }, - "scripts/sync-split-pr.sh": { - "hash": "169e29683f7b" - }, - "scripts/validate-numbering.sh": { - "hash": "d78c153d05ee" - }, - "scripts/update-changelog.sh": { - "hash": "146f6934a4ee" - }, - "scripts/validate-documentation.sh": { - "hash": "c00c47269a24" - }, - "scripts/update-changelog.ps1": { - "hash": "3b64bfbcfc25" - }, - "scripts/sync-split-pr.ps1": { - "hash": "199b5056c32e" - }, - "UNIFIED_AGENT_TEAMS.md": { - "hash": "506e38f9e21c" - }, - "WARP.md": { - "hash": "24ca1510e68e" - }, - "SECURITY.md": { - "hash": "a926751bc190" - } - } -} diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/AGENT_TEAMS.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/AGENT_TEAMS.md deleted file mode 100644 index ed649683..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/AGENT_TEAMS.md +++ /dev/null @@ -1,80 +0,0 @@ - - - -# Agent Teams — agentkit-forge - -> Repo-local team mapping derived from `.agentkit/spec/teams.yaml`. -> Customize the **Status**, **Primary Scope**, **Tech Stack**, and **Lead Agent** -> columns for your repository. The orchestrator uses this file for task dispatch. - ---- - -## Overview - -This document maps the canonical AgentKit team definitions (see -[UNIFIED_AGENT_TEAMS.md](./UNIFIED_AGENT_TEAMS.md)) to the concrete structure -of this repository. Not all teams may be active — mark inactive teams so the -orchestrator skips them during dispatch. - ---- - -## Team Roster - -| Team | ID | Focus | Scope | Accepts | Handoff Chain | Status | Lead Agent | -| ---- | -- | ----- | ----- | ------- | ------------- | ------ | ---------- | -| BACKEND | backend | API, services, core logic | `apps/api/**`, `services/**`, `src/server/**`, `controllers/**` | implement, review, plan | testing → docs | Active | — | -| FRONTEND | frontend | UI, components, PWA | `apps/web/**`, `apps/marketing/**`, `src/client/**`, `components/**` | implement, review, plan | testing → docs | Active | — | -| DATA | data | Database, models, migrations | `db/**`, `migrations/**`, `models/**`, `prisma/**` | implement, review, plan | backend → testing | Active | — | -| INFRA | infra | IaC, cloud, Terraform/Bicep | `infra/**`, `terraform/**`, `bicep/**`, `pulumi/**` | implement, review, plan, investigate | devops → security | Active | — | -| DEVOPS | devops | CI/CD, pipelines, automation | `.github/workflows/**`, `scripts/**`, `docker/**`, `**/Dockerfile*` | implement, review, plan | testing → security | Active | — | -| TESTING | testing | Unit, E2E, integration tests | `**/*.test.*`, `**/*.spec.*`, `tests/**`, `e2e/**`, `playwright/**` | implement, review, test | quality | Active | — | -| SECURITY | security | Auth, compliance, audit | `auth/**`, `security/**`, `middleware/auth*` | review, investigate | — | Active | — | -| DOCUMENTATION | docs | Docs, ADRs, guides | `docs/**`, `docs/architecture/decisions/**`, `.github/**`, `README.md`, `CHANGELOG.md`, `CONTRIBUTING.md` | implement, review, document | — | Active | — | -| PRODUCT | product | Features, PRDs, roadmap | `docs/product/**`, `docs/prd/**` | plan, review | backend → frontend | Active | — | -| QUALITY | quality | Code review, refactoring, bugs, reliability, session retrospectives | `**/*` | review, investigate | — | Active | — | -| TEAMFORGE | forge | Meta-team — creates, validates, and deploys new agent team specifications | `.agentkit/spec/**`, `docs/planning/agents-teams/**`, `docs/architecture/**` | plan, review, investigate, document | quality → docs | Active | — | -| STRATEGIC OPS | strategic-ops | Cross-project coordination, framework governance, portfolio-level planning | `docs/planning/**`, `docs/architecture/**`, `.agentkit/spec/**`, `AGENT_BACKLOG.md`, `UNIFIED_AGENT_TEAMS.md`, `AGENT_TEAMS.md` | plan, review, investigate, document | product → quality | Active | — | -| COST OPS | cost-ops | AI infrastructure cost reduction, vendor optimization, token efficiency | `docs/cost-ops/**`, `docs/planning/cost/**`, `config/models/**`, `config/pricing/**` | investigate, review, plan, document, implement | infra → product → strategic-ops | Active | — | - ---- - -## How to Customize - -### Activating / Deactivating a Team - -1. Change the **Status** column from `Inactive` to `Active` (or vice versa). -2. Fill in the **Primary Scope** with actual directory paths in this repo. -3. Set the **Tech Stack** to reflect the tools and frameworks used. -4. Assign a **Lead Agent** identifier (used for mentions and escalation). -5. Add any relevant notes about the team's role. - -The orchestrator will skip inactive teams during `/orchestrate` dispatch. - -### Adding Custom Scope Patterns - -Each team's scope patterns determine which files the orchestrator will assign -to that team. Use glob patterns: - -``` -src/server/** — all files under src/server/ -src/api/*.ts — TypeScript files directly in src/api/ -tests/unit/server/* — server unit tests -``` - ---- - -## Scope Overlap Resolution - -When multiple teams have overlapping scope patterns, the orchestrator uses -these priority rules: - -1. **Most specific pattern wins.** A deeper path match takes precedence. -2. **Explicit assignment overrides.** A task explicitly assigned to a team - via `--teams` flag takes precedence over pattern matching. -3. **Primary scope takes priority.** The team whose scope lists the most - specific matching directory owns the file. - ---- - -_Customize this file for your repository. User edits are preserved across syncs._ -_Canonical team definitions: [UNIFIED_AGENT_TEAMS.md](./UNIFIED_AGENT_TEAMS.md)_ diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/README.md deleted file mode 100644 index 9484b549..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/README.md +++ /dev/null @@ -1,47 +0,0 @@ - - - - -# agentkit-forge — Documentation - -Welcome to the agentkit-forge documentation hub. This index links to every -documentation category maintained by this repository. - -## Categories - -| Category | Description | -| -------------------------------------- | ----------------------------------------------------- | -| [Product](./product/) | Product vision, strategy, personas, PRDs | -| [Architecture](./architecture/) | Specs, ADRs, diagrams, tech stack decisions | -| [Orchestration](./orchestration/) | Orchestration guide, PM guide, concurrency protocol | -| [Agents](./agents/) | Agent catalog, roles, team mappings | -| [API](./api/) | API reference, authentication, versioning, and errors | -| [Operations](./operations/) | CI/CD, deployments, monitoring, and troubleshooting | -| [Engineering](./engineering/) | Setup, coding standards, testing, and contributing | -| [Integrations](./integrations/) | External APIs, webhooks, and SDK | -| [Reference](./reference/) | Glossary, acronyms, FAQ, and tool config | -| [Handoffs](./handoffs/) | AI session handoff documents | -| [History](./history/) | Bug fixes, features, implementations, lessons | - -## Quick Links - -- [Architecture Overview](./architecture/01_overview.md) -- [Orchestration Guide](./orchestration/overview.md) -- [PM Guide](./orchestration/pm-guide.md) -- [Agent Catalog](./agents/catalog.md) -- [API Overview](./api/01_overview.md) -- [Getting Started](./engineering/01_setup.md) -- [Changelog](./reference/03_changelog.md) - -- [PRD Library](./product/prd/README.md) - - -## Conventions - -- Placeholder tokens `agentkit-forge` and `3.1.0` are replaced at sync time. -- Do **not** edit generated files directly — run `pnpm -C .agentkit agentkit:sync` - to regenerate them from the AgentKit Forge spec and overlays. - ---- - -Generated by AgentKit Forge v3.1.0 diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/api/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/api/README.md deleted file mode 100644 index e91f44ae..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/api/README.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -# API Docs Index - -## Contents - -- [01_overview.md](./01_overview.md) -- [02_endpoints.md](./02_endpoints.md) -- [03_authentication.md](./03_authentication.md) -- [04_examples.md](./04_examples.md) -- [05_errors.md](./05_errors.md) -- [06_versioning.md](./06_versioning.md) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/README.md deleted file mode 100644 index de2050fe..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/README.md +++ /dev/null @@ -1,12 +0,0 @@ - - - - -# Architecture Docs Index - -## Contents - -- [01_overview.md](./01_overview.md) — Architecture overview and entry point -- [specs/](./specs/) — Functional, technical, and API specifications -- [diagrams/](./diagrams/) — Architecture diagrams -- [decisions/](./decisions/) — Architecture Decision Records (ADRs) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/decisions/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/decisions/README.md deleted file mode 100644 index e488986f..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/decisions/README.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -# ADR Index - -## Decision Records - -- [01-adopt-agentkit-forge.md](./01-adopt-agentkit-forge.md) -- [02-fallback-policy-tokens-problem.md](./02-fallback-policy-tokens-problem.md) -- [03-tooling-strategy.md](./03-tooling-strategy.md) -- [04-static-security-analysis-depth-tooling.md](./04-static-security-analysis-depth-tooling.md) -- [05-dependency-supply-chain-detection-tooling.md](./05-dependency-supply-chain-detection-tooling.md) -- [06-code-quality-maintainability-signal-tooling.md](./06-code-quality-maintainability-signal-tooling.md) -- [07-delivery-strategy.md](./07-delivery-strategy.md) -- [08-issue-sync-strategy.md](./08-issue-sync-strategy.md) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/diagrams/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/diagrams/README.md deleted file mode 100644 index f93d1b98..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/diagrams/README.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -# Architecture Diagrams Index - -## Contents - -- Add C4 and deployment diagrams in this folder. -- Keep diagram files named with ordered prefixes when sequence matters (`01_`, `02_`, ...). - -## Recommended Diagrams - -- `01_system-context.mmd` (C4 L1) -- `02_container-view.mmd` (C4 L2) -- `03_deployment-view.mmd` (runtime/deployment) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/specs/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/specs/README.md deleted file mode 100644 index abdab96a..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/architecture/specs/README.md +++ /dev/null @@ -1,12 +0,0 @@ - - - - -# Specs Docs Index - -## Contents - -- [01_functional_spec.md](./01_functional_spec.md) -- [02_technical_spec.md](./02_technical_spec.md) -- [03_api_spec.md](./03_api_spec.md) -- [04_data_models.md](./04_data_models.md) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/engineering/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/engineering/README.md deleted file mode 100644 index 9deaffc9..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/engineering/README.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - -# Engineering Docs Index - -## Contents - -- [01_setup.md](./01_setup.md) -- [02_coding_standards.md](./02_coding_standards.md) -- [03_testing.md](./03_testing.md) -- [04_git_workflow.md](./04_git_workflow.md) -- [05_security.md](./05_security.md) -- [06_pr_documentation.md](./06_pr_documentation.md) -- [07_changelog.md](./07_changelog.md) -- [08_scaffold_management.md](./08_scaffold_management.md) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/README.md deleted file mode 100644 index ecab947d..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/README.md +++ /dev/null @@ -1,67 +0,0 @@ - - - - -# History - -Historical documentation for significant PRs and implementations in agentkit-forge. - -## Directory Structure - -| Directory | Description | -| -------------------------------------- | ---------------------------------------------- | -| [implementations/](./implementations/) | Major implementations and architecture changes | -| [bug-fixes/](./bug-fixes/) | Complex or critical bug resolutions | -| [features/](./features/) | New feature launches | -| [migrations/](./migrations/) | Major migrations and upgrades | -| [issues/](./issues/) | Issues encountered during development sessions | -| [lessons-learned/](./lessons-learned/) | Lessons learned from retrospectives | - -## Naming Convention - -Files use the format: `XXXX-YYYY-MM-DD-[title]-[type].md` - -- `XXXX` — sequential 4-digit number (maintained in [.index.json](./.index.json)) -- `YYYY-MM-DD` — completion date -- `[title]` — kebab-case title -- `[type]` — `implementation`, `bugfix`, `feature`, `migration`, `issue`, or `lesson` - -## Creating New Documentation - -Use the provided script to generate a new document from the correct template: - -```bash -# Bash -./scripts/create-doc.sh implementation "Feature Name" -./scripts/create-doc.sh bugfix "Bug Description" -./scripts/create-doc.sh feature "Feature Name" -./scripts/create-doc.sh migration "Migration Name" -./scripts/create-doc.sh issue "Issue Title" -./scripts/create-doc.sh lesson "Lesson Title" -``` - -> **Note:** Issue and lesson records are created automatically via -> `/review --focus=retrospective`, not through the create-doc script. -> -> **Fallback:** When `gh` CLI is unavailable (proxy failures, air-gapped -> environments), use `./scripts/create-doc.sh issue "Title"` to record issues -> locally, then run `./scripts/sync-issues.sh --apply` once access is restored. - -The `/review` command with `--focus=retrospective` automates issue and lesson -creation at end-of-session (non-blocking — never gates delivery): - -```bash -# Via agent command -/review --focus=retrospective # Full retrospective: issues + lessons -/review --focus=retrospective --dry-run # Preview without writing -/review --focus=retrospective --open-issues # Also create GitHub issues for unresolved problems -``` - -```powershell -# PowerShell -./scripts/create-doc.ps1 implementation "Feature Name" -``` - -Or use the `/document-history` slash command for auto-detection of type and title from session context. - -See [docs/engineering/06_pr_documentation.md](../engineering/06_pr_documentation.md) for the full documentation strategy. diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/bug-fixes/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/bug-fixes/README.md deleted file mode 100644 index 011ae350..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/bug-fixes/README.md +++ /dev/null @@ -1,8 +0,0 @@ - - - -# Bug Fixes - -Historical records of complex or critical bug resolutions. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/features/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/features/README.md deleted file mode 100644 index 4e4a4c82..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/features/README.md +++ /dev/null @@ -1,8 +0,0 @@ - - - -# Features - -Historical records of new feature launches. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/implementations/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/implementations/README.md deleted file mode 100644 index afc0d54d..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/implementations/README.md +++ /dev/null @@ -1,8 +0,0 @@ - - - -# Implementations - -Historical records of major implementations, architecture changes, and significant refactoring. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/issues/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/issues/README.md deleted file mode 100644 index 53ac6b6a..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/issues/README.md +++ /dev/null @@ -1,42 +0,0 @@ - - - -# Issues - -Historical records of issues encountered during development sessions. - -## Creating Issue Records - -### Preferred: GitHub Issues via `gh` - -When the GitHub CLI is available and authenticated, create issues directly: - -```bash -gh issue create --title "Issue Title" --body "Description" -``` - -### Fallback: Local Issue Docs - -When `gh` is unavailable (no CLI installed, proxy/auth failures, air-gapped -environments), record issues locally as structured markdown: - -```bash -./scripts/create-doc.sh issue "Issue Title" -``` - -Issues are also logged automatically by `/review --focus=retrospective` at the -end of a session. - -### Syncing Local Issues to GitHub - -Once `gh` access is restored, sync local issue docs to GitHub Issues: - -```bash -./scripts/sync-issues.sh # Dry-run by default -./scripts/sync-issues.sh --apply # Create GitHub Issues and mark synced -``` - -See [ADR-08](../../architecture/decisions/08-issue-sync-strategy.md) for -the sync strategy and automation decisions. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/lessons-learned/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/lessons-learned/README.md deleted file mode 100644 index 5acf19fb..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/lessons-learned/README.md +++ /dev/null @@ -1,11 +0,0 @@ - - - -# Lessons Learned - -Historical records of lessons learned during development sessions. - -Lessons are logged automatically by `/review --focus=retrospective` at the end of -a session, or manually via `scripts/create-doc.sh lesson "Lesson Title"`. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/migrations/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/migrations/README.md deleted file mode 100644 index 672df4f0..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/history/migrations/README.md +++ /dev/null @@ -1,8 +0,0 @@ - - - -# Migrations - -Historical records of major migrations and upgrades. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/integrations/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/integrations/README.md deleted file mode 100644 index 48aa94c7..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/integrations/README.md +++ /dev/null @@ -1,11 +0,0 @@ - - - - -# Integrations Docs Index - -## Contents - -- [01_external_apis.md](./01_external_apis.md) -- [02_webhooks.md](./02_webhooks.md) -- [03_sdk.md](./03_sdk.md) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/operations/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/operations/README.md deleted file mode 100644 index 5918083e..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/operations/README.md +++ /dev/null @@ -1,13 +0,0 @@ - - - - -# Operations Docs Index - -## Contents - -- [01_deployment.md](./01_deployment.md) -- [02_monitoring.md](./02_monitoring.md) -- [03_incident_response.md](./03_incident_response.md) -- [04_troubleshooting.md](./04_troubleshooting.md) -- [05_slos_slis.md](./05_slos_slis.md) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/product/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/product/README.md deleted file mode 100644 index ce11aaf5..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/product/README.md +++ /dev/null @@ -1,12 +0,0 @@ - - - - -# Product Docs Index - -## Contents - -- [01_prd.md](./01_prd.md) -- [02_user_stories.md](./02_user_stories.md) -- [03_roadmap.md](./03_roadmap.md) -- [04_personas.md](./04_personas.md) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/reference/README.md b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/reference/README.md deleted file mode 100644 index 3921959d..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/docs/reference/README.md +++ /dev/null @@ -1,14 +0,0 @@ - - - - -# Reference Docs Index - -## Contents - -- [01_glossary.md](./01_glossary.md) -- [02_faq.md](./02_faq.md) -- [03_changelog.md](./03_changelog.md) -- [04_contributing.md](./04_contributing.md) -- [05_project_yaml_reference.md](./05_project_yaml_reference.md) -- [ai_handoffs/](./ai_handoffs/) diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/analyze-agents.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/analyze-agents.sh deleted file mode 100644 index fd5324d6..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/analyze-agents.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/analyze-agents.sh -# Generates agent/team relationship matrices from spec files. -# -# Usage: -# ./scripts/analyze-agents.sh [--output ] [--matrix ] [--format ] -# -# Options: -# --output Output file (default: docs/agents/agent-team-matrix.md) -# --matrix Specific matrix: 1-8, supplementary, all (default: all) -# --format Output format: markdown, json (default: markdown) - -set -euo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -node "$PROJECT_ROOT/.agentkit/engines/node/src/cli.mjs" analyze-agents "$@" diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/check-documentation-requirement.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/check-documentation-requirement.sh deleted file mode 100644 index 944d7501..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/check-documentation-requirement.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/check-documentation-requirement.sh -# Analyzes staged or changed files to determine whether PR documentation is required. -# -# Usage (pre-commit hook): -# ./scripts/check-documentation-requirement.sh -# -# Exit codes: -# 0 — documentation not required or already present -# 1 — documentation required but not present (when --strict is passed) -# -# Environment variables: -# GITHUB_BASE_REF — set automatically in GitHub Actions PR workflows -# STRICT — set to "true" to exit 1 when documentation is required - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" -STRICT="${STRICT:-false}" - -# --------------------------------------------------------------------------- -# Collect changed files -# --------------------------------------------------------------------------- - -if [[ -n "${GITHUB_BASE_REF:-}" ]]; then - # Running inside GitHub Actions pull_request event - CHANGED_FILES=$(git diff --name-only "origin/${GITHUB_BASE_REF}" HEAD 2>/dev/null || git diff --name-only HEAD~1 HEAD) -else - # Running locally — inspect staged files, fall back to last commit - CHANGED_FILES=$(git diff --cached --name-only 2>/dev/null) - if [[ -z "$CHANGED_FILES" ]]; then - CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || true) - fi -fi - -if [[ -z "$CHANGED_FILES" ]]; then - echo "ℹ️ No changed files detected." - exit 0 -fi - -# --------------------------------------------------------------------------- -# Impact assessment -# --------------------------------------------------------------------------- - -IMPACT_HIGH=false -IMPACT_MEDIUM=false - -while IFS= read -r file; do - # High impact: project files, CI, security configs, infrastructure - if [[ "$file" == *.csproj || "$file" == package.json || "$file" == Cargo.toml || \ - "$file" == go.mod || "$file" == pyproject.toml || "$file" == build.gradle || \ - "$file" == .github/workflows/*.yml || "$file" == .github/workflows/*.yaml || \ - "$file" == Dockerfile* || "$file" == docker-compose*.yml || \ - "$file" == **/terraform/**/*.tf || "$file" == **/infra/**/*.tf ]]; then - IMPACT_HIGH=true - # Medium impact: source code files - elif [[ "$file" == src/**/*.cs || "$file" == src/**/*.ts || "$file" == src/**/*.tsx || \ - "$file" == src/**/*.py || "$file" == src/**/*.rs || "$file" == src/**/*.go || \ - "$file" == lib/**/*.* || "$file" == packages/**/*.* ]]; then - IMPACT_MEDIUM=true - fi -done <<< "$CHANGED_FILES" - -# --------------------------------------------------------------------------- -# Count changed files -# --------------------------------------------------------------------------- - -CHANGED_COUNT=$(echo "$CHANGED_FILES" | wc -l | tr -d ' ') - -if [[ "$CHANGED_COUNT" -gt 50 ]]; then - IMPACT_HIGH=true -fi - -# --------------------------------------------------------------------------- -# Check if documentation already exists for this branch/PR -# --------------------------------------------------------------------------- - -# Count history docs that have been staged or added in this branch -HISTORY_DOCS=0 -if [[ -n "${GITHUB_BASE_REF:-}" ]]; then - HISTORY_DOCS=$(git diff --name-only "origin/${GITHUB_BASE_REF}" HEAD -- 'docs/history/**/*.md' 2>/dev/null | grep -v 'README\.md\|TEMPLATE-' | wc -l | tr -d ' ' || echo 0) -else - HISTORY_DOCS=$(git diff --cached --name-only -- 'docs/history/*.md' 'docs/history/**/*.md' 2>/dev/null | grep -v 'README\.md\|TEMPLATE-' | wc -l | tr -d ' ' || echo 0) -fi - -# --------------------------------------------------------------------------- -# Output assessment -# --------------------------------------------------------------------------- - -if [[ "$IMPACT_HIGH" == true ]]; then - echo "⚠️ HIGH IMPACT change detected — documentation required" - echo " Changed files: $CHANGED_COUNT" - if [[ "$HISTORY_DOCS" -gt 0 ]]; then - echo "✅ Documentation found ($HISTORY_DOCS new doc(s) in docs/history/)" - exit 0 - else - echo " Run: ./scripts/create-doc.sh \"\" <pr-number>" - echo " See: docs/engineering/06_pr_documentation.md" - if [[ "$STRICT" == "true" ]]; then - exit 1 - fi - fi -elif [[ "$IMPACT_MEDIUM" == true ]]; then - echo "ℹ️ MEDIUM IMPACT change detected — documentation recommended" - echo " Run: ./scripts/create-doc.sh <type> \"<title>\" <pr-number>" -else - echo "✅ LOW IMPACT change — documentation optional" -fi - -exit 0 diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/consolidate-branches.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/consolidate-branches.sh deleted file mode 100644 index 9aa9b746..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/consolidate-branches.sh +++ /dev/null @@ -1,289 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# ============================================================================= -# consolidate-branches.sh — Merge all unmerged feature branches into one -# ============================================================================= -# Usage: scripts/consolidate-branches.sh [base-branch] [--dry-run] [--skip=branch1,branch2] -# -# Discovers all local and remote branches not yet merged into <base-branch>, -# filters out protected branches, and merges them one by one into the current -# branch. Uses resolve-merge.sh for auto-resolution of generated files. -# -# Arguments: -# base-branch Branch to check "merged" status against (default: main) -# --dry-run List branches that would be merged without doing anything -# --skip=X,Y Comma-separated list of branch names to skip -# -# Examples: -# scripts/consolidate-branches.sh # merge all into current -# scripts/consolidate-branches.sh dev --dry-run # preview what would merge -# scripts/consolidate-branches.sh main --skip=wip/experiment -# ============================================================================= -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -# Colours (disabled when piped) -if [ -t 1 ]; then - GREEN='\033[0;32m' - YELLOW='\033[1;33m' - RED='\033[0;31m' - CYAN='\033[0;36m' - BOLD='\033[1m' - NC='\033[0m' -else - GREEN='' YELLOW='' RED='' CYAN='' BOLD='' NC='' -fi - -info() { echo -e "${CYAN}[info]${NC} $*"; } -ok() { echo -e "${GREEN}[ok]${NC} $*"; } -warn() { echo -e "${YELLOW}[warn]${NC} $*"; } -err() { echo -e "${RED}[error]${NC} $*"; } - -# --------------------------------------------------------------------------- -# Parse arguments -# --------------------------------------------------------------------------- -BASE_BRANCH="main" -DRY_RUN=false -SKIP_BRANCHES="" - -for arg in "$@"; do - case "$arg" in - --dry-run) DRY_RUN=true ;; - --skip=*) SKIP_BRANCHES="${arg#--skip=}" ;; - -*) err "Unknown flag: $arg"; exit 1 ;; - *) BASE_BRANCH="$arg" ;; - esac -done - -cd "$REPO_ROOT" - -CURRENT_BRANCH="$(git branch --show-current)" -if [ -z "$CURRENT_BRANCH" ]; then - err "Not on a branch (detached HEAD). Checkout a branch first." - exit 1 -fi - -# --------------------------------------------------------------------------- -# Protected branches — never auto-merge these -# --------------------------------------------------------------------------- -PROTECTED_BRANCHES="main master develop release" - -is_protected() { - local branch="$1" - for p in $PROTECTED_BRANCHES; do - [ "$branch" = "$p" ] && return 0 - done - return 1 -} - -is_skipped() { - local branch="$1" - if [ -n "$SKIP_BRANCHES" ]; then - IFS=',' read -ra SKIPS <<< "$SKIP_BRANCHES" - for s in "${SKIPS[@]}"; do - [ "$branch" = "$s" ] && return 0 - done - fi - return 1 -} - -# --------------------------------------------------------------------------- -# 1. Fetch all remotes -# --------------------------------------------------------------------------- -info "Fetching all remotes..." -git fetch --all --prune 2>/dev/null || warn "Fetch failed — continuing with local state" - -# --------------------------------------------------------------------------- -# 2. Discover unmerged branches -# --------------------------------------------------------------------------- -info "Finding branches not merged into ${BASE_BRANCH}..." - -# Get all remote branches not merged into base -UNMERGED=() -while IFS= read -r ref; do - [ -z "$ref" ] && continue - # Strip 'origin/' prefix for display - branch="${ref#origin/}" - - # Skip current branch, base branch, HEAD pointer - [ "$branch" = "$CURRENT_BRANCH" ] && continue - [ "$branch" = "$BASE_BRANCH" ] && continue - [ "$branch" = "HEAD" ] && continue - - # Skip protected branches - is_protected "$branch" && continue - - # Skip user-specified branches - is_skipped "$branch" && continue - - UNMERGED+=("$branch") -done < <(git branch -r --no-merged "origin/${BASE_BRANCH}" 2>/dev/null | sed 's/^[* ]*//' | sort) - -# Also check local-only branches (not on remote) -while IFS= read -r branch; do - [ -z "$branch" ] && continue - [ "$branch" = "$CURRENT_BRANCH" ] && continue - [ "$branch" = "$BASE_BRANCH" ] && continue - is_protected "$branch" && continue - is_skipped "$branch" && continue - - # Check if already in UNMERGED list - already=false - for u in "${UNMERGED[@]+"${UNMERGED[@]}"}"; do - [ "$u" = "$branch" ] && already=true && break - done - $already && continue - - UNMERGED+=("$branch") -done < <(git branch --no-merged "$BASE_BRANCH" 2>/dev/null | sed 's/^[* ]*//' | sort) - -if [ ${#UNMERGED[@]} -eq 0 ]; then - ok "No unmerged branches found. Everything is up to date with ${BASE_BRANCH}." - exit 0 -fi - -# --------------------------------------------------------------------------- -# 3. Display plan -# --------------------------------------------------------------------------- -echo "" -echo -e "${BOLD}Branch Consolidation Plan${NC}" -echo -e "${BOLD}========================${NC}" -echo "" -echo -e " Current branch: ${GREEN}${CURRENT_BRANCH}${NC}" -echo -e " Base branch: ${CYAN}${BASE_BRANCH}${NC}" -echo -e " Branches to merge: ${#UNMERGED[@]}" -echo "" - -for i in "${!UNMERGED[@]}"; do - branch="${UNMERGED[$i]}" - # Get commit count ahead of base - ahead=$(git rev-list --count "origin/${BASE_BRANCH}..origin/${branch}" 2>/dev/null || echo "?") - echo -e " $((i + 1)). ${YELLOW}${branch}${NC} (${ahead} commits ahead)" -done - -echo "" - -if $DRY_RUN; then - info "Dry run — no changes made." - exit 0 -fi - -# --------------------------------------------------------------------------- -# 4. Merge each branch -# --------------------------------------------------------------------------- -MERGED=() -FAILED=() -SKIPPED_DIRTY=() - -for branch in "${UNMERGED[@]}"; do - echo "" - echo -e "${BOLD}─────────────────────────────────────────${NC}" - info "Merging ${branch} ($(( ${#MERGED[@]} + ${#FAILED[@]} + 1 ))/${#UNMERGED[@]})..." - - # Check for uncommitted changes before each merge - if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then - warn "Uncommitted changes detected. Stashing before merge..." - git stash push -m "consolidate-branches: before merging ${branch}" 2>/dev/null - fi - - # Try merging from remote first, fall back to local - merge_ref="origin/${branch}" - if ! git rev-parse --verify "$merge_ref" &>/dev/null; then - merge_ref="$branch" - fi - - merge_output=$(git merge "$merge_ref" --no-edit 2>&1) && { - ok "Merged ${branch} cleanly." - MERGED+=("$branch") - continue - } - - # Check if it's a conflict or other error - if echo "$merge_output" | grep -qF "CONFLICT"; then - warn "Conflicts merging ${branch}. Attempting auto-resolution..." - - # Use resolve-merge logic inline (auto-resolve generated files) - auto_resolved=0 - while IFS= read -r file; do - [ -z "$file" ] && continue - case "$file" in - .claude/*|.cursor/*|.windsurf/*|.roo/*|.clinerules/*|.github/instructions/*|\ - .github/copilot-instructions.md|.github/PULL_REQUEST_TEMPLATE.md|\ - .github/agents/*|.github/chatmodes/*|.github/prompts/*|\ - .agents/*|.gemini/*|docs/*/README.md|scripts/*.sh|scripts/*.ps1|\ - AGENTS.md|UNIFIED_AGENT_TEAMS.md|COMMAND_GUIDE.md|QUALITY_GATES.md|\ - RUNBOOK_AI.md|CONTRIBUTING.md) - git checkout --theirs -- "$file" 2>/dev/null && git add "$file" 2>/dev/null - ok " Auto-resolved: $file" - auto_resolved=$((auto_resolved + 1)) - ;; - pnpm-lock.yaml|.agentkit/pnpm-lock.yaml|package-lock.json|yarn.lock|.agentkit/yarn.lock) - git checkout --theirs -- "$file" 2>/dev/null && git add "$file" 2>/dev/null - ok " Auto-resolved (lockfile): $file" - auto_resolved=$((auto_resolved + 1)) - ;; - esac - done < <(git diff --name-only --diff-filter=U 2>/dev/null) - - # Check if any conflicts remain - remaining=$(git diff --name-only --diff-filter=U 2>/dev/null || true) - if [ -z "$remaining" ]; then - git commit --no-edit 2>/dev/null - ok "Merged ${branch} (${auto_resolved} auto-resolved)." - MERGED+=("$branch") - else - err "Unresolved conflicts merging ${branch}:" - echo "$remaining" | while IFS= read -r f; do - echo -e " ${RED}✗${NC} $f" - done - warn "Aborting merge of ${branch}. Resolve manually or re-run with --skip=${branch}" - git merge --abort 2>/dev/null || true - FAILED+=("$branch") - fi - else - err "Merge of ${branch} failed (not a conflict):" - echo " $merge_output" - git merge --abort 2>/dev/null || true - FAILED+=("$branch") - fi -done - -# --------------------------------------------------------------------------- -# 5. Summary -# --------------------------------------------------------------------------- -echo "" -echo -e "${BOLD}═══════════════════════════════════════════${NC}" -echo -e "${BOLD}Consolidation Summary${NC}" -echo -e "${BOLD}═══════════════════════════════════════════${NC}" -echo "" -echo -e " ${GREEN}Merged:${NC} ${#MERGED[@]}/${#UNMERGED[@]}" - -if [ ${#MERGED[@]} -gt 0 ]; then - for b in "${MERGED[@]}"; do - echo -e " ${GREEN}✓${NC} $b" - done -fi - -if [ ${#FAILED[@]} -gt 0 ]; then - echo "" - echo -e " ${RED}Failed:${NC} ${#FAILED[@]}/${#UNMERGED[@]}" - for b in "${FAILED[@]}"; do - echo -e " ${RED}✗${NC} $b" - done - echo "" - warn "Re-run with: scripts/consolidate-branches.sh ${BASE_BRANCH} --skip=$(IFS=,; echo "${MERGED[*]}")" -fi - -echo "" -if [ ${#MERGED[@]} -gt 0 ]; then - info "Next steps:" - echo " 1. Run: pnpm -C .agentkit agentkit:sync" - echo " 2. Run: pnpm test" - echo " 3. Review with: git log --oneline -20" -fi - -exit ${#FAILED[@]} diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/create-doc.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/create-doc.sh deleted file mode 100644 index 318e7fe7..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/create-doc.sh +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/create-doc.sh -# Creates a new history document from the appropriate template. -# -# Usage: -# ./scripts/create-doc.sh <type> "<title>" [pr-number] -# -# Arguments: -# type Document type: implementation | bugfix | feature | migration -# title Human-readable title for the document -# pr-number Optional PR number to include in the document -# -# Examples: -# ./scripts/create-doc.sh implementation "TreatWarningsAsErrors" 42 -# ./scripts/create-doc.sh bugfix "Null Reference in Auth" 43 -# ./scripts/create-doc.sh feature "User Authentication" 44 -# ./scripts/create-doc.sh migration "Upgrade to Node 22" 45 - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" -INDEX_FILE="$HISTORY_DIR/.index.json" - -# --------------------------------------------------------------------------- -# Argument validation -# --------------------------------------------------------------------------- - -usage() { - echo "Usage: $0 <type> \"<title>\" [pr-number]" - echo " type: implementation | bugfix | feature | migration | issue | lesson" - exit 1 -} - -if [[ $# -lt 2 ]]; then - usage -fi - -TYPE="$1" -TITLE="$2" -PR_NUMBER="${3:-}" - -case "$TYPE" in - implementation|bugfix|feature|migration|issue|lesson) ;; - *) echo "Error: unknown type '$TYPE'. Must be one of: implementation, bugfix, feature, migration, issue, lesson"; exit 1 ;; -esac - -# --------------------------------------------------------------------------- -# Determine subdirectory from type -# --------------------------------------------------------------------------- - -case "$TYPE" in - implementation) SUBDIR="implementations" ;; - bugfix) SUBDIR="bug-fixes" ;; - feature) SUBDIR="features" ;; - migration) SUBDIR="migrations" ;; - issue) SUBDIR="issues" ;; - lesson) SUBDIR="lessons-learned" ;; -esac - -# --------------------------------------------------------------------------- -# Read and update the sequential index -# --------------------------------------------------------------------------- - -if [[ ! -f "$INDEX_FILE" ]]; then - echo '{"sequences":{"implementation":1,"bugfix":1,"feature":1,"migration":1,"issue":1,"lesson":1},"entries":[]}' > "$INDEX_FILE" -fi - -# Use node to read the current sequence number safely (no user input interpolated) -SEQ_NUM=$(node - "$INDEX_FILE" "$TYPE" << 'NODEEOF' - const [,, indexFile, type] = process.argv; - const fs = require('fs'); - const idx = JSON.parse(fs.readFileSync(indexFile, 'utf8')); - process.stdout.write(String(idx.sequences[type] || 1)); -NODEEOF -) - -PADDED=$(printf "%04d" "$SEQ_NUM") -DATE=$(date +%Y-%m-%d) - -# Sanitize title: lowercase, spaces to hyphens, remove non-alphanumeric except hyphens -SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/-\+/-/g' | sed 's/^-\|-$//g') - -FILENAME="${PADDED}-${DATE}-${SLUG}-${TYPE}.md" -DEST_DIR="$HISTORY_DIR/$SUBDIR" -DEST_FILE="$DEST_DIR/$FILENAME" - -mkdir -p "$DEST_DIR" - -# --------------------------------------------------------------------------- -# Copy template and substitute placeholders -# --------------------------------------------------------------------------- - -TEMPLATE_SRC="$REPO_ROOT/.agentkit/templates/docs/history/$SUBDIR/TEMPLATE-${TYPE}.md" - -if [[ ! -f "$TEMPLATE_SRC" ]]; then - echo "Error: template not found at $TEMPLATE_SRC" - exit 1 -fi - -PR_REF="${PR_NUMBER:+#${PR_NUMBER}}" - -# Perform literal replacements using Node.js to avoid sed injection -TITLE_VAL="$TITLE" DATE_VAL="$DATE" PR_REF_VAL="${PR_REF:-[#PR-Number]}" \ -node - "$TEMPLATE_SRC" "$DEST_FILE" << 'NODEEOF' - const fs = require('fs'); - const [,, src, dest] = process.argv; - let content = fs.readFileSync(src, 'utf8'); - - const replacements = { - '[Feature/Change Name]': process.env.TITLE_VAL, - '[Bug Description]': process.env.TITLE_VAL, - '[Feature Name]': process.env.TITLE_VAL, - '[Migration Name]': process.env.TITLE_VAL, - '[Issue Title]': process.env.TITLE_VAL, - '[Lesson Title]': process.env.TITLE_VAL, - '[YYYY-MM-DD]': process.env.DATE_VAL, - '[#PR-Number]': process.env.PR_REF_VAL - }; - - for (const [placeholder, value] of Object.entries(replacements)) { - content = content.split(placeholder).join(value); - } - - fs.writeFileSync(dest, content, 'utf8'); -NODEEOF - -# --------------------------------------------------------------------------- -# Update index -# --------------------------------------------------------------------------- - -node - "$INDEX_FILE" "$TYPE" "$SEQ_NUM" "$TITLE" "$DATE" "${PR_NUMBER:-}" "$SUBDIR/$FILENAME" << 'NODEEOF' - const [,, indexFile, type, seqNum, title, date, pr, file] = process.argv; - const fs = require('fs'); - const idx = JSON.parse(fs.readFileSync(indexFile, 'utf8')); - idx.sequences[type] = (idx.sequences[type] || 1) + 1; - idx.entries = idx.entries || []; - idx.entries.push({ number: Number(seqNum), type, title, date, pr, file }); - fs.writeFileSync(indexFile, JSON.stringify(idx, null, 2) + '\n'); -NODEEOF - -echo "Created: $DEST_FILE" - -# --------------------------------------------------------------------------- -# Update CHANGELOG.md -# --------------------------------------------------------------------------- - -# Map history doc type to changelog section -case "$TYPE" in - feature) CHANGELOG_SECTION="Added" ;; - implementation) CHANGELOG_SECTION="Added" ;; - bugfix) CHANGELOG_SECTION="Fixed" ;; - migration) CHANGELOG_SECTION="Changed" ;; - issue) CHANGELOG_SECTION="" ;; # Issues don't go in changelog - lesson) CHANGELOG_SECTION="" ;; # Lessons don't go in changelog -esac - -UPDATE_CHANGELOG="$SCRIPT_DIR/update-changelog.sh" -if [[ -z "$CHANGELOG_SECTION" ]]; then - echo "ℹ️ ${TYPE} records are not added to CHANGELOG.md — skipping changelog update." -elif [[ -f "$UPDATE_CHANGELOG" ]]; then - bash "$UPDATE_CHANGELOG" "$CHANGELOG_SECTION" "$TITLE" "${PR_NUMBER:-}" "$SUBDIR/$FILENAME" || \ - echo "⚠️ Could not update CHANGELOG.md — please add the entry manually." -else - echo "ℹ️ update-changelog.sh not found — skipping changelog update." -fi diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/resolve-merge.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/resolve-merge.sh deleted file mode 100644 index a3daecff..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/resolve-merge.sh +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# ============================================================================= -# resolve-merge.sh — Apply standard merge conflict resolutions -# ============================================================================= -# Usage: scripts/resolve-merge.sh [target-branch] -# -# Merges origin/<target-branch> into the current branch and auto-resolves -# generated/framework-managed files per the AgentKit merge resolution matrix. -# Remaining conflicts (engine source, spec files) are listed for manual review. -# ============================================================================= -set -euo pipefail - -TARGET="${1:-main}" -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -# Colours (disabled when piped) -if [ -t 1 ]; then - GREEN='\033[0;32m' - YELLOW='\033[1;33m' - RED='\033[0;31m' - CYAN='\033[0;36m' - NC='\033[0m' -else - GREEN='' YELLOW='' RED='' CYAN='' NC='' -fi - -info() { echo -e "${CYAN}[info]${NC} $*"; } -ok() { echo -e "${GREEN}[ok]${NC} $*"; } -warn() { echo -e "${YELLOW}[warn]${NC} $*"; } -err() { echo -e "${RED}[error]${NC} $*"; } - -cd "$REPO_ROOT" - -# --------------------------------------------------------------------------- -# 1. Fetch and attempt merge -# --------------------------------------------------------------------------- -info "Fetching origin/${TARGET}..." -git fetch origin "$TARGET" 2>/dev/null || { - err "Failed to fetch origin/${TARGET}. Check your remote." - exit 1 -} - -CURRENT_BRANCH="$(git branch --show-current)" -info "Merging origin/${TARGET} into ${CURRENT_BRANCH}..." - -merge_output=$(git merge "origin/${TARGET}" --no-edit 2>&1) && { - ok "Merge completed cleanly — no conflicts." - exit 0 -} - -# Distinguish real merge conflicts from other failures -if ! echo "$merge_output" | grep -qF "CONFLICT"; then - err "Merge failed for a reason other than conflicts:" - echo "$merge_output" - exit 1 -fi - -info "Merge conflicts detected. Applying resolution matrix..." - -# --------------------------------------------------------------------------- -# 2. Auto-resolve generated files (KEEP_THEIRS — accept upstream) -# --------------------------------------------------------------------------- -GENERATED_PATTERNS=( - '.agents/skills/*/SKILL.md' - '.github/agents/*.agent.md' - '.github/chatmodes/*.chatmode.md' - '.github/prompts/*.prompt.md' - 'docs/*/README.md' - '.github/copilot-instructions.md' - '.github/PULL_REQUEST_TEMPLATE.md' -) - -auto_resolved=0 -for pattern in "${GENERATED_PATTERNS[@]}"; do - # Find conflicted files matching this pattern - while IFS= read -r file; do - [ -z "$file" ] && continue - if git checkout --theirs -- "$file" 2>/dev/null; then - git add "$file" 2>/dev/null - ok "Auto-resolved (accept upstream): $file" - auto_resolved=$((auto_resolved + 1)) - fi - done < <(git diff --name-only --diff-filter=U | grep -E "$pattern" 2>/dev/null || true) -done - -# --------------------------------------------------------------------------- -# 3. Auto-resolve lockfiles (KEEP_THEIRS — accept upstream, regenerate later) -# --------------------------------------------------------------------------- -LOCKFILE_PATTERNS=( - 'pnpm-lock.yaml' - '.agentkit/pnpm-lock.yaml' - 'package-lock.json' - '.agentkit/package-lock.json' -) - -for lockfile in "${LOCKFILE_PATTERNS[@]}"; do - if git diff --name-only --diff-filter=U | grep -qx "$lockfile" 2>/dev/null; then - if git checkout --theirs -- "$lockfile" 2>/dev/null; then - git add "$lockfile" 2>/dev/null - ok "Auto-resolved (accept upstream): $lockfile" - auto_resolved=$((auto_resolved + 1)) - fi - fi -done - -# --------------------------------------------------------------------------- -# 4. Auto-resolve generated config (KEEP_THEIRS) -# --------------------------------------------------------------------------- -GENERATED_CONFIGS=( - '.gemini/config.yaml' -) - -for config in "${GENERATED_CONFIGS[@]}"; do - if git diff --name-only --diff-filter=U | grep -qx "$config" 2>/dev/null; then - if git checkout --theirs -- "$config" 2>/dev/null; then - git add "$config" 2>/dev/null - ok "Auto-resolved (accept upstream): $config" - auto_resolved=$((auto_resolved + 1)) - fi - fi -done - -# --------------------------------------------------------------------------- -# 5. Report remaining conflicts -# --------------------------------------------------------------------------- -REMAINING="$(git diff --name-only --diff-filter=U 2>/dev/null || true)" - -echo "" -info "Auto-resolved: ${auto_resolved} file(s)" - -if [ -n "$REMAINING" ]; then - echo "" - warn "Manual merge required for the following file(s):" - echo "" - while IFS= read -r file; do - [ -z "$file" ] && continue - # Categorise for the developer - case "$file" in - .agentkit/engines/*) echo -e " ${RED}[engine]${NC} $file — semantic merge required (runtime logic)" ;; - .agentkit/spec/*) echo -e " ${YELLOW}[spec]${NC} $file — preserve both intents" ;; - *) echo -e " ${CYAN}[source]${NC} $file" ;; - esac - done <<< "$REMAINING" - echo "" - info "Resolve the files above, then run: git add -A && git commit" - exit 1 -else - ok "All conflicts resolved automatically." - info "Committing merge..." - git commit --no-edit - ok "Merge committed successfully." - - # Suggest lockfile regeneration - if git diff --name-only "HEAD~1..HEAD" | grep -q "lock\.\(yaml\|json\)$" 2>/dev/null; then - echo "" - warn "Lockfiles were updated. Consider running: pnpm install" - fi -fi diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/setup-agentkit-branch-governance.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/setup-agentkit-branch-governance.sh deleted file mode 100644 index f955e11b..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/setup-agentkit-branch-governance.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -set -euo pipefail - -REPO="" -DRY_RUN=false -SKIP_DEFAULT_BRANCH=false -SKIP_PROTECTION=false - -while [[ $# -gt 0 ]]; do - case "$1" in - --repo) - if [[ $# -lt 2 || -z "${2:-}" || "${2:-}" == -* ]]; then - echo "Error: --repo requires a value in the form owner/name" - exit 1 - fi - REPO="$2" - shift 2 - ;; - --dry-run) - DRY_RUN=true - shift - ;; - --skip-default-branch) - SKIP_DEFAULT_BRANCH=true - shift - ;; - --skip-protection) - SKIP_PROTECTION=true - shift - ;; - --help|-h) - echo "Usage: $(basename "$0") [--repo owner/name] [--dry-run] [--skip-default-branch] [--skip-protection]" - exit 0 - ;; - *) - echo "Unknown option: $1" - exit 1 - ;; - esac -done - -if ! command -v gh >/dev/null 2>&1; then - echo "gh CLI is not installed. Install from https://cli.github.com/" - exit 1 -fi - -if ! gh auth status >/dev/null 2>&1; then - echo "gh CLI is not authenticated. Run 'gh auth login' first." - exit 1 -fi - -if [[ -z "$REPO" ]]; then - REPO=$(gh repo view --json nameWithOwner -q '.nameWithOwner' 2>/dev/null || true) -fi - -if [[ -z "$REPO" ]]; then - echo "Could not determine repository. Pass --repo <owner/name>." - exit 1 -fi - -echo "=== AgentKit Branch Governance Setup ===" -echo "Repository: $REPO" -echo "DryRun: $DRY_RUN" -echo - -if [[ "$SKIP_DEFAULT_BRANCH" == false ]]; then - if [[ "$DRY_RUN" == true ]]; then - echo "[dry-run] Would set default branch to 'main' for $REPO" - else - gh api --method PATCH "/repos/$REPO" -f default_branch='main' >/dev/null - echo "Default branch set to 'main'." - fi -fi - -PAYLOAD=$(cat <<'JSON' -{ - "required_status_checks": { - "strict": true, - "contexts": [ - "Test", - "Validate", - "Branch Protection / branch-rules" - ] - }, - "enforce_admins": false, - "required_pull_request_reviews": { - "required_approving_review_count": 1, - "dismiss_stale_reviews": true, - "require_code_owner_reviews": true, - "require_last_push_approval": false - }, - "restrictions": null, - "required_linear_history": true, - "allow_force_pushes": false, - "allow_deletions": false, - "block_creations": false, - "required_conversation_resolution": true -} -JSON -) - -if [[ "$SKIP_PROTECTION" == false ]]; then - # Deduplicate: if defaultBranch is 'main', don't apply twice - for BRANCH in $(echo "main main" | tr ' ' '\n' | awk '!seen[$0]++'); do - # Skip if the branch does not exist on the remote - if ! gh api "/repos/$REPO/branches/$BRANCH" --silent 2>/dev/null; then - echo "[skip] Branch '$BRANCH' does not exist on $REPO — skipping protection." - continue - fi - - if [[ "$DRY_RUN" == true ]]; then - echo "[dry-run] Would apply branch protection to $REPO/$BRANCH" - continue - fi - - gh api --method PUT "/repos/$REPO/branches/$BRANCH/protection" --input - <<< "$PAYLOAD" >/dev/null - echo "Branch protection applied to $BRANCH." - done -fi - -echo -echo "Done." -for BRANCH in $(echo "main main" | tr ' ' '\n' | awk '!seen[$0]++'); do - echo "Verify with: gh api /repos/$REPO/branches/$BRANCH/protection" -done diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/sync-issues.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/sync-issues.sh deleted file mode 100644 index 9ace772a..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/sync-issues.sh +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/sync-issues.sh -# Syncs local issue docs (docs/history/issues/) to GitHub Issues. -# -# Local issue markdown files that have "gh_synced: false" are candidates for -# sync. In dry-run mode (default) the script prints what would be created. -# With --apply it creates GitHub Issues via `gh` and stamps the file with the -# resulting issue number. -# -# Usage: -# ./scripts/sync-issues.sh # Dry-run — preview only -# ./scripts/sync-issues.sh --apply # Create GitHub Issues -# ./scripts/sync-issues.sh --apply --label "from-local" # Add extra label -# -# Requirements: -# - gh CLI installed and authenticated -# - Current directory inside the git repository - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -ISSUES_DIR="$REPO_ROOT/docs/history/issues" - -APPLY=false -EXTRA_LABEL="" - -while [[ $# -gt 0 ]]; do - case "$1" in - --apply) APPLY=true; shift ;; - --label) - [[ $# -ge 2 ]] || { echo "Error: --label requires a value"; exit 1; } - EXTRA_LABEL="$2"; shift 2 ;; - -h|--help) - echo "Usage: $0 [--apply] [--label <label>]" - echo " --apply Create GitHub Issues (default is dry-run)" - echo " --label Extra label to add to created issues" - exit 0 - ;; - *) echo "Unknown option: $1"; exit 1 ;; - esac -done - -# --------------------------------------------------------------------------- -# Preflight checks (only needed when actually creating issues) -# --------------------------------------------------------------------------- - -if [[ "$APPLY" == true ]]; then - if ! command -v gh &>/dev/null; then - echo "Error: gh CLI is not installed. Install it from https://cli.github.com/" - exit 1 - fi - - if ! gh auth status &>/dev/null; then - echo "Error: gh is not authenticated. Run 'gh auth login' first." - exit 1 - fi -fi - -# --------------------------------------------------------------------------- -# Discover unsynced issue files -# --------------------------------------------------------------------------- - -CANDIDATES=0 -SKIPPED=0 -FAILED=0 - -# Glob matches the enforced naming convention: XXXX-YYYY-MM-DD-slug-issue.md -# Files created outside create-doc.sh without the -issue suffix are not picked up. -for issue_file in "$ISSUES_DIR"/*-issue.md; do - [[ -f "$issue_file" ]] || continue - - basename_file="$(basename "$issue_file")" - - # Skip templates - if [[ "$basename_file" == TEMPLATE-* ]]; then - continue - fi - - # Check sync status - if ! grep -q 'gh_synced.*false' "$issue_file" 2>/dev/null; then - SKIPPED=$((SKIPPED + 1)) - continue - fi - - # Extract title from first H1 (|| true prevents set -e exit on no match) - TITLE="$(grep -m1 '^# ' "$issue_file" | sed 's/^# //' | sed 's/ - Issue Record$//')" || true - if [[ -z "$TITLE" ]]; then - TITLE="$basename_file" - fi - - # Extract severity for labeling - SEVERITY="$(grep -m1 '^\*\*Severity\*\*:' "$issue_file" | sed 's/.*: *//' | tr '[:upper:]' '[:lower:]')" || true - if [[ -z "$SEVERITY" ]]; then - echo " [warn] No severity found in $basename_file — defaulting to unlabelled" - fi - - # Extract summary section as the issue body - BODY="$(sed -n '/^## Summary$/,/^## /{/^## Summary$/d;/^## /d;p}' "$issue_file" | sed '/^$/N;/^\n$/d')" - if [[ -z "$BODY" ]]; then - echo " [warn] No ## Summary section found in $basename_file — using fallback body" - BODY="Synced from local issue doc: $basename_file" - fi - - # Append a link back to the local file - BODY="$BODY - ---- -_Synced from \`docs/history/issues/$basename_file\`_" - - # Build labels - LABELS="synced-from-local" - if [[ -n "$SEVERITY" && "$SEVERITY" != *"["* ]]; then - LABELS="$LABELS,severity:$SEVERITY" - fi - if [[ -n "$EXTRA_LABEL" ]]; then - LABELS="$LABELS,$EXTRA_LABEL" - fi - - if [[ "$APPLY" == false ]]; then - echo "[dry-run] Would create issue: \"$TITLE\"" - echo " Labels: $LABELS" - echo " Source: $basename_file" - echo "" - CANDIDATES=$((CANDIDATES + 1)) - continue - fi - - # Create the GitHub Issue — capture stderr separately so it can be surfaced - # on failure without polluting the URL on success. - echo "Creating issue: \"$TITLE\" ..." - GH_STDERR_FILE="$(mktemp)" - ISSUE_URL="$(gh issue create \ - --title "$TITLE" \ - --body "$BODY" \ - --label "$LABELS" 2>"$GH_STDERR_FILE")" || { - echo " FAILED to create issue: \"$TITLE\"" - echo " gh stderr: $(cat "$GH_STDERR_FILE")" - rm -f "$GH_STDERR_FILE" - FAILED=$((FAILED + 1)) - continue - } - rm -f "$GH_STDERR_FILE" - - # Extract issue number from URL (https://github.com/owner/repo/issues/123) - ISSUE_NUMBER="${ISSUE_URL##*/}" - if [[ ! "$ISSUE_NUMBER" =~ ^[0-9]+$ ]]; then - ISSUE_NUMBER="$(echo "$ISSUE_URL" | grep -oE '[0-9]+$')" || true - [[ -z "$ISSUE_NUMBER" ]] && ISSUE_NUMBER="unknown" - fi - - echo " Created: $ISSUE_URL (#$ISSUE_NUMBER)" - - # Stamp the local file with sync metadata (portable: temp file instead of sed -i). - SYNC_DATE="$(date +%Y-%m-%d)" - TMPFILE="$(mktemp)" - sed \ - -e "s/^\(- \*\*gh_synced\*\*:\) .*/\1 true/" \ - -e "s/^\(- \*\*gh_issue_number\*\*:\) .*/\1 #$ISSUE_NUMBER/" \ - -e "s/^\(- \*\*gh_synced_at\*\*:\) .*/\1 $SYNC_DATE/" \ - -e "s|\(- \*\*Issue tracker\*\*:\) \[GitHub Issue.*\]|\1 $ISSUE_URL|" \ - "$issue_file" > "$TMPFILE" && mv "$TMPFILE" "$issue_file" - - CANDIDATES=$((CANDIDATES + 1)) -done - -# --------------------------------------------------------------------------- -# Summary -# --------------------------------------------------------------------------- - -echo "---" -if [[ "$APPLY" == false ]]; then - echo "Dry-run complete. $CANDIDATES issue(s) would be created, $SKIPPED already synced." - echo "Run with --apply to create GitHub Issues." -else - echo "Sync complete. $CANDIDATES created, $SKIPPED already synced, $FAILED failed." -fi diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/sync-split-pr.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/sync-split-pr.sh deleted file mode 100644 index 1bbf61ac..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/sync-split-pr.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -set -euo pipefail - -BASE_BRANCH="" -NEW_BRANCH="" -COMMIT_MESSAGE="chore(sync): regenerate generated outputs" -PR_TITLE="chore(sync): regenerate generated outputs" -DRY_RUN=0 - -while [[ $# -gt 0 ]]; do - case "$1" in - --base) - BASE_BRANCH="${2:-}" - shift 2 - ;; - --branch) - NEW_BRANCH="${2:-}" - shift 2 - ;; - --commit-message) - COMMIT_MESSAGE="${2:-}" - shift 2 - ;; - --pr-title) - PR_TITLE="${2:-}" - shift 2 - ;; - --dry-run) - DRY_RUN=1 - shift - ;; - -h|--help) - cat <<'EOF' -Usage: scripts/sync-split-pr.sh [options] - -Creates a dedicated branch + commit + PR for files produced by `agentkit:sync`. - -Options: - --base <branch> PR base branch (default: current branch) - --branch <name> Branch name for sync commit (default: chore/sync-generated-<utc>) - --commit-message <msg> Commit message - --pr-title <title> PR title - --dry-run Run sync and report changes without creating branch/commit/PR - -h, --help Show help -EOF - exit 0 - ;; - *) - echo "Unknown option: $1" >&2 - exit 1 - ;; - esac -done - -if [[ -n "$(git status --porcelain)" ]]; then - echo "Working tree is not clean. Commit/stash/discard changes before running sync split." >&2 - exit 1 -fi - -CURRENT_BRANCH="$(git branch --show-current)" -if [[ -z "$BASE_BRANCH" ]]; then - BASE_BRANCH="$CURRENT_BRANCH" -fi - -if [[ -z "$NEW_BRANCH" ]]; then - TS="$(date -u +%Y%m%d-%H%M%S)" - NEW_BRANCH="chore/sync-generated-$TS" -fi - -echo "Running sync..." -pnpm -C .agentkit agentkit:sync - -CHANGED_FILES="$(git status --porcelain)" -if [[ -z "$CHANGED_FILES" ]]; then - echo "No sync-generated changes detected." - mkdir -p .agentkit/logs - printf '{"timestamp":"%s","tool":"sync-split-pr","outcome":"no_changes","base":"%s","branch":"%s"}\n' \ - "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$BASE_BRANCH" "$CURRENT_BRANCH" >> .agentkit/logs/tool-usage.jsonl - exit 0 -fi - -FILES_COUNT="$(git status --porcelain | wc -l | tr -d ' ')" -echo "Detected $FILES_COUNT changed file(s) from sync." - -if [[ "$DRY_RUN" -eq 1 ]]; then - echo "Dry run enabled; not creating branch/commit/PR." - git status --short - mkdir -p .agentkit/logs - printf '{"timestamp":"%s","tool":"sync-split-pr","outcome":"dry_run","files":%s,"base":"%s","branch":"%s"}\n' \ - "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$FILES_COUNT" "$BASE_BRANCH" "$CURRENT_BRANCH" >> .agentkit/logs/tool-usage.jsonl - exit 0 -fi - -git checkout -b "$NEW_BRANCH" -git add -A -git commit -m "$COMMIT_MESSAGE" -git push -u origin "$NEW_BRANCH" - -PR_BODY="Automated sync-only PR. - -- Source branch: $CURRENT_BRANCH -- Sync command: pnpm -C .agentkit agentkit:sync -- Changed files: $FILES_COUNT" - -PR_URL="$(gh pr create --base "$BASE_BRANCH" --head "$NEW_BRANCH" --title "$PR_TITLE" --body "$PR_BODY")" -echo "Created PR: $PR_URL" - -mkdir -p .agentkit/logs -printf '{"timestamp":"%s","tool":"sync-split-pr","outcome":"pr_created","files":%s,"base":"%s","source":"%s","syncBranch":"%s","prUrl":"%s"}\n' \ - "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$FILES_COUNT" "$BASE_BRANCH" "$CURRENT_BRANCH" "$NEW_BRANCH" "$PR_URL" >> .agentkit/logs/tool-usage.jsonl diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/update-changelog.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/update-changelog.sh deleted file mode 100644 index e5693e00..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/update-changelog.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/update-changelog.sh -# Inserts an entry into the [Unreleased] section of CHANGELOG.md. -# -# Usage: -# ./scripts/update-changelog.sh <section> "<description>" [pr-number] [history-doc-path] -# -# Arguments: -# section Changelog section: Added | Fixed | Changed | Removed | Security | Deprecated -# description Human-readable description of the change -# pr-number Optional PR number (e.g. 42) -# history-doc-path Optional relative path to the history document -# -# Examples: -# ./scripts/update-changelog.sh Added "New user auth feature" 44 -# ./scripts/update-changelog.sh Fixed "Null reference in login flow" 43 \ -# "docs/history/bug-fixes/0001-2026-03-01-null-reference-bugfix.md" - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -CHANGELOG="$REPO_ROOT/CHANGELOG.md" - -# --------------------------------------------------------------------------- -# Argument validation -# --------------------------------------------------------------------------- - -usage() { - echo "Usage: $0 <section> \"<description>\" [pr-number] [history-doc-path]" - echo " section: Added | Fixed | Changed | Removed | Security | Deprecated" - exit 1 -} - -if [[ $# -lt 2 ]]; then - usage -fi - -SECTION="$1" -DESCRIPTION="$2" -PR_NUMBER="${3:-}" -HISTORY_DOC="${4:-}" - -case "$SECTION" in - Added|Fixed|Changed|Removed|Security|Deprecated) ;; - *) echo "Error: unknown section '$SECTION'. Must be one of: Added, Fixed, Changed, Removed, Security, Deprecated"; exit 1 ;; -esac - -if [[ ! -f "$CHANGELOG" ]]; then - echo "Error: CHANGELOG.md not found at $CHANGELOG" - exit 1 -fi - -# --------------------------------------------------------------------------- -# Build the entry line -# --------------------------------------------------------------------------- - -ENTRY="- $DESCRIPTION" - -if [[ -n "$PR_NUMBER" && -n "$HISTORY_DOC" ]]; then - ENTRY="$ENTRY ([#${PR_NUMBER}](../../pull/${PR_NUMBER}), [history](${HISTORY_DOC}))" -elif [[ -n "$PR_NUMBER" ]]; then - ENTRY="$ENTRY ([#${PR_NUMBER}](../../pull/${PR_NUMBER}))" -elif [[ -n "$HISTORY_DOC" ]]; then - ENTRY="$ENTRY ([history](${HISTORY_DOC}))" -fi - -# --------------------------------------------------------------------------- -# Insert entry into CHANGELOG.md using Node.js for reliable multiline editing -# --------------------------------------------------------------------------- - -node - "$CHANGELOG" "$SECTION" "$ENTRY" << 'NODEEOF' -const [,, changelogPath, section, entry] = process.argv; -const fs = require('fs'); -const content = fs.readFileSync(changelogPath, 'utf8'); -const lines = content.split('\n'); - -// Find the [Unreleased] section -const unreleasedIdx = lines.findIndex(l => /^## \[Unreleased\]/i.test(l)); -if (unreleasedIdx === -1) { - console.error('Error: could not find ## [Unreleased] section in CHANGELOG.md'); - process.exit(1); -} - -// Find or create the target ### section within [Unreleased] -// The [Unreleased] block ends at the next ## line -let blockEnd = lines.findIndex((l, i) => i > unreleasedIdx && /^## /.test(l)); -if (blockEnd === -1) blockEnd = lines.length; - -const sectionHeader = `### ${section}`; -let sectionIdx = lines.findIndex((l, i) => i > unreleasedIdx && i < blockEnd && l.trim() === sectionHeader); - -if (sectionIdx === -1) { - // Section doesn't exist — insert before blockEnd (or before the next ---/## delimiter) - let insertAt = blockEnd; - // Look for a trailing --- separator just before blockEnd - for (let i = blockEnd - 1; i > unreleasedIdx; i--) { - if (lines[i].trim() === '---') { insertAt = i; break; } - if (lines[i].trim() !== '') break; - } - lines.splice(insertAt, 0, '', sectionHeader, entry); -} else { - // Section exists — insert after the header line (and any existing entries) - let insertAt = sectionIdx + 1; - // Find the end of this section's entries (next ### or ## or blank+##/###) - while ( - insertAt < blockEnd && - lines[insertAt].trim() !== '' && - !lines[insertAt].startsWith('###') && - !lines[insertAt].startsWith('##') - ) { - insertAt++; - } - lines.splice(insertAt, 0, entry); -} - -fs.writeFileSync(changelogPath, lines.join('\n'), 'utf8'); -console.log(`Updated CHANGELOG.md — ${section}: ${entry}`); -NODEEOF diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/validate-documentation.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/validate-documentation.sh deleted file mode 100644 index e5a60220..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/validate-documentation.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/validate-documentation.sh -# Validates that history documents meet structural requirements. -# -# Usage: -# ./scripts/validate-documentation.sh [file...] -# -# If no files are given, validates all markdown files under docs/history/. - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" - -ERRORS=0 - -validate_file() { - local file="$1" - local base - base="$(basename "$file")" - - # Skip template and README files - if [[ "$base" == TEMPLATE-* || "$base" == README.md ]]; then - return 0 - fi - - # Validate naming convention: XXXX-YYYY-MM-DD-*-{type}.md - if ! [[ "$base" =~ ^[0-9]{4}-[0-9]{4}-[0-9]{2}-[0-9]{2}-.+-(implementation|bugfix|feature|migration)\.md$ ]]; then - echo "❌ $file" - echo " Invalid filename format. Expected: XXXX-YYYY-MM-DD-[title]-[type].md" - ERRORS=$((ERRORS + 1)) - return 0 - fi - - # Check that required placeholder sections have been filled in - if grep -q '\[YYYY-MM-DD\]' "$file"; then - echo "❌ $file" - echo " Unfilled placeholder: [YYYY-MM-DD]" - ERRORS=$((ERRORS + 1)) - fi - - if grep -q '\[#PR-Number\]' "$file"; then - echo "⚠️ $file" - echo " Missing PR number: [#PR-Number] not replaced" - fi - - # Check that file is non-empty beyond the title line - local line_count - line_count=$(wc -l < "$file") - if [[ "$line_count" -lt 10 ]]; then - echo "❌ $file" - echo " Document too short ($line_count lines). Please fill in the template." - ERRORS=$((ERRORS + 1)) - fi -} - -# Determine files to validate -if [[ $# -gt 0 ]]; then - FILES=("$@") -else - mapfile -t FILES < <(find "$HISTORY_DIR" -name "*.md" -not -name "README.md" -not -name "TEMPLATE-*" 2>/dev/null || true) -fi - -if [[ ${#FILES[@]} -eq 0 ]]; then - echo "ℹ️ No history documents found to validate." - exit 0 -fi - -for f in "${FILES[@]}"; do - validate_file "$f" -done - -if [[ "$ERRORS" -gt 0 ]]; then - echo "" - echo "Found $ERRORS validation error(s)." - exit 1 -else - echo "✅ All history documents are valid." -fi diff --git a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/validate-numbering.sh b/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/validate-numbering.sh deleted file mode 100644 index 00c2a506..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/.scaffold-cache/scripts/validate-numbering.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/validate-numbering.sh -# Validates the sequential numbering of history documents against .index.json. -# -# Usage: -# ./scripts/validate-numbering.sh - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" -INDEX_FILE="$HISTORY_DIR/.index.json" - -ERRORS=0 - -if [[ ! -f "$INDEX_FILE" ]]; then - echo "ℹ️ No .index.json found at $INDEX_FILE — skipping numbering validation." - exit 0 -fi - -# Check for duplicate sequence numbers per type -for subdir in implementations bug-fixes features migrations; do - case "$subdir" in - implementations) TYPE="implementation" ;; - bug-fixes) TYPE="bugfix" ;; - features) TYPE="feature" ;; - migrations) TYPE="migration" ;; - esac - - DIR="$HISTORY_DIR/$subdir" - if [[ ! -d "$DIR" ]]; then - continue - fi - - declare -A seen_numbers=() - - while IFS= read -r -d '' file; do - base="$(basename "$file")" - # Skip templates and READMEs - if [[ "$base" == TEMPLATE-* || "$base" == README.md ]]; then - continue - fi - # Extract leading 4-digit number - if [[ "$base" =~ ^([0-9]{4})- ]]; then - num="${BASH_REMATCH[1]}" - if [[ -n "${seen_numbers[$num]+x}" ]]; then - echo "❌ Duplicate number $num in $subdir/:" - echo " ${seen_numbers[$num]}" - echo " $base" - ERRORS=$((ERRORS + 1)) - else - seen_numbers[$num]="$base" - fi - fi - done < <(find "$DIR" -maxdepth 1 -name "*.md" -print0 2>/dev/null || true) - - unset seen_numbers -done - -if [[ "$ERRORS" -gt 0 ]]; then - echo "" - echo "Found $ERRORS numbering error(s)." - exit 1 -else - echo "✅ Sequential numbering is valid." -fi diff --git a/.claude/worktrees/focused-colden/.agentkit/logs/usage-2026-03-16.jsonl b/.claude/worktrees/focused-colden/.agentkit/logs/usage-2026-03-16.jsonl deleted file mode 100644 index 1406244c..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/logs/usage-2026-03-16.jsonl +++ /dev/null @@ -1,8 +0,0 @@ -{ - "timestamp": "2026-03-16T21:11:08.000Z", - "event": "session_start", - "sessionId": "ee01d53c-5eba-4fc9-9de2-73b21ff7a6b9", - "user": "6d0e0d6bc477", - "branch": "claude/focused-colden", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\focused-colden" -} diff --git a/.claude/worktrees/focused-colden/.agentkit/logs/usage-2026-03-17.jsonl b/.claude/worktrees/focused-colden/.agentkit/logs/usage-2026-03-17.jsonl deleted file mode 100644 index 14ae0190..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/logs/usage-2026-03-17.jsonl +++ /dev/null @@ -1,24 +0,0 @@ -{ - "timestamp": "2026-03-17T02:10:54.000Z", - "event": "session_start", - "sessionId": "ee01d53c-5eba-4fc9-9de2-73b21ff7a6b9", - "user": "6d0e0d6bc477", - "branch": "claude/focused-colden", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\focused-colden" -} -{ - "timestamp": "2026-03-17T03:55:20.000Z", - "event": "session_start", - "sessionId": "ee01d53c-5eba-4fc9-9de2-73b21ff7a6b9", - "user": "6d0e0d6bc477", - "branch": "claude/focused-colden", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\focused-colden" -} -{ - "timestamp": "2026-03-17T06:54:30.000Z", - "event": "session_start", - "sessionId": "ee01d53c-5eba-4fc9-9de2-73b21ff7a6b9", - "user": "6d0e0d6bc477", - "branch": "claude/focused-colden", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\focused-colden" -} diff --git a/.claude/worktrees/focused-colden/.agentkit/package-lock.json b/.claude/worktrees/focused-colden/.agentkit/package-lock.json deleted file mode 100644 index 0ecd531d..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/package-lock.json +++ /dev/null @@ -1,2764 +0,0 @@ -{ - "name": "agentkit-forge-runtime", - "version": "3.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "agentkit-forge-runtime", - "version": "3.1.0", - "dependencies": { - "@clack/prompts": "^1.0.1", - "js-yaml": "^4.1.0" - }, - "devDependencies": { - "markdownlint-cli2": "^0.18.1", - "prettier": "^3.5.3", - "vitest": "^4.0.18" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@clack/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.0.1.tgz", - "integrity": "sha512-WKeyK3NOBwDOzagPR5H08rFk9D/WuN705yEbuZvKqlkmoLM2woKtXb10OO2k1NoSU4SFG947i2/SCYh+2u5e4g==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@clack/prompts": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.0.1.tgz", - "integrity": "sha512-/42G73JkuYdyWZ6m8d/CJtBrGl1Hegyc7Fy78m5Ob+jF85TOUmLR5XLce/U3LxYAw0kJ8CT5aI99RIvPHcGp/Q==", - "license": "MIT", - "dependencies": { - "@clack/core": "1.0.1", - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.18", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/katex": { - "version": "0.16.33", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.33.tgz", - "integrity": "sha512-q3N5u+1sY9Bu7T4nlXoiRBXWfwSefNGoKeOwekV+gw0cAXQlz2Ww6BLcmBxVDeXBMUDQv6fK5bcNaJLxob3ZQA==", - "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdownlint": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz", - "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark": "4.0.2", - "micromark-core-commonmark": "2.0.3", - "micromark-extension-directive": "4.0.0", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.1", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-cli2": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.18.1.tgz", - "integrity": "sha512-/4Osri9QFGCZOCTkfA8qJF+XGjKYERSHkXzxSyS1hd3ZERJGjvsUao2h4wdnvpHp6Tu2Jh/bPHM0FE9JJza6ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "globby": "14.1.0", - "js-yaml": "4.1.0", - "jsonc-parser": "3.3.1", - "markdown-it": "14.1.0", - "markdownlint": "0.38.0", - "markdownlint-cli2-formatter-default": "0.0.5", - "micromatch": "4.0.8" - }, - "bin": { - "markdownlint-cli2": "markdownlint-cli2-bin.mjs" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-cli2-formatter-default": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.5.tgz", - "integrity": "sha512-4XKTwQ5m1+Txo2kuQ3Jgpo/KmnG+X90dWt4acufg6HVGadTUG5hzHF/wssp9b5MBYOMCnZ9RMPaU//uHsszF8Q==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - }, - "peerDependencies": { - "markdownlint-cli2": ">=0.0.4" - } - }, - "node_modules/markdownlint-cli2/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - } - } -} diff --git a/.claude/worktrees/focused-colden/.agentkit/state/orchestrator.json.template b/.claude/worktrees/focused-colden/.agentkit/state/orchestrator.json.template deleted file mode 100644 index 076c20ed..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/state/orchestrator.json.template +++ /dev/null @@ -1,25 +0,0 @@ -{ - "schema_version": "1.0.0", - "repo_id": "agentkit-forge", - "branch": "main", - "session_id": "", - "current_phase": 1, - "phase_name": "Discovery", - "last_phase_completed": 0, - "next_action": "Run /orchestrate to begin project assessment", - "team_progress": { - "team-backend": { "status": "idle", "notes": "" }, - "team-frontend": { "status": "idle", "notes": "" }, - "team-data": { "status": "idle", "notes": "" }, - "team-infra": { "status": "idle", "notes": "" }, - "team-devops": { "status": "idle", "notes": "" }, - "team-testing": { "status": "idle", "notes": "" }, - "team-security": { "status": "idle", "notes": "" }, - "team-docs": { "status": "idle", "notes": "" }, - "team-product": { "status": "idle", "notes": "" }, - "team-quality": { "status": "idle", "notes": "" } - }, - "todo_items": [], - "recent_results": [], - "completed": false -} diff --git a/.claude/worktrees/focused-colden/.agentkit/state/schema.json b/.claude/worktrees/focused-colden/.agentkit/state/schema.json deleted file mode 100644 index 7bfdc405..00000000 --- a/.claude/worktrees/focused-colden/.agentkit/state/schema.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AgentKit Forge Orchestrator State", - "description": "Schema for the orchestrator state file managed by /orchestrate", - "type": "object", - "required": ["schema_version", "repo_id", "current_phase", "phase_name", "team_progress"], - "properties": { - "schema_version": { - "type": "string", - "const": "1.0.0", - "description": "Schema version for forward compatibility" - }, - "repo_id": { - "type": "string", - "description": "Repository identifier (from .agentkit-repo)" - }, - "branch": { - "type": "string", - "description": "Current git branch" - }, - "session_id": { - "type": "string", - "description": "Current session identifier" - }, - "current_phase": { - "type": "integer", - "minimum": 1, - "maximum": 5, - "description": "Current lifecycle phase (1-5)" - }, - "phase_name": { - "type": "string", - "enum": ["Discovery", "Planning", "Implementation", "Validation", "Ship"], - "description": "Human-readable phase name" - }, - "last_phase_completed": { - "type": "integer", - "minimum": 0, - "maximum": 5, - "description": "Last fully completed phase (0 = none)" - }, - "next_action": { - "type": "string", - "description": "Recommended next action" - }, - "team_progress": { - "type": "object", - "description": "Per-team status tracking", - "patternProperties": { - "^team-": { - "type": "object", - "required": ["status"], - "properties": { - "status": { - "type": "string", - "enum": ["idle", "in_progress", "blocked", "done"] - }, - "notes": { - "type": "string" - }, - "last_updated": { - "type": "string", - "format": "date-time" - }, - "assigned_to": { - "type": "string" - } - } - } - } - }, - "todo_items": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "title", "status"], - "properties": { - "id": { "type": "string" }, - "title": { "type": "string" }, - "status": { - "type": "string", - "enum": ["pending", "in_progress", "done", "blocked"] - }, - "team": { "type": "string" }, - "priority": { - "type": "string", - "enum": ["critical", "high", "medium", "low"] - } - } - } - }, - "recent_results": { - "type": "array", - "items": { - "type": "object", - "properties": { - "timestamp": { "type": "string", "format": "date-time" }, - "action": { "type": "string" }, - "result": { "type": "string" }, - "team": { "type": "string" } - } - } - }, - "completed": { - "type": "boolean", - "description": "Whether all phases are complete" - }, - "last_healthcheck": { - "type": "string", - "format": "date-time", - "description": "Timestamp of last healthcheck run" - }, - "health_status": { - "type": "string", - "enum": ["HEALTHY", "UNHEALTHY"], - "description": "Overall health status from last healthcheck" - }, - "session_metrics": { - "type": "object", - "description": "Cost tracking session metrics", - "properties": { - "current_session_id": { - "type": "string", - "description": "Active session ID for cost tracking" - }, - "total_sessions": { - "type": "integer", - "description": "Total sessions recorded" - }, - "last_session_end": { - "type": "string", - "format": "date-time", - "description": "When the last session ended" - } - } - } - } -} diff --git a/.claude/worktrees/focused-colden/.claude/settings.local.json b/.claude/worktrees/focused-colden/.claude/settings.local.json deleted file mode 100644 index db9b92be..00000000 --- a/.claude/worktrees/focused-colden/.claude/settings.local.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(git ls-remote https://github.com/actions/checkout.git refs/tags/v4.2.2)", - "Bash(git ls-remote https://github.com/anthropics/claude-code-action.git refs/tags/v1)", - "Bash(git ls-remote https://github.com/actions/github-script.git refs/tags/v7)", - "Bash(pnpm -C .agentkit test)", - "Bash(pnpm -C .agentkit vitest run src/__tests__/prettier.test.mjs src/__tests__/expansion-analyzer.test.mjs src/__tests__/budget-guard.test.mjs src/__tests__/feature-manager.test.mjs src/__tests__/backlog-store.test.mjs src/__tests__/discover.test.mjs)", - "Bash(pnpm -C .agentkit agentkit:sync)", - "Bash(grep -rn 'uses:' .agentkit/templates/github/workflows/*.yml)", - "Bash(grep -rn 'uses:.*@[a-f0-9]\\\\{40\\\\}' .agentkit/templates/github/workflows/*.yml)", - "Bash(grep -rn 'uses:.*@v[0-9]' .agentkit/templates/github/workflows/*.yml)", - "Bash(git ls-remote https://github.com/pnpm/action-setup.git refs/tags/v4.2.0)", - "Bash(git ls-remote https://github.com/actions/setup-node.git refs/tags/v4.4.0)", - "Bash(git ls-remote https://github.com/actions/setup-python.git refs/tags/v5.6.0)", - "Bash(git ls-remote https://github.com/pnpm/action-setup.git refs/tags/v4)", - "Bash(git checkout -- AGENT_TEAMS.md .clinerules/git-workflow.md)", - "Bash(for branch in dev chore/merge-all-open-branches ci/enforce-sha-pinning-and-templates claude/fix-full-tier-black-elements-gkgln docs/consolidate-pending-items docs/restructure-agentkit-docs fix/review-findings-round1 fix/template-numbered-paths refactor/remove-team-prefix)", - "Bash(do echo \"=== $branch ===\")", - "Bash(git checkout -- .)", - "Bash(git pull)", - "Bash(git cherry-pick 097e0cc --no-edit)", - "Bash(git remote prune origin)", - "Bash(pnpm -C /c/Users/smitj/repos/retort/.agentkit test)", - "Bash(gh repo list JustAGhosT --limit 50)", - "Bash(gh label create \"priority:P3\" --repo phoenixvc/cognitive-mesh --color \"0E8A16\" --description \"Priority 3 - Nice to have\")", - "Bash(git add -A)", - "Bash(gh label list --repo phoenixvc/cognitive-mesh --json name,description,color --limit 100)", - "Bash(gh label list --repo JustAGhosT/retort --json name,description,color --limit 100)", - "mcp__filesystem__read_multiple_files", - "Bash(grep -E \"\\\\.\\(yml|yaml|json|ts|js\\)$\")", - "Bash(gh label:*)", - "Bash(git add:*)", - "Bash(gh api:*)", - "WebSearch", - "WebFetch(domain:buildermethods.com)", - "WebFetch(domain:github.com)" - ] - } -} diff --git a/.claude/worktrees/focused-colden/.claude/state/events.log b/.claude/worktrees/focused-colden/.claude/state/events.log deleted file mode 100644 index 48ed9c92..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/events.log +++ /dev/null @@ -1,105 +0,0 @@ -{"timestamp":"2026-02-26T17:31:21.524Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":92388},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1253},{"step":"build","status":"FAIL","durationMs":2299}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T17:32:22.387Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":57877},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1756}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T17:40:11.462Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":300556},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":12726},{"step":"build","status":"FAIL","durationMs":4619}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T17:44:14.114Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":236951},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":2693}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T17:57:01.313Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":54449},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1488},{"step":"build","status":"FAIL","durationMs":1535}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T17:57:39.437Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":35135},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1489}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T18:00:44.882Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":18855},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":599},{"step":"build","status":"FAIL","durationMs":755}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T18:00:57.395Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":11525},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":587}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T22:50:22.150Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":43407},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1370},{"step":"build","status":"FAIL","durationMs":1982}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T22:50:57.402Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":34361},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":485}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T22:59:44.909Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":72662},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1055},{"step":"build","status":"FAIL","durationMs":1767}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T23:00:12.840Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":26869},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":598}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T23:27:21.525Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":54059},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1538},{"step":"build","status":"FAIL","durationMs":2558}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T23:27:55.191Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":31691},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1126}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T23:47:11.830Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":54257},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":2146},{"step":"build","status":"FAIL","durationMs":3389}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T23:47:43.881Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":30944},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":619}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-28T15:41:34.550Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":118},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":15063},{"step":"build","status":"FAIL","durationMs":4029}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-28T15:41:38.884Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":29},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3080}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-01T04:51:06.914Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":43},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-01T04:51:08.526Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":19},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-01T04:54:06.715Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":53},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":28}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-01T04:54:08.867Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":75},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-01T05:10:28.549Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":106},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":22},{"step":"build","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-01T05:10:30.610Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":19},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T14:57:27.967Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":158},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T14:57:29.567Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":22},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T15:01:59.380Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":30},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T15:02:00.404Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":20},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:05:27.157Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":20},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1913},{"step":"build","status":"FAIL","durationMs":3071}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:05:57.398Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":22},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:05:59.276Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":16},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:14:48.130Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":26},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8},{"step":"build","status":"FAIL","durationMs":153}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:14:55.776Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":438},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":35}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:16:15.728Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":46},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":101184},{"step":"build","status":"FAIL","durationMs":9256}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:19:12.380Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":29},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":7},{"step":"build","status":"FAIL","durationMs":11}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:19:14.119Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":21},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:25:42.885Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":27},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8},{"step":"build","status":"FAIL","durationMs":160}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:25:46.626Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":181},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":26}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:27:05.654Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":18},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"PASS","durationMs":95529},{"step":"build","status":"PASS","durationMs":7674}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:32:51.735Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":252},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":75},{"step":"build","status":"FAIL","durationMs":42}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:32:55.553Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":192},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":22}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:34:25.998Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":23},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":120925},{"step":"build","status":"PASS","durationMs":7972}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:36:16.808Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":109},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":10},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:36:19.087Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":51},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:39:23.323Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":269},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":37},{"step":"build","status":"FAIL","durationMs":46}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:39:26.597Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":142},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":27}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:41:21.411Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":262},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":138},{"step":"build","status":"FAIL","durationMs":74}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:41:25.946Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":179},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":68}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:42:47.046Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":16},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":92882},{"step":"build","status":"PASS","durationMs":10552}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:43:49.613Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":250},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":81},{"step":"build","status":"FAIL","durationMs":105}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:43:53.957Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":444},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":19}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T18:57:58.751Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":64},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":7},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T18:58:00.655Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":40},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T18:58:46.509Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":24},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":60941},{"step":"build","status":"PASS","durationMs":3076}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:00:40.415Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":83},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":97},{"step":"build","status":"FAIL","durationMs":171}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:00:50.568Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":562},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":58}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T19:15:27.769Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":48},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:15:29.811Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":19},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T19:18:40.784Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":56},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:18:42.732Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":21},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T19:36:57.250Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":25},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:36:58.289Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":17},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:14:44.559Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":45},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":11}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:14:46.176Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":40},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:20:45.419Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":72},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4},{"step":"build","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:20:46.671Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":17},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:21:33.859Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":21},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:21:35.551Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":24},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:22:37.730Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":36},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:22:39.534Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":16},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:23:58.276Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":56},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:23:59.332Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":17},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:27:17.403Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":231},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":17},{"step":"build","status":"FAIL","durationMs":15}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:27:19.502Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":75},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":14}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T10:20:44.292Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":15},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T11:40:03.234Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":12},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T11:40:14.944Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":24},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T11:40:16.696Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":20},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T13:37:02.860Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":37},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T13:37:04.586Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":18},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T14:57:52.992Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"PASS","durationMs":12865},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T16:26:18.432Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"PASS","durationMs":8533},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T18:50:47.548Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":10054},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T18:53:17.017Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":9339},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -[2026-03-11T03:17:17.000Z] [HANDOFF] [ORCHESTRATOR] Session complete. Done: 6 items. Blockers: 0. Next: "Start Phase 1 cost-provider-schema on feat/cost-provider-schema branch". -[2026-03-11T17:00:03Z] [ORCHESTRATE] [W1] Phase 5 Ship. Tests: 110/110. Sync: clean. Branch: fix/ci-remediation. Commits ahead: 51. Ready for PR to main. -[2026-03-15T07:06:00Z] [ORCHESTRATE] [W1] Phase 5 Ship. Branch: feat/source-code-conventions. Build: pass. agentkit:check fails (Duplicate export auditUnresolvedPlaceholders). orchestrator.test.mjs: 22 failed. Health: at_risk. Next: fix test/check then PR. -[2026-03-15T07:13:00Z] [ORCHESTRATE] [W1] Phase 5 Ship. Branch: feat/source-code-conventions. Build: pass. No lock. Validation: build re-run PASS. Tests running in background. Health: at_risk (check CLI + orchestrator tests). Next: fix then PR to main. -[2026-03-15T07:16:00Z] [ORCHESTRATE] [W1] Fixed check.mjs duplicate export (auditUnresolvedPlaceholders). agentkit:check runs; format PASS. NB added to CLAUDE.md: this repo may modify .agentkit files. Next: orchestrator.test.mjs fixes then PR. -[2026-03-15T09:25:00Z] [ORCHESTRATE] [W1] Phase 5 Ship. Fixed orchestrator.test.mjs: unique temp dir per test (TEST_BASE/run-id), removed afterEach rmSync. 39/39 orchestrator tests pass. Health: healthy. Next: Create PR to main. -[2026-03-15T11:30:00Z] [ORCHESTRATE] [W1] Phase 2 Planning. Scope: all P0 and P1. Discovery: AGENT_TEAMS.md present; CI workflows present (ci.yml, branch-protection, etc.). Healthcheck: UNHEALTHY (typecheck/test/build fail in agentkit:check). Created 7 task files in .claude/state/tasks/ for P0 (2) and P1 (5). Next: teams implement then Phase 4 Validation. -[2026-03-15T12:05:00Z] [ORCHESTRATE] [W1] Assess-only run. Branch: fix/generated-files-and-conflict-markers. Phase 2. Tasks: 7 submitted, 0 in progress, 0 completed. Health: UNHEALTHY. Check: format PASS; typecheck/test/build FAIL. Next: run /team-infra, /team-quality, /team-backend, /team-data to implement tasks; then re-run /orchestrate for Validation. -[2026-03-15T12:15:00Z] [TEAM] [backend] Completed 2 items. Changes: 1 file (docs/api/07_framework-api-conventions.md). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T12:25:00Z] [TEAM] [infra] Rejected task-p0-ci-pipeline (out of scope; suggested team-devops). Completed 1 item (task-p1-staging-env). Changes: infra/README.md, docker-compose.yml. Tests: 0 added, 0 modified. Gate: N/A. -[2026-03-15T12:35:00Z] [TEAM] [data] Completed 2 items. Changes: db/README.md, migrations/README.md. Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T12:45:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (PRD index). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:00:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (P1 backlog section). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:10:00Z] [ORCHESTRATE] [W1] Assess. Branch: fix/generated-files-and-conflict-markers. Phase 2. Tasks: 5 completed, 1 rejected (P0 CI → devops), 1 submitted (P0 test-framework). Health: UNHEALTHY (format/typecheck/test/build FAIL). Next: /team-quality for task-p0-test-framework; reassign P0 CI to DevOps; then Phase 4 Validation. -[2026-03-15T13:15:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (link to PLAN-gh371). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:20:00Z] [ORCHESTRATE] [W1] Assess-only. Branch: fix/generated-files-and-conflict-markers. Phase 2. Tasks: 5 completed, 1 rejected, 1 submitted (task-p0-test-framework). Health: UNHEALTHY. Next: /team-quality; reassign P0 CI to DevOps; Phase 4 Validation. -[2026-03-15T13:25:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (GH#328 plan note, link to implementation plans). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:30:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (next PRD number 008 in Creating a New PRD). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:35:00Z] [TEAM] [product] No delegated tasks; no additional backlog items completed (P1/P2 require plans or implementation). Scope: docs/product/**, docs/prd/**. -[2026-03-15T13:40:00Z] [TEAM] [docs] Completed 1 item. Changes: CONTRIBUTING.md (link to docs hub in Discovery phase). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-17T04:35:00Z] [HANDOFF] [ORCHESTRATOR] Session complete. Done: 6 items (findings report, ADR-10, adoption roadmap, competitive landscape, PR review responses, merge conflict resolution). Blockers: 0. Next: "Review and merge PR #428, then begin Phase 1 implementation of ADR-10 (.agents/ sync target)". diff --git a/.claude/worktrees/focused-colden/.claude/state/orchestrator.json b/.claude/worktrees/focused-colden/.claude/state/orchestrator.json deleted file mode 100644 index ad4dd611..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/orchestrator.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "schema_version": "1.0.0", - "repo_id": "JustAGhosT/retort", - "branch": "fix/generated-files-and-conflict-markers", - "session_id": "2026-03-15", - "current_phase": 2, - "phase_name": "Planning", - "last_phase_completed": 1, - "next_action": "Complete task-p0-test-framework (team-quality). Reassign P0 CI to DevOps. Then run Phase 4 Validation.", - "lastHealthcheck": "2026-03-15T13:10:00Z", - "healthStatus": "unhealthy", - "healthDetails": { - "dependencies": "pass", - "format": "FAIL", - "lint": "SKIP (eslint not found)", - "typecheck": "FAIL", - "tests": "FAIL", - "build": "FAIL", - "syncDrift": "not run" - }, - "taskSummary": { - "total": 7, - "completed": 5, - "rejected": 1, - "submitted": 1 - }, - "backlogSnapshot": [ - {"priority": "P0", "team": "T4-Infrastructure", "task": "Configure CI pipeline for main branch"}, - {"priority": "P0", "team": "T10-Quality", "task": "Set up test framework and coverage thresholds"}, - {"priority": "P1", "team": "T1-Backend", "task": "Define core API route structure"}, - {"priority": "P1", "team": "T3-Data", "task": "Design initial database schema"}, - {"priority": "P1", "team": "T1-Backend", "task": "Implement health check endpoint"}, - {"priority": "P1", "team": "T3-Data", "task": "Create migration tooling setup"}, - {"priority": "P1", "team": "T4-Infrastructure", "task": "Set up staging environment"} - ], - "team_progress": { - "backend": { "status": "idle", "notes": "Completed task-p1-api-routes, task-p1-health-check (docs/api/07_framework-api-conventions.md)." }, - "frontend": { "status": "idle", "notes": "start TUI component merged and tested" }, - "data": { "status": "idle", "notes": "Completed task-p1-db-schema, task-p1-migration-tooling (db/README.md, migrations/README.md; repo has no DB, adopters own schema and migrations)." }, - "infra": { "status": "idle", "notes": "Rejected P0 CI (DevOps scope). Completed P1 staging: infra/README.md, docker-compose.yml." }, - "devops": { "status": "idle", "notes": "Configurable package manager implemented" }, - "testing": { "status": "complete", "notes": "110 tests green, ConversationFlow flakiness fixed" }, - "security": { "status": "idle", "notes": "" }, - "docs": { "status": "idle", "notes": "CONTRIBUTING.md: link to docs hub (docs/README.md) in Discovery phase." }, - "product": { "status": "idle", "notes": "PRD index, P1 backlog, PLAN-gh371 link, docs/planning link, next PRD number (008) in Creating a New PRD." }, - "quality": { "status": "complete", "notes": "Review findings addressed, sync drift clean" } - }, - "todo_items": [], - "recent_results": [ - { - "date": "2026-03-11", - "action": "Fixed ConversationFlow test flakiness (ink-select-input event loop yields)", - "status": "done" - }, - { - "date": "2026-03-11", - "action": "Added pnpm-workspace.yaml packages field", - "status": "done" - }, - { - "date": "2026-03-11", - "action": "Regenerated lockfile after version pinning", - "status": "done" - }, - { - "date": "2026-03-11", - "action": "Verified sync drift clean (533 files, 0 changes)", - "status": "done" - } - ], - "completed": false -} diff --git a/.claude/worktrees/focused-colden/.claude/state/orchestrator.json.template b/.claude/worktrees/focused-colden/.claude/state/orchestrator.json.template deleted file mode 100644 index 076c20ed..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/orchestrator.json.template +++ /dev/null @@ -1,25 +0,0 @@ -{ - "schema_version": "1.0.0", - "repo_id": "agentkit-forge", - "branch": "main", - "session_id": "", - "current_phase": 1, - "phase_name": "Discovery", - "last_phase_completed": 0, - "next_action": "Run /orchestrate to begin project assessment", - "team_progress": { - "team-backend": { "status": "idle", "notes": "" }, - "team-frontend": { "status": "idle", "notes": "" }, - "team-data": { "status": "idle", "notes": "" }, - "team-infra": { "status": "idle", "notes": "" }, - "team-devops": { "status": "idle", "notes": "" }, - "team-testing": { "status": "idle", "notes": "" }, - "team-security": { "status": "idle", "notes": "" }, - "team-docs": { "status": "idle", "notes": "" }, - "team-product": { "status": "idle", "notes": "" }, - "team-quality": { "status": "idle", "notes": "" } - }, - "todo_items": [], - "recent_results": [], - "completed": false -} diff --git a/.claude/worktrees/focused-colden/.claude/state/schema.json b/.claude/worktrees/focused-colden/.claude/state/schema.json deleted file mode 100644 index 5206822c..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/schema.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Retort Orchestrator State", - "description": "Schema for the orchestrator state file managed by /orchestrate", - "type": "object", - "required": ["schema_version", "repo_id", "current_phase", "phase_name", "team_progress"], - "properties": { - "schema_version": { - "type": "string", - "const": "1.0.0", - "description": "Schema version for forward compatibility" - }, - "repo_id": { - "type": "string", - "description": "Repository identifier (from .agentkit-repo)" - }, - "branch": { - "type": "string", - "description": "Current git branch" - }, - "session_id": { - "type": "string", - "description": "Current session identifier" - }, - "current_phase": { - "type": "integer", - "minimum": 1, - "maximum": 5, - "description": "Current lifecycle phase (1-5)" - }, - "phase_name": { - "type": "string", - "enum": ["Discovery", "Planning", "Implementation", "Validation", "Ship"], - "description": "Human-readable phase name" - }, - "last_phase_completed": { - "type": "integer", - "minimum": 0, - "maximum": 5, - "description": "Last fully completed phase (0 = none)" - }, - "next_action": { - "type": "string", - "description": "Recommended next action" - }, - "team_progress": { - "type": "object", - "description": "Per-team status tracking", - "patternProperties": { - "^team-": { - "type": "object", - "required": ["status"], - "properties": { - "status": { - "type": "string", - "enum": ["idle", "in_progress", "blocked", "done"] - }, - "notes": { - "type": "string" - }, - "last_updated": { - "type": "string", - "format": "date-time" - }, - "assigned_to": { - "type": "string" - } - } - } - } - }, - "todo_items": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "title", "status"], - "properties": { - "id": { "type": "string" }, - "title": { "type": "string" }, - "status": { - "type": "string", - "enum": ["pending", "in_progress", "done", "blocked"] - }, - "team": { "type": "string" }, - "priority": { - "type": "string", - "enum": ["critical", "high", "medium", "low"] - } - } - } - }, - "recent_results": { - "type": "array", - "items": { - "type": "object", - "properties": { - "timestamp": { "type": "string", "format": "date-time" }, - "action": { "type": "string" }, - "result": { "type": "string" }, - "team": { "type": "string" } - } - } - }, - "completed": { - "type": "boolean", - "description": "Whether all phases are complete" - }, - "last_healthcheck": { - "type": "string", - "format": "date-time", - "description": "Timestamp of last healthcheck run" - }, - "health_status": { - "type": "string", - "enum": ["HEALTHY", "UNHEALTHY"], - "description": "Overall health status from last healthcheck" - }, - "session_metrics": { - "type": "object", - "description": "Cost tracking session metrics", - "properties": { - "current_session_id": { - "type": "string", - "description": "Active session ID for cost tracking" - }, - "total_sessions": { - "type": "integer", - "description": "Total sessions recorded" - }, - "last_session_end": { - "type": "string", - "format": "date-time", - "description": "When the last session ended" - } - } - } - } -} diff --git a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p0-ci-pipeline.json b/.claude/worktrees/focused-colden/.claude/state/tasks/task-p0-ci-pipeline.json deleted file mode 100644 index e656cf8b..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p0-ci-pipeline.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "task-p0-ci-pipeline", - "type": "implement", - "status": "rejected", - "priority": "P0", - "delegator": "orchestrator", - "assignees": ["team-infra"], - "title": "Configure CI pipeline for main branch", - "description": "GitHub Actions workflow; scope: branch-protection, drift check, quality gates on main. Ensure required status checks align with ci.yml, branch-protection.yml, and drift/sync validation.", - "acceptanceCriteria": [ - "Workflow runs on push/PR to main (and dev per existing)", - "Drift check (sync then git diff) runs and is required for main", - "Quality gates (test, validate) are required; branch protection documented or enforced" - ], - "scope": [".github/workflows/**", "docs/operations/**"], - "backlogItemId": "P0-T4-CI-pipeline", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P0: Configure CI pipeline for main. See AGENT_BACKLOG.md Active Sprint." }, - { "role": "executor", "from": "infra", "timestamp": "2026-03-15T12:25:00Z", "content": "Rejected: task scope is .github/workflows/** and docs/operations/**, which is DevOps (CI/CD, pipelines), not Infra (IaC, terraform, bicep, pulumi). Suggested team: team-devops." } - ], - "artifacts": [] -} diff --git a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p0-test-framework.json b/.claude/worktrees/focused-colden/.claude/state/tasks/task-p0-test-framework.json deleted file mode 100644 index e69de29b..00000000 diff --git a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-api-routes.json b/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-api-routes.json deleted file mode 100644 index b76ef61f..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-api-routes.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-api-routes", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-backend"], - "title": "Define core API route structure", - "description": "REST endpoints for v1. Define route layout and conventions for the project (or document that this repo is framework-only and adopters define routes).", - "acceptanceCriteria": [ - "API route structure documented or implemented per project conventions", - "REST v1 layout clear for downstream adopters or for this repo if applicable" - ], - "scope": ["apps/api/**", "services/**", "docs/api/**"], - "backlogItemId": "P1-T1-api-routes", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Define core API route structure. See AGENT_BACKLOG.md." }, - { "role": "executor", "from": "backend", "timestamp": "2026-03-15T12:15:00Z", "content": "Completed. Repo is framework-only (no apps/api or services). Added docs/api/07_framework-api-conventions.md documenting recommended route structure (base /api, url-segment versioning, envelope, cursor pagination) for adopters." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["docs/api/07_framework-api-conventions.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-db-schema.json b/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-db-schema.json deleted file mode 100644 index b52354a2..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-db-schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "id": "task-p1-db-schema", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-data"], - "title": "Design initial database schema", - "description": "Depends on T1 API design. Design initial schema for the project (or document that this repo has no DB and adopters own schema).", - "acceptanceCriteria": [ - "Schema design or decision documented", - "Dependencies on API design acknowledged" - ], - "scope": ["db/**", "migrations/**", "prisma/**", "docs/architecture/**"], - "dependsOn": ["task-p1-api-routes"], - "backlogItemId": "P1-T3-db-schema", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Design initial database schema. Depends on T1." }, - { "role": "executor", "from": "data", "timestamp": "2026-03-15T12:35:00Z", "content": "Completed. Repo has no database (CLAUDE.md: Database none, ORM none). Added db/README.md documenting that adopters own schema and referencing API conventions; dependency on API design acknowledged." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["db/README.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-health-check.json b/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-health-check.json deleted file mode 100644 index 10b652ef..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-health-check.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-health-check", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-backend"], - "title": "Implement health check endpoint", - "description": "Implement /api/health (or equivalent) for the application.", - "acceptanceCriteria": [ - "Health check endpoint implemented and documented", - "Returns appropriate status for load balancers or readiness probes" - ], - "scope": ["apps/api/**", "services/**", "docs/api/**"], - "backlogItemId": "P1-T1-health-check", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Implement health check endpoint. See Backlog." }, - { "role": "executor", "from": "backend", "timestamp": "2026-03-15T12:15:00Z", "content": "Completed. No application server in this repo (framework-only). Documented health check convention in docs/api/07_framework-api-conventions.md: GET /api/health or GET /health, 200 + { status: ok } for adopters." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["docs/api/07_framework-api-conventions.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-migration-tooling.json b/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-migration-tooling.json deleted file mode 100644 index 4e72185f..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-migration-tooling.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-migration-tooling", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-data"], - "title": "Create migration tooling setup", - "description": "Prisma or Drizzle (or document choice). Set up migration tooling for the project.", - "acceptanceCriteria": [ - "Migration tooling chosen and documented or implemented", - "Basic migration workflow documented" - ], - "scope": ["db/**", "migrations/**", "prisma/**", "package.json"], - "backlogItemId": "P1-T3-migration-tooling", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Create migration tooling setup. See Backlog." }, - { "role": "executor", "from": "data", "timestamp": "2026-03-15T12:35:00Z", "content": "Completed. Repo has no DB. Added migrations/README.md documenting that adopters choose Prisma or Drizzle and documenting basic migration workflow (define schema, generate migration, run migrations)." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["migrations/README.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-staging-env.json b/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-staging-env.json deleted file mode 100644 index 19f40686..00000000 --- a/.claude/worktrees/focused-colden/.claude/state/tasks/task-p1-staging-env.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-staging-env", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-infra"], - "title": "Set up staging environment", - "description": "Docker Compose (or equivalent) for staging. Set up staging environment for the project.", - "acceptanceCriteria": [ - "Staging environment defined (e.g. docker-compose or IaC)", - "Documented how to run and deploy to staging" - ], - "scope": ["infra/**", "docker/**", "docker-compose*.yml", "docs/operations/**"], - "backlogItemId": "P1-T4-staging", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Set up staging environment. See Backlog." }, - { "role": "executor", "from": "infra", "timestamp": "2026-03-15T12:25:00Z", "content": "Completed. Added infra/README.md (staging and local validation; adopters define their own staging). Added docker-compose.yml at repo root with profile 'sync' to run pnpm install + agentkit:sync in a container for staging-like validation." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["infra/README.md", "docker-compose.yml"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/focused-colden/package-lock.json b/.claude/worktrees/focused-colden/package-lock.json deleted file mode 100644 index 24372cf6..00000000 --- a/.claude/worktrees/focused-colden/package-lock.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "retort-root", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "retort-root", - "dependencies": { - "js-yaml": "^4.1.1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - } - } -} diff --git a/.claude/worktrees/heuristic-mendel b/.claude/worktrees/heuristic-mendel deleted file mode 160000 index b65743f9..00000000 --- a/.claude/worktrees/heuristic-mendel +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b65743f9d6f48c99cdb078fce8bedf2d5d88b653 diff --git a/.claude/worktrees/tender-margulis/.agentkit/.manifest.json b/.claude/worktrees/tender-margulis/.agentkit/.manifest.json deleted file mode 100644 index f044e15e..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.manifest.json +++ /dev/null @@ -1,1873 +0,0 @@ -{ - "generatedAt": "2026-03-17T07:03:33.588Z", - "version": "3.1.0", - "repoName": "agentkit-forge", - "files": { - ".agentkit/state/orchestrator.json.template": { - "hash": "b70e87b7211b" - }, - ".agents/skills/analyze-agents/SKILL.md": { - "hash": "e42eee25c9fd" - }, - ".agents/skills/brand/SKILL.md": { - "hash": "4f819e2e0d69" - }, - ".agents/skills/build/SKILL.md": { - "hash": "d325dae8f934" - }, - ".agents/skills/check/SKILL.md": { - "hash": "fc46476bca7b" - }, - ".agents/skills/cost/SKILL.md": { - "hash": "834badf6646b" - }, - ".agents/skills/cost-centres/SKILL.md": { - "hash": "3140d48f16b0" - }, - ".agents/skills/deploy/SKILL.md": { - "hash": "2e1330fd693e" - }, - ".agents/skills/discover/SKILL.md": { - "hash": "9ac71caf6992" - }, - ".agents/skills/doctor/SKILL.md": { - "hash": "9d9e7ffcaf71" - }, - ".agents/skills/document-history/SKILL.md": { - "hash": "e82dbff8c514" - }, - ".agentkit/state/schema.json": { - "hash": "b47a7efcd922" - }, - ".agents/skills/expand/SKILL.md": { - "hash": "d9883bcc8f88" - }, - ".agents/skills/feature-flow/SKILL.md": { - "hash": "ec9b155a84e6" - }, - ".agents/skills/feature-configure/SKILL.md": { - "hash": "c11f2cc3273b" - }, - ".agents/skills/feature-review/SKILL.md": { - "hash": "da38a280ec45" - }, - ".agents/skills/format/SKILL.md": { - "hash": "0cdb87886f36" - }, - ".agents/skills/backlog/SKILL.md": { - "hash": "2dc8e5c1d39b" - }, - ".agents/skills/import-issues/SKILL.md": { - "hash": "e2d105f8b201" - }, - ".agents/skills/infra-eval/SKILL.md": { - "hash": "37505d91a1c5" - }, - ".agents/skills/plan/SKILL.md": { - "hash": "71c44b0ef7b1" - }, - ".agents/skills/preflight/SKILL.md": { - "hash": "85c05dc2c072" - }, - ".agents/skills/review/SKILL.md": { - "hash": "00b236ee680f" - }, - ".agents/skills/project-status/SKILL.md": { - "hash": "9a47cc64914b" - }, - ".agents/skills/orchestrate/SKILL.md": { - "hash": "2b6c677c66a3" - }, - ".agents/skills/scaffold/SKILL.md": { - "hash": "ff8fb03eecd2" - }, - ".agents/skills/security/SKILL.md": { - "hash": "3127f1e216c9" - }, - ".agents/skills/start/SKILL.md": { - "hash": "f0cd8fd39b4a" - }, - ".agents/skills/sync-backlog/SKILL.md": { - "hash": "6a3ad80bff8d" - }, - ".agents/skills/sync/SKILL.md": { - "hash": "c25161dc8913" - }, - ".agents/skills/test/SKILL.md": { - "hash": "3c02bdac8593" - }, - ".agents/skills/validate/SKILL.md": { - "hash": "30bc2a0427be" - }, - ".ai/cursorrules": { - "hash": "32f8f48220f6" - }, - ".ai/README.md": { - "hash": "608c681edb4e" - }, - ".ai/continuerules": { - "hash": "2d40023b7c45" - }, - ".ai/windsurfrules": { - "hash": "2d40023b7c45" - }, - ".claude/agents/adoption-strategist.md": { - "hash": "e0f5197c5140" - }, - ".claude/agents/brand-guardian.md": { - "hash": "06321324ad8c" - }, - ".claude/agents/backend.md": { - "hash": "738bca85b556" - }, - ".claude/agents/content-strategist.md": { - "hash": "bdea95fbdc97" - }, - ".claude/agents/cost-ops-monitor.md": { - "hash": "9f195cfb5ab3" - }, - ".claude/agents/data.md": { - "hash": "95222b841a68" - }, - ".claude/agents/dependency-watcher.md": { - "hash": "1317fdcdbdc6" - }, - ".claude/agents/coverage-tracker.md": { - "hash": "faf2173529c5" - }, - ".claude/agents/devops.md": { - "hash": "8623979399e3" - }, - ".claude/agents/expansion-analyst.md": { - "hash": "1acec03026a0" - }, - ".claude/agents/frontend.md": { - "hash": "2e553b7926ef" - }, - ".claude/agents/flow-designer.md": { - "hash": "0e0423753fd8" - }, - ".claude/agents/feature-ops.md": { - "hash": "f7a55b2e0a57" - }, - ".claude/agents/environment-manager.md": { - "hash": "7630c0856682" - }, - ".claude/agents/governance-advisor.md": { - "hash": "6fde5c50bf67" - }, - ".claude/agents/grant-hunter.md": { - "hash": "906ddfa7eeb1" - }, - ".claude/agents/infra.md": { - "hash": "49829cf96e63" - }, - ".claude/agents/input-clarifier.md": { - "hash": "10e22accb2c0" - }, - ".claude/agents/integration-tester.md": { - "hash": "9c537deec75e" - }, - ".claude/agents/mission-definer.md": { - "hash": "530ef4249f0b" - }, - ".claude/agents/impact-assessor.md": { - "hash": "86fdde8309c2" - }, - ".claude/agents/portfolio-analyst.md": { - "hash": "b85f4d82d325" - }, - ".claude/agents/product-manager.md": { - "hash": "ae255ee14143" - }, - ".claude/agents/model-economist.md": { - "hash": "87e470197ac4" - }, - ".claude/agents/project-shipper.md": { - "hash": "627257130af4" - }, - ".claude/agents/prompt-engineer.md": { - "hash": "3f98b589828e" - }, - ".claude/agents/release-manager.md": { - "hash": "74293815fa62" - }, - ".claude/agents/retrospective-analyst.md": { - "hash": "ee7cdb422865" - }, - ".claude/agents/roadmap-tracker.md": { - "hash": "89ddfff0b104" - }, - ".claude/agents/role-architect.md": { - "hash": "ff8dfe28ea56" - }, - ".claude/agents/growth-analyst.md": { - "hash": "f8eec3b1e625" - }, - ".claude/agents/security-auditor.md": { - "hash": "1cbf3ad0f91d" - }, - ".claude/agents/spec-compliance-auditor.md": { - "hash": "177cc631b0a2" - }, - ".claude/agents/team-validator.md": { - "hash": "bee9c68baeac" - }, - ".claude/agents/ui-designer.md": { - "hash": "a3e99552415f" - }, - ".claude/agents/release-coordinator.md": { - "hash": "df573b60959d" - }, - ".claude/agents/vendor-arbitrage-analyst.md": { - "hash": "48daa9f47218" - }, - ".claude/commands/backlog.md": { - "hash": "22a8d07575b3" - }, - ".claude/agents/test-lead.md": { - "hash": "45e8abd92aaf" - }, - ".claude/commands/check.md": { - "hash": "ca6dd1de5d9a" - }, - ".claude/commands/cost.md": { - "hash": "2392989dddaa" - }, - ".claude/commands/deploy.md": { - "hash": "adc2c2629b09" - }, - ".claude/commands/brand.md": { - "hash": "472c7438a795" - }, - ".claude/agents/token-efficiency-engineer.md": { - "hash": "c5e07b99dbc3" - }, - ".claude/commands/discover.md": { - "hash": "8fe679961a27" - }, - ".claude/commands/build.md": { - "hash": "fee9680802e1" - }, - ".claude/commands/cost-centres.md": { - "hash": "07ead7d1c63f" - }, - ".claude/commands/expand.md": { - "hash": "f3b8f79ccd05" - }, - ".claude/commands/document-history.md": { - "hash": "c99673f9ae3c" - }, - ".claude/commands/feature-flow.md": { - "hash": "d1b8207a2a5a" - }, - ".claude/commands/feature-configure.md": { - "hash": "ee21aacdcd29" - }, - ".claude/commands/format.md": { - "hash": "a3f0eee9b52e" - }, - ".claude/commands/import-issues.md": { - "hash": "6331f512f2b8" - }, - ".claude/commands/feature-review.md": { - "hash": "fced358b99eb" - }, - ".claude/commands/infra-eval.md": { - "hash": "8a58ea808952" - }, - ".claude/commands/doctor.md": { - "hash": "8fa0fd26e893" - }, - ".claude/commands/project-status.md": { - "hash": "0565edacffae" - }, - ".claude/commands/plan.md": { - "hash": "0eca590818b3" - }, - ".claude/commands/scaffold.md": { - "hash": "4b3cd870e0fc" - }, - ".claude/commands/review.md": { - "hash": "e32bc6f663ab" - }, - ".claude/commands/orchestrate.md": { - "hash": "574c6938b38d" - }, - ".claude/commands/start.md": { - "hash": "d172290d22db" - }, - ".claude/commands/security.md": { - "hash": "5efa63762b04" - }, - ".claude/commands/preflight.md": { - "hash": "4a65b6271bd6" - }, - ".claude/commands/sync.md": { - "hash": "efd3cfb56eed" - }, - ".claude/commands/sync-backlog.md": { - "hash": "2352a7d04323" - }, - ".claude/commands/team-backend.md": { - "hash": "f7e4f2d9d9b7" - }, - ".claude/commands/team-cost-ops.md": { - "hash": "812a2d58a81e" - }, - ".claude/commands/team-data.md": { - "hash": "ac4681cf9293" - }, - ".claude/commands/team-devops.md": { - "hash": "715a51cc4892" - }, - ".claude/commands/team-forge.md": { - "hash": "ff14d00c8c6c" - }, - ".claude/commands/team-frontend.md": { - "hash": "93f516367115" - }, - ".claude/commands/team-docs.md": { - "hash": "3deff18a07e9" - }, - ".claude/commands/team-infra.md": { - "hash": "436ecc831ca4" - }, - ".claude/commands/team-quality.md": { - "hash": "201199588ab2" - }, - ".claude/commands/team-product.md": { - "hash": "d0388844667d" - }, - ".claude/commands/team-strategic-ops.md": { - "hash": "5c65b47e2d4f" - }, - ".claude/commands/team-testing.md": { - "hash": "0d04836de633" - }, - ".claude/commands/test.md": { - "hash": "dff6e64066e4" - }, - ".claude/commands/team-security.md": { - "hash": "39f9d0c7d438" - }, - ".claude/commands/validate.md": { - "hash": "db126df15cad" - }, - ".claude/hooks/budget-guard-check.sh": { - "hash": "4fabe38fe963" - }, - ".claude/hooks/guard-destructive-commands.ps1": { - "hash": "55a58d211c2c" - }, - ".claude/hooks/pre-push-validate.sh": { - "hash": "86db6d107d60" - }, - ".claude/hooks/protect-sensitive.ps1": { - "hash": "59c32beeb28b" - }, - ".claude/hooks/protect-sensitive.sh": { - "hash": "f064ddda7879" - }, - ".claude/hooks/guard-destructive-commands.sh": { - "hash": "155b707b2af0" - }, - ".claude/hooks/protect-templates.ps1": { - "hash": "0b14c70ee6ef" - }, - ".claude/hooks/session-start.sh": { - "hash": "bf976e3ffb1a" - }, - ".claude/hooks/protect-templates.sh": { - "hash": "04a1d69ea578" - }, - ".claude/hooks/session-start.ps1": { - "hash": "7d50dcf043f4" - }, - ".claude/hooks/stop-build-check.sh": { - "hash": "8aecebcef7b7" - }, - ".claude/hooks/warn-uncommitted.ps1": { - "hash": "e01cd78b2c17" - }, - ".claude/hooks/warn-uncommitted.sh": { - "hash": "b224fa6b1b1f" - }, - ".claude/rules/blockchain.md": { - "hash": "6ebb3c6166c1" - }, - ".claude/rules/agent-conduct.md": { - "hash": "a9204d8e7dc4" - }, - ".claude/hooks/stop-build-check.ps1": { - "hash": "16d00d311940" - }, - ".claude/rules/dependency-management.md": { - "hash": "d0089754e232" - }, - ".claude/rules/ci-cd.md": { - "hash": "4eb972787de8" - }, - ".claude/rules/dotnet.md": { - "hash": "afd3bc539ab3" - }, - ".claude/rules/git-workflow.md": { - "hash": "16df971f4442" - }, - ".claude/rules/iac.md": { - "hash": "7389f06f50fe" - }, - ".claude/rules/documentation.md": { - "hash": "041b08cabcc0" - }, - ".claude/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".claude/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".claude/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".claude/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".claude/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".claude/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".claude/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".claude/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".claude/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".claude/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".claude/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".claude/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".claude/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".claude/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".claude/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".claude/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".claude/rules/python.md": { - "hash": "842f7d201c27" - }, - ".claude/rules/quality.md": { - "hash": "478859ffbb93" - }, - ".claude/rules/rust.md": { - "hash": "653b8dfb73b5" - }, - ".claude/rules/template-protection.md": { - "hash": "e0eca318e94b" - }, - ".claude/rules/testing.md": { - "hash": "3e7853b624e1" - }, - ".claude/rules/typescript.md": { - "hash": "1b050804b6ef" - }, - ".claude/settings.json": { - "hash": "b5f6aee20306" - }, - ".claude/skills/analyze-agents/SKILL.md": { - "hash": "3d77831e022a" - }, - ".claude/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".claude/rules/security.md": { - "hash": "3ed7f09d1ad0" - }, - ".claude/skills/backlog/SKILL.md": { - "hash": "de8c81512467" - }, - ".claude/skills/brand/SKILL.md": { - "hash": "b4de2f51b106" - }, - ".claude/skills/cost/SKILL.md": { - "hash": "7276c4052975" - }, - ".claude/skills/check/SKILL.md": { - "hash": "6d7d38148af5" - }, - ".claude/skills/cost-centres/SKILL.md": { - "hash": "738667d8716f" - }, - ".claude/skills/deploy/SKILL.md": { - "hash": "f5cbd6d04c02" - }, - ".claude/skills/doctor/SKILL.md": { - "hash": "310dce98d8f4" - }, - ".claude/skills/document-history/SKILL.md": { - "hash": "074d8a3cab21" - }, - ".claude/skills/build/SKILL.md": { - "hash": "77448a90e59b" - }, - ".claude/skills/discover/SKILL.md": { - "hash": "ef2e7d50b511" - }, - ".claude/skills/expand/SKILL.md": { - "hash": "fd58b1775fd1" - }, - ".claude/skills/feature-flow/SKILL.md": { - "hash": "cd75ad612f63" - }, - ".claude/skills/format/SKILL.md": { - "hash": "3f2951d68edf" - }, - ".claude/skills/import-issues/SKILL.md": { - "hash": "7fb72bc4c4a2" - }, - ".claude/skills/infra-eval/SKILL.md": { - "hash": "7a4eedae11b3" - }, - ".claude/skills/orchestrate/SKILL.md": { - "hash": "8950d5dbb641" - }, - ".claude/skills/feature-review/SKILL.md": { - "hash": "b556218af259" - }, - ".claude/skills/feature-configure/SKILL.md": { - "hash": "4320cc00be36" - }, - ".claude/skills/plan/SKILL.md": { - "hash": "28fd3cc22953" - }, - ".claude/skills/scaffold/SKILL.md": { - "hash": "9291d71bc86b" - }, - ".claude/skills/security/SKILL.md": { - "hash": "1520feb2bf97" - }, - ".claude/skills/start/SKILL.md": { - "hash": "a987a611b567" - }, - ".claude/skills/preflight/SKILL.md": { - "hash": "b6ad1a083bac" - }, - ".claude/skills/project-status/SKILL.md": { - "hash": "8df33d0cb8c9" - }, - ".claude/skills/sync/SKILL.md": { - "hash": "19de7f1cc4cb" - }, - ".claude/skills/review/SKILL.md": { - "hash": "8386eb6c97ee" - }, - ".claude/skills/sync-backlog/SKILL.md": { - "hash": "cea14e0c67fc" - }, - ".claude/skills/validate/SKILL.md": { - "hash": "112b57703063" - }, - ".clinerules/agent-conduct.md": { - "hash": "58310e525ade" - }, - ".clinerules/ai-cost-ops.md": { - "hash": "464c1fde7714" - }, - ".claude/skills/test/SKILL.md": { - "hash": "21da74147f13" - }, - ".clinerules/ci-cd.md": { - "hash": "d6b6698178f3" - }, - ".clinerules/blockchain.md": { - "hash": "21750f5c565c" - }, - ".clinerules/dependency-management.md": { - "hash": "909464fb0495" - }, - ".clinerules/documentation.md": { - "hash": "a947fca57aca" - }, - ".clinerules/iac.md": { - "hash": "12318597c6ca" - }, - ".clinerules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".clinerules/dotnet.md": { - "hash": "d978b656d898" - }, - ".clinerules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".clinerules/finops.md": { - "hash": "c02b0486012f" - }, - ".clinerules/git-workflow.md": { - "hash": "0ce8ea97c321" - }, - ".clinerules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".clinerules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".clinerules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".clinerules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".clinerules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".clinerules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".clinerules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".clinerules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".clinerules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".clinerules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".clinerules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".clinerules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".clinerules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".clinerules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".clinerules/rust.md": { - "hash": "dc2f173fa092" - }, - ".clinerules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".clinerules/security.md": { - "hash": "9cefb19e63e5" - }, - ".clinerules/python.md": { - "hash": "0d1ed61bb8dc" - }, - ".clinerules/template-protection.md": { - "hash": "ea83904b6713" - }, - ".cursor/commands/analyze-agents.md": { - "hash": "024e3cec1f56" - }, - ".cursor/commands/brand.md": { - "hash": "63960929d9fc" - }, - ".cursor/commands/backlog.md": { - "hash": "c6b5aa7de695" - }, - ".clinerules/typescript.md": { - "hash": "c77f9043197a" - }, - ".clinerules/testing.md": { - "hash": "fba2f07c5a5b" - }, - ".cursor/commands/build.md": { - "hash": "74cc820e6fc1" - }, - ".cursor/commands/cost-centres.md": { - "hash": "143856799eda" - }, - ".cursor/commands/check.md": { - "hash": "9373b3fca5ff" - }, - ".cursor/commands/deploy.md": { - "hash": "cd5b2f461cd7" - }, - ".cursor/commands/discover.md": { - "hash": "60be19c91420" - }, - ".cursor/commands/cost.md": { - "hash": "9c338e5f33b1" - }, - ".cursor/commands/doctor.md": { - "hash": "c619f9e3b1e6" - }, - ".cursor/commands/expand.md": { - "hash": "089462f22f52" - }, - ".cursor/commands/document-history.md": { - "hash": "975b4458c2c1" - }, - ".cursor/commands/feature-flow.md": { - "hash": "7d7a302552c6" - }, - ".cursor/commands/feature-review.md": { - "hash": "021c98874605" - }, - ".cursor/commands/format.md": { - "hash": "5be0e24ce07a" - }, - ".cursor/commands/feature-configure.md": { - "hash": "9b071a084415" - }, - ".cursor/commands/import-issues.md": { - "hash": "2acded7ac4fa" - }, - ".cursor/commands/infra-eval.md": { - "hash": "313ed28d7c7f" - }, - ".cursor/commands/orchestrate.md": { - "hash": "e2f5928cdb2f" - }, - ".cursor/commands/plan.md": { - "hash": "0af99fb78d12" - }, - ".cursor/commands/project-status.md": { - "hash": "7a0056181045" - }, - ".cursor/commands/review.md": { - "hash": "e1853e4abdb9" - }, - ".cursor/commands/preflight.md": { - "hash": "6d1a97bd57d5" - }, - ".cursor/commands/scaffold.md": { - "hash": "69986b1530cf" - }, - ".cursor/commands/sync.md": { - "hash": "513bea4ea974" - }, - ".cursor/commands/security.md": { - "hash": "1a4e4a4d8cf6" - }, - ".cursor/commands/sync-backlog.md": { - "hash": "a6282eab6689" - }, - ".cursor/commands/validate.md": { - "hash": "5bc457b26628" - }, - ".cursor/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".cursor/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".cursor/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".cursor/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".cursor/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".cursor/commands/test.md": { - "hash": "0f83a2bdea71" - }, - ".cursor/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".cursor/commands/start.md": { - "hash": "a72ec5c139fe" - }, - ".cursor/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".cursor/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".cursor/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".cursor/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".cursor/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".cursor/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".cursor/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".cursor/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".cursor/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".cursor/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".cursor/rules/orchestrate.mdc": { - "hash": "9853913b4857" - }, - ".cursor/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".cursor/rules/security.mdc": { - "hash": "24c286e725a3" - }, - ".cursor/rules/project-context.mdc": { - "hash": "dd6859b78404" - }, - ".cursor/rules/team-backend.mdc": { - "hash": "66c7510720e1" - }, - ".cursor/rules/team-data.mdc": { - "hash": "412987c5fb0e" - }, - ".cursor/rules/team-docs.mdc": { - "hash": "b0ccc30e6b77" - }, - ".cursor/rules/team-cost-ops.mdc": { - "hash": "545aecedca0b" - }, - ".cursor/rules/team-forge.mdc": { - "hash": "a238f2cc330b" - }, - ".cursor/rules/team-infra.mdc": { - "hash": "d5f6f094dc30" - }, - ".cursor/rules/team-frontend.mdc": { - "hash": "82a998fe0de5" - }, - ".cursor/rules/team-product.mdc": { - "hash": "153f579d8b04" - }, - ".cursor/rules/team-security.mdc": { - "hash": "9778f59babaa" - }, - ".cursor/rules/team-devops.mdc": { - "hash": "0fe62d640199" - }, - ".cursor/rules/team-quality.mdc": { - "hash": "f70002d21c69" - }, - ".cursor/rules/team-strategic-ops.mdc": { - "hash": "00d0e2e368e4" - }, - ".cursor/rules/team-testing.mdc": { - "hash": "e5e949b5a9ad" - }, - ".gemini/config.yaml": { - "hash": "8f50c65f25fb" - }, - ".editorconfig": { - "hash": "fa09dda3d2e2" - }, - ".github/agents/adoption-strategist.agent.md": { - "hash": "5d2836dcb475" - }, - ".github/agents/backend.agent.md": { - "hash": "0d127baccf58" - }, - ".github/agents/content-strategist.agent.md": { - "hash": "c2544a299b60" - }, - ".gitattributes": { - "hash": "90af26762384" - }, - ".github/agents/brand-guardian.agent.md": { - "hash": "c2461a9a8466" - }, - ".github/agents/cost-ops-monitor.agent.md": { - "hash": "4188ea493644" - }, - ".github/agents/coverage-tracker.agent.md": { - "hash": "0ec9cd09509b" - }, - ".gemini/styleguide.md": { - "hash": "b3f330f5df8f" - }, - ".github/agents/data.agent.md": { - "hash": "a55f855de262" - }, - ".github/agents/expansion-analyst.agent.md": { - "hash": "45e7e34e7877" - }, - ".github/agents/devops.agent.md": { - "hash": "ffe4f3317ec8" - }, - ".github/agents/dependency-watcher.agent.md": { - "hash": "e85baf4d0d46" - }, - ".github/agents/environment-manager.agent.md": { - "hash": "d2e9a801a5e5" - }, - ".github/agents/flow-designer.agent.md": { - "hash": "d09c5f1d7cd2" - }, - ".github/agents/feature-ops.agent.md": { - "hash": "c4ba3dc907f6" - }, - ".github/agents/governance-advisor.agent.md": { - "hash": "35e92bcae9d0" - }, - ".github/agents/frontend.agent.md": { - "hash": "778677e3a2f1" - }, - ".github/agents/grant-hunter.agent.md": { - "hash": "7d849df31023" - }, - ".github/agents/impact-assessor.agent.md": { - "hash": "98a4559e208d" - }, - ".github/agents/infra.agent.md": { - "hash": "8c8d3a4f1adf" - }, - ".github/agents/input-clarifier.agent.md": { - "hash": "63f969a72bc4" - }, - ".github/agents/mission-definer.agent.md": { - "hash": "4ba6262d5eb8" - }, - ".github/agents/integration-tester.agent.md": { - "hash": "b34beafad1bd" - }, - ".github/agents/model-economist.agent.md": { - "hash": "b3ea5f80581d" - }, - ".github/agents/portfolio-analyst.agent.md": { - "hash": "fa3fe9e48a52" - }, - ".github/agents/product-manager.agent.md": { - "hash": "9d3da17ae6f3" - }, - ".github/agents/project-shipper.agent.md": { - "hash": "93e8ef14bb8f" - }, - ".github/agents/prompt-engineer.agent.md": { - "hash": "778f224899a3" - }, - ".github/agents/retrospective-analyst.agent.md": { - "hash": "143b2fd6c727" - }, - ".github/agents/roadmap-tracker.agent.md": { - "hash": "0fdd8e9b7985" - }, - ".github/agents/role-architect.agent.md": { - "hash": "217b0f7d6bc5" - }, - ".github/agents/security-auditor.agent.md": { - "hash": "1f8a11a72b17" - }, - ".github/agents/spec-compliance-auditor.agent.md": { - "hash": "e2b66fe05d2b" - }, - ".github/agents/team-validator.agent.md": { - "hash": "046b30086c5b" - }, - ".github/agents/test-lead.agent.md": { - "hash": "6561c9a0a1c2" - }, - ".github/agents/token-efficiency-engineer.agent.md": { - "hash": "12997f39f2cb" - }, - ".github/agents/ui-designer.agent.md": { - "hash": "337cddf83447" - }, - ".github/agents/vendor-arbitrage-analyst.agent.md": { - "hash": "627c29b70357" - }, - ".github/agents/growth-analyst.agent.md": { - "hash": "25e3b42da3aa" - }, - ".github/agents/release-coordinator.agent.md": { - "hash": "dfa94cb6ff6f" - }, - ".github/agents/release-manager.agent.md": { - "hash": "e58484632ca0" - }, - ".github/chatmodes/team-backend.chatmode.md": { - "hash": "ac8f69b82220" - }, - ".github/chatmodes/team-cost-ops.chatmode.md": { - "hash": "121bbf207ca4" - }, - ".github/chatmodes/team-devops.chatmode.md": { - "hash": "978de914aab8" - }, - ".github/chatmodes/team-data.chatmode.md": { - "hash": "0afb7a28f351" - }, - ".github/chatmodes/team-forge.chatmode.md": { - "hash": "b04f7d8a9d9a" - }, - ".github/chatmodes/team-frontend.chatmode.md": { - "hash": "cce72ab3a795" - }, - ".github/chatmodes/team-infra.chatmode.md": { - "hash": "5850b3a37256" - }, - ".github/chatmodes/team-docs.chatmode.md": { - "hash": "c204bd1f1788" - }, - ".github/chatmodes/team-product.chatmode.md": { - "hash": "03428a19c477" - }, - ".github/chatmodes/team-quality.chatmode.md": { - "hash": "7bc2b2f277e1" - }, - ".github/chatmodes/team-strategic-ops.chatmode.md": { - "hash": "8b337da42662" - }, - ".github/ai-framework-ci.yml": { - "hash": "d33ebabcb073" - }, - ".github/chatmodes/team-testing.chatmode.md": { - "hash": "074a36442ca2" - }, - ".github/CODEOWNERS": { - "hash": "ccf003556232" - }, - ".github/chatmodes/team-security.chatmode.md": { - "hash": "09342e8fc4bc" - }, - ".github/copilot-instructions.md": { - "hash": "c8bb26bb2cba" - }, - ".github/instructions/code-verify.md": { - "hash": "f82d9d55fc86" - }, - ".github/instructions/docs.md": { - "hash": "dca898c99b6c" - }, - ".github/instructions/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".github/instructions/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".github/instructions/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".github/instructions/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".github/instructions/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".github/instructions/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".github/instructions/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".github/instructions/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".github/instructions/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".github/instructions/languages/python.md": { - "hash": "63b439981bbc" - }, - ".github/instructions/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".github/instructions/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".github/instructions/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".github/instructions/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".github/instructions/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".github/instructions/marketing.md": { - "hash": "84860c42a466" - }, - ".github/instructions/performance.md": { - "hash": "4f8cd32aeb7e" - }, - ".github/instructions/quality.md": { - "hash": "d2d93df02537" - }, - ".github/instructions/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".github/instructions/languages/security.md": { - "hash": "1c73e7635578" - }, - ".github/instructions/testing.md": { - "hash": "ee3e0d11b01b" - }, - ".github/instructions/README.md": { - "hash": "a79739379379" - }, - ".github/ISSUE_TEMPLATE/feature_request.yml": { - "hash": "79e7e3da99d0" - }, - ".github/ISSUE_TEMPLATE/bug_report.yml": { - "hash": "0b7c12b0e1bb" - }, - ".github/prompts/backlog.prompt.md": { - "hash": "45f1abd24d72" - }, - ".github/ISSUE_TEMPLATE/config.yml": { - "hash": "47344ff5c32c" - }, - ".github/prompts/brand.prompt.md": { - "hash": "0c6c0002f942" - }, - ".github/prompts/build.prompt.md": { - "hash": "046bffc8791e" - }, - ".github/prompts/check.prompt.md": { - "hash": "cc0bdba2f08f" - }, - ".github/prompts/cost.prompt.md": { - "hash": "8d2d9868723a" - }, - ".github/prompts/deploy.prompt.md": { - "hash": "fc9569e74c5d" - }, - ".github/prompts/discover.prompt.md": { - "hash": "e04bdf639b4a" - }, - ".github/prompts/analyze-agents.prompt.md": { - "hash": "19e1dc8432f0" - }, - ".github/prompts/document-history.prompt.md": { - "hash": "d9f170e31ace" - }, - ".github/prompts/doctor.prompt.md": { - "hash": "1dad8d876f62" - }, - ".github/prompts/expand.prompt.md": { - "hash": "ff9445bec477" - }, - ".github/prompts/feature-review.prompt.md": { - "hash": "cf81881f51f5" - }, - ".github/prompts/feature-configure.prompt.md": { - "hash": "ce35b4c465e6" - }, - ".github/prompts/format.prompt.md": { - "hash": "94a0505df23e" - }, - ".github/prompts/cost-centres.prompt.md": { - "hash": "6baa174774e6" - }, - ".github/prompts/import-issues.prompt.md": { - "hash": "4b2701705479" - }, - ".github/prompts/infra-eval.prompt.md": { - "hash": "a8b15916f960" - }, - ".github/prompts/orchestrate.prompt.md": { - "hash": "63451784c289" - }, - ".github/prompts/preflight.prompt.md": { - "hash": "52dcd9cbf075" - }, - ".github/prompts/feature-flow.prompt.md": { - "hash": "b82d78500eb3" - }, - ".github/prompts/review.prompt.md": { - "hash": "94016ba6950b" - }, - ".github/prompts/plan.prompt.md": { - "hash": "69797faa11a4" - }, - ".github/prompts/project-status.prompt.md": { - "hash": "328769323130" - }, - ".github/prompts/scaffold.prompt.md": { - "hash": "22240d89615d" - }, - ".github/prompts/security.prompt.md": { - "hash": "953693049d80" - }, - ".github/prompts/start.prompt.md": { - "hash": "97357c17d8fe" - }, - ".github/prompts/sync-backlog.prompt.md": { - "hash": "9cea7fd68060" - }, - ".github/prompts/sync.prompt.md": { - "hash": "7e7773332996" - }, - ".github/prompts/test.prompt.md": { - "hash": "871f38d6af82" - }, - ".github/prompts/validate.prompt.md": { - "hash": "028479c6d2e2" - }, - ".github/scripts/resolve-merge.ps1": { - "hash": "0cd5d9407b89" - }, - ".github/scripts/resolve-merge.sh": { - "hash": "7ce68cb84a3a" - }, - ".github/scripts/setup-branch-protection.ps1": { - "hash": "160cb7bb55b1" - }, - ".github/scripts/setup-branch-protection.sh": { - "hash": "6eb664b21ee4" - }, - ".github/workflows/breaking-change-detection.yml": { - "hash": "bcd2f5c2e450" - }, - ".github/scripts/README.md": { - "hash": "3124e25a7cfa" - }, - ".github/workflows/coverage-report.yml": { - "hash": "80dafccc5b8f" - }, - ".github/workflows/dependency-audit.yml": { - "hash": "fc376b5eef06" - }, - ".github/workflows/documentation-quality.yml": { - "hash": "6088b2095f59" - }, - ".github/workflows/documentation-validation.yml": { - "hash": "01abb4c23ec9" - }, - ".github/workflows/pr-validation.yml": { - "hash": "2c316a51ea66" - }, - ".github/workflows/retrospective-quality.yml": { - "hash": "74474e570115" - }, - ".gitmessage": { - "hash": "3f5666033096" - }, - ".markdownlint.json": { - "hash": "afe70a444035" - }, - ".prettierrc": { - "hash": "7288d28eacd8" - }, - ".roo/rules/agent-conduct.md": { - "hash": "1f4b060a86eb" - }, - ".github/PULL_REQUEST_TEMPLATE.md": { - "hash": "10b91e98a082" - }, - ".roo/rules/ci-cd.md": { - "hash": "56d669134c88" - }, - ".roo/rules/ai-cost-ops.md": { - "hash": "2c38e075d4db" - }, - ".roo/rules/dependency-management.md": { - "hash": "10ec56bb6292" - }, - ".roo/rules/blockchain.md": { - "hash": "205b3ca13935" - }, - ".roo/rules/finops.md": { - "hash": "17a63264e7b1" - }, - ".roo/rules/documentation.md": { - "hash": "ff90f251ce71" - }, - ".roo/rules/git-workflow.md": { - "hash": "ae185cb50c40" - }, - ".roo/rules/iac.md": { - "hash": "2024c73bc61a" - }, - ".roo/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".roo/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".roo/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".roo/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".roo/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".roo/rules/dotnet.md": { - "hash": "8b8461bcf286" - }, - ".roo/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".roo/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".roo/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".roo/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".roo/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".roo/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".roo/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".roo/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".roo/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".roo/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".roo/rules/python.md": { - "hash": "7b9a642b9197" - }, - ".roo/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".roo/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".roo/rules/template-protection.md": { - "hash": "2097e8899fab" - }, - ".roo/rules/security.md": { - "hash": "a05714124061" - }, - ".roo/rules/typescript.md": { - "hash": "5bff848ce5b6" - }, - ".roo/rules/testing.md": { - "hash": "f420798449b7" - }, - ".vscode/settings.json": { - "hash": "4af945c89151" - }, - ".windsurf/commands/analyze-agents.md": { - "hash": "371f6c3bd7d5" - }, - ".windsurf/commands/backlog.md": { - "hash": "68b4263fc444" - }, - ".windsurf/commands/build.md": { - "hash": "7fc64a835712" - }, - ".windsurf/commands/brand.md": { - "hash": "1eb99e2c4883" - }, - ".roo/rules/rust.md": { - "hash": "f68627a539a3" - }, - ".windsurf/commands/check.md": { - "hash": "780d7cb5ba53" - }, - ".windsurf/commands/cost-centres.md": { - "hash": "16f70ee610a8" - }, - ".windsurf/commands/cost.md": { - "hash": "6b9a7ee00d03" - }, - ".windsurf/commands/discover.md": { - "hash": "438676ab6872" - }, - ".windsurf/commands/doctor.md": { - "hash": "e40703581729" - }, - ".windsurf/commands/document-history.md": { - "hash": "57554e0ae8d7" - }, - ".windsurf/commands/expand.md": { - "hash": "62310f81603e" - }, - ".windsurf/commands/deploy.md": { - "hash": "bb64704796af" - }, - ".windsurf/commands/feature-configure.md": { - "hash": "31f4a7a16fe7" - }, - ".windsurf/commands/feature-review.md": { - "hash": "9c212c4c7afe" - }, - ".windsurf/commands/feature-flow.md": { - "hash": "840122cc19aa" - }, - ".windsurf/commands/infra-eval.md": { - "hash": "359a364a00e5" - }, - ".windsurf/commands/orchestrate.md": { - "hash": "1d9602ce2908" - }, - ".windsurf/commands/plan.md": { - "hash": "0bf8e69458de" - }, - ".windsurf/commands/preflight.md": { - "hash": "2d35df2ccd8e" - }, - ".vscode/extensions.json": { - "hash": "dd20fd0751ba" - }, - ".windsurf/commands/format.md": { - "hash": "10cda487929d" - }, - ".windsurf/commands/project-status.md": { - "hash": "a85e72f6794e" - }, - ".windsurf/commands/review.md": { - "hash": "ebd187ab3d06" - }, - ".windsurf/commands/security.md": { - "hash": "4878d4daa234" - }, - ".windsurf/commands/import-issues.md": { - "hash": "9b714f3d4b02" - }, - ".windsurf/commands/sync.md": { - "hash": "d4678bf06724" - }, - ".windsurf/commands/sync-backlog.md": { - "hash": "bf720daf3704" - }, - ".windsurf/commands/test.md": { - "hash": "73463ed24c36" - }, - ".windsurf/commands/validate.md": { - "hash": "02d1c93720c5" - }, - ".windsurf/commands/scaffold.md": { - "hash": "c57cd1471acf" - }, - ".windsurf/commands/start.md": { - "hash": "7cc5267d9274" - }, - ".windsurf/rules/languages/agent-conduct.md": { - "hash": "dfa139fec0e9" - }, - ".windsurf/rules/languages/blockchain.md": { - "hash": "7fc6185f787c" - }, - ".windsurf/rules/languages/documentation.md": { - "hash": "1987c9f42ff1" - }, - ".windsurf/rules/languages/ai-cost-ops.md": { - "hash": "a1ae9bf2bed7" - }, - ".windsurf/rules/languages/dotnet.md": { - "hash": "d32abad9b778" - }, - ".windsurf/rules/languages/ci-cd.md": { - "hash": "ee4914ac0781" - }, - ".windsurf/rules/languages/finops.md": { - "hash": "26ed29eca172" - }, - ".windsurf/rules/languages/dependency-management.md": { - "hash": "e03ef3668bb4" - }, - ".windsurf/rules/languages/git-workflow.md": { - "hash": "1fdb78c70ab0" - }, - ".windsurf/rules/languages/README.md": { - "hash": "1525f51b3b52" - }, - ".windsurf/rules/languages/rust.md": { - "hash": "4d57482d5c8b" - }, - ".windsurf/rules/languages/python.md": { - "hash": "63b439981bbc" - }, - ".windsurf/rules/languages/iac.md": { - "hash": "8e3e330610df" - }, - ".windsurf/rules/languages/template-protection.md": { - "hash": "da0cc75841da" - }, - ".windsurf/rules/languages/typescript.md": { - "hash": "02ce5a9b6f2f" - }, - ".windsurf/rules/languages/testing.md": { - "hash": "2e8c3bd2fd50" - }, - ".windsurf/rules/orchestrate.md": { - "hash": "0eea9715c9db" - }, - ".windsurf/rules/security.md": { - "hash": "6a39548b2255" - }, - ".windsurf/rules/team-cost-ops.md": { - "hash": "69db0e22010d" - }, - ".windsurf/rules/team-data.md": { - "hash": "2fa55fd04223" - }, - ".windsurf/rules/team-devops.md": { - "hash": "06c93f75dcd3" - }, - ".windsurf/rules/team-forge.md": { - "hash": "13f5fa696b1d" - }, - ".windsurf/rules/team-backend.md": { - "hash": "ec288e9b54ce" - }, - ".windsurf/rules/team-docs.md": { - "hash": "f019d83abc58" - }, - ".windsurf/rules/team-frontend.md": { - "hash": "e9a5f425646d" - }, - ".windsurf/rules/languages/security.md": { - "hash": "1c73e7635578" - }, - ".windsurf/rules/team-product.md": { - "hash": "81f4929e42f3" - }, - ".windsurf/rules/project.md": { - "hash": "cc8ae6d95221" - }, - ".windsurf/rules/team-testing.md": { - "hash": "505b7caae49d" - }, - ".windsurf/rules/team-security.md": { - "hash": "a7c778d35665" - }, - ".windsurf/workflows/phase-execution.yml": { - "hash": "81054e1a3272" - }, - "AGENTS.md": { - "hash": "911950e72f75" - }, - ".windsurf/workflows/full-assessment.yml": { - "hash": "57d1220ee8ac" - }, - "AGENT_BACKLOG.md": { - "hash": "f45282123027" - }, - "CHANGELOG.md": { - "hash": "8cb5a19628b1" - }, - "AGENT_TEAMS.md": { - "hash": "725ada7d289f" - }, - ".windsurf/rules/team-strategic-ops.md": { - "hash": "c1d8c4f33abe" - }, - "CLAUDE.md": { - "hash": "4e7b5fb72c4c" - }, - ".windsurf/rules/team-quality.md": { - "hash": "afb908c98b76" - }, - ".windsurf/rules/team-infra.md": { - "hash": "fb977ea917c1" - }, - "docs/api/01_overview.md": { - "hash": "342e9d07b13f" - }, - "docs/api/02_endpoints.md": { - "hash": "43eb1cc5a21f" - }, - "CONTRIBUTING.md": { - "hash": "afd7d3c16416" - }, - "docs/api/04_examples.md": { - "hash": "7c21b7bcf311" - }, - "docs/api/03_authentication.md": { - "hash": "26ef4da3ef56" - }, - "docs/api/05_errors.md": { - "hash": "ed2e5a6e94ed" - }, - "docs/api/06_versioning.md": { - "hash": "bd878ba8a2f6" - }, - "COMMAND_GUIDE.md": { - "hash": "4600c6725f0d" - }, - "docs/architecture/01_overview.md": { - "hash": "df6efc6fda78" - }, - "docs/architecture/decisions/01-adopt-agentkit-forge.md": { - "hash": "552c1023dcf2" - }, - "docs/api/README.md": { - "hash": "5a266ea2df82" - }, - "docs/agents/agent-team-matrix.md": { - "hash": "09345b713ca1" - }, - "docs/architecture/decisions/03-tooling-strategy.md": { - "hash": "b2700e569966" - }, - "docs/architecture/decisions/05-dependency-supply-chain-detection-tooling.md": { - "hash": "6ccff01874c7" - }, - "docs/architecture/decisions/06-code-quality-maintainability-signal-tooling.md": { - "hash": "3fb3fc9fd6ff" - }, - "docs/architecture/decisions/04-static-security-analysis-depth-tooling.md": { - "hash": "998c41843f21" - }, - "docs/architecture/decisions/02-fallback-policy-tokens-problem.md": { - "hash": "31295d24794e" - }, - "docs/architecture/decisions/README.md": { - "hash": "28b5d189b354" - }, - "docs/architecture/diagrams/.gitkeep": { - "hash": "64edc5f9f589" - }, - "docs/architecture/README.md": { - "hash": "a867a017c8a0" - }, - "docs/architecture/specs/02_technical_spec.md": { - "hash": "b603c83e06d5" - }, - "docs/architecture/diagrams/README.md": { - "hash": "782485a4f5ef" - }, - "docs/architecture/specs/01_functional_spec.md": { - "hash": "cb36564f8ddd" - }, - "docs/architecture/specs/03_api_spec.md": { - "hash": "d5a1811ddc75" - }, - "docs/architecture/specs/README.md": { - "hash": "7c4e52efbd0d" - }, - "docs/architecture/specs/04_data_models.md": { - "hash": "a77400c5387c" - }, - "docs/engineering/02_coding_standards.md": { - "hash": "cf4473c84515" - }, - "docs/engineering/03_testing.md": { - "hash": "7cbc67b07b25" - }, - "docs/engineering/04_git_workflow.md": { - "hash": "8621780ffdcb" - }, - "docs/engineering/05_security.md": { - "hash": "b2fd1574733d" - }, - "docs/engineering/06_pr_documentation.md": { - "hash": "74d9c99fc82a" - }, - "docs/engineering/README.md": { - "hash": "35afee261b38" - }, - "docs/engineering/07_changelog.md": { - "hash": "945e28ab8b34" - }, - "docs/history/.index.json": { - "hash": "7beb781687f2" - }, - "docs/history/bug-fixes/README.md": { - "hash": "78dcabc86f74" - }, - "docs/history/bug-fixes/TEMPLATE-bugfix.md": { - "hash": "7873d84034ec" - }, - "docs/history/features/README.md": { - "hash": "7a6b10981688" - }, - "docs/history/features/TEMPLATE-feature.md": { - "hash": "c704b2662b57" - }, - "docs/history/implementations/README.md": { - "hash": "938114ecc966" - }, - "docs/history/implementations/TEMPLATE-implementation.md": { - "hash": "d4b4ad9bf6cc" - }, - "docs/history/issues/README.md": { - "hash": "3e5d149f1a6c" - }, - "docs/history/issues/TEMPLATE-issue.md": { - "hash": "b133cb73cdc5" - }, - "docs/history/lessons-learned/README.md": { - "hash": "b21e63388be4" - }, - "docs/history/lessons-learned/TEMPLATE-lesson.md": { - "hash": "810fcf97423b" - }, - "docs/engineering/01_setup.md": { - "hash": "225879d37c28" - }, - "docs/history/migrations/README.md": { - "hash": "7b023cecc53d" - }, - "docs/history/migrations/TEMPLATE-migration.md": { - "hash": "97272242bd4e" - }, - "docs/history/README.md": { - "hash": "8feb37cbe0c0" - }, - "docs/integrations/02_webhooks.md": { - "hash": "b9e1b977bf00" - }, - "docs/integrations/README.md": { - "hash": "105308932223" - }, - "docs/operations/01_deployment.md": { - "hash": "8fc948f3e280" - }, - "docs/operations/02_monitoring.md": { - "hash": "0d1c7d4a021e" - }, - "docs/operations/03_incident_response.md": { - "hash": "549b6f418202" - }, - "docs/operations/04_troubleshooting.md": { - "hash": "a8c0364e80c9" - }, - "docs/operations/05_slos_slis.md": { - "hash": "2cbf5f2188dd" - }, - "docs/operations/README.md": { - "hash": "62c405f25743" - }, - "docs/planning/TEMPLATE-plan.md": { - "hash": "305534965f0e" - }, - "docs/product/01_prd.md": { - "hash": "80c041b82e0d" - }, - "docs/integrations/01_external_apis.md": { - "hash": "17bc92567b46" - }, - "docs/integrations/03_sdk.md": { - "hash": "c05a8a69392d" - }, - "docs/product/02_user_stories.md": { - "hash": "fce181fc7087" - }, - "docs/product/03_roadmap.md": { - "hash": "c24ab738099b" - }, - "docs/product/README.md": { - "hash": "43db13443d26" - }, - "docs/reference/03_changelog.md": { - "hash": "4bd7c9e727aa" - }, - "docs/reference/02_faq.md": { - "hash": "ac95d6fb41ec" - }, - "docs/reference/04_contributing.md": { - "hash": "b33e1d721718" - }, - "docs/reference/README.md": { - "hash": "c09171b9b8a1" - }, - "GEMINI.md": { - "hash": "a59e2d67b8dd" - }, - "MIGRATIONS.md": { - "hash": "e880b3edb24c" - }, - "docs/product/04_personas.md": { - "hash": "609113c06c69" - }, - "QUALITY_GATES.md": { - "hash": "e3158c924e6e" - }, - "docs/README.md": { - "hash": "0a5900bf46af" - }, - "docs/reference/01_glossary.md": { - "hash": "2f571539f2ff" - }, - "scripts/analyze-agents.sh": { - "hash": "dfd5f15e5267" - }, - "scripts/analyze-agents.ps1": { - "hash": "e66c881de65a" - }, - "scripts/check-documentation-requirement.sh": { - "hash": "0604d65be8db" - }, - "scripts/consolidate-branches.sh": { - "hash": "f345de274644" - }, - "scripts/create-doc.sh": { - "hash": "c170336b69e0" - }, - "scripts/create-doc.ps1": { - "hash": "207501b71fe6" - }, - "scripts/resolve-merge.ps1": { - "hash": "1ae33673ef63" - }, - "scripts/resolve-merge.sh": { - "hash": "29048f9dc59d" - }, - "scripts/setup-agentkit-branch-governance.ps1": { - "hash": "ac356d29ce05" - }, - "scripts/setup-agentkit-branch-governance.sh": { - "hash": "cecf99c1c59a" - }, - "RUNBOOK_AI.md": { - "hash": "2a0d351455dc" - }, - "scripts/sync-issues.sh": { - "hash": "5728f842fda3" - }, - "scripts/sync-split-pr.ps1": { - "hash": "199b5056c32e" - }, - "scripts/sync-split-pr.sh": { - "hash": "169e29683f7b" - }, - "scripts/update-changelog.sh": { - "hash": "146f6934a4ee" - }, - "scripts/consolidate-branches.ps1": { - "hash": "767265430308" - }, - "scripts/validate-documentation.sh": { - "hash": "c00c47269a24" - }, - "scripts/validate-numbering.sh": { - "hash": "d78c153d05ee" - }, - "UNIFIED_AGENT_TEAMS.md": { - "hash": "506e38f9e21c" - }, - "SECURITY.md": { - "hash": "a926751bc190" - }, - "WARP.md": { - "hash": "24ca1510e68e" - }, - "scripts/update-changelog.ps1": { - "hash": "3b64bfbcfc25" - } - } -} diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/AGENT_TEAMS.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/AGENT_TEAMS.md deleted file mode 100644 index ed649683..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/AGENT_TEAMS.md +++ /dev/null @@ -1,80 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Agent Teams — agentkit-forge - -> Repo-local team mapping derived from `.agentkit/spec/teams.yaml`. -> Customize the **Status**, **Primary Scope**, **Tech Stack**, and **Lead Agent** -> columns for your repository. The orchestrator uses this file for task dispatch. - ---- - -## Overview - -This document maps the canonical AgentKit team definitions (see -[UNIFIED_AGENT_TEAMS.md](./UNIFIED_AGENT_TEAMS.md)) to the concrete structure -of this repository. Not all teams may be active — mark inactive teams so the -orchestrator skips them during dispatch. - ---- - -## Team Roster - -| Team | ID | Focus | Scope | Accepts | Handoff Chain | Status | Lead Agent | -| ---- | -- | ----- | ----- | ------- | ------------- | ------ | ---------- | -| BACKEND | backend | API, services, core logic | `apps/api/**`, `services/**`, `src/server/**`, `controllers/**` | implement, review, plan | testing → docs | Active | — | -| FRONTEND | frontend | UI, components, PWA | `apps/web/**`, `apps/marketing/**`, `src/client/**`, `components/**` | implement, review, plan | testing → docs | Active | — | -| DATA | data | Database, models, migrations | `db/**`, `migrations/**`, `models/**`, `prisma/**` | implement, review, plan | backend → testing | Active | — | -| INFRA | infra | IaC, cloud, Terraform/Bicep | `infra/**`, `terraform/**`, `bicep/**`, `pulumi/**` | implement, review, plan, investigate | devops → security | Active | — | -| DEVOPS | devops | CI/CD, pipelines, automation | `.github/workflows/**`, `scripts/**`, `docker/**`, `**/Dockerfile*` | implement, review, plan | testing → security | Active | — | -| TESTING | testing | Unit, E2E, integration tests | `**/*.test.*`, `**/*.spec.*`, `tests/**`, `e2e/**`, `playwright/**` | implement, review, test | quality | Active | — | -| SECURITY | security | Auth, compliance, audit | `auth/**`, `security/**`, `middleware/auth*` | review, investigate | — | Active | — | -| DOCUMENTATION | docs | Docs, ADRs, guides | `docs/**`, `docs/architecture/decisions/**`, `.github/**`, `README.md`, `CHANGELOG.md`, `CONTRIBUTING.md` | implement, review, document | — | Active | — | -| PRODUCT | product | Features, PRDs, roadmap | `docs/product/**`, `docs/prd/**` | plan, review | backend → frontend | Active | — | -| QUALITY | quality | Code review, refactoring, bugs, reliability, session retrospectives | `**/*` | review, investigate | — | Active | — | -| TEAMFORGE | forge | Meta-team — creates, validates, and deploys new agent team specifications | `.agentkit/spec/**`, `docs/planning/agents-teams/**`, `docs/architecture/**` | plan, review, investigate, document | quality → docs | Active | — | -| STRATEGIC OPS | strategic-ops | Cross-project coordination, framework governance, portfolio-level planning | `docs/planning/**`, `docs/architecture/**`, `.agentkit/spec/**`, `AGENT_BACKLOG.md`, `UNIFIED_AGENT_TEAMS.md`, `AGENT_TEAMS.md` | plan, review, investigate, document | product → quality | Active | — | -| COST OPS | cost-ops | AI infrastructure cost reduction, vendor optimization, token efficiency | `docs/cost-ops/**`, `docs/planning/cost/**`, `config/models/**`, `config/pricing/**` | investigate, review, plan, document, implement | infra → product → strategic-ops | Active | — | - ---- - -## How to Customize - -### Activating / Deactivating a Team - -1. Change the **Status** column from `Inactive` to `Active` (or vice versa). -2. Fill in the **Primary Scope** with actual directory paths in this repo. -3. Set the **Tech Stack** to reflect the tools and frameworks used. -4. Assign a **Lead Agent** identifier (used for mentions and escalation). -5. Add any relevant notes about the team's role. - -The orchestrator will skip inactive teams during `/orchestrate` dispatch. - -### Adding Custom Scope Patterns - -Each team's scope patterns determine which files the orchestrator will assign -to that team. Use glob patterns: - -``` -src/server/** — all files under src/server/ -src/api/*.ts — TypeScript files directly in src/api/ -tests/unit/server/* — server unit tests -``` - ---- - -## Scope Overlap Resolution - -When multiple teams have overlapping scope patterns, the orchestrator uses -these priority rules: - -1. **Most specific pattern wins.** A deeper path match takes precedence. -2. **Explicit assignment overrides.** A task explicitly assigned to a team - via `--teams` flag takes precedence over pattern matching. -3. **Primary scope takes priority.** The team whose scope lists the most - specific matching directory owns the file. - ---- - -_Customize this file for your repository. User edits are preserved across syncs._ -_Canonical team definitions: [UNIFIED_AGENT_TEAMS.md](./UNIFIED_AGENT_TEAMS.md)_ diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/README.md deleted file mode 100644 index 9484b549..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/README.md +++ /dev/null @@ -1,47 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# agentkit-forge — Documentation - -Welcome to the agentkit-forge documentation hub. This index links to every -documentation category maintained by this repository. - -## Categories - -| Category | Description | -| -------------------------------------- | ----------------------------------------------------- | -| [Product](./product/) | Product vision, strategy, personas, PRDs | -| [Architecture](./architecture/) | Specs, ADRs, diagrams, tech stack decisions | -| [Orchestration](./orchestration/) | Orchestration guide, PM guide, concurrency protocol | -| [Agents](./agents/) | Agent catalog, roles, team mappings | -| [API](./api/) | API reference, authentication, versioning, and errors | -| [Operations](./operations/) | CI/CD, deployments, monitoring, and troubleshooting | -| [Engineering](./engineering/) | Setup, coding standards, testing, and contributing | -| [Integrations](./integrations/) | External APIs, webhooks, and SDK | -| [Reference](./reference/) | Glossary, acronyms, FAQ, and tool config | -| [Handoffs](./handoffs/) | AI session handoff documents | -| [History](./history/) | Bug fixes, features, implementations, lessons | - -## Quick Links - -- [Architecture Overview](./architecture/01_overview.md) -- [Orchestration Guide](./orchestration/overview.md) -- [PM Guide](./orchestration/pm-guide.md) -- [Agent Catalog](./agents/catalog.md) -- [API Overview](./api/01_overview.md) -- [Getting Started](./engineering/01_setup.md) -- [Changelog](./reference/03_changelog.md) - -- [PRD Library](./product/prd/README.md) - - -## Conventions - -- Placeholder tokens `agentkit-forge` and `3.1.0` are replaced at sync time. -- Do **not** edit generated files directly — run `pnpm -C .agentkit agentkit:sync` - to regenerate them from the AgentKit Forge spec and overlays. - ---- - -Generated by AgentKit Forge v3.1.0 diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/api/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/api/README.md deleted file mode 100644 index e91f44ae..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/api/README.md +++ /dev/null @@ -1,14 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# API Docs Index - -## Contents - -- [01_overview.md](./01_overview.md) -- [02_endpoints.md](./02_endpoints.md) -- [03_authentication.md](./03_authentication.md) -- [04_examples.md](./04_examples.md) -- [05_errors.md](./05_errors.md) -- [06_versioning.md](./06_versioning.md) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/README.md deleted file mode 100644 index de2050fe..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/README.md +++ /dev/null @@ -1,12 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Architecture Docs Index - -## Contents - -- [01_overview.md](./01_overview.md) — Architecture overview and entry point -- [specs/](./specs/) — Functional, technical, and API specifications -- [diagrams/](./diagrams/) — Architecture diagrams -- [decisions/](./decisions/) — Architecture Decision Records (ADRs) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/decisions/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/decisions/README.md deleted file mode 100644 index e488986f..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/decisions/README.md +++ /dev/null @@ -1,16 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# ADR Index - -## Decision Records - -- [01-adopt-agentkit-forge.md](./01-adopt-agentkit-forge.md) -- [02-fallback-policy-tokens-problem.md](./02-fallback-policy-tokens-problem.md) -- [03-tooling-strategy.md](./03-tooling-strategy.md) -- [04-static-security-analysis-depth-tooling.md](./04-static-security-analysis-depth-tooling.md) -- [05-dependency-supply-chain-detection-tooling.md](./05-dependency-supply-chain-detection-tooling.md) -- [06-code-quality-maintainability-signal-tooling.md](./06-code-quality-maintainability-signal-tooling.md) -- [07-delivery-strategy.md](./07-delivery-strategy.md) -- [08-issue-sync-strategy.md](./08-issue-sync-strategy.md) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/diagrams/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/diagrams/README.md deleted file mode 100644 index f93d1b98..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/diagrams/README.md +++ /dev/null @@ -1,16 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Architecture Diagrams Index - -## Contents - -- Add C4 and deployment diagrams in this folder. -- Keep diagram files named with ordered prefixes when sequence matters (`01_`, `02_`, ...). - -## Recommended Diagrams - -- `01_system-context.mmd` (C4 L1) -- `02_container-view.mmd` (C4 L2) -- `03_deployment-view.mmd` (runtime/deployment) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/specs/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/specs/README.md deleted file mode 100644 index abdab96a..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/architecture/specs/README.md +++ /dev/null @@ -1,12 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Specs Docs Index - -## Contents - -- [01_functional_spec.md](./01_functional_spec.md) -- [02_technical_spec.md](./02_technical_spec.md) -- [03_api_spec.md](./03_api_spec.md) -- [04_data_models.md](./04_data_models.md) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/engineering/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/engineering/README.md deleted file mode 100644 index 9deaffc9..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/engineering/README.md +++ /dev/null @@ -1,16 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Engineering Docs Index - -## Contents - -- [01_setup.md](./01_setup.md) -- [02_coding_standards.md](./02_coding_standards.md) -- [03_testing.md](./03_testing.md) -- [04_git_workflow.md](./04_git_workflow.md) -- [05_security.md](./05_security.md) -- [06_pr_documentation.md](./06_pr_documentation.md) -- [07_changelog.md](./07_changelog.md) -- [08_scaffold_management.md](./08_scaffold_management.md) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/README.md deleted file mode 100644 index ecab947d..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/README.md +++ /dev/null @@ -1,67 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# History - -Historical documentation for significant PRs and implementations in agentkit-forge. - -## Directory Structure - -| Directory | Description | -| -------------------------------------- | ---------------------------------------------- | -| [implementations/](./implementations/) | Major implementations and architecture changes | -| [bug-fixes/](./bug-fixes/) | Complex or critical bug resolutions | -| [features/](./features/) | New feature launches | -| [migrations/](./migrations/) | Major migrations and upgrades | -| [issues/](./issues/) | Issues encountered during development sessions | -| [lessons-learned/](./lessons-learned/) | Lessons learned from retrospectives | - -## Naming Convention - -Files use the format: `XXXX-YYYY-MM-DD-[title]-[type].md` - -- `XXXX` — sequential 4-digit number (maintained in [.index.json](./.index.json)) -- `YYYY-MM-DD` — completion date -- `[title]` — kebab-case title -- `[type]` — `implementation`, `bugfix`, `feature`, `migration`, `issue`, or `lesson` - -## Creating New Documentation - -Use the provided script to generate a new document from the correct template: - -```bash -# Bash -./scripts/create-doc.sh implementation "Feature Name" <pr-number> -./scripts/create-doc.sh bugfix "Bug Description" <pr-number> -./scripts/create-doc.sh feature "Feature Name" <pr-number> -./scripts/create-doc.sh migration "Migration Name" <pr-number> -./scripts/create-doc.sh issue "Issue Title" -./scripts/create-doc.sh lesson "Lesson Title" -``` - -> **Note:** Issue and lesson records are created automatically via -> `/review --focus=retrospective`, not through the create-doc script. -> -> **Fallback:** When `gh` CLI is unavailable (proxy failures, air-gapped -> environments), use `./scripts/create-doc.sh issue "Title"` to record issues -> locally, then run `./scripts/sync-issues.sh --apply` once access is restored. - -The `/review` command with `--focus=retrospective` automates issue and lesson -creation at end-of-session (non-blocking — never gates delivery): - -```bash -# Via agent command -/review --focus=retrospective # Full retrospective: issues + lessons -/review --focus=retrospective --dry-run # Preview without writing -/review --focus=retrospective --open-issues # Also create GitHub issues for unresolved problems -``` - -```powershell -# PowerShell -./scripts/create-doc.ps1 implementation "Feature Name" <pr-number> -``` - -Or use the `/document-history` slash command for auto-detection of type and title from session context. - -See [docs/engineering/06_pr_documentation.md](../engineering/06_pr_documentation.md) for the full documentation strategy. diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/bug-fixes/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/bug-fixes/README.md deleted file mode 100644 index 011ae350..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/bug-fixes/README.md +++ /dev/null @@ -1,8 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Bug Fixes - -Historical records of complex or critical bug resolutions. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/features/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/features/README.md deleted file mode 100644 index 4e4a4c82..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/features/README.md +++ /dev/null @@ -1,8 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Features - -Historical records of new feature launches. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/implementations/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/implementations/README.md deleted file mode 100644 index afc0d54d..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/implementations/README.md +++ /dev/null @@ -1,8 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Implementations - -Historical records of major implementations, architecture changes, and significant refactoring. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/issues/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/issues/README.md deleted file mode 100644 index 53ac6b6a..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/issues/README.md +++ /dev/null @@ -1,42 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Issues - -Historical records of issues encountered during development sessions. - -## Creating Issue Records - -### Preferred: GitHub Issues via `gh` - -When the GitHub CLI is available and authenticated, create issues directly: - -```bash -gh issue create --title "Issue Title" --body "Description" -``` - -### Fallback: Local Issue Docs - -When `gh` is unavailable (no CLI installed, proxy/auth failures, air-gapped -environments), record issues locally as structured markdown: - -```bash -./scripts/create-doc.sh issue "Issue Title" -``` - -Issues are also logged automatically by `/review --focus=retrospective` at the -end of a session. - -### Syncing Local Issues to GitHub - -Once `gh` access is restored, sync local issue docs to GitHub Issues: - -```bash -./scripts/sync-issues.sh # Dry-run by default -./scripts/sync-issues.sh --apply # Create GitHub Issues and mark synced -``` - -See [ADR-08](../../architecture/decisions/08-issue-sync-strategy.md) for -the sync strategy and automation decisions. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/lessons-learned/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/lessons-learned/README.md deleted file mode 100644 index 5acf19fb..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/lessons-learned/README.md +++ /dev/null @@ -1,11 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Lessons Learned - -Historical records of lessons learned during development sessions. - -Lessons are logged automatically by `/review --focus=retrospective` at the end of -a session, or manually via `scripts/create-doc.sh lesson "Lesson Title"`. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/migrations/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/migrations/README.md deleted file mode 100644 index 672df4f0..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/history/migrations/README.md +++ /dev/null @@ -1,8 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Migrations - -Historical records of major migrations and upgrades. - -See [docs/history/README.md](../README.md) for naming conventions and usage. diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/integrations/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/integrations/README.md deleted file mode 100644 index 48aa94c7..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/integrations/README.md +++ /dev/null @@ -1,11 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Integrations Docs Index - -## Contents - -- [01_external_apis.md](./01_external_apis.md) -- [02_webhooks.md](./02_webhooks.md) -- [03_sdk.md](./03_sdk.md) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/operations/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/operations/README.md deleted file mode 100644 index 5918083e..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/operations/README.md +++ /dev/null @@ -1,13 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Operations Docs Index - -## Contents - -- [01_deployment.md](./01_deployment.md) -- [02_monitoring.md](./02_monitoring.md) -- [03_incident_response.md](./03_incident_response.md) -- [04_troubleshooting.md](./04_troubleshooting.md) -- [05_slos_slis.md](./05_slos_slis.md) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/product/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/product/README.md deleted file mode 100644 index ce11aaf5..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/product/README.md +++ /dev/null @@ -1,12 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Product Docs Index - -## Contents - -- [01_prd.md](./01_prd.md) -- [02_user_stories.md](./02_user_stories.md) -- [03_roadmap.md](./03_roadmap.md) -- [04_personas.md](./04_personas.md) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/reference/README.md b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/reference/README.md deleted file mode 100644 index 3921959d..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/docs/reference/README.md +++ /dev/null @@ -1,14 +0,0 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> -<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> - -# Reference Docs Index - -## Contents - -- [01_glossary.md](./01_glossary.md) -- [02_faq.md](./02_faq.md) -- [03_changelog.md](./03_changelog.md) -- [04_contributing.md](./04_contributing.md) -- [05_project_yaml_reference.md](./05_project_yaml_reference.md) -- [ai_handoffs/](./ai_handoffs/) diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/analyze-agents.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/analyze-agents.sh deleted file mode 100644 index fd5324d6..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/analyze-agents.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/analyze-agents.sh -# Generates agent/team relationship matrices from spec files. -# -# Usage: -# ./scripts/analyze-agents.sh [--output <path>] [--matrix <n>] [--format <fmt>] -# -# Options: -# --output <path> Output file (default: docs/agents/agent-team-matrix.md) -# --matrix <n> Specific matrix: 1-8, supplementary, all (default: all) -# --format <fmt> Output format: markdown, json (default: markdown) - -set -euo pipefail -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -node "$PROJECT_ROOT/.agentkit/engines/node/src/cli.mjs" analyze-agents "$@" diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/check-documentation-requirement.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/check-documentation-requirement.sh deleted file mode 100644 index 944d7501..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/check-documentation-requirement.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/check-documentation-requirement.sh -# Analyzes staged or changed files to determine whether PR documentation is required. -# -# Usage (pre-commit hook): -# ./scripts/check-documentation-requirement.sh -# -# Exit codes: -# 0 — documentation not required or already present -# 1 — documentation required but not present (when --strict is passed) -# -# Environment variables: -# GITHUB_BASE_REF — set automatically in GitHub Actions PR workflows -# STRICT — set to "true" to exit 1 when documentation is required - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" -STRICT="${STRICT:-false}" - -# --------------------------------------------------------------------------- -# Collect changed files -# --------------------------------------------------------------------------- - -if [[ -n "${GITHUB_BASE_REF:-}" ]]; then - # Running inside GitHub Actions pull_request event - CHANGED_FILES=$(git diff --name-only "origin/${GITHUB_BASE_REF}" HEAD 2>/dev/null || git diff --name-only HEAD~1 HEAD) -else - # Running locally — inspect staged files, fall back to last commit - CHANGED_FILES=$(git diff --cached --name-only 2>/dev/null) - if [[ -z "$CHANGED_FILES" ]]; then - CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null || true) - fi -fi - -if [[ -z "$CHANGED_FILES" ]]; then - echo "ℹ️ No changed files detected." - exit 0 -fi - -# --------------------------------------------------------------------------- -# Impact assessment -# --------------------------------------------------------------------------- - -IMPACT_HIGH=false -IMPACT_MEDIUM=false - -while IFS= read -r file; do - # High impact: project files, CI, security configs, infrastructure - if [[ "$file" == *.csproj || "$file" == package.json || "$file" == Cargo.toml || \ - "$file" == go.mod || "$file" == pyproject.toml || "$file" == build.gradle || \ - "$file" == .github/workflows/*.yml || "$file" == .github/workflows/*.yaml || \ - "$file" == Dockerfile* || "$file" == docker-compose*.yml || \ - "$file" == **/terraform/**/*.tf || "$file" == **/infra/**/*.tf ]]; then - IMPACT_HIGH=true - # Medium impact: source code files - elif [[ "$file" == src/**/*.cs || "$file" == src/**/*.ts || "$file" == src/**/*.tsx || \ - "$file" == src/**/*.py || "$file" == src/**/*.rs || "$file" == src/**/*.go || \ - "$file" == lib/**/*.* || "$file" == packages/**/*.* ]]; then - IMPACT_MEDIUM=true - fi -done <<< "$CHANGED_FILES" - -# --------------------------------------------------------------------------- -# Count changed files -# --------------------------------------------------------------------------- - -CHANGED_COUNT=$(echo "$CHANGED_FILES" | wc -l | tr -d ' ') - -if [[ "$CHANGED_COUNT" -gt 50 ]]; then - IMPACT_HIGH=true -fi - -# --------------------------------------------------------------------------- -# Check if documentation already exists for this branch/PR -# --------------------------------------------------------------------------- - -# Count history docs that have been staged or added in this branch -HISTORY_DOCS=0 -if [[ -n "${GITHUB_BASE_REF:-}" ]]; then - HISTORY_DOCS=$(git diff --name-only "origin/${GITHUB_BASE_REF}" HEAD -- 'docs/history/**/*.md' 2>/dev/null | grep -v 'README\.md\|TEMPLATE-' | wc -l | tr -d ' ' || echo 0) -else - HISTORY_DOCS=$(git diff --cached --name-only -- 'docs/history/*.md' 'docs/history/**/*.md' 2>/dev/null | grep -v 'README\.md\|TEMPLATE-' | wc -l | tr -d ' ' || echo 0) -fi - -# --------------------------------------------------------------------------- -# Output assessment -# --------------------------------------------------------------------------- - -if [[ "$IMPACT_HIGH" == true ]]; then - echo "⚠️ HIGH IMPACT change detected — documentation required" - echo " Changed files: $CHANGED_COUNT" - if [[ "$HISTORY_DOCS" -gt 0 ]]; then - echo "✅ Documentation found ($HISTORY_DOCS new doc(s) in docs/history/)" - exit 0 - else - echo " Run: ./scripts/create-doc.sh <type> \"<title>\" <pr-number>" - echo " See: docs/engineering/06_pr_documentation.md" - if [[ "$STRICT" == "true" ]]; then - exit 1 - fi - fi -elif [[ "$IMPACT_MEDIUM" == true ]]; then - echo "ℹ️ MEDIUM IMPACT change detected — documentation recommended" - echo " Run: ./scripts/create-doc.sh <type> \"<title>\" <pr-number>" -else - echo "✅ LOW IMPACT change — documentation optional" -fi - -exit 0 diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/consolidate-branches.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/consolidate-branches.sh deleted file mode 100644 index 9aa9b746..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/consolidate-branches.sh +++ /dev/null @@ -1,289 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# ============================================================================= -# consolidate-branches.sh — Merge all unmerged feature branches into one -# ============================================================================= -# Usage: scripts/consolidate-branches.sh [base-branch] [--dry-run] [--skip=branch1,branch2] -# -# Discovers all local and remote branches not yet merged into <base-branch>, -# filters out protected branches, and merges them one by one into the current -# branch. Uses resolve-merge.sh for auto-resolution of generated files. -# -# Arguments: -# base-branch Branch to check "merged" status against (default: main) -# --dry-run List branches that would be merged without doing anything -# --skip=X,Y Comma-separated list of branch names to skip -# -# Examples: -# scripts/consolidate-branches.sh # merge all into current -# scripts/consolidate-branches.sh dev --dry-run # preview what would merge -# scripts/consolidate-branches.sh main --skip=wip/experiment -# ============================================================================= -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -# Colours (disabled when piped) -if [ -t 1 ]; then - GREEN='\033[0;32m' - YELLOW='\033[1;33m' - RED='\033[0;31m' - CYAN='\033[0;36m' - BOLD='\033[1m' - NC='\033[0m' -else - GREEN='' YELLOW='' RED='' CYAN='' BOLD='' NC='' -fi - -info() { echo -e "${CYAN}[info]${NC} $*"; } -ok() { echo -e "${GREEN}[ok]${NC} $*"; } -warn() { echo -e "${YELLOW}[warn]${NC} $*"; } -err() { echo -e "${RED}[error]${NC} $*"; } - -# --------------------------------------------------------------------------- -# Parse arguments -# --------------------------------------------------------------------------- -BASE_BRANCH="main" -DRY_RUN=false -SKIP_BRANCHES="" - -for arg in "$@"; do - case "$arg" in - --dry-run) DRY_RUN=true ;; - --skip=*) SKIP_BRANCHES="${arg#--skip=}" ;; - -*) err "Unknown flag: $arg"; exit 1 ;; - *) BASE_BRANCH="$arg" ;; - esac -done - -cd "$REPO_ROOT" - -CURRENT_BRANCH="$(git branch --show-current)" -if [ -z "$CURRENT_BRANCH" ]; then - err "Not on a branch (detached HEAD). Checkout a branch first." - exit 1 -fi - -# --------------------------------------------------------------------------- -# Protected branches — never auto-merge these -# --------------------------------------------------------------------------- -PROTECTED_BRANCHES="main master develop release" - -is_protected() { - local branch="$1" - for p in $PROTECTED_BRANCHES; do - [ "$branch" = "$p" ] && return 0 - done - return 1 -} - -is_skipped() { - local branch="$1" - if [ -n "$SKIP_BRANCHES" ]; then - IFS=',' read -ra SKIPS <<< "$SKIP_BRANCHES" - for s in "${SKIPS[@]}"; do - [ "$branch" = "$s" ] && return 0 - done - fi - return 1 -} - -# --------------------------------------------------------------------------- -# 1. Fetch all remotes -# --------------------------------------------------------------------------- -info "Fetching all remotes..." -git fetch --all --prune 2>/dev/null || warn "Fetch failed — continuing with local state" - -# --------------------------------------------------------------------------- -# 2. Discover unmerged branches -# --------------------------------------------------------------------------- -info "Finding branches not merged into ${BASE_BRANCH}..." - -# Get all remote branches not merged into base -UNMERGED=() -while IFS= read -r ref; do - [ -z "$ref" ] && continue - # Strip 'origin/' prefix for display - branch="${ref#origin/}" - - # Skip current branch, base branch, HEAD pointer - [ "$branch" = "$CURRENT_BRANCH" ] && continue - [ "$branch" = "$BASE_BRANCH" ] && continue - [ "$branch" = "HEAD" ] && continue - - # Skip protected branches - is_protected "$branch" && continue - - # Skip user-specified branches - is_skipped "$branch" && continue - - UNMERGED+=("$branch") -done < <(git branch -r --no-merged "origin/${BASE_BRANCH}" 2>/dev/null | sed 's/^[* ]*//' | sort) - -# Also check local-only branches (not on remote) -while IFS= read -r branch; do - [ -z "$branch" ] && continue - [ "$branch" = "$CURRENT_BRANCH" ] && continue - [ "$branch" = "$BASE_BRANCH" ] && continue - is_protected "$branch" && continue - is_skipped "$branch" && continue - - # Check if already in UNMERGED list - already=false - for u in "${UNMERGED[@]+"${UNMERGED[@]}"}"; do - [ "$u" = "$branch" ] && already=true && break - done - $already && continue - - UNMERGED+=("$branch") -done < <(git branch --no-merged "$BASE_BRANCH" 2>/dev/null | sed 's/^[* ]*//' | sort) - -if [ ${#UNMERGED[@]} -eq 0 ]; then - ok "No unmerged branches found. Everything is up to date with ${BASE_BRANCH}." - exit 0 -fi - -# --------------------------------------------------------------------------- -# 3. Display plan -# --------------------------------------------------------------------------- -echo "" -echo -e "${BOLD}Branch Consolidation Plan${NC}" -echo -e "${BOLD}========================${NC}" -echo "" -echo -e " Current branch: ${GREEN}${CURRENT_BRANCH}${NC}" -echo -e " Base branch: ${CYAN}${BASE_BRANCH}${NC}" -echo -e " Branches to merge: ${#UNMERGED[@]}" -echo "" - -for i in "${!UNMERGED[@]}"; do - branch="${UNMERGED[$i]}" - # Get commit count ahead of base - ahead=$(git rev-list --count "origin/${BASE_BRANCH}..origin/${branch}" 2>/dev/null || echo "?") - echo -e " $((i + 1)). ${YELLOW}${branch}${NC} (${ahead} commits ahead)" -done - -echo "" - -if $DRY_RUN; then - info "Dry run — no changes made." - exit 0 -fi - -# --------------------------------------------------------------------------- -# 4. Merge each branch -# --------------------------------------------------------------------------- -MERGED=() -FAILED=() -SKIPPED_DIRTY=() - -for branch in "${UNMERGED[@]}"; do - echo "" - echo -e "${BOLD}─────────────────────────────────────────${NC}" - info "Merging ${branch} ($(( ${#MERGED[@]} + ${#FAILED[@]} + 1 ))/${#UNMERGED[@]})..." - - # Check for uncommitted changes before each merge - if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then - warn "Uncommitted changes detected. Stashing before merge..." - git stash push -m "consolidate-branches: before merging ${branch}" 2>/dev/null - fi - - # Try merging from remote first, fall back to local - merge_ref="origin/${branch}" - if ! git rev-parse --verify "$merge_ref" &>/dev/null; then - merge_ref="$branch" - fi - - merge_output=$(git merge "$merge_ref" --no-edit 2>&1) && { - ok "Merged ${branch} cleanly." - MERGED+=("$branch") - continue - } - - # Check if it's a conflict or other error - if echo "$merge_output" | grep -qF "CONFLICT"; then - warn "Conflicts merging ${branch}. Attempting auto-resolution..." - - # Use resolve-merge logic inline (auto-resolve generated files) - auto_resolved=0 - while IFS= read -r file; do - [ -z "$file" ] && continue - case "$file" in - .claude/*|.cursor/*|.windsurf/*|.roo/*|.clinerules/*|.github/instructions/*|\ - .github/copilot-instructions.md|.github/PULL_REQUEST_TEMPLATE.md|\ - .github/agents/*|.github/chatmodes/*|.github/prompts/*|\ - .agents/*|.gemini/*|docs/*/README.md|scripts/*.sh|scripts/*.ps1|\ - AGENTS.md|UNIFIED_AGENT_TEAMS.md|COMMAND_GUIDE.md|QUALITY_GATES.md|\ - RUNBOOK_AI.md|CONTRIBUTING.md) - git checkout --theirs -- "$file" 2>/dev/null && git add "$file" 2>/dev/null - ok " Auto-resolved: $file" - auto_resolved=$((auto_resolved + 1)) - ;; - pnpm-lock.yaml|.agentkit/pnpm-lock.yaml|package-lock.json|yarn.lock|.agentkit/yarn.lock) - git checkout --theirs -- "$file" 2>/dev/null && git add "$file" 2>/dev/null - ok " Auto-resolved (lockfile): $file" - auto_resolved=$((auto_resolved + 1)) - ;; - esac - done < <(git diff --name-only --diff-filter=U 2>/dev/null) - - # Check if any conflicts remain - remaining=$(git diff --name-only --diff-filter=U 2>/dev/null || true) - if [ -z "$remaining" ]; then - git commit --no-edit 2>/dev/null - ok "Merged ${branch} (${auto_resolved} auto-resolved)." - MERGED+=("$branch") - else - err "Unresolved conflicts merging ${branch}:" - echo "$remaining" | while IFS= read -r f; do - echo -e " ${RED}✗${NC} $f" - done - warn "Aborting merge of ${branch}. Resolve manually or re-run with --skip=${branch}" - git merge --abort 2>/dev/null || true - FAILED+=("$branch") - fi - else - err "Merge of ${branch} failed (not a conflict):" - echo " $merge_output" - git merge --abort 2>/dev/null || true - FAILED+=("$branch") - fi -done - -# --------------------------------------------------------------------------- -# 5. Summary -# --------------------------------------------------------------------------- -echo "" -echo -e "${BOLD}═══════════════════════════════════════════${NC}" -echo -e "${BOLD}Consolidation Summary${NC}" -echo -e "${BOLD}═══════════════════════════════════════════${NC}" -echo "" -echo -e " ${GREEN}Merged:${NC} ${#MERGED[@]}/${#UNMERGED[@]}" - -if [ ${#MERGED[@]} -gt 0 ]; then - for b in "${MERGED[@]}"; do - echo -e " ${GREEN}✓${NC} $b" - done -fi - -if [ ${#FAILED[@]} -gt 0 ]; then - echo "" - echo -e " ${RED}Failed:${NC} ${#FAILED[@]}/${#UNMERGED[@]}" - for b in "${FAILED[@]}"; do - echo -e " ${RED}✗${NC} $b" - done - echo "" - warn "Re-run with: scripts/consolidate-branches.sh ${BASE_BRANCH} --skip=$(IFS=,; echo "${MERGED[*]}")" -fi - -echo "" -if [ ${#MERGED[@]} -gt 0 ]; then - info "Next steps:" - echo " 1. Run: pnpm -C .agentkit agentkit:sync" - echo " 2. Run: pnpm test" - echo " 3. Review with: git log --oneline -20" -fi - -exit ${#FAILED[@]} diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/create-doc.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/create-doc.sh deleted file mode 100644 index 318e7fe7..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/create-doc.sh +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/create-doc.sh -# Creates a new history document from the appropriate template. -# -# Usage: -# ./scripts/create-doc.sh <type> "<title>" [pr-number] -# -# Arguments: -# type Document type: implementation | bugfix | feature | migration -# title Human-readable title for the document -# pr-number Optional PR number to include in the document -# -# Examples: -# ./scripts/create-doc.sh implementation "TreatWarningsAsErrors" 42 -# ./scripts/create-doc.sh bugfix "Null Reference in Auth" 43 -# ./scripts/create-doc.sh feature "User Authentication" 44 -# ./scripts/create-doc.sh migration "Upgrade to Node 22" 45 - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" -INDEX_FILE="$HISTORY_DIR/.index.json" - -# --------------------------------------------------------------------------- -# Argument validation -# --------------------------------------------------------------------------- - -usage() { - echo "Usage: $0 <type> \"<title>\" [pr-number]" - echo " type: implementation | bugfix | feature | migration | issue | lesson" - exit 1 -} - -if [[ $# -lt 2 ]]; then - usage -fi - -TYPE="$1" -TITLE="$2" -PR_NUMBER="${3:-}" - -case "$TYPE" in - implementation|bugfix|feature|migration|issue|lesson) ;; - *) echo "Error: unknown type '$TYPE'. Must be one of: implementation, bugfix, feature, migration, issue, lesson"; exit 1 ;; -esac - -# --------------------------------------------------------------------------- -# Determine subdirectory from type -# --------------------------------------------------------------------------- - -case "$TYPE" in - implementation) SUBDIR="implementations" ;; - bugfix) SUBDIR="bug-fixes" ;; - feature) SUBDIR="features" ;; - migration) SUBDIR="migrations" ;; - issue) SUBDIR="issues" ;; - lesson) SUBDIR="lessons-learned" ;; -esac - -# --------------------------------------------------------------------------- -# Read and update the sequential index -# --------------------------------------------------------------------------- - -if [[ ! -f "$INDEX_FILE" ]]; then - echo '{"sequences":{"implementation":1,"bugfix":1,"feature":1,"migration":1,"issue":1,"lesson":1},"entries":[]}' > "$INDEX_FILE" -fi - -# Use node to read the current sequence number safely (no user input interpolated) -SEQ_NUM=$(node - "$INDEX_FILE" "$TYPE" << 'NODEEOF' - const [,, indexFile, type] = process.argv; - const fs = require('fs'); - const idx = JSON.parse(fs.readFileSync(indexFile, 'utf8')); - process.stdout.write(String(idx.sequences[type] || 1)); -NODEEOF -) - -PADDED=$(printf "%04d" "$SEQ_NUM") -DATE=$(date +%Y-%m-%d) - -# Sanitize title: lowercase, spaces to hyphens, remove non-alphanumeric except hyphens -SLUG=$(echo "$TITLE" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/-\+/-/g' | sed 's/^-\|-$//g') - -FILENAME="${PADDED}-${DATE}-${SLUG}-${TYPE}.md" -DEST_DIR="$HISTORY_DIR/$SUBDIR" -DEST_FILE="$DEST_DIR/$FILENAME" - -mkdir -p "$DEST_DIR" - -# --------------------------------------------------------------------------- -# Copy template and substitute placeholders -# --------------------------------------------------------------------------- - -TEMPLATE_SRC="$REPO_ROOT/.agentkit/templates/docs/history/$SUBDIR/TEMPLATE-${TYPE}.md" - -if [[ ! -f "$TEMPLATE_SRC" ]]; then - echo "Error: template not found at $TEMPLATE_SRC" - exit 1 -fi - -PR_REF="${PR_NUMBER:+#${PR_NUMBER}}" - -# Perform literal replacements using Node.js to avoid sed injection -TITLE_VAL="$TITLE" DATE_VAL="$DATE" PR_REF_VAL="${PR_REF:-[#PR-Number]}" \ -node - "$TEMPLATE_SRC" "$DEST_FILE" << 'NODEEOF' - const fs = require('fs'); - const [,, src, dest] = process.argv; - let content = fs.readFileSync(src, 'utf8'); - - const replacements = { - '[Feature/Change Name]': process.env.TITLE_VAL, - '[Bug Description]': process.env.TITLE_VAL, - '[Feature Name]': process.env.TITLE_VAL, - '[Migration Name]': process.env.TITLE_VAL, - '[Issue Title]': process.env.TITLE_VAL, - '[Lesson Title]': process.env.TITLE_VAL, - '[YYYY-MM-DD]': process.env.DATE_VAL, - '[#PR-Number]': process.env.PR_REF_VAL - }; - - for (const [placeholder, value] of Object.entries(replacements)) { - content = content.split(placeholder).join(value); - } - - fs.writeFileSync(dest, content, 'utf8'); -NODEEOF - -# --------------------------------------------------------------------------- -# Update index -# --------------------------------------------------------------------------- - -node - "$INDEX_FILE" "$TYPE" "$SEQ_NUM" "$TITLE" "$DATE" "${PR_NUMBER:-}" "$SUBDIR/$FILENAME" << 'NODEEOF' - const [,, indexFile, type, seqNum, title, date, pr, file] = process.argv; - const fs = require('fs'); - const idx = JSON.parse(fs.readFileSync(indexFile, 'utf8')); - idx.sequences[type] = (idx.sequences[type] || 1) + 1; - idx.entries = idx.entries || []; - idx.entries.push({ number: Number(seqNum), type, title, date, pr, file }); - fs.writeFileSync(indexFile, JSON.stringify(idx, null, 2) + '\n'); -NODEEOF - -echo "Created: $DEST_FILE" - -# --------------------------------------------------------------------------- -# Update CHANGELOG.md -# --------------------------------------------------------------------------- - -# Map history doc type to changelog section -case "$TYPE" in - feature) CHANGELOG_SECTION="Added" ;; - implementation) CHANGELOG_SECTION="Added" ;; - bugfix) CHANGELOG_SECTION="Fixed" ;; - migration) CHANGELOG_SECTION="Changed" ;; - issue) CHANGELOG_SECTION="" ;; # Issues don't go in changelog - lesson) CHANGELOG_SECTION="" ;; # Lessons don't go in changelog -esac - -UPDATE_CHANGELOG="$SCRIPT_DIR/update-changelog.sh" -if [[ -z "$CHANGELOG_SECTION" ]]; then - echo "ℹ️ ${TYPE} records are not added to CHANGELOG.md — skipping changelog update." -elif [[ -f "$UPDATE_CHANGELOG" ]]; then - bash "$UPDATE_CHANGELOG" "$CHANGELOG_SECTION" "$TITLE" "${PR_NUMBER:-}" "$SUBDIR/$FILENAME" || \ - echo "⚠️ Could not update CHANGELOG.md — please add the entry manually." -else - echo "ℹ️ update-changelog.sh not found — skipping changelog update." -fi diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/resolve-merge.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/resolve-merge.sh deleted file mode 100644 index a3daecff..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/resolve-merge.sh +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# ============================================================================= -# resolve-merge.sh — Apply standard merge conflict resolutions -# ============================================================================= -# Usage: scripts/resolve-merge.sh [target-branch] -# -# Merges origin/<target-branch> into the current branch and auto-resolves -# generated/framework-managed files per the AgentKit merge resolution matrix. -# Remaining conflicts (engine source, spec files) are listed for manual review. -# ============================================================================= -set -euo pipefail - -TARGET="${1:-main}" -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -# Colours (disabled when piped) -if [ -t 1 ]; then - GREEN='\033[0;32m' - YELLOW='\033[1;33m' - RED='\033[0;31m' - CYAN='\033[0;36m' - NC='\033[0m' -else - GREEN='' YELLOW='' RED='' CYAN='' NC='' -fi - -info() { echo -e "${CYAN}[info]${NC} $*"; } -ok() { echo -e "${GREEN}[ok]${NC} $*"; } -warn() { echo -e "${YELLOW}[warn]${NC} $*"; } -err() { echo -e "${RED}[error]${NC} $*"; } - -cd "$REPO_ROOT" - -# --------------------------------------------------------------------------- -# 1. Fetch and attempt merge -# --------------------------------------------------------------------------- -info "Fetching origin/${TARGET}..." -git fetch origin "$TARGET" 2>/dev/null || { - err "Failed to fetch origin/${TARGET}. Check your remote." - exit 1 -} - -CURRENT_BRANCH="$(git branch --show-current)" -info "Merging origin/${TARGET} into ${CURRENT_BRANCH}..." - -merge_output=$(git merge "origin/${TARGET}" --no-edit 2>&1) && { - ok "Merge completed cleanly — no conflicts." - exit 0 -} - -# Distinguish real merge conflicts from other failures -if ! echo "$merge_output" | grep -qF "CONFLICT"; then - err "Merge failed for a reason other than conflicts:" - echo "$merge_output" - exit 1 -fi - -info "Merge conflicts detected. Applying resolution matrix..." - -# --------------------------------------------------------------------------- -# 2. Auto-resolve generated files (KEEP_THEIRS — accept upstream) -# --------------------------------------------------------------------------- -GENERATED_PATTERNS=( - '.agents/skills/*/SKILL.md' - '.github/agents/*.agent.md' - '.github/chatmodes/*.chatmode.md' - '.github/prompts/*.prompt.md' - 'docs/*/README.md' - '.github/copilot-instructions.md' - '.github/PULL_REQUEST_TEMPLATE.md' -) - -auto_resolved=0 -for pattern in "${GENERATED_PATTERNS[@]}"; do - # Find conflicted files matching this pattern - while IFS= read -r file; do - [ -z "$file" ] && continue - if git checkout --theirs -- "$file" 2>/dev/null; then - git add "$file" 2>/dev/null - ok "Auto-resolved (accept upstream): $file" - auto_resolved=$((auto_resolved + 1)) - fi - done < <(git diff --name-only --diff-filter=U | grep -E "$pattern" 2>/dev/null || true) -done - -# --------------------------------------------------------------------------- -# 3. Auto-resolve lockfiles (KEEP_THEIRS — accept upstream, regenerate later) -# --------------------------------------------------------------------------- -LOCKFILE_PATTERNS=( - 'pnpm-lock.yaml' - '.agentkit/pnpm-lock.yaml' - 'package-lock.json' - '.agentkit/package-lock.json' -) - -for lockfile in "${LOCKFILE_PATTERNS[@]}"; do - if git diff --name-only --diff-filter=U | grep -qx "$lockfile" 2>/dev/null; then - if git checkout --theirs -- "$lockfile" 2>/dev/null; then - git add "$lockfile" 2>/dev/null - ok "Auto-resolved (accept upstream): $lockfile" - auto_resolved=$((auto_resolved + 1)) - fi - fi -done - -# --------------------------------------------------------------------------- -# 4. Auto-resolve generated config (KEEP_THEIRS) -# --------------------------------------------------------------------------- -GENERATED_CONFIGS=( - '.gemini/config.yaml' -) - -for config in "${GENERATED_CONFIGS[@]}"; do - if git diff --name-only --diff-filter=U | grep -qx "$config" 2>/dev/null; then - if git checkout --theirs -- "$config" 2>/dev/null; then - git add "$config" 2>/dev/null - ok "Auto-resolved (accept upstream): $config" - auto_resolved=$((auto_resolved + 1)) - fi - fi -done - -# --------------------------------------------------------------------------- -# 5. Report remaining conflicts -# --------------------------------------------------------------------------- -REMAINING="$(git diff --name-only --diff-filter=U 2>/dev/null || true)" - -echo "" -info "Auto-resolved: ${auto_resolved} file(s)" - -if [ -n "$REMAINING" ]; then - echo "" - warn "Manual merge required for the following file(s):" - echo "" - while IFS= read -r file; do - [ -z "$file" ] && continue - # Categorise for the developer - case "$file" in - .agentkit/engines/*) echo -e " ${RED}[engine]${NC} $file — semantic merge required (runtime logic)" ;; - .agentkit/spec/*) echo -e " ${YELLOW}[spec]${NC} $file — preserve both intents" ;; - *) echo -e " ${CYAN}[source]${NC} $file" ;; - esac - done <<< "$REMAINING" - echo "" - info "Resolve the files above, then run: git add -A && git commit" - exit 1 -else - ok "All conflicts resolved automatically." - info "Committing merge..." - git commit --no-edit - ok "Merge committed successfully." - - # Suggest lockfile regeneration - if git diff --name-only "HEAD~1..HEAD" | grep -q "lock\.\(yaml\|json\)$" 2>/dev/null; then - echo "" - warn "Lockfiles were updated. Consider running: pnpm install" - fi -fi diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/setup-agentkit-branch-governance.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/setup-agentkit-branch-governance.sh deleted file mode 100644 index f955e11b..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/setup-agentkit-branch-governance.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -set -euo pipefail - -REPO="" -DRY_RUN=false -SKIP_DEFAULT_BRANCH=false -SKIP_PROTECTION=false - -while [[ $# -gt 0 ]]; do - case "$1" in - --repo) - if [[ $# -lt 2 || -z "${2:-}" || "${2:-}" == -* ]]; then - echo "Error: --repo requires a value in the form owner/name" - exit 1 - fi - REPO="$2" - shift 2 - ;; - --dry-run) - DRY_RUN=true - shift - ;; - --skip-default-branch) - SKIP_DEFAULT_BRANCH=true - shift - ;; - --skip-protection) - SKIP_PROTECTION=true - shift - ;; - --help|-h) - echo "Usage: $(basename "$0") [--repo owner/name] [--dry-run] [--skip-default-branch] [--skip-protection]" - exit 0 - ;; - *) - echo "Unknown option: $1" - exit 1 - ;; - esac -done - -if ! command -v gh >/dev/null 2>&1; then - echo "gh CLI is not installed. Install from https://cli.github.com/" - exit 1 -fi - -if ! gh auth status >/dev/null 2>&1; then - echo "gh CLI is not authenticated. Run 'gh auth login' first." - exit 1 -fi - -if [[ -z "$REPO" ]]; then - REPO=$(gh repo view --json nameWithOwner -q '.nameWithOwner' 2>/dev/null || true) -fi - -if [[ -z "$REPO" ]]; then - echo "Could not determine repository. Pass --repo <owner/name>." - exit 1 -fi - -echo "=== AgentKit Branch Governance Setup ===" -echo "Repository: $REPO" -echo "DryRun: $DRY_RUN" -echo - -if [[ "$SKIP_DEFAULT_BRANCH" == false ]]; then - if [[ "$DRY_RUN" == true ]]; then - echo "[dry-run] Would set default branch to 'main' for $REPO" - else - gh api --method PATCH "/repos/$REPO" -f default_branch='main' >/dev/null - echo "Default branch set to 'main'." - fi -fi - -PAYLOAD=$(cat <<'JSON' -{ - "required_status_checks": { - "strict": true, - "contexts": [ - "Test", - "Validate", - "Branch Protection / branch-rules" - ] - }, - "enforce_admins": false, - "required_pull_request_reviews": { - "required_approving_review_count": 1, - "dismiss_stale_reviews": true, - "require_code_owner_reviews": true, - "require_last_push_approval": false - }, - "restrictions": null, - "required_linear_history": true, - "allow_force_pushes": false, - "allow_deletions": false, - "block_creations": false, - "required_conversation_resolution": true -} -JSON -) - -if [[ "$SKIP_PROTECTION" == false ]]; then - # Deduplicate: if defaultBranch is 'main', don't apply twice - for BRANCH in $(echo "main main" | tr ' ' '\n' | awk '!seen[$0]++'); do - # Skip if the branch does not exist on the remote - if ! gh api "/repos/$REPO/branches/$BRANCH" --silent 2>/dev/null; then - echo "[skip] Branch '$BRANCH' does not exist on $REPO — skipping protection." - continue - fi - - if [[ "$DRY_RUN" == true ]]; then - echo "[dry-run] Would apply branch protection to $REPO/$BRANCH" - continue - fi - - gh api --method PUT "/repos/$REPO/branches/$BRANCH/protection" --input - <<< "$PAYLOAD" >/dev/null - echo "Branch protection applied to $BRANCH." - done -fi - -echo -echo "Done." -for BRANCH in $(echo "main main" | tr ' ' '\n' | awk '!seen[$0]++'); do - echo "Verify with: gh api /repos/$REPO/branches/$BRANCH/protection" -done diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/sync-issues.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/sync-issues.sh deleted file mode 100644 index 9ace772a..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/sync-issues.sh +++ /dev/null @@ -1,180 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/sync-issues.sh -# Syncs local issue docs (docs/history/issues/) to GitHub Issues. -# -# Local issue markdown files that have "gh_synced: false" are candidates for -# sync. In dry-run mode (default) the script prints what would be created. -# With --apply it creates GitHub Issues via `gh` and stamps the file with the -# resulting issue number. -# -# Usage: -# ./scripts/sync-issues.sh # Dry-run — preview only -# ./scripts/sync-issues.sh --apply # Create GitHub Issues -# ./scripts/sync-issues.sh --apply --label "from-local" # Add extra label -# -# Requirements: -# - gh CLI installed and authenticated -# - Current directory inside the git repository - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -ISSUES_DIR="$REPO_ROOT/docs/history/issues" - -APPLY=false -EXTRA_LABEL="" - -while [[ $# -gt 0 ]]; do - case "$1" in - --apply) APPLY=true; shift ;; - --label) - [[ $# -ge 2 ]] || { echo "Error: --label requires a value"; exit 1; } - EXTRA_LABEL="$2"; shift 2 ;; - -h|--help) - echo "Usage: $0 [--apply] [--label <label>]" - echo " --apply Create GitHub Issues (default is dry-run)" - echo " --label Extra label to add to created issues" - exit 0 - ;; - *) echo "Unknown option: $1"; exit 1 ;; - esac -done - -# --------------------------------------------------------------------------- -# Preflight checks (only needed when actually creating issues) -# --------------------------------------------------------------------------- - -if [[ "$APPLY" == true ]]; then - if ! command -v gh &>/dev/null; then - echo "Error: gh CLI is not installed. Install it from https://cli.github.com/" - exit 1 - fi - - if ! gh auth status &>/dev/null; then - echo "Error: gh is not authenticated. Run 'gh auth login' first." - exit 1 - fi -fi - -# --------------------------------------------------------------------------- -# Discover unsynced issue files -# --------------------------------------------------------------------------- - -CANDIDATES=0 -SKIPPED=0 -FAILED=0 - -# Glob matches the enforced naming convention: XXXX-YYYY-MM-DD-slug-issue.md -# Files created outside create-doc.sh without the -issue suffix are not picked up. -for issue_file in "$ISSUES_DIR"/*-issue.md; do - [[ -f "$issue_file" ]] || continue - - basename_file="$(basename "$issue_file")" - - # Skip templates - if [[ "$basename_file" == TEMPLATE-* ]]; then - continue - fi - - # Check sync status - if ! grep -q 'gh_synced.*false' "$issue_file" 2>/dev/null; then - SKIPPED=$((SKIPPED + 1)) - continue - fi - - # Extract title from first H1 (|| true prevents set -e exit on no match) - TITLE="$(grep -m1 '^# ' "$issue_file" | sed 's/^# //' | sed 's/ - Issue Record$//')" || true - if [[ -z "$TITLE" ]]; then - TITLE="$basename_file" - fi - - # Extract severity for labeling - SEVERITY="$(grep -m1 '^\*\*Severity\*\*:' "$issue_file" | sed 's/.*: *//' | tr '[:upper:]' '[:lower:]')" || true - if [[ -z "$SEVERITY" ]]; then - echo " [warn] No severity found in $basename_file — defaulting to unlabelled" - fi - - # Extract summary section as the issue body - BODY="$(sed -n '/^## Summary$/,/^## /{/^## Summary$/d;/^## /d;p}' "$issue_file" | sed '/^$/N;/^\n$/d')" - if [[ -z "$BODY" ]]; then - echo " [warn] No ## Summary section found in $basename_file — using fallback body" - BODY="Synced from local issue doc: $basename_file" - fi - - # Append a link back to the local file - BODY="$BODY - ---- -_Synced from \`docs/history/issues/$basename_file\`_" - - # Build labels - LABELS="synced-from-local" - if [[ -n "$SEVERITY" && "$SEVERITY" != *"["* ]]; then - LABELS="$LABELS,severity:$SEVERITY" - fi - if [[ -n "$EXTRA_LABEL" ]]; then - LABELS="$LABELS,$EXTRA_LABEL" - fi - - if [[ "$APPLY" == false ]]; then - echo "[dry-run] Would create issue: \"$TITLE\"" - echo " Labels: $LABELS" - echo " Source: $basename_file" - echo "" - CANDIDATES=$((CANDIDATES + 1)) - continue - fi - - # Create the GitHub Issue — capture stderr separately so it can be surfaced - # on failure without polluting the URL on success. - echo "Creating issue: \"$TITLE\" ..." - GH_STDERR_FILE="$(mktemp)" - ISSUE_URL="$(gh issue create \ - --title "$TITLE" \ - --body "$BODY" \ - --label "$LABELS" 2>"$GH_STDERR_FILE")" || { - echo " FAILED to create issue: \"$TITLE\"" - echo " gh stderr: $(cat "$GH_STDERR_FILE")" - rm -f "$GH_STDERR_FILE" - FAILED=$((FAILED + 1)) - continue - } - rm -f "$GH_STDERR_FILE" - - # Extract issue number from URL (https://github.com/owner/repo/issues/123) - ISSUE_NUMBER="${ISSUE_URL##*/}" - if [[ ! "$ISSUE_NUMBER" =~ ^[0-9]+$ ]]; then - ISSUE_NUMBER="$(echo "$ISSUE_URL" | grep -oE '[0-9]+$')" || true - [[ -z "$ISSUE_NUMBER" ]] && ISSUE_NUMBER="unknown" - fi - - echo " Created: $ISSUE_URL (#$ISSUE_NUMBER)" - - # Stamp the local file with sync metadata (portable: temp file instead of sed -i). - SYNC_DATE="$(date +%Y-%m-%d)" - TMPFILE="$(mktemp)" - sed \ - -e "s/^\(- \*\*gh_synced\*\*:\) .*/\1 true/" \ - -e "s/^\(- \*\*gh_issue_number\*\*:\) .*/\1 #$ISSUE_NUMBER/" \ - -e "s/^\(- \*\*gh_synced_at\*\*:\) .*/\1 $SYNC_DATE/" \ - -e "s|\(- \*\*Issue tracker\*\*:\) \[GitHub Issue.*\]|\1 $ISSUE_URL|" \ - "$issue_file" > "$TMPFILE" && mv "$TMPFILE" "$issue_file" - - CANDIDATES=$((CANDIDATES + 1)) -done - -# --------------------------------------------------------------------------- -# Summary -# --------------------------------------------------------------------------- - -echo "---" -if [[ "$APPLY" == false ]]; then - echo "Dry-run complete. $CANDIDATES issue(s) would be created, $SKIPPED already synced." - echo "Run with --apply to create GitHub Issues." -else - echo "Sync complete. $CANDIDATES created, $SKIPPED already synced, $FAILED failed." -fi diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/sync-split-pr.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/sync-split-pr.sh deleted file mode 100644 index 1bbf61ac..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/sync-split-pr.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -set -euo pipefail - -BASE_BRANCH="" -NEW_BRANCH="" -COMMIT_MESSAGE="chore(sync): regenerate generated outputs" -PR_TITLE="chore(sync): regenerate generated outputs" -DRY_RUN=0 - -while [[ $# -gt 0 ]]; do - case "$1" in - --base) - BASE_BRANCH="${2:-}" - shift 2 - ;; - --branch) - NEW_BRANCH="${2:-}" - shift 2 - ;; - --commit-message) - COMMIT_MESSAGE="${2:-}" - shift 2 - ;; - --pr-title) - PR_TITLE="${2:-}" - shift 2 - ;; - --dry-run) - DRY_RUN=1 - shift - ;; - -h|--help) - cat <<'EOF' -Usage: scripts/sync-split-pr.sh [options] - -Creates a dedicated branch + commit + PR for files produced by `agentkit:sync`. - -Options: - --base <branch> PR base branch (default: current branch) - --branch <name> Branch name for sync commit (default: chore/sync-generated-<utc>) - --commit-message <msg> Commit message - --pr-title <title> PR title - --dry-run Run sync and report changes without creating branch/commit/PR - -h, --help Show help -EOF - exit 0 - ;; - *) - echo "Unknown option: $1" >&2 - exit 1 - ;; - esac -done - -if [[ -n "$(git status --porcelain)" ]]; then - echo "Working tree is not clean. Commit/stash/discard changes before running sync split." >&2 - exit 1 -fi - -CURRENT_BRANCH="$(git branch --show-current)" -if [[ -z "$BASE_BRANCH" ]]; then - BASE_BRANCH="$CURRENT_BRANCH" -fi - -if [[ -z "$NEW_BRANCH" ]]; then - TS="$(date -u +%Y%m%d-%H%M%S)" - NEW_BRANCH="chore/sync-generated-$TS" -fi - -echo "Running sync..." -pnpm -C .agentkit agentkit:sync - -CHANGED_FILES="$(git status --porcelain)" -if [[ -z "$CHANGED_FILES" ]]; then - echo "No sync-generated changes detected." - mkdir -p .agentkit/logs - printf '{"timestamp":"%s","tool":"sync-split-pr","outcome":"no_changes","base":"%s","branch":"%s"}\n' \ - "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$BASE_BRANCH" "$CURRENT_BRANCH" >> .agentkit/logs/tool-usage.jsonl - exit 0 -fi - -FILES_COUNT="$(git status --porcelain | wc -l | tr -d ' ')" -echo "Detected $FILES_COUNT changed file(s) from sync." - -if [[ "$DRY_RUN" -eq 1 ]]; then - echo "Dry run enabled; not creating branch/commit/PR." - git status --short - mkdir -p .agentkit/logs - printf '{"timestamp":"%s","tool":"sync-split-pr","outcome":"dry_run","files":%s,"base":"%s","branch":"%s"}\n' \ - "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$FILES_COUNT" "$BASE_BRANCH" "$CURRENT_BRANCH" >> .agentkit/logs/tool-usage.jsonl - exit 0 -fi - -git checkout -b "$NEW_BRANCH" -git add -A -git commit -m "$COMMIT_MESSAGE" -git push -u origin "$NEW_BRANCH" - -PR_BODY="Automated sync-only PR. - -- Source branch: $CURRENT_BRANCH -- Sync command: pnpm -C .agentkit agentkit:sync -- Changed files: $FILES_COUNT" - -PR_URL="$(gh pr create --base "$BASE_BRANCH" --head "$NEW_BRANCH" --title "$PR_TITLE" --body "$PR_BODY")" -echo "Created PR: $PR_URL" - -mkdir -p .agentkit/logs -printf '{"timestamp":"%s","tool":"sync-split-pr","outcome":"pr_created","files":%s,"base":"%s","source":"%s","syncBranch":"%s","prUrl":"%s"}\n' \ - "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$FILES_COUNT" "$BASE_BRANCH" "$CURRENT_BRANCH" "$NEW_BRANCH" "$PR_URL" >> .agentkit/logs/tool-usage.jsonl diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/update-changelog.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/update-changelog.sh deleted file mode 100644 index e5693e00..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/update-changelog.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/update-changelog.sh -# Inserts an entry into the [Unreleased] section of CHANGELOG.md. -# -# Usage: -# ./scripts/update-changelog.sh <section> "<description>" [pr-number] [history-doc-path] -# -# Arguments: -# section Changelog section: Added | Fixed | Changed | Removed | Security | Deprecated -# description Human-readable description of the change -# pr-number Optional PR number (e.g. 42) -# history-doc-path Optional relative path to the history document -# -# Examples: -# ./scripts/update-changelog.sh Added "New user auth feature" 44 -# ./scripts/update-changelog.sh Fixed "Null reference in login flow" 43 \ -# "docs/history/bug-fixes/0001-2026-03-01-null-reference-bugfix.md" - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -CHANGELOG="$REPO_ROOT/CHANGELOG.md" - -# --------------------------------------------------------------------------- -# Argument validation -# --------------------------------------------------------------------------- - -usage() { - echo "Usage: $0 <section> \"<description>\" [pr-number] [history-doc-path]" - echo " section: Added | Fixed | Changed | Removed | Security | Deprecated" - exit 1 -} - -if [[ $# -lt 2 ]]; then - usage -fi - -SECTION="$1" -DESCRIPTION="$2" -PR_NUMBER="${3:-}" -HISTORY_DOC="${4:-}" - -case "$SECTION" in - Added|Fixed|Changed|Removed|Security|Deprecated) ;; - *) echo "Error: unknown section '$SECTION'. Must be one of: Added, Fixed, Changed, Removed, Security, Deprecated"; exit 1 ;; -esac - -if [[ ! -f "$CHANGELOG" ]]; then - echo "Error: CHANGELOG.md not found at $CHANGELOG" - exit 1 -fi - -# --------------------------------------------------------------------------- -# Build the entry line -# --------------------------------------------------------------------------- - -ENTRY="- $DESCRIPTION" - -if [[ -n "$PR_NUMBER" && -n "$HISTORY_DOC" ]]; then - ENTRY="$ENTRY ([#${PR_NUMBER}](../../pull/${PR_NUMBER}), [history](${HISTORY_DOC}))" -elif [[ -n "$PR_NUMBER" ]]; then - ENTRY="$ENTRY ([#${PR_NUMBER}](../../pull/${PR_NUMBER}))" -elif [[ -n "$HISTORY_DOC" ]]; then - ENTRY="$ENTRY ([history](${HISTORY_DOC}))" -fi - -# --------------------------------------------------------------------------- -# Insert entry into CHANGELOG.md using Node.js for reliable multiline editing -# --------------------------------------------------------------------------- - -node - "$CHANGELOG" "$SECTION" "$ENTRY" << 'NODEEOF' -const [,, changelogPath, section, entry] = process.argv; -const fs = require('fs'); -const content = fs.readFileSync(changelogPath, 'utf8'); -const lines = content.split('\n'); - -// Find the [Unreleased] section -const unreleasedIdx = lines.findIndex(l => /^## \[Unreleased\]/i.test(l)); -if (unreleasedIdx === -1) { - console.error('Error: could not find ## [Unreleased] section in CHANGELOG.md'); - process.exit(1); -} - -// Find or create the target ### section within [Unreleased] -// The [Unreleased] block ends at the next ## line -let blockEnd = lines.findIndex((l, i) => i > unreleasedIdx && /^## /.test(l)); -if (blockEnd === -1) blockEnd = lines.length; - -const sectionHeader = `### ${section}`; -let sectionIdx = lines.findIndex((l, i) => i > unreleasedIdx && i < blockEnd && l.trim() === sectionHeader); - -if (sectionIdx === -1) { - // Section doesn't exist — insert before blockEnd (or before the next ---/## delimiter) - let insertAt = blockEnd; - // Look for a trailing --- separator just before blockEnd - for (let i = blockEnd - 1; i > unreleasedIdx; i--) { - if (lines[i].trim() === '---') { insertAt = i; break; } - if (lines[i].trim() !== '') break; - } - lines.splice(insertAt, 0, '', sectionHeader, entry); -} else { - // Section exists — insert after the header line (and any existing entries) - let insertAt = sectionIdx + 1; - // Find the end of this section's entries (next ### or ## or blank+##/###) - while ( - insertAt < blockEnd && - lines[insertAt].trim() !== '' && - !lines[insertAt].startsWith('###') && - !lines[insertAt].startsWith('##') - ) { - insertAt++; - } - lines.splice(insertAt, 0, entry); -} - -fs.writeFileSync(changelogPath, lines.join('\n'), 'utf8'); -console.log(`Updated CHANGELOG.md — ${section}: ${entry}`); -NODEEOF diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/validate-documentation.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/validate-documentation.sh deleted file mode 100644 index e5a60220..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/validate-documentation.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/validate-documentation.sh -# Validates that history documents meet structural requirements. -# -# Usage: -# ./scripts/validate-documentation.sh [file...] -# -# If no files are given, validates all markdown files under docs/history/. - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" - -ERRORS=0 - -validate_file() { - local file="$1" - local base - base="$(basename "$file")" - - # Skip template and README files - if [[ "$base" == TEMPLATE-* || "$base" == README.md ]]; then - return 0 - fi - - # Validate naming convention: XXXX-YYYY-MM-DD-*-{type}.md - if ! [[ "$base" =~ ^[0-9]{4}-[0-9]{4}-[0-9]{2}-[0-9]{2}-.+-(implementation|bugfix|feature|migration)\.md$ ]]; then - echo "❌ $file" - echo " Invalid filename format. Expected: XXXX-YYYY-MM-DD-[title]-[type].md" - ERRORS=$((ERRORS + 1)) - return 0 - fi - - # Check that required placeholder sections have been filled in - if grep -q '\[YYYY-MM-DD\]' "$file"; then - echo "❌ $file" - echo " Unfilled placeholder: [YYYY-MM-DD]" - ERRORS=$((ERRORS + 1)) - fi - - if grep -q '\[#PR-Number\]' "$file"; then - echo "⚠️ $file" - echo " Missing PR number: [#PR-Number] not replaced" - fi - - # Check that file is non-empty beyond the title line - local line_count - line_count=$(wc -l < "$file") - if [[ "$line_count" -lt 10 ]]; then - echo "❌ $file" - echo " Document too short ($line_count lines). Please fill in the template." - ERRORS=$((ERRORS + 1)) - fi -} - -# Determine files to validate -if [[ $# -gt 0 ]]; then - FILES=("$@") -else - mapfile -t FILES < <(find "$HISTORY_DIR" -name "*.md" -not -name "README.md" -not -name "TEMPLATE-*" 2>/dev/null || true) -fi - -if [[ ${#FILES[@]} -eq 0 ]]; then - echo "ℹ️ No history documents found to validate." - exit 0 -fi - -for f in "${FILES[@]}"; do - validate_file "$f" -done - -if [[ "$ERRORS" -gt 0 ]]; then - echo "" - echo "Found $ERRORS validation error(s)." - exit 1 -else - echo "✅ All history documents are valid." -fi diff --git a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/validate-numbering.sh b/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/validate-numbering.sh deleted file mode 100644 index 00c2a506..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/.scaffold-cache/scripts/validate-numbering.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge -# Regenerate: pnpm -C .agentkit agentkit:sync -# scripts/validate-numbering.sh -# Validates the sequential numbering of history documents against .index.json. -# -# Usage: -# ./scripts/validate-numbering.sh - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" -HISTORY_DIR="$REPO_ROOT/docs/history" -INDEX_FILE="$HISTORY_DIR/.index.json" - -ERRORS=0 - -if [[ ! -f "$INDEX_FILE" ]]; then - echo "ℹ️ No .index.json found at $INDEX_FILE — skipping numbering validation." - exit 0 -fi - -# Check for duplicate sequence numbers per type -for subdir in implementations bug-fixes features migrations; do - case "$subdir" in - implementations) TYPE="implementation" ;; - bug-fixes) TYPE="bugfix" ;; - features) TYPE="feature" ;; - migrations) TYPE="migration" ;; - esac - - DIR="$HISTORY_DIR/$subdir" - if [[ ! -d "$DIR" ]]; then - continue - fi - - declare -A seen_numbers=() - - while IFS= read -r -d '' file; do - base="$(basename "$file")" - # Skip templates and READMEs - if [[ "$base" == TEMPLATE-* || "$base" == README.md ]]; then - continue - fi - # Extract leading 4-digit number - if [[ "$base" =~ ^([0-9]{4})- ]]; then - num="${BASH_REMATCH[1]}" - if [[ -n "${seen_numbers[$num]+x}" ]]; then - echo "❌ Duplicate number $num in $subdir/:" - echo " ${seen_numbers[$num]}" - echo " $base" - ERRORS=$((ERRORS + 1)) - else - seen_numbers[$num]="$base" - fi - fi - done < <(find "$DIR" -maxdepth 1 -name "*.md" -print0 2>/dev/null || true) - - unset seen_numbers -done - -if [[ "$ERRORS" -gt 0 ]]; then - echo "" - echo "Found $ERRORS numbering error(s)." - exit 1 -else - echo "✅ Sequential numbering is valid." -fi diff --git a/.claude/worktrees/tender-margulis/.agentkit/logs/usage-2026-03-16.jsonl b/.claude/worktrees/tender-margulis/.agentkit/logs/usage-2026-03-16.jsonl deleted file mode 100644 index ec570e61..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/logs/usage-2026-03-16.jsonl +++ /dev/null @@ -1,16 +0,0 @@ -{ - "timestamp": "2026-03-16T21:12:21.000Z", - "event": "session_start", - "sessionId": "3b5b142a-2318-46de-8e68-3b2a1156ec61", - "user": "6d0e0d6bc477", - "branch": "claude/tender-margulis", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\tender-margulis" -} -{ - "timestamp": "2026-03-16T23:15:13.000Z", - "event": "session_start", - "sessionId": "3b5b142a-2318-46de-8e68-3b2a1156ec61", - "user": "6d0e0d6bc477", - "branch": "claude/tender-margulis", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\tender-margulis" -} diff --git a/.claude/worktrees/tender-margulis/.agentkit/logs/usage-2026-03-17.jsonl b/.claude/worktrees/tender-margulis/.agentkit/logs/usage-2026-03-17.jsonl deleted file mode 100644 index b090941e..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/logs/usage-2026-03-17.jsonl +++ /dev/null @@ -1,32 +0,0 @@ -{ - "timestamp": "2026-03-17T01:36:58.000Z", - "event": "session_start", - "sessionId": "3b5b142a-2318-46de-8e68-3b2a1156ec61", - "user": "6d0e0d6bc477", - "branch": "claude/tender-margulis", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\tender-margulis" -} -{ - "timestamp": "2026-03-17T02:03:22.000Z", - "event": "session_start", - "sessionId": "3b5b142a-2318-46de-8e68-3b2a1156ec61", - "user": "6d0e0d6bc477", - "branch": "claude/tender-margulis", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\tender-margulis" -} -{ - "timestamp": "2026-03-17T05:00:11.000Z", - "event": "session_start", - "sessionId": "3b5b142a-2318-46de-8e68-3b2a1156ec61", - "user": "6d0e0d6bc477", - "branch": "claude/tender-margulis", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\tender-margulis" -} -{ - "timestamp": "2026-03-17T09:06:27.000Z", - "event": "session_start", - "sessionId": "3b5b142a-2318-46de-8e68-3b2a1156ec61", - "user": "6d0e0d6bc477", - "branch": "claude/tender-margulis", - "cwd": "C:\\Users\\smitj\\repos\\agentkit-forge\\.claude\\worktrees\\tender-margulis" -} diff --git a/.claude/worktrees/tender-margulis/.agentkit/package-lock.json b/.claude/worktrees/tender-margulis/.agentkit/package-lock.json deleted file mode 100644 index 0ecd531d..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/package-lock.json +++ /dev/null @@ -1,2764 +0,0 @@ -{ - "name": "agentkit-forge-runtime", - "version": "3.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "agentkit-forge-runtime", - "version": "3.1.0", - "dependencies": { - "@clack/prompts": "^1.0.1", - "js-yaml": "^4.1.0" - }, - "devDependencies": { - "markdownlint-cli2": "^0.18.1", - "prettier": "^3.5.3", - "vitest": "^4.0.18" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/@clack/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.0.1.tgz", - "integrity": "sha512-WKeyK3NOBwDOzagPR5H08rFk9D/WuN705yEbuZvKqlkmoLM2woKtXb10OO2k1NoSU4SFG947i2/SCYh+2u5e4g==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@clack/prompts": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.0.1.tgz", - "integrity": "sha512-/42G73JkuYdyWZ6m8d/CJtBrGl1Hegyc7Fy78m5Ob+jF85TOUmLR5XLce/U3LxYAw0kJ8CT5aI99RIvPHcGp/Q==", - "license": "MIT", - "dependencies": { - "@clack/core": "1.0.1", - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz", - "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", - "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz", - "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.18", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz", - "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz", - "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz", - "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.18", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.3", - "@esbuild/android-arm": "0.27.3", - "@esbuild/android-arm64": "0.27.3", - "@esbuild/android-x64": "0.27.3", - "@esbuild/darwin-arm64": "0.27.3", - "@esbuild/darwin-x64": "0.27.3", - "@esbuild/freebsd-arm64": "0.27.3", - "@esbuild/freebsd-x64": "0.27.3", - "@esbuild/linux-arm": "0.27.3", - "@esbuild/linux-arm64": "0.27.3", - "@esbuild/linux-ia32": "0.27.3", - "@esbuild/linux-loong64": "0.27.3", - "@esbuild/linux-mips64el": "0.27.3", - "@esbuild/linux-ppc64": "0.27.3", - "@esbuild/linux-riscv64": "0.27.3", - "@esbuild/linux-s390x": "0.27.3", - "@esbuild/linux-x64": "0.27.3", - "@esbuild/netbsd-arm64": "0.27.3", - "@esbuild/netbsd-x64": "0.27.3", - "@esbuild/openbsd-arm64": "0.27.3", - "@esbuild/openbsd-x64": "0.27.3", - "@esbuild/openharmony-arm64": "0.27.3", - "@esbuild/sunos-x64": "0.27.3", - "@esbuild/win32-arm64": "0.27.3", - "@esbuild/win32-ia32": "0.27.3", - "@esbuild/win32-x64": "0.27.3" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/katex": { - "version": "0.16.33", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.33.tgz", - "integrity": "sha512-q3N5u+1sY9Bu7T4nlXoiRBXWfwSefNGoKeOwekV+gw0cAXQlz2Ww6BLcmBxVDeXBMUDQv6fK5bcNaJLxob3ZQA==", - "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdownlint": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz", - "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark": "4.0.2", - "micromark-core-commonmark": "2.0.3", - "micromark-extension-directive": "4.0.0", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.1", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-cli2": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.18.1.tgz", - "integrity": "sha512-/4Osri9QFGCZOCTkfA8qJF+XGjKYERSHkXzxSyS1hd3ZERJGjvsUao2h4wdnvpHp6Tu2Jh/bPHM0FE9JJza6ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "globby": "14.1.0", - "js-yaml": "4.1.0", - "jsonc-parser": "3.3.1", - "markdown-it": "14.1.0", - "markdownlint": "0.38.0", - "markdownlint-cli2-formatter-default": "0.0.5", - "micromatch": "4.0.8" - }, - "bin": { - "markdownlint-cli2": "markdownlint-cli2-bin.mjs" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-cli2-formatter-default": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.5.tgz", - "integrity": "sha512-4XKTwQ5m1+Txo2kuQ3Jgpo/KmnG+X90dWt4acufg6HVGadTUG5hzHF/wssp9b5MBYOMCnZ9RMPaU//uHsszF8Q==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - }, - "peerDependencies": { - "markdownlint-cli2": ">=0.0.4" - } - }, - "node_modules/markdownlint-cli2/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/sxzz", - "https://opencollective.com/debug" - ], - "license": "MIT" - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "license": "MIT" - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz", - "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.18", - "@vitest/mocker": "4.0.18", - "@vitest/pretty-format": "4.0.18", - "@vitest/runner": "4.0.18", - "@vitest/snapshot": "4.0.18", - "@vitest/spy": "4.0.18", - "@vitest/utils": "4.0.18", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.18", - "@vitest/browser-preview": "4.0.18", - "@vitest/browser-webdriverio": "4.0.18", - "@vitest/ui": "4.0.18", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - } - } -} diff --git a/.claude/worktrees/tender-margulis/.agentkit/state/orchestrator.json.template b/.claude/worktrees/tender-margulis/.agentkit/state/orchestrator.json.template deleted file mode 100644 index 076c20ed..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/state/orchestrator.json.template +++ /dev/null @@ -1,25 +0,0 @@ -{ - "schema_version": "1.0.0", - "repo_id": "agentkit-forge", - "branch": "main", - "session_id": "", - "current_phase": 1, - "phase_name": "Discovery", - "last_phase_completed": 0, - "next_action": "Run /orchestrate to begin project assessment", - "team_progress": { - "team-backend": { "status": "idle", "notes": "" }, - "team-frontend": { "status": "idle", "notes": "" }, - "team-data": { "status": "idle", "notes": "" }, - "team-infra": { "status": "idle", "notes": "" }, - "team-devops": { "status": "idle", "notes": "" }, - "team-testing": { "status": "idle", "notes": "" }, - "team-security": { "status": "idle", "notes": "" }, - "team-docs": { "status": "idle", "notes": "" }, - "team-product": { "status": "idle", "notes": "" }, - "team-quality": { "status": "idle", "notes": "" } - }, - "todo_items": [], - "recent_results": [], - "completed": false -} diff --git a/.claude/worktrees/tender-margulis/.agentkit/state/schema.json b/.claude/worktrees/tender-margulis/.agentkit/state/schema.json deleted file mode 100644 index 7bfdc405..00000000 --- a/.claude/worktrees/tender-margulis/.agentkit/state/schema.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "AgentKit Forge Orchestrator State", - "description": "Schema for the orchestrator state file managed by /orchestrate", - "type": "object", - "required": ["schema_version", "repo_id", "current_phase", "phase_name", "team_progress"], - "properties": { - "schema_version": { - "type": "string", - "const": "1.0.0", - "description": "Schema version for forward compatibility" - }, - "repo_id": { - "type": "string", - "description": "Repository identifier (from .agentkit-repo)" - }, - "branch": { - "type": "string", - "description": "Current git branch" - }, - "session_id": { - "type": "string", - "description": "Current session identifier" - }, - "current_phase": { - "type": "integer", - "minimum": 1, - "maximum": 5, - "description": "Current lifecycle phase (1-5)" - }, - "phase_name": { - "type": "string", - "enum": ["Discovery", "Planning", "Implementation", "Validation", "Ship"], - "description": "Human-readable phase name" - }, - "last_phase_completed": { - "type": "integer", - "minimum": 0, - "maximum": 5, - "description": "Last fully completed phase (0 = none)" - }, - "next_action": { - "type": "string", - "description": "Recommended next action" - }, - "team_progress": { - "type": "object", - "description": "Per-team status tracking", - "patternProperties": { - "^team-": { - "type": "object", - "required": ["status"], - "properties": { - "status": { - "type": "string", - "enum": ["idle", "in_progress", "blocked", "done"] - }, - "notes": { - "type": "string" - }, - "last_updated": { - "type": "string", - "format": "date-time" - }, - "assigned_to": { - "type": "string" - } - } - } - } - }, - "todo_items": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "title", "status"], - "properties": { - "id": { "type": "string" }, - "title": { "type": "string" }, - "status": { - "type": "string", - "enum": ["pending", "in_progress", "done", "blocked"] - }, - "team": { "type": "string" }, - "priority": { - "type": "string", - "enum": ["critical", "high", "medium", "low"] - } - } - } - }, - "recent_results": { - "type": "array", - "items": { - "type": "object", - "properties": { - "timestamp": { "type": "string", "format": "date-time" }, - "action": { "type": "string" }, - "result": { "type": "string" }, - "team": { "type": "string" } - } - } - }, - "completed": { - "type": "boolean", - "description": "Whether all phases are complete" - }, - "last_healthcheck": { - "type": "string", - "format": "date-time", - "description": "Timestamp of last healthcheck run" - }, - "health_status": { - "type": "string", - "enum": ["HEALTHY", "UNHEALTHY"], - "description": "Overall health status from last healthcheck" - }, - "session_metrics": { - "type": "object", - "description": "Cost tracking session metrics", - "properties": { - "current_session_id": { - "type": "string", - "description": "Active session ID for cost tracking" - }, - "total_sessions": { - "type": "integer", - "description": "Total sessions recorded" - }, - "last_session_end": { - "type": "string", - "format": "date-time", - "description": "When the last session ended" - } - } - } - } -} diff --git a/.claude/worktrees/tender-margulis/.claude/settings.local.json b/.claude/worktrees/tender-margulis/.claude/settings.local.json deleted file mode 100644 index b36185b5..00000000 --- a/.claude/worktrees/tender-margulis/.claude/settings.local.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(git ls-remote https://github.com/actions/checkout.git refs/tags/v4.2.2)", - "Bash(git ls-remote https://github.com/anthropics/claude-code-action.git refs/tags/v1)", - "Bash(git ls-remote https://github.com/actions/github-script.git refs/tags/v7)", - "Bash(pnpm -C .agentkit test)", - "Bash(pnpm -C .agentkit vitest run src/__tests__/prettier.test.mjs src/__tests__/expansion-analyzer.test.mjs src/__tests__/budget-guard.test.mjs src/__tests__/feature-manager.test.mjs src/__tests__/backlog-store.test.mjs src/__tests__/discover.test.mjs)", - "Bash(pnpm -C .agentkit agentkit:sync)", - "Bash(grep -rn 'uses:' .agentkit/templates/github/workflows/*.yml)", - "Bash(grep -rn 'uses:.*@[a-f0-9]\\\\{40\\\\}' .agentkit/templates/github/workflows/*.yml)", - "Bash(grep -rn 'uses:.*@v[0-9]' .agentkit/templates/github/workflows/*.yml)", - "Bash(git ls-remote https://github.com/pnpm/action-setup.git refs/tags/v4.2.0)", - "Bash(git ls-remote https://github.com/actions/setup-node.git refs/tags/v4.4.0)", - "Bash(git ls-remote https://github.com/actions/setup-python.git refs/tags/v5.6.0)", - "Bash(git ls-remote https://github.com/pnpm/action-setup.git refs/tags/v4)", - "Bash(git checkout -- AGENT_TEAMS.md .clinerules/git-workflow.md)", - "Bash(for branch in dev chore/merge-all-open-branches ci/enforce-sha-pinning-and-templates claude/fix-full-tier-black-elements-gkgln docs/consolidate-pending-items docs/restructure-agentkit-docs fix/review-findings-round1 fix/template-numbered-paths refactor/remove-team-prefix)", - "Bash(do echo \"=== $branch ===\")", - "Bash(git checkout -- .)", - "Bash(git pull)", - "Bash(git cherry-pick 097e0cc --no-edit)", - "Bash(git remote prune origin)", - "Bash(pnpm -C /c/Users/smitj/repos/retort/.agentkit test)", - "Bash(gh repo list JustAGhosT --limit 50)", - "Bash(gh label create \"priority:P3\" --repo phoenixvc/cognitive-mesh --color \"0E8A16\" --description \"Priority 3 - Nice to have\")", - "Bash(git add -A)", - "Bash(gh label list --repo phoenixvc/cognitive-mesh --json name,description,color --limit 100)", - "Bash(gh label list --repo JustAGhosT/retort --json name,description,color --limit 100)", - "mcp__filesystem__read_multiple_files", - "Bash(grep -E \"\\\\.\\(yml|yaml|json|ts|js\\)$\")", - "Bash(gh label:*)", - "Bash(git add:*)", - "Bash(gh api:*)" - ] - } -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/events.log b/.claude/worktrees/tender-margulis/.claude/state/events.log deleted file mode 100644 index 30a818dd..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/events.log +++ /dev/null @@ -1,104 +0,0 @@ -{"timestamp":"2026-02-26T17:31:21.524Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":92388},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1253},{"step":"build","status":"FAIL","durationMs":2299}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T17:32:22.387Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":57877},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1756}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T17:40:11.462Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":300556},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":12726},{"step":"build","status":"FAIL","durationMs":4619}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T17:44:14.114Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":236951},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":2693}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T17:57:01.313Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":54449},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1488},{"step":"build","status":"FAIL","durationMs":1535}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T17:57:39.437Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":35135},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1489}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T18:00:44.882Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":18855},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":599},{"step":"build","status":"FAIL","durationMs":755}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T18:00:57.395Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":11525},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":587}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T22:50:22.150Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":43407},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1370},{"step":"build","status":"FAIL","durationMs":1982}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T22:50:57.402Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":34361},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":485}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T22:59:44.909Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":72662},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1055},{"step":"build","status":"FAIL","durationMs":1767}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T23:00:12.840Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":26869},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":598}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T23:27:21.525Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":54059},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1538},{"step":"build","status":"FAIL","durationMs":2558}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T23:27:55.191Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":31691},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1126}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-26T23:47:11.830Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":54257},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":2146},{"step":"build","status":"FAIL","durationMs":3389}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-26T23:47:43.881Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":30944},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":619}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-02-28T15:41:34.550Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":118},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":15063},{"step":"build","status":"FAIL","durationMs":4029}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-02-28T15:41:38.884Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":29},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3080}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-01T04:51:06.914Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":43},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-01T04:51:08.526Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":19},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-01T04:54:06.715Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":53},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":28}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-01T04:54:08.867Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":75},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-01T05:10:28.549Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":106},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":22},{"step":"build","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-01T05:10:30.610Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":19},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T14:57:27.967Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":158},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T14:57:29.567Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":22},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T15:01:59.380Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":30},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T15:02:00.404Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":20},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:05:27.157Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":20},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":1913},{"step":"build","status":"FAIL","durationMs":3071}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:05:57.398Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":22},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:05:59.276Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":16},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:14:48.130Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":26},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8},{"step":"build","status":"FAIL","durationMs":153}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:14:55.776Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":438},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":35}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:16:15.728Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":46},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":101184},{"step":"build","status":"FAIL","durationMs":9256}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:19:12.380Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":29},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":7},{"step":"build","status":"FAIL","durationMs":11}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:19:14.119Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":21},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:25:42.885Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":27},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8},{"step":"build","status":"FAIL","durationMs":160}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:25:46.626Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":181},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":26}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:27:05.654Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":18},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"PASS","durationMs":95529},{"step":"build","status":"PASS","durationMs":7674}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:32:51.735Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":252},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":75},{"step":"build","status":"FAIL","durationMs":42}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:32:55.553Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":192},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":22}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:34:25.998Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":23},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":120925},{"step":"build","status":"PASS","durationMs":7972}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:36:16.808Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":109},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":10},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:36:19.087Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":51},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:39:23.323Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":269},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":37},{"step":"build","status":"FAIL","durationMs":46}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:39:26.597Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":142},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":27}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:41:21.411Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":262},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":138},{"step":"build","status":"FAIL","durationMs":74}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:41:25.946Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":179},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":68}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T17:42:47.046Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":16},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":92882},{"step":"build","status":"PASS","durationMs":10552}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:43:49.613Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":250},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":81},{"step":"build","status":"FAIL","durationMs":105}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T17:43:53.957Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":444},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":19}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T18:57:58.751Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":64},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":7},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T18:58:00.655Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":40},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T18:58:46.509Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":24},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":60941},{"step":"build","status":"PASS","durationMs":3076}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:00:40.415Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":83},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":97},{"step":"build","status":"FAIL","durationMs":171}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:00:50.568Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":562},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":58}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T19:15:27.769Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":48},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:15:29.811Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":19},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T19:18:40.784Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":56},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:18:42.732Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":21},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T19:36:57.250Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":25},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T19:36:58.289Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":17},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:14:44.559Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":45},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":11}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:14:46.176Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":40},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:20:45.419Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":72},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4},{"step":"build","status":"FAIL","durationMs":8}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:20:46.671Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":17},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:21:33.859Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":21},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:21:35.551Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":24},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:22:37.730Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":36},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":7}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:22:39.534Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":16},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:23:58.276Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":56},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":9}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:23:59.332Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":17},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-03T20:27:17.403Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":231},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":17},{"step":"build","status":"FAIL","durationMs":15}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-03T20:27:19.502Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":75},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":14}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T10:20:44.292Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":15},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T11:40:03.234Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":12},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T11:40:14.944Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":24},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6},{"step":"build","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T11:40:16.696Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":20},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":6}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T13:37:02.860Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":37},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5},{"step":"build","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T13:37:04.586Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":18},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":5}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T14:57:52.992Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"PASS","durationMs":12865},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4}]}],"flags":{"fix":false,"fast":true,"stack":null}} -{"timestamp":"2026-03-04T16:26:18.432Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"PASS","durationMs":8533},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T18:50:47.548Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":10054},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":4},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -{"timestamp":"2026-03-04T18:53:17.017Z","action":"check_completed","overallStatus":"FAIL","stacks":[{"stack":"node","steps":[{"step":"format","status":"FAIL","durationMs":9339},{"step":"lint","status":"SKIP","durationMs":0},{"step":"typecheck","status":"SKIP","durationMs":0},{"step":"test","status":"FAIL","durationMs":3},{"step":"build","status":"FAIL","durationMs":3}]}],"flags":{"fix":false,"fast":false,"stack":null}} -[2026-03-11T03:17:17.000Z] [HANDOFF] [ORCHESTRATOR] Session complete. Done: 6 items. Blockers: 0. Next: "Start Phase 1 cost-provider-schema on feat/cost-provider-schema branch". -[2026-03-11T17:00:03Z] [ORCHESTRATE] [W1] Phase 5 Ship. Tests: 110/110. Sync: clean. Branch: fix/ci-remediation. Commits ahead: 51. Ready for PR to main. -[2026-03-15T07:06:00Z] [ORCHESTRATE] [W1] Phase 5 Ship. Branch: feat/source-code-conventions. Build: pass. agentkit:check fails (Duplicate export auditUnresolvedPlaceholders). orchestrator.test.mjs: 22 failed. Health: at_risk. Next: fix test/check then PR. -[2026-03-15T07:13:00Z] [ORCHESTRATE] [W1] Phase 5 Ship. Branch: feat/source-code-conventions. Build: pass. No lock. Validation: build re-run PASS. Tests running in background. Health: at_risk (check CLI + orchestrator tests). Next: fix then PR to main. -[2026-03-15T07:16:00Z] [ORCHESTRATE] [W1] Fixed check.mjs duplicate export (auditUnresolvedPlaceholders). agentkit:check runs; format PASS. NB added to CLAUDE.md: this repo may modify .agentkit files. Next: orchestrator.test.mjs fixes then PR. -[2026-03-15T09:25:00Z] [ORCHESTRATE] [W1] Phase 5 Ship. Fixed orchestrator.test.mjs: unique temp dir per test (TEST_BASE/run-id), removed afterEach rmSync. 39/39 orchestrator tests pass. Health: healthy. Next: Create PR to main. -[2026-03-15T11:30:00Z] [ORCHESTRATE] [W1] Phase 2 Planning. Scope: all P0 and P1. Discovery: AGENT_TEAMS.md present; CI workflows present (ci.yml, branch-protection, etc.). Healthcheck: UNHEALTHY (typecheck/test/build fail in agentkit:check). Created 7 task files in .claude/state/tasks/ for P0 (2) and P1 (5). Next: teams implement then Phase 4 Validation. -[2026-03-15T12:05:00Z] [ORCHESTRATE] [W1] Assess-only run. Branch: fix/generated-files-and-conflict-markers. Phase 2. Tasks: 7 submitted, 0 in progress, 0 completed. Health: UNHEALTHY. Check: format PASS; typecheck/test/build FAIL. Next: run /team-infra, /team-quality, /team-backend, /team-data to implement tasks; then re-run /orchestrate for Validation. -[2026-03-15T12:15:00Z] [TEAM] [backend] Completed 2 items. Changes: 1 file (docs/api/07_framework-api-conventions.md). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T12:25:00Z] [TEAM] [infra] Rejected task-p0-ci-pipeline (out of scope; suggested team-devops). Completed 1 item (task-p1-staging-env). Changes: infra/README.md, docker-compose.yml. Tests: 0 added, 0 modified. Gate: N/A. -[2026-03-15T12:35:00Z] [TEAM] [data] Completed 2 items. Changes: db/README.md, migrations/README.md. Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T12:45:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (PRD index). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:00:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (P1 backlog section). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:10:00Z] [ORCHESTRATE] [W1] Assess. Branch: fix/generated-files-and-conflict-markers. Phase 2. Tasks: 5 completed, 1 rejected (P0 CI → devops), 1 submitted (P0 test-framework). Health: UNHEALTHY (format/typecheck/test/build FAIL). Next: /team-quality for task-p0-test-framework; reassign P0 CI to DevOps; then Phase 4 Validation. -[2026-03-15T13:15:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (link to PLAN-gh371). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:20:00Z] [ORCHESTRATE] [W1] Assess-only. Branch: fix/generated-files-and-conflict-markers. Phase 2. Tasks: 5 completed, 1 rejected, 1 submitted (task-p0-test-framework). Health: UNHEALTHY. Next: /team-quality; reassign P0 CI to DevOps; Phase 4 Validation. -[2026-03-15T13:25:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (GH#328 plan note, link to implementation plans). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:30:00Z] [TEAM] [product] Completed 1 item. Changes: docs/product/prd/README.md (next PRD number 008 in Creating a New PRD). Tests: 0 added, 0 modified. Gate: N/A (docs only). -[2026-03-15T13:35:00Z] [TEAM] [product] No delegated tasks; no additional backlog items completed (P1/P2 require plans or implementation). Scope: docs/product/**, docs/prd/**. -[2026-03-15T13:40:00Z] [TEAM] [docs] Completed 1 item. Changes: CONTRIBUTING.md (link to docs hub in Discovery phase). Tests: 0 added, 0 modified. Gate: N/A (docs only). diff --git a/.claude/worktrees/tender-margulis/.claude/state/orchestrator.json b/.claude/worktrees/tender-margulis/.claude/state/orchestrator.json deleted file mode 100644 index ad4dd611..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/orchestrator.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "schema_version": "1.0.0", - "repo_id": "JustAGhosT/retort", - "branch": "fix/generated-files-and-conflict-markers", - "session_id": "2026-03-15", - "current_phase": 2, - "phase_name": "Planning", - "last_phase_completed": 1, - "next_action": "Complete task-p0-test-framework (team-quality). Reassign P0 CI to DevOps. Then run Phase 4 Validation.", - "lastHealthcheck": "2026-03-15T13:10:00Z", - "healthStatus": "unhealthy", - "healthDetails": { - "dependencies": "pass", - "format": "FAIL", - "lint": "SKIP (eslint not found)", - "typecheck": "FAIL", - "tests": "FAIL", - "build": "FAIL", - "syncDrift": "not run" - }, - "taskSummary": { - "total": 7, - "completed": 5, - "rejected": 1, - "submitted": 1 - }, - "backlogSnapshot": [ - {"priority": "P0", "team": "T4-Infrastructure", "task": "Configure CI pipeline for main branch"}, - {"priority": "P0", "team": "T10-Quality", "task": "Set up test framework and coverage thresholds"}, - {"priority": "P1", "team": "T1-Backend", "task": "Define core API route structure"}, - {"priority": "P1", "team": "T3-Data", "task": "Design initial database schema"}, - {"priority": "P1", "team": "T1-Backend", "task": "Implement health check endpoint"}, - {"priority": "P1", "team": "T3-Data", "task": "Create migration tooling setup"}, - {"priority": "P1", "team": "T4-Infrastructure", "task": "Set up staging environment"} - ], - "team_progress": { - "backend": { "status": "idle", "notes": "Completed task-p1-api-routes, task-p1-health-check (docs/api/07_framework-api-conventions.md)." }, - "frontend": { "status": "idle", "notes": "start TUI component merged and tested" }, - "data": { "status": "idle", "notes": "Completed task-p1-db-schema, task-p1-migration-tooling (db/README.md, migrations/README.md; repo has no DB, adopters own schema and migrations)." }, - "infra": { "status": "idle", "notes": "Rejected P0 CI (DevOps scope). Completed P1 staging: infra/README.md, docker-compose.yml." }, - "devops": { "status": "idle", "notes": "Configurable package manager implemented" }, - "testing": { "status": "complete", "notes": "110 tests green, ConversationFlow flakiness fixed" }, - "security": { "status": "idle", "notes": "" }, - "docs": { "status": "idle", "notes": "CONTRIBUTING.md: link to docs hub (docs/README.md) in Discovery phase." }, - "product": { "status": "idle", "notes": "PRD index, P1 backlog, PLAN-gh371 link, docs/planning link, next PRD number (008) in Creating a New PRD." }, - "quality": { "status": "complete", "notes": "Review findings addressed, sync drift clean" } - }, - "todo_items": [], - "recent_results": [ - { - "date": "2026-03-11", - "action": "Fixed ConversationFlow test flakiness (ink-select-input event loop yields)", - "status": "done" - }, - { - "date": "2026-03-11", - "action": "Added pnpm-workspace.yaml packages field", - "status": "done" - }, - { - "date": "2026-03-11", - "action": "Regenerated lockfile after version pinning", - "status": "done" - }, - { - "date": "2026-03-11", - "action": "Verified sync drift clean (533 files, 0 changes)", - "status": "done" - } - ], - "completed": false -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/orchestrator.json.template b/.claude/worktrees/tender-margulis/.claude/state/orchestrator.json.template deleted file mode 100644 index 076c20ed..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/orchestrator.json.template +++ /dev/null @@ -1,25 +0,0 @@ -{ - "schema_version": "1.0.0", - "repo_id": "agentkit-forge", - "branch": "main", - "session_id": "", - "current_phase": 1, - "phase_name": "Discovery", - "last_phase_completed": 0, - "next_action": "Run /orchestrate to begin project assessment", - "team_progress": { - "team-backend": { "status": "idle", "notes": "" }, - "team-frontend": { "status": "idle", "notes": "" }, - "team-data": { "status": "idle", "notes": "" }, - "team-infra": { "status": "idle", "notes": "" }, - "team-devops": { "status": "idle", "notes": "" }, - "team-testing": { "status": "idle", "notes": "" }, - "team-security": { "status": "idle", "notes": "" }, - "team-docs": { "status": "idle", "notes": "" }, - "team-product": { "status": "idle", "notes": "" }, - "team-quality": { "status": "idle", "notes": "" } - }, - "todo_items": [], - "recent_results": [], - "completed": false -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/schema.json b/.claude/worktrees/tender-margulis/.claude/state/schema.json deleted file mode 100644 index 5206822c..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/schema.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Retort Orchestrator State", - "description": "Schema for the orchestrator state file managed by /orchestrate", - "type": "object", - "required": ["schema_version", "repo_id", "current_phase", "phase_name", "team_progress"], - "properties": { - "schema_version": { - "type": "string", - "const": "1.0.0", - "description": "Schema version for forward compatibility" - }, - "repo_id": { - "type": "string", - "description": "Repository identifier (from .agentkit-repo)" - }, - "branch": { - "type": "string", - "description": "Current git branch" - }, - "session_id": { - "type": "string", - "description": "Current session identifier" - }, - "current_phase": { - "type": "integer", - "minimum": 1, - "maximum": 5, - "description": "Current lifecycle phase (1-5)" - }, - "phase_name": { - "type": "string", - "enum": ["Discovery", "Planning", "Implementation", "Validation", "Ship"], - "description": "Human-readable phase name" - }, - "last_phase_completed": { - "type": "integer", - "minimum": 0, - "maximum": 5, - "description": "Last fully completed phase (0 = none)" - }, - "next_action": { - "type": "string", - "description": "Recommended next action" - }, - "team_progress": { - "type": "object", - "description": "Per-team status tracking", - "patternProperties": { - "^team-": { - "type": "object", - "required": ["status"], - "properties": { - "status": { - "type": "string", - "enum": ["idle", "in_progress", "blocked", "done"] - }, - "notes": { - "type": "string" - }, - "last_updated": { - "type": "string", - "format": "date-time" - }, - "assigned_to": { - "type": "string" - } - } - } - } - }, - "todo_items": { - "type": "array", - "items": { - "type": "object", - "required": ["id", "title", "status"], - "properties": { - "id": { "type": "string" }, - "title": { "type": "string" }, - "status": { - "type": "string", - "enum": ["pending", "in_progress", "done", "blocked"] - }, - "team": { "type": "string" }, - "priority": { - "type": "string", - "enum": ["critical", "high", "medium", "low"] - } - } - } - }, - "recent_results": { - "type": "array", - "items": { - "type": "object", - "properties": { - "timestamp": { "type": "string", "format": "date-time" }, - "action": { "type": "string" }, - "result": { "type": "string" }, - "team": { "type": "string" } - } - } - }, - "completed": { - "type": "boolean", - "description": "Whether all phases are complete" - }, - "last_healthcheck": { - "type": "string", - "format": "date-time", - "description": "Timestamp of last healthcheck run" - }, - "health_status": { - "type": "string", - "enum": ["HEALTHY", "UNHEALTHY"], - "description": "Overall health status from last healthcheck" - }, - "session_metrics": { - "type": "object", - "description": "Cost tracking session metrics", - "properties": { - "current_session_id": { - "type": "string", - "description": "Active session ID for cost tracking" - }, - "total_sessions": { - "type": "integer", - "description": "Total sessions recorded" - }, - "last_session_end": { - "type": "string", - "format": "date-time", - "description": "When the last session ended" - } - } - } - } -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p0-ci-pipeline.json b/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p0-ci-pipeline.json deleted file mode 100644 index e656cf8b..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p0-ci-pipeline.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "task-p0-ci-pipeline", - "type": "implement", - "status": "rejected", - "priority": "P0", - "delegator": "orchestrator", - "assignees": ["team-infra"], - "title": "Configure CI pipeline for main branch", - "description": "GitHub Actions workflow; scope: branch-protection, drift check, quality gates on main. Ensure required status checks align with ci.yml, branch-protection.yml, and drift/sync validation.", - "acceptanceCriteria": [ - "Workflow runs on push/PR to main (and dev per existing)", - "Drift check (sync then git diff) runs and is required for main", - "Quality gates (test, validate) are required; branch protection documented or enforced" - ], - "scope": [".github/workflows/**", "docs/operations/**"], - "backlogItemId": "P0-T4-CI-pipeline", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P0: Configure CI pipeline for main. See AGENT_BACKLOG.md Active Sprint." }, - { "role": "executor", "from": "infra", "timestamp": "2026-03-15T12:25:00Z", "content": "Rejected: task scope is .github/workflows/** and docs/operations/**, which is DevOps (CI/CD, pipelines), not Infra (IaC, terraform, bicep, pulumi). Suggested team: team-devops." } - ], - "artifacts": [] -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p0-test-framework.json b/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p0-test-framework.json deleted file mode 100644 index e69de29b..00000000 diff --git a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-api-routes.json b/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-api-routes.json deleted file mode 100644 index b76ef61f..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-api-routes.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-api-routes", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-backend"], - "title": "Define core API route structure", - "description": "REST endpoints for v1. Define route layout and conventions for the project (or document that this repo is framework-only and adopters define routes).", - "acceptanceCriteria": [ - "API route structure documented or implemented per project conventions", - "REST v1 layout clear for downstream adopters or for this repo if applicable" - ], - "scope": ["apps/api/**", "services/**", "docs/api/**"], - "backlogItemId": "P1-T1-api-routes", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Define core API route structure. See AGENT_BACKLOG.md." }, - { "role": "executor", "from": "backend", "timestamp": "2026-03-15T12:15:00Z", "content": "Completed. Repo is framework-only (no apps/api or services). Added docs/api/07_framework-api-conventions.md documenting recommended route structure (base /api, url-segment versioning, envelope, cursor pagination) for adopters." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["docs/api/07_framework-api-conventions.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-db-schema.json b/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-db-schema.json deleted file mode 100644 index b52354a2..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-db-schema.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "id": "task-p1-db-schema", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-data"], - "title": "Design initial database schema", - "description": "Depends on T1 API design. Design initial schema for the project (or document that this repo has no DB and adopters own schema).", - "acceptanceCriteria": [ - "Schema design or decision documented", - "Dependencies on API design acknowledged" - ], - "scope": ["db/**", "migrations/**", "prisma/**", "docs/architecture/**"], - "dependsOn": ["task-p1-api-routes"], - "backlogItemId": "P1-T3-db-schema", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Design initial database schema. Depends on T1." }, - { "role": "executor", "from": "data", "timestamp": "2026-03-15T12:35:00Z", "content": "Completed. Repo has no database (CLAUDE.md: Database none, ORM none). Added db/README.md documenting that adopters own schema and referencing API conventions; dependency on API design acknowledged." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["db/README.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-health-check.json b/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-health-check.json deleted file mode 100644 index 10b652ef..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-health-check.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-health-check", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-backend"], - "title": "Implement health check endpoint", - "description": "Implement /api/health (or equivalent) for the application.", - "acceptanceCriteria": [ - "Health check endpoint implemented and documented", - "Returns appropriate status for load balancers or readiness probes" - ], - "scope": ["apps/api/**", "services/**", "docs/api/**"], - "backlogItemId": "P1-T1-health-check", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Implement health check endpoint. See Backlog." }, - { "role": "executor", "from": "backend", "timestamp": "2026-03-15T12:15:00Z", "content": "Completed. No application server in this repo (framework-only). Documented health check convention in docs/api/07_framework-api-conventions.md: GET /api/health or GET /health, 200 + { status: ok } for adopters." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["docs/api/07_framework-api-conventions.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-migration-tooling.json b/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-migration-tooling.json deleted file mode 100644 index 4e72185f..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-migration-tooling.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-migration-tooling", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-data"], - "title": "Create migration tooling setup", - "description": "Prisma or Drizzle (or document choice). Set up migration tooling for the project.", - "acceptanceCriteria": [ - "Migration tooling chosen and documented or implemented", - "Basic migration workflow documented" - ], - "scope": ["db/**", "migrations/**", "prisma/**", "package.json"], - "backlogItemId": "P1-T3-migration-tooling", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Create migration tooling setup. See Backlog." }, - { "role": "executor", "from": "data", "timestamp": "2026-03-15T12:35:00Z", "content": "Completed. Repo has no DB. Added migrations/README.md documenting that adopters choose Prisma or Drizzle and documenting basic migration workflow (define schema, generate migration, run migrations)." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["migrations/README.md"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-staging-env.json b/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-staging-env.json deleted file mode 100644 index 19f40686..00000000 --- a/.claude/worktrees/tender-margulis/.claude/state/tasks/task-p1-staging-env.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "task-p1-staging-env", - "type": "implement", - "status": "completed", - "priority": "P1", - "delegator": "orchestrator", - "assignees": ["team-infra"], - "title": "Set up staging environment", - "description": "Docker Compose (or equivalent) for staging. Set up staging environment for the project.", - "acceptanceCriteria": [ - "Staging environment defined (e.g. docker-compose or IaC)", - "Documented how to run and deploy to staging" - ], - "scope": ["infra/**", "docker/**", "docker-compose*.yml", "docs/operations/**"], - "backlogItemId": "P1-T4-staging", - "messages": [ - { "role": "delegator", "from": "orchestrator", "timestamp": "2026-03-15T12:00:00Z", "content": "P1: Set up staging environment. See Backlog." }, - { "role": "executor", "from": "infra", "timestamp": "2026-03-15T12:25:00Z", "content": "Completed. Added infra/README.md (staging and local validation; adopters define their own staging). Added docker-compose.yml at repo root with profile 'sync' to run pnpm install + agentkit:sync in a container for staging-like validation." } - ], - "artifacts": [ - { "type": "files-changed", "paths": ["infra/README.md", "docker-compose.yml"] }, - { "type": "test-results", "passed": 0, "failed": 0, "testsAdded": 0, "testsModified": 0 } - ] -} diff --git a/.claude/worktrees/tender-margulis/package-lock.json b/.claude/worktrees/tender-margulis/package-lock.json deleted file mode 100644 index 24372cf6..00000000 --- a/.claude/worktrees/tender-margulis/package-lock.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "retort-root", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "retort-root", - "dependencies": { - "js-yaml": "^4.1.1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - } - } -} diff --git a/.cursor/commands/cicd-optimize.md b/.cursor/commands/cicd-optimize.md new file mode 100644 index 00000000..3a607429 --- /dev/null +++ b/.cursor/commands/cicd-optimize.md @@ -0,0 +1,99 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-20 --> +<!-- Format: Plain Markdown. Cursor command template. --> +<!-- Docs: https://docs.cursor.com/context/rules --> + +# cicd-optimize + +CI/CD pipeline and local hook optimizer. Audits GitHub Actions workflows, pre-commit/stop hooks, and test configurations for speed bottlenecks. Identifies caching gaps, sequential jobs that could parallelize, missing path filters, redundant installs, and slow hook steps. Produces a prioritized list of improvements with estimated time savings per fix. + +## Role + +You are the **CI/CD Optimization Agent**. Analyse this project's CI/CD pipelines and local hooks for speed bottlenecks. Produce a prioritized report with concrete, copy-paste-ready fixes. + +## Step 1 — Inventory + +Collect all CI/CD surface area: + +- `.github/workflows/*.yml` — list each workflow, its triggers, jobs, and steps +- `.claude/hooks/` — list each hook file and its purpose +- `package.json` scripts: `lint`, `test`, `build`, `typecheck` +- Test framework config: `vitest.config.*`, `jest.config.*`, `pytest.ini`, `Cargo.toml [profile.test]` +- Lock files: `pnpm-lock.yaml`, `Cargo.lock`, `poetry.lock` + +## Step 2 — Bottleneck Detection + +For each workflow, check: + +### Caching + +- [ ] Node modules cached? (`actions/cache` with `node_modules` or `pnpm store`) +- [ ] Cargo registry cached? (`~/.cargo/registry` and `target/`) +- [ ] pip/poetry cached? (`~/.cache/pip`) +- [ ] Docker layer cache used? (`cache-from: type=gha`) + +### Parallelization + +- [ ] Jobs that depend on each other but don't need to — should they be parallel? +- [ ] Test suites that could use matrix strategy or `--pool` (vitest), `pytest-xdist`, `cargo nextest` +- [ ] Lint and typecheck run sequentially when they're independent + +### Trigger efficiency + +- [ ] Workflows triggered on `push` to all branches — should use `paths:` filters +- [ ] PR workflows trigger on `push` AND `pull_request` — often redundant +- [ ] Scheduled workflows running more frequently than needed + +### Install efficiency + +- [ ] `npm install` / `pnpm install` without `--frozen-lockfile` (slower) +- [ ] Install steps duplicated across jobs (should use artifacts or caching) +- [ ] `node_modules` copied between jobs instead of restored from cache + +### Hook efficiency + +- [ ] Stop hook runs tests or full builds (should be lint-only with file-change gating) +- [ ] Pre-commit hook runs expensive operations without caching +- [ ] Hooks run regardless of which files changed + +## Step 3 — Test Suite Speed + +Check for parallelization opportunities: + +- vitest: `--pool=threads` or `--pool=forks`, `--reporter=verbose` adding noise +- pytest: `pytest-xdist` (`-n auto`), test isolation issues +- cargo: `cargo nextest` (2-3x faster than `cargo test`) +- jest: `--maxWorkers` configuration + +## Step 4 — Report + +Produce a table sorted by estimated time savings (highest first): + +| # | Area | Issue | Fix | Est. saving | +| --- | ---- | ----- | --- | ----------- | +| 1 | ... | ... | ... | ~Xs per run | + +Then provide **Ready-to-apply fixes** — code blocks for each high-impact change, in order. For workflow changes, show the exact YAML diff. For hook changes, show the exact shell change. For config changes, show the file and the new content. + +## Rules + +1. Only suggest changes with clear, measurable benefit. Skip micro-optimisations. +2. Preserve correctness — never suggest removing a cache that would break reproducibility. +3. Flag any changes that require secrets or environment variables. +4. If a fix requires a new dependency (e.g. cargo-nextest), note the install command. + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused diffs — change only what is necessary +- Maintain backwards compatibility +- Every behavioral change must include tests +- Never commit secrets or credentials +- Follow the project's coding standards and quality gates diff --git a/.cursor/commands/handoff.md b/.cursor/commands/handoff.md index 2763d727..50513c7a 100644 --- a/.cursor/commands/handoff.md +++ b/.cursor/commands/handoff.md @@ -1,7 +1,7 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -<!-- generated_by: agentkit-forge | last_model: sync-engine | last_updated: 2026-03-05 --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-05 --> <!-- Format: Plain Markdown. Cursor command template. --> <!-- Docs: https://docs.cursor.com/context/rules --> @@ -20,7 +20,7 @@ Generates a structured handoff document for the current session. Captures what w ## Instructions -When invoked, follow the AgentKit Forge orchestration lifecycle: +When invoked, follow the Retort orchestration lifecycle: 1. **Understand** the request and any arguments provided 2. **Scan** relevant files to build context @@ -30,7 +30,7 @@ When invoked, follow the AgentKit Forge orchestration lifecycle: ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.cursor/commands/healthcheck.md b/.cursor/commands/healthcheck.md index 75718665..162b1a44 100644 --- a/.cursor/commands/healthcheck.md +++ b/.cursor/commands/healthcheck.md @@ -1,7 +1,7 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -<!-- generated_by: agentkit-forge | last_model: sync-engine | last_updated: 2026-03-05 --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-05 --> <!-- Format: Plain Markdown. Cursor command template. --> <!-- Docs: https://docs.cursor.com/context/rules --> @@ -20,7 +20,7 @@ Performs a comprehensive health check of the repository: validates builds, runs ## Instructions -When invoked, follow the AgentKit Forge orchestration lifecycle: +When invoked, follow the Retort orchestration lifecycle: 1. **Understand** the request and any arguments provided 2. **Scan** relevant files to build context @@ -30,7 +30,7 @@ When invoked, follow the AgentKit Forge orchestration lifecycle: ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.cursor/commands/init.md b/.cursor/commands/init.md new file mode 100644 index 00000000..38971627 --- /dev/null +++ b/.cursor/commands/init.md @@ -0,0 +1,68 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-20 --> +<!-- Format: Plain Markdown. Cursor command template. --> +<!-- Docs: https://docs.cursor.com/context/rules --> + +# init + +Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing. + +## Role + +You are the **Init Agent**. Guide users through initialising a new Retort project in the current repository. + +## How to Initialise + +Run the init command from the repository root: + +```bash +node .agentkit/engines/node/src/cli.mjs init +``` + +Or if pnpm is available: + +```bash +pnpm -C .agentkit agentkit:init +``` + +## Flags + +| Flag | Effect | +| ------------------- | ------------------------------------------------------ | +| `--dry-run` | Show what would be generated without writing any files | +| `--non-interactive` | Skip prompts, use auto-detected defaults | +| `--preset <name>` | Use a preset: minimal, full, team, infra | +| `--force` | Overwrite existing overlay configuration | +| `--repoName <name>` | Override the detected repository name | + +## Kit Selection + +During interactive init, Retort detects your tech stack and shows which +language kits will be activated (typescript, dotnet, rust, python, blockchain). +Universal kits (security, testing, git-workflow, documentation, ci-cd, +dependency-management, agent-conduct) are always included. + +Optional kits (iac, finops, ai-cost-ops) are presented for explicit opt-in. + +## Post-Init + +1. Review the generated `spec/project.yaml` — fill in any `null` fields +2. Run `/sync` to regenerate all AI tool configurations +3. Run `/validate` to verify generated outputs are well-formed +4. Commit both the spec and generated outputs together + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused diffs — change only what is necessary +- Maintain backwards compatibility +- Every behavioral change must include tests +- Never commit secrets or credentials +- Follow the project's coding standards and quality gates diff --git a/.cursor/commands/project-review.md b/.cursor/commands/project-review.md index e03a8a5e..130116da 100644 --- a/.cursor/commands/project-review.md +++ b/.cursor/commands/project-review.md @@ -1,7 +1,7 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -<!-- generated_by: agentkit-forge | last_model: sync-engine | last_updated: 2026-03-05 --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-05 --> <!-- Format: Plain Markdown. Cursor command template. --> <!-- Docs: https://docs.cursor.com/context/rules --> @@ -19,7 +19,7 @@ Comprehensive production-grade project review and assessment. Systematically ana ## Instructions -When invoked, follow the AgentKit Forge orchestration lifecycle: +When invoked, follow the Retort orchestration lifecycle: 1. **Understand** the request and any arguments provided 2. **Scan** relevant files to build context @@ -29,7 +29,7 @@ When invoked, follow the AgentKit Forge orchestration lifecycle: ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.cursor/rules/orchestrate.mdc b/.cursor/rules/orchestrate.mdc index 7c18205e..5e19cff8 100644 --- a/.cursor/rules/orchestrate.mdc +++ b/.cursor/rules/orchestrate.mdc @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Orchestration diff --git a/.cursor/rules/project-context.mdc b/.cursor/rules/project-context.mdc index 227de637..0e435d5d 100644 --- a/.cursor/rules/project-context.mdc +++ b/.cursor/rules/project-context.mdc @@ -1,9 +1,12 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Project Context This repository uses the AgentKit Forge unified agent team framework (v3.1.0). ## Language Profile Diagnostics -- Source: mixed (confidence: high) +- Source: configured (confidence: high) - Configured languages present: yes - JS-like: configured=true, inferred=true, effective=true - Python: configured=false, inferred=false, effective=false diff --git a/.cursor/rules/security.mdc b/.cursor/rules/security.mdc index 251d8935..2287c4ba 100644 --- a/.cursor/rules/security.mdc +++ b/.cursor/rules/security.mdc @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Security Rules - Never read, print, or commit secrets or tokens diff --git a/.cursor/settings.json b/.cursor/settings.json index 95cb789e..0122b43d 100644 --- a/.cursor/settings.json +++ b/.cursor/settings.json @@ -79,7 +79,7 @@ "menu.separatorBackground": "#18232A" }, "_agentkit_theme": { - "brand": "AgentKit Forge", + "brand": "Retort", "mode": "both", "scheme": "dark", "tier": "full", diff --git a/.gemini/config.yaml b/.gemini/config.yaml index 749f297b..efd7112a 100644 --- a/.gemini/config.yaml +++ b/.gemini/config.yaml @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # Gemini Code Assist configuration # Generated by AgentKit Forge — see .agentkit/ for source diff --git a/.gitattributes b/.gitattributes index b9765db7..a5e34706 100644 --- a/.gitattributes +++ b/.gitattributes @@ -21,38 +21,12 @@ *.ttf binary *.eot binary -# ============================================================================= -# Merge drivers — auto-resolve conflicts on generated / framework-managed files -# ============================================================================= -# These rules use custom merge drivers defined in .gitconfig (repo-local) or -# the user's global config. Run `git config --local include.path ../.gitattributes-drivers` -# or the setup script to activate them. -# -# Driver: agentkit-generated — always accept the incoming (upstream) version -# for files that are regenerated by `agentkit sync` and should never diverge. -# ============================================================================= - -# --- Generated agent/skill/prompt packs (always accept upstream) --- -.agents/skills/**/SKILL.md merge=agentkit-generated -.github/agents/*.agent.md merge=agentkit-generated -.github/chatmodes/*.chatmode.md merge=agentkit-generated -.github/prompts/*.prompt.md merge=agentkit-generated - -# --- Generated doc indexes (always accept upstream) --- -docs/*/README.md merge=agentkit-generated - -# --- Generated config files (always accept upstream) --- -.github/copilot-instructions.md merge=agentkit-generated -.github/PULL_REQUEST_TEMPLATE.md merge=agentkit-generated - -# --- Lock files (accept upstream, regenerate after merge) --- -pnpm-lock.yaml merge=agentkit-generated -.agentkit/pnpm-lock.yaml merge=agentkit-generated - -# >>> AgentKit Forge merge drivers — DO NOT EDIT below this line -# GENERATED by AgentKit Forge v3.1.0 — regenerated on every sync. +# >>> Retort merge drivers — DO NOT EDIT below this line +# GENERATED by Retort v3.1.0 — regenerated on every sync. # These custom merge drivers auto-resolve conflicts on framework-managed files. # Driver "agentkit-generated" accepts the incoming (upstream/theirs) version. +# Only scaffold:always files are listed — scaffold:managed files (CLAUDE.md, +# settings.json, etc.) are intentionally excluded so user edits are preserved. # # To activate locally, run: # git config merge.agentkit-generated.name "Accept upstream for generated files" @@ -60,20 +34,44 @@ pnpm-lock.yaml merge=agentkit-generated # # Or use: scripts/resolve-merge.sh <target-branch> -# --- Generated agent/skill/prompt packs (always accept upstream) --- -.agents/skills/**/SKILL.md merge=agentkit-generated +# --- Claude Code: agents, commands, rules, hooks, skills --- +.claude/agents/*.md merge=agentkit-generated +.claude/commands/*.md merge=agentkit-generated +.claude/rules/**/*.md merge=agentkit-generated +.claude/hooks/*.sh merge=agentkit-generated +.claude/hooks/*.ps1 merge=agentkit-generated +.claude/skills/**/SKILL.md merge=agentkit-generated + +# --- Cursor: commands and rules --- +.cursor/commands/*.md merge=agentkit-generated +.cursor/rules/**/*.md merge=agentkit-generated + +# --- Windsurf: commands, rules, and workflows --- +.windsurf/commands/*.md merge=agentkit-generated +.windsurf/rules/**/*.md merge=agentkit-generated +.windsurf/workflows/*.yml merge=agentkit-generated + +# --- Cline rules --- +.clinerules/**/*.md merge=agentkit-generated + +# --- Roo rules --- +.roo/rules/**/*.md merge=agentkit-generated + +# --- GitHub Copilot: instructions, agents, chatmodes, prompts --- +.github/instructions/**/*.md merge=agentkit-generated .github/agents/*.agent.md merge=agentkit-generated .github/chatmodes/*.chatmode.md merge=agentkit-generated .github/prompts/*.prompt.md merge=agentkit-generated - -# --- Generated doc indexes (always accept upstream) --- -docs/*/README.md merge=agentkit-generated - -# --- Generated config files (always accept upstream) --- .github/copilot-instructions.md merge=agentkit-generated .github/PULL_REQUEST_TEMPLATE.md merge=agentkit-generated +# --- Agent skills packs --- +.agents/skills/**/SKILL.md merge=agentkit-generated + +# --- Generated doc indexes --- +docs/*/README.md merge=agentkit-generated + # --- Lock files (accept upstream, regenerate after merge) --- pnpm-lock.yaml merge=agentkit-generated .agentkit/pnpm-lock.yaml merge=agentkit-generated -# <<< AgentKit Forge merge drivers — DO NOT EDIT above this line +# <<< Retort merge drivers — DO NOT EDIT above this line diff --git a/.github/ISSUES/002-maintenance-coordinator-agent.md b/.github/ISSUES/002-maintenance-coordinator-agent.md index 98f1ce3a..1f84002c 100644 --- a/.github/ISSUES/002-maintenance-coordinator-agent.md +++ b/.github/ISSUES/002-maintenance-coordinator-agent.md @@ -33,7 +33,7 @@ Append to the operations category in `.agentkit/spec/agents.yaml`: role: > System maintenance specialist responsible for framework health, rule governance, technical debt tracking, script ownership, and coordination - of maintenance-phase operations. Stewards AgentKit Forge internals and + of maintenance-phase operations. Stewards Retort internals and ensures CLI, hooks, CI, and generated outputs remain consistent with specifications. accepts: diff --git a/.github/ISSUES/009-doctor-presync-healthcheck.md b/.github/ISSUES/009-doctor-presync-healthcheck.md index 3a46cf10..2c40421c 100644 --- a/.github/ISSUES/009-doctor-presync-healthcheck.md +++ b/.github/ISSUES/009-doctor-presync-healthcheck.md @@ -25,7 +25,7 @@ It's **not called from**: ### Step 1: Integrate doctor into healthcheck.mjs (~30 min) -In `healthcheck.mjs`, after the AgentKit Setup section (line 84): +In `healthcheck.mjs`, after the Retort Setup section (line 84): ```javascript // --- Step 2b: Framework Diagnostics --- diff --git a/.github/ISSUES/013-trae-mcp-alignment-umbrella.md b/.github/ISSUES/013-trae-mcp-alignment-umbrella.md index 2b0822bd..ce11571c 100644 --- a/.github/ISSUES/013-trae-mcp-alignment-umbrella.md +++ b/.github/ISSUES/013-trae-mcp-alignment-umbrella.md @@ -10,7 +10,7 @@ ## Summary -Add first-class support for high-value MCP integrations and MCP-oriented framework behavior so AgentKit Forge can better interoperate with TRAE-style MCP workflows. +Add first-class support for high-value MCP integrations and MCP-oriented framework behavior so Retort can better interoperate with TRAE-style MCP workflows. This umbrella tracks: @@ -46,7 +46,7 @@ Additional screenshot-visible MCP categories worth grouping: ## Problem -AgentKit Forge already generates MCP-related assets (for example `.mcp/a2a-config.json`) and contains early A2A/task delegation concepts, but the framework does **not yet present a coherent strategy** for: +Retort already generates MCP-related assets (for example `.mcp/a2a-config.json`) and contains early A2A/task delegation concepts, but the framework does **not yet present a coherent strategy** for: 1. Selecting and prioritizing high-value MCP servers 2. Modeling MCP server categories in spec/config @@ -57,13 +57,13 @@ AgentKit Forge already generates MCP-related assets (for example `.mcp/a2a-confi This creates a gap between: - What MCP-capable IDEs now expose in marketplace workflows -- What AgentKit Forge can scaffold, document, validate, and maintain +- What Retort can scaffold, document, validate, and maintain --- ## Goals -- Define a canonical MCP support strategy for AgentKit Forge +- Define a canonical MCP support strategy for Retort - Prioritize practical MCP servers with clear user value - Add documentation, config, and generated output support where justified - Avoid server-by-server sprawl without governance diff --git a/.github/ISSUES/014-trae-mcp-foundation.md b/.github/ISSUES/014-trae-mcp-foundation.md index fe321275..01ec97d2 100644 --- a/.github/ISSUES/014-trae-mcp-foundation.md +++ b/.github/ISSUES/014-trae-mcp-foundation.md @@ -8,7 +8,7 @@ ## Problem -MCP support currently exists as scattered capability rather than a governed framework concern. AgentKit Forge needs a clear model for deciding: +MCP support currently exists as scattered capability rather than a governed framework concern. Retort needs a clear model for deciding: - Which MCP servers are officially supported - Which MCP servers are merely documented or recommended diff --git a/.github/ISSUES/015-priority-mcp-integrations.md b/.github/ISSUES/015-priority-mcp-integrations.md index 7e4e6c3c..d4e136cc 100644 --- a/.github/ISSUES/015-priority-mcp-integrations.md +++ b/.github/ISSUES/015-priority-mcp-integrations.md @@ -34,12 +34,12 @@ For each server, document: - expected user value - credential / environment requirements - local vs hosted execution model -- overlap with existing AgentKit capabilities +- overlap with existing Retort capabilities - target support level ### Step 2: Define framework integration surface -For each server, decide whether AgentKit Forge should add: +For each server, decide whether Retort should add: - documentation only - recommended install/onboarding workflow @@ -77,7 +77,7 @@ Beyond the first four priority MCPs, keep the following adjacent follow-ups visi - Notion MCP client support details: `033-notion-mcp-client-support.md` - Documentation MCP and Pandoc workflows: `035-documentation-mcp-and-pandoc-support.md` -- Self-hosted AgentKit MCP server strategy: `036-self-hosted-mcp-server-strategy.md` +- Self-hosted Retort MCP server strategy: `036-self-hosted-mcp-server-strategy.md` - Todoist-through-MCP task integration: `037-todoist-mcp-task-integration.md` - InsForge MCP evaluation: `034-insforge-mcp-support.md` diff --git a/.github/ISSUES/016-mcp-category-browser-devtools.md b/.github/ISSUES/016-mcp-category-browser-devtools.md index 7acb3415..0cc53551 100644 --- a/.github/ISSUES/016-mcp-category-browser-devtools.md +++ b/.github/ISSUES/016-mcp-category-browser-devtools.md @@ -8,7 +8,7 @@ ## Problem -TRAE marketplace screenshots show browser-oriented MCP workflows such as Puppeteer and Chrome DevTools MCP. AgentKit Forge should decide how these fit into platform guidance, testing workflows, and security boundaries. +TRAE marketplace screenshots show browser-oriented MCP workflows such as Puppeteer and Chrome DevTools MCP. Retort should decide how these fit into platform guidance, testing workflows, and security boundaries. --- @@ -26,7 +26,7 @@ Evaluate support patterns for browser/devtools MCP servers, including: - [ ] Browser/devtools MCP category has a support recommendation - [ ] Security constraints are documented -- [ ] Testing / debugging workflows are mapped to AgentKit commands or skills +- [ ] Testing / debugging workflows are mapped to Retort commands or skills - [ ] First-class vs documented-only support is decided per candidate --- diff --git a/.github/ISSUES/017-mcp-category-repo-data-research.md b/.github/ISSUES/017-mcp-category-repo-data-research.md index abb5db9f..0e59240c 100644 --- a/.github/ISSUES/017-mcp-category-repo-data-research.md +++ b/.github/ISSUES/017-mcp-category-repo-data-research.md @@ -8,7 +8,7 @@ ## Problem -The TRAE marketplace screenshots show strong coverage across repository, database, and research-oriented MCP servers. AgentKit Forge needs a deliberate support position for these categories rather than ad hoc adoption. +The TRAE marketplace screenshots show strong coverage across repository, database, and research-oriented MCP servers. Retort needs a deliberate support position for these categories rather than ad hoc adoption. Candidate examples visible across screenshots and request context include: @@ -35,7 +35,7 @@ This issue should identify which category members deserve separate first-class f ## Acceptance Criteria - [ ] Repo/data/research MCP categories have support recommendations -- [ ] Existing AgentKit capabilities are compared against marketplace MCP overlap +- [ ] Existing Retort capabilities are compared against marketplace MCP overlap - [ ] High-value servers are identified for first-class support - [ ] Documentation-only vs generated-config support is decided where practical diff --git a/.github/ISSUES/018-mcp-category-desktop-collab-memory.md b/.github/ISSUES/018-mcp-category-desktop-collab-memory.md index f52346a5..65b141d7 100644 --- a/.github/ISSUES/018-mcp-category-desktop-collab-memory.md +++ b/.github/ISSUES/018-mcp-category-desktop-collab-memory.md @@ -8,7 +8,7 @@ ## Problem -The TRAE marketplace includes desktop/filesystem/shell, collaboration, and memory-oriented MCP servers that can materially change agent workflows. AgentKit Forge needs a clear position on which of these should be integrated, documented, or deferred. +The TRAE marketplace includes desktop/filesystem/shell, collaboration, and memory-oriented MCP servers that can materially change agent workflows. Retort needs a clear position on which of these should be integrated, documented, or deferred. Examples visible in screenshots include: diff --git a/.github/ISSUES/019-trae-memory-support-umbrella.md b/.github/ISSUES/019-trae-memory-support-umbrella.md index c0df1952..c49e1265 100644 --- a/.github/ISSUES/019-trae-memory-support-umbrella.md +++ b/.github/ISSUES/019-trae-memory-support-umbrella.md @@ -10,7 +10,7 @@ ## Summary -Add explicit memory support strategy and implementation planning to AgentKit Forge, aligned with TRAE memory workflows. +Add explicit memory support strategy and implementation planning to Retort, aligned with TRAE memory workflows. Primary reference: @@ -27,7 +27,7 @@ This umbrella covers: ## Problem -AgentKit Forge supports rich prompts, generated rules, workflows, and orchestration, but does not yet define a framework-level position on: +Retort supports rich prompts, generated rules, workflows, and orchestration, but does not yet define a framework-level position on: - what memory means in product terms - which memories are per-session vs durable @@ -41,7 +41,7 @@ Without that, memory support risks becoming inconsistent, overly implicit, or un ## Acceptance Criteria -- [ ] A memory support model exists for AgentKit Forge +- [ ] A memory support model exists for Retort - [ ] Persistence, scope, retention, and privacy boundaries are defined - [ ] Follow-on sub-issues cover architecture, UX/governance, and generated-output integration - [ ] TRAE memory documentation is referenced in the implementation notes diff --git a/.github/ISSUES/020-memory-model-and-storage.md b/.github/ISSUES/020-memory-model-and-storage.md index 27fc71ea..f53c0aa6 100644 --- a/.github/ISSUES/020-memory-model-and-storage.md +++ b/.github/ISSUES/020-memory-model-and-storage.md @@ -8,7 +8,7 @@ ## Problem -Before implementing memory-related features, AgentKit Forge needs a clear architecture for: +Before implementing memory-related features, Retort needs a clear architecture for: - session memory vs durable memory - workspace-scoped vs user-scoped memory diff --git a/.github/ISSUES/022-memory-generated-output-support.md b/.github/ISSUES/022-memory-generated-output-support.md index bf0d02e5..3b122e15 100644 --- a/.github/ISSUES/022-memory-generated-output-support.md +++ b/.github/ISSUES/022-memory-generated-output-support.md @@ -8,7 +8,7 @@ ## Problem -If AgentKit Forge adds memory support, generated outputs need to reflect that consistently across supported platforms. +If Retort adds memory support, generated outputs need to reflect that consistently across supported platforms. This includes: diff --git a/.github/ISSUES/023-trae-codebase-indexing.md b/.github/ISSUES/023-trae-codebase-indexing.md index 0182bc06..c0a40880 100644 --- a/.github/ISSUES/023-trae-codebase-indexing.md +++ b/.github/ISSUES/023-trae-codebase-indexing.md @@ -8,7 +8,7 @@ ## Problem -TRAE documents explicit codebase indexing behavior, but AgentKit Forge does not yet define a corresponding framework posture for indexing-aware workflows. +TRAE documents explicit codebase indexing behavior, but Retort does not yet define a corresponding framework posture for indexing-aware workflows. Reference: @@ -16,7 +16,7 @@ Reference: Questions to resolve: -- What should AgentKit Forge assume about indexing availability? +- What should Retort assume about indexing availability? - Which generated instructions should be indexing-aware? - How should indexing limitations or stale index behavior be handled? - What repo guidance improves indexing quality in large or multi-root workspaces? diff --git a/.github/ISSUES/024-trae-context-compaction.md b/.github/ISSUES/024-trae-context-compaction.md index 3daec45b..1533b207 100644 --- a/.github/ISSUES/024-trae-context-compaction.md +++ b/.github/ISSUES/024-trae-context-compaction.md @@ -8,7 +8,7 @@ ## Problem -TRAE documents automated context compaction, but AgentKit Forge does not yet define how its generated prompts, workflows, and orchestration model should behave when context is compacted automatically. +TRAE documents automated context compaction, but Retort does not yet define how its generated prompts, workflows, and orchestration model should behave when context is compacted automatically. Reference: diff --git a/.github/ISSUES/025-trae-rules-revisit.md b/.github/ISSUES/025-trae-rules-revisit.md index fe004e13..1fddf6b2 100644 --- a/.github/ISSUES/025-trae-rules-revisit.md +++ b/.github/ISSUES/025-trae-rules-revisit.md @@ -8,7 +8,7 @@ ## Problem -TRAE exposes explicit rules behavior, and AgentKit Forge should revisit whether its current rule generation strategy best fits that environment. +TRAE exposes explicit rules behavior, and Retort should revisit whether its current rule generation strategy best fits that environment. Reference: @@ -40,6 +40,15 @@ Areas to revisit: - [ ] Platform-specific projection strategy is reviewed - [ ] Follow-up implementation tasks are identified if needed +## Implementation Notes (2026-03-20) + +The `feat/kit-domain-selection-onboarding` branch introduces stack-based domain filtering +(`filterDomainsByStack` in `template-utils.mjs`) which directly reduces rule noise: only +domains relevant to the declared stack are generated. A TypeScript-only project now gets +typescript + universal domains — not dotnet/rust/python/blockchain. This partially addresses +the redundancy and platform noise concerns raised here. The TRAE-specific rule format audit +remains outstanding. + --- ## Resolution diff --git a/.github/ISSUES/026-trae-skills-revisit.md b/.github/ISSUES/026-trae-skills-revisit.md index 430a815a..38ad6558 100644 --- a/.github/ISSUES/026-trae-skills-revisit.md +++ b/.github/ISSUES/026-trae-skills-revisit.md @@ -8,7 +8,7 @@ ## Problem -TRAE exposes skills as a first-class concept. AgentKit Forge should revisit whether its generated skills are scoped, named, and documented optimally for TRAE-style usage. +TRAE exposes skills as a first-class concept. Retort should revisit whether its generated skills are scoped, named, and documented optimally for TRAE-style usage. Reference: @@ -31,6 +31,13 @@ Areas to revisit: - [ ] Naming/discoverability improvements are proposed - [ ] Follow-up implementation tasks are identified if needed +## Implementation Notes (2026-03-20) + +Kit-based domain filtering (`feat/kit-domain-selection-onboarding`) reduces generated skill +volume by only activating domains relevant to the project's declared stack. The same principle +could be applied to skill generation in a follow-up: generate language-specific skills only +for active language kits. Skill format audit against TRAE expectations remains outstanding. + --- ## Note diff --git a/.github/ISSUES/027-trae-agents-revisit.md b/.github/ISSUES/027-trae-agents-revisit.md index c0bab958..f1a53c3f 100644 --- a/.github/ISSUES/027-trae-agents-revisit.md +++ b/.github/ISSUES/027-trae-agents-revisit.md @@ -8,7 +8,7 @@ ## Problem -TRAE provides both agent overview guidance and custom agents ready for one-click import. AgentKit Forge should revisit whether its agent model and generated outputs map well to those capabilities. +TRAE provides both agent overview guidance and custom agents ready for one-click import. Retort should revisit whether its agent model and generated outputs map well to those capabilities. References: @@ -37,7 +37,7 @@ Identify over-specialization, duplication, and missing platform-oriented persona ### 3. Evaluate export/import affordances -Determine whether AgentKit Forge should emit TRAE-ready agent artifacts directly or via an adapter/export step. +Determine whether Retort should emit TRAE-ready agent artifacts directly or via an adapter/export step. --- @@ -48,6 +48,13 @@ Determine whether AgentKit Forge should emit TRAE-ready agent artifacts directly - [ ] Agent overlap/gaps are identified - [ ] Follow-up implementation tasks are identified if needed +## Implementation Notes (2026-03-20) + +Issue 040 (elegance-guidelines) from `feat/kit-domain-selection-onboarding` adds per-agent +design guidance that improves agent quality independent of platform. The kit-based filtering +work means agent-related generation is more stack-aware. TRAE-specific agent packaging/import +format audit remains outstanding — this should be prioritised in the next sprint. + --- ## Note diff --git a/.github/ISSUES/028-trae-figma-support.md b/.github/ISSUES/028-trae-figma-support.md index c88b6b19..dd0f2342 100644 --- a/.github/ISSUES/028-trae-figma-support.md +++ b/.github/ISSUES/028-trae-figma-support.md @@ -8,7 +8,7 @@ ## Problem -The screenshots show Figma-oriented MCP capability (`Figma AI Bridge`). AgentKit Forge does not yet define how design-tool integration should work across prompts, agents, workflows, and generated platform guidance. +The screenshots show Figma-oriented MCP capability (`Figma AI Bridge`). Retort does not yet define how design-tool integration should work across prompts, agents, workflows, and generated platform guidance. This gap affects: diff --git a/.github/ISSUES/029-platform-support-umbrella.md b/.github/ISSUES/029-platform-support-umbrella.md index f9f7d071..8fd38a03 100644 --- a/.github/ISSUES/029-platform-support-umbrella.md +++ b/.github/ISSUES/029-platform-support-umbrella.md @@ -31,13 +31,13 @@ Requested platforms: This umbrella exists to answer two questions consistently: 1. Is the platform an IDE, an agent shell, an aggregator, or another execution surface? -2. What level of AgentKit Forge support should exist for that platform? +2. What level of Retort support should exist for that platform? --- ## Problem -AgentKit Forge already targets several AI coding environments, but support expansion is currently driven by ad hoc additions. That makes it hard to reason about: +Retort already targets several AI coding environments, but support expansion is currently driven by ad hoc additions. That makes it hard to reason about: - which platforms are officially supported - how support levels differ by platform type @@ -70,7 +70,7 @@ Review each requested platform for: ### Phase 3: Support implementation strategy -Decide for each platform whether AgentKit Forge should add: +Decide for each platform whether Retort should add: - first-class generated outputs - adapter/export support diff --git a/.github/ISSUES/031-ai-aggregator-support.md b/.github/ISSUES/031-ai-aggregator-support.md index c7c09a76..d3278dd6 100644 --- a/.github/ISSUES/031-ai-aggregator-support.md +++ b/.github/ISSUES/031-ai-aggregator-support.md @@ -8,7 +8,7 @@ ## Problem -AgentKit Forge currently focuses mostly on editor and agent-runtime targets, but there is a separate class of tools that act as AI aggregators or orchestration hubs. +Retort currently focuses mostly on editor and agent-runtime targets, but there is a separate class of tools that act as AI aggregators or orchestration hubs. Example requested category: diff --git a/.github/ISSUES/032-trae-alignment-master-umbrella.md b/.github/ISSUES/032-trae-alignment-master-umbrella.md index f94d70a6..21ce4bda 100644 --- a/.github/ISSUES/032-trae-alignment-master-umbrella.md +++ b/.github/ISSUES/032-trae-alignment-master-umbrella.md @@ -48,7 +48,7 @@ Tracking these as isolated issues is useful for execution, but there also needs ## Coordination Goals -- Define what “TRAE support” means for AgentKit Forge +- Define what “TRAE support” means for Retort - Separate first-class support from documentation-only support - Ensure platform changes do not fragment the core spec/sync architecture - Reuse common abstractions across MCP, memory, rules, skills, and agents where possible diff --git a/.github/ISSUES/033-notion-mcp-client-support.md b/.github/ISSUES/033-notion-mcp-client-support.md index 105d05a8..71f055af 100644 --- a/.github/ISSUES/033-notion-mcp-client-support.md +++ b/.github/ISSUES/033-notion-mcp-client-support.md @@ -19,10 +19,10 @@ References: ## Scope -Evaluate what AgentKit Forge should support for Notion MCP integration, including: +Evaluate what Retort should support for Notion MCP integration, including: - recommended MCP client usage patterns -- workspace/page/database operations most relevant to AgentKit workflows +- workspace/page/database operations most relevant to Retort workflows - authentication and secret handling - generated docs or setup guidance - overlap with existing Notion integration expectations @@ -35,7 +35,7 @@ Evaluate what AgentKit Forge should support for Notion MCP integration, includin Document the client-side flow and required capabilities from the Notion MCP guide. -### Step 2: Map high-value AgentKit use cases +### Step 2: Map high-value Retort use cases Candidate use cases: @@ -60,7 +60,7 @@ Decide whether support should be: - [ ] Notion MCP has a dedicated support recommendation - [ ] The official Notion MCP client guide is referenced -- [ ] High-value AgentKit use cases are documented +- [ ] High-value Retort use cases are documented - [ ] Auth/security handling is documented at a planning level --- diff --git a/.github/ISSUES/034-insforge-mcp-support.md b/.github/ISSUES/034-insforge-mcp-support.md index 19d7e6a5..670e09cb 100644 --- a/.github/ISSUES/034-insforge-mcp-support.md +++ b/.github/ISSUES/034-insforge-mcp-support.md @@ -8,7 +8,7 @@ ## Problem -InsForge MCP appeared in the marketplace screenshots, but AgentKit Forge does not yet have a dedicated issue evaluating whether it should support or document this integration. +InsForge MCP appeared in the marketplace screenshots, but Retort does not yet have a dedicated issue evaluating whether it should support or document this integration. --- @@ -16,7 +16,7 @@ InsForge MCP appeared in the marketplace screenshots, but AgentKit Forge does no Assess InsForge MCP for: -- fit with AgentKit workflows +- fit with Retort workflows - backend/app-scaffolding relevance - security and credential requirements - whether it is docs-only, experimental, or a stronger candidate @@ -26,7 +26,7 @@ Assess InsForge MCP for: ## Acceptance Criteria - [ ] InsForge MCP is evaluated with a support recommendation -- [ ] Likely use cases inside AgentKit are documented +- [ ] Likely use cases inside Retort are documented - [ ] Security/prerequisite considerations are captured --- diff --git a/.github/ISSUES/035-documentation-mcp-and-pandoc-support.md b/.github/ISSUES/035-documentation-mcp-and-pandoc-support.md index 47eb9a11..e01c81b2 100644 --- a/.github/ISSUES/035-documentation-mcp-and-pandoc-support.md +++ b/.github/ISSUES/035-documentation-mcp-and-pandoc-support.md @@ -8,7 +8,7 @@ ## Problem -There is no dedicated ticket for documentation-focused MCP workflows, despite strong relevance to AgentKit Forge. +There is no dedicated ticket for documentation-focused MCP workflows, despite strong relevance to Retort. Pandoc also appeared in the marketplace screenshots, and documentation-oriented MCP support could be valuable for: @@ -50,7 +50,7 @@ Assess whether Pandoc MCP support should help with: - markdown-to-pdf-oriented workflows - frontmatter-preserving transformations -### Step 3: Identify AgentKit-specific value +### Step 3: Identify Retort-specific value Potential value areas: @@ -65,7 +65,7 @@ Potential value areas: - [ ] Documentation MCP category is described with examples - [ ] Pandoc MCP is evaluated as a concrete candidate -- [ ] Documentation-oriented use cases for AgentKit are listed +- [ ] Documentation-oriented use cases for Retort are listed - [ ] Follow-up implementation work is identified if warranted --- diff --git a/.github/ISSUES/036-self-hosted-mcp-server-strategy.md b/.github/ISSUES/036-self-hosted-mcp-server-strategy.md index 2fc89177..8bbb0814 100644 --- a/.github/ISSUES/036-self-hosted-mcp-server-strategy.md +++ b/.github/ISSUES/036-self-hosted-mcp-server-strategy.md @@ -1,4 +1,4 @@ -# feat(mcp): Evaluate hosting our own MCP server for AgentKit Forge +# feat(mcp): Evaluate hosting our own MCP server for Retort **Priority:** P1 — High **Labels:** `enhancement`, `mcp`, `architecture`, `platform` @@ -8,7 +8,7 @@ ## Problem -AgentKit Forge currently consumes or plans around third-party MCP servers, but there is no dedicated issue evaluating whether the project should host its own MCP server. +Retort currently consumes or plans around third-party MCP servers, but there is no dedicated issue evaluating whether the project should host its own MCP server. This needs a deliberate architectural decision before ad hoc implementation begins. @@ -18,12 +18,12 @@ This needs a deliberate architectural decision before ad hoc implementation begi Candidate responsibilities worth evaluating: -- expose AgentKit project/spec metadata to MCP-capable clients +- expose Retort project/spec metadata to MCP-capable clients - expose backlog/tasks/orchestrator state in a stable tool interface - expose docs/ADR/PRD retrieval with project-aware filtering - expose workflow execution surfaces safely - expose project health/status summaries -- provide a stable adapter over AgentKit-native concepts instead of leaking file layout details +- provide a stable adapter over Retort-native concepts instead of leaking file layout details Possible non-goals: @@ -41,7 +41,7 @@ Answer whether a first-party MCP server would improve: - interoperability - platform portability -- discoverability of AgentKit capabilities +- discoverability of Retort capabilities - safer integrations for external tools ### Step 2: Define candidate tool surface diff --git a/.github/ISSUES/037-todoist-mcp-task-integration.md b/.github/ISSUES/037-todoist-mcp-task-integration.md index ac66f63b..09eb9cf1 100644 --- a/.github/ISSUES/037-todoist-mcp-task-integration.md +++ b/.github/ISSUES/037-todoist-mcp-task-integration.md @@ -1,4 +1,4 @@ -# feat(mcp): Integrate AgentKit tasks with Todoist through MCP +# feat(mcp): Integrate Retort tasks with Todoist through MCP **Priority:** P2 — Medium **Labels:** `enhancement`, `mcp`, `tasks`, `todoist`, `integration` @@ -8,7 +8,7 @@ ## Problem -AgentKit Forge has task and backlog concepts, but there is no dedicated issue to evaluate syncing or integrating them with Todoist through MCP. +Retort has task and backlog concepts, but there is no dedicated issue to evaluate syncing or integrating them with Todoist through MCP. --- @@ -16,8 +16,8 @@ AgentKit Forge has task and backlog concepts, but there is no dedicated issue to Evaluate whether Todoist-through-MCP should support: -- pushing AgentKit tasks to Todoist -- importing Todoist tasks into AgentKit backlog/task views +- pushing Retort tasks to Todoist +- importing Todoist tasks into Retort backlog/task views - one-way vs two-way sync - tagging/project mapping - priority/status translation @@ -37,7 +37,7 @@ Decide whether the initial target should be: ### Step 2: Define mapping model -Map AgentKit concepts to Todoist concepts: +Map Retort concepts to Todoist concepts: - task type - priority @@ -55,7 +55,7 @@ Clarify conflict and ownership rules so Todoist does not become an unsafe parall ## Acceptance Criteria - [ ] Todoist-through-MCP integration has a support recommendation -- [ ] Mapping between AgentKit tasks and Todoist concepts is documented +- [ ] Mapping between Retort tasks and Todoist concepts is documented - [ ] Sync direction and conflict model are documented - [ ] Follow-up implementation work is identified if warranted diff --git a/.github/ISSUES/038-platform-support-zed-codex-opencode.md b/.github/ISSUES/038-platform-support-zed-codex-opencode.md index 9e9943e1..06258719 100644 --- a/.github/ISSUES/038-platform-support-zed-codex-opencode.md +++ b/.github/ISSUES/038-platform-support-zed-codex-opencode.md @@ -23,7 +23,7 @@ These are close enough to core coding-agent/editor workflows that they deserve e For each platform, evaluate: - platform type and target model -- current overlap with existing AgentKit outputs +- current overlap with existing Retort outputs - rules/skills/agent/workflow fit - adapter/export opportunities - first-class vs docs-only support recommendation diff --git a/.github/ISSUES/040-agents-should-consider-architectural-elegance.md b/.github/ISSUES/040-agents-should-consider-architectural-elegance.md index 0e278f4b..2928dcf6 100644 --- a/.github/ISSUES/040-agents-should-consider-architectural-elegance.md +++ b/.github/ISSUES/040-agents-should-consider-architectural-elegance.md @@ -31,7 +31,7 @@ elegance-guidelines: - Prefer standard library patterns unless a custom abstraction is clearly justified ``` -### Why this fits AgentKit Forge +### Why this fits Retort - It lives in the agent persona definition, where agents already look for guidance - It can be tailored per agent (backend vs frontend vs infra) @@ -40,11 +40,18 @@ elegance-guidelines: ## Acceptance criteria -- [ ] Add `elegance-guidelines` as an optional field in the agent schema -- [ ] Populate initial elegance guidelines for core engineering agents (backend, frontend, infra, devops) -- [ ] Update spec-validator to accept the new field -- [ ] Regenerate issue templates and agent files to confirm compatibility -- [ ] Document the new field in the agents.yaml header comment +- [x] Add `elegance-guidelines` as an optional field in the agent schema + - Documented in `agents.yaml` header with example + - `spec-validator` does not reject unknown fields; no change needed +- [x] Populate initial elegance guidelines for core engineering agents (backend, frontend, infra, devops) + - `backend`: single-responsibility, thin abstractions, DRY extraction, explicit contracts + - `frontend`: composition > inheritance, design tokens, small components, simple state + - `devops`: composite actions, workflow clarity, fail-fast + - `infra`: thin root modules, consistent naming locals, Terragrunt DRY, minimal parameters +- [x] Update spec-validator to accept the new field (no change needed — validator allows unknown fields) +- [x] Regenerate issue templates and agent files to confirm compatibility (run sync) + - Sync run as part of `feat/kit-domain-selection-onboarding`; no compatibility issues found +- [x] Document the new field in the agents.yaml header comment ## Alternatives considered @@ -61,7 +68,7 @@ This change is inspired by recent code review feedback where technically correct - `.agentkit/engines/node/src/spec-validator.mjs` — accept the new field - Update generated files via `pnpm -C .agentkit agentkit:sync` -**IMPORTANT**: Do not edit generated files directly. All spec changes must be made in `.agentkit/spec/agents.yaml` and regenerated via the sync command. Files marked "GENERATED by AgentKit Forge — DO NOT EDIT" must not be modified directly. Any engine/template changes should be submitted as a PR to the agentkit-forge repository. +**IMPORTANT**: Do not edit generated files directly. All spec changes must be made in `.agentkit/spec/agents.yaml` and regenerated via the sync command. Files marked "GENERATED by Retort — DO NOT EDIT" must not be modified directly. Any engine/template changes should be submitted as a PR to the retort repository. --- @@ -77,3 +84,9 @@ Implemented in `feat(init): kit-based wizard with dry-run, elegance-guidelines, - Sync run confirmed compatibility; no generated file breakage The `elegance-guidelines` field is now part of every agent's persona definition, alongside existing `conventions` and `anti-patterns` fields. + +### Acceptance Criteria + +- [x] `elegance-guidelines` field added to agents.yaml schema +- [x] At least 3 agents have initial elegance guidelines +- [x] Generated files updated and validated diff --git a/.github/ISSUES/agent-maintainer-proposal.md b/.github/ISSUES/agent-maintainer-proposal.md index f3546595..6765b907 100644 --- a/.github/ISSUES/agent-maintainer-proposal.md +++ b/.github/ISSUES/agent-maintainer-proposal.md @@ -34,7 +34,7 @@ The system has 19 agents covering engineering, design, marketing, operations, pr role: > System maintenance specialist responsible for framework health, rule governance, technical debt tracking, script ownership, and coordination - of maintenance-phase operations. Acts as the steward of AgentKit Forge + of maintenance-phase operations. Acts as the steward of Retort internals and ensures CLI, hooks, CI, and generated outputs remain consistent with specifications. accepts: diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 64720d32..a4c3b6cf 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync name: Bug Report description: Report a bug to help us improve diff --git a/.github/ISSUE_TEMPLATE/doc-audit-command.md b/.github/ISSUE_TEMPLATE/doc-audit-command.md index f6e6b7e5..db968faa 100644 --- a/.github/ISSUE_TEMPLATE/doc-audit-command.md +++ b/.github/ISSUE_TEMPLATE/doc-audit-command.md @@ -1,13 +1,13 @@ --- name: 'feat: add /doc-audit slash command' -about: 'Add a repeatable documentation audit command to agentkit-forge' +about: 'Add a repeatable documentation audit command to retort' title: 'feat: add /doc-audit slash command for repeatable documentation audits' labels: enhancement, documentation --- ## Summary -Add a dedicated `/doc-audit` command to agentkit-forge that provides repeatable, systematic documentation audits. Currently, documentation auditing is either a manual one-off exercise or a narrow subset of `/project-review --focus docs`. +Add a dedicated `/doc-audit` command to retort that provides repeatable, systematic documentation audits. Currently, documentation auditing is either a manual one-off exercise or a narrow subset of `/project-review --focus docs`. ## Context diff --git a/.github/ISSUE_TEMPLATE/doc-audit-command.yml b/.github/ISSUE_TEMPLATE/doc-audit-command.yml index 5879a0b5..48b61648 100644 --- a/.github/ISSUE_TEMPLATE/doc-audit-command.yml +++ b/.github/ISSUE_TEMPLATE/doc-audit-command.yml @@ -1,5 +1,5 @@ name: 'feat: add /doc-audit slash command' -description: Add a repeatable documentation audit command to agentkit-forge +description: Add a repeatable documentation audit command to retort title: '[FEATURE] add /doc-audit slash command for repeatable documentation audits' labels: ['enhancement', 'documentation', 'triage'] assignees: [] @@ -10,7 +10,7 @@ body: value: | ## Summary - Add a dedicated `/doc-audit` command to agentkit-forge that provides repeatable, systematic documentation audits. Currently, documentation auditing is either a manual one-off exercise or a narrow subset of `/project-review --focus docs`. + Add a dedicated `/doc-audit` command to retort that provides repeatable, systematic documentation audits. Currently, documentation auditing is either a manual one-off exercise or a narrow subset of `/project-review --focus docs`. ## Context diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 7c545c86..1556c9d5 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync name: Feature Request description: Suggest a new feature or enhancement diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5c85bcfd..1659ec44 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> ## Summary diff --git a/.github/ai-framework-ci.yml b/.github/ai-framework-ci.yml index bee50056..2dc581e7 100644 --- a/.github/ai-framework-ci.yml +++ b/.github/ai-framework-ci.yml @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync name: AI Framework Validation diff --git a/.github/codeql/codeql-config.yml b/.github/codeql/codeql-config.yml index 1ff8fe90..5bc21e5f 100644 --- a/.github/codeql/codeql-config.yml +++ b/.github/codeql/codeql-config.yml @@ -1,4 +1,4 @@ -name: 'agentkit-forge CodeQL Config' +name: 'retort CodeQL Config' paths: - .agentkit/engines/node/src diff --git a/.github/instructions/rust.md b/.github/instructions/rust.md index 4a092aba..461d9005 100644 --- a/.github/instructions/rust.md +++ b/.github/instructions/rust.md @@ -1,7 +1,7 @@ -<!-- GENERATED by AgentKit Forge v0.2.1 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v0.2.1 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -<!-- generated_by: agentkit-forge | last_model: sync-engine | last_updated: 2026-03-01 --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-01 --> <!-- Format: Plain Markdown. Copilot domain-specific instructions. --> <!-- Docs: https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot --> diff --git a/.github/prompts/cicd-optimize.prompt.md b/.github/prompts/cicd-optimize.prompt.md new file mode 100644 index 00000000..25097b45 --- /dev/null +++ b/.github/prompts/cicd-optimize.prompt.md @@ -0,0 +1,115 @@ +--- +mode: 'agent' +description: 'CI/CD pipeline and local hook optimizer. Audits GitHub Actions workflows, pre-commit/stop hooks, and test configurations for speed bottlenecks. Identifies caching gaps, sequential jobs that could parallelize, missing path filters, redundant installs, and slow hook steps. Produces a prioritized list of improvements with estimated time savings per fix.' +generated_by: 'retort' +last_model: 'sync-engine' +last_updated: '2026-03-20' +# Format: YAML frontmatter + Markdown body. Copilot reusable prompt. +# Docs: https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot +--- + +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> + +# cicd-optimize + +CI/CD pipeline and local hook optimizer. Audits GitHub Actions workflows, pre-commit/stop hooks, and test configurations for speed bottlenecks. Identifies caching gaps, sequential jobs that could parallelize, missing path filters, redundant installs, and slow hook steps. Produces a prioritized list of improvements with estimated time savings per fix. + +## Role + +You are the **CI/CD Optimization Agent**. Analyse this project's CI/CD pipelines and local hooks for speed bottlenecks. Produce a prioritized report with concrete, copy-paste-ready fixes. + +## Step 1 — Inventory + +Collect all CI/CD surface area: + +- `.github/workflows/*.yml` — list each workflow, its triggers, jobs, and steps +- `.claude/hooks/` — list each hook file and its purpose +- `package.json` scripts: `lint`, `test`, `build`, `typecheck` +- Test framework config: `vitest.config.*`, `jest.config.*`, `pytest.ini`, `Cargo.toml [profile.test]` +- Lock files: `pnpm-lock.yaml`, `Cargo.lock`, `poetry.lock` + +## Step 2 — Bottleneck Detection + +For each workflow, check: + +### Caching + +- [ ] Node modules cached? (`actions/cache` with `node_modules` or `pnpm store`) +- [ ] Cargo registry cached? (`~/.cargo/registry` and `target/`) +- [ ] pip/poetry cached? (`~/.cache/pip`) +- [ ] Docker layer cache used? (`cache-from: type=gha`) + +### Parallelization + +- [ ] Jobs that depend on each other but don't need to — should they be parallel? +- [ ] Test suites that could use matrix strategy or `--pool` (vitest), `pytest-xdist`, `cargo nextest` +- [ ] Lint and typecheck run sequentially when they're independent + +### Trigger efficiency + +- [ ] Workflows triggered on `push` to all branches — should use `paths:` filters +- [ ] PR workflows trigger on `push` AND `pull_request` — often redundant +- [ ] Scheduled workflows running more frequently than needed + +### Install efficiency + +- [ ] `npm install` / `pnpm install` without `--frozen-lockfile` (slower) +- [ ] Install steps duplicated across jobs (should use artifacts or caching) +- [ ] `node_modules` copied between jobs instead of restored from cache + +### Hook efficiency + +- [ ] Stop hook runs tests or full builds (should be lint-only with file-change gating) +- [ ] Pre-commit hook runs expensive operations without caching +- [ ] Hooks run regardless of which files changed + +## Step 3 — Test Suite Speed + +Check for parallelization opportunities: + +- vitest: `--pool=threads` or `--pool=forks`, `--reporter=verbose` adding noise +- pytest: `pytest-xdist` (`-n auto`), test isolation issues +- cargo: `cargo nextest` (2-3x faster than `cargo test`) +- jest: `--maxWorkers` configuration + +## Step 4 — Report + +Produce a table sorted by estimated time savings (highest first): + +| # | Area | Issue | Fix | Est. saving | +| --- | ---- | ----- | --- | ----------- | +| 1 | ... | ... | ... | ~Xs per run | + +Then provide **Ready-to-apply fixes** — code blocks for each high-impact change, in order. For workflow changes, show the exact YAML diff. For hook changes, show the exact shell change. For config changes, show the file and the new content. + +## Rules + +1. Only suggest changes with clear, measurable benefit. Skip micro-optimisations. +2. Preserve correctness — never suggest removing a cache that would break reproducibility. +3. Flag any changes that require secrets or environment variables. +4. If a fix requires a new dependency (e.g. cargo-nextest), note the install command. + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused diffs — change only what is necessary +- Maintain backwards compatibility +- Every behavioral change must include tests +- Never commit secrets or credentials +- Follow the project's coding standards and quality gates + +## References + +- See `AGENTS.md` for universal project instructions +- See `UNIFIED_AGENT_TEAMS.md` for team ownership and escalation +- See `AGENT_TEAMS.md` for repo-specific team boundaries +- See `AGENT_BACKLOG.md` for active work items +- See `CLAUDE.md` for project context and workflow +- See `docs/` for architecture, runbooks, and guides diff --git a/.github/prompts/handoff.prompt.md b/.github/prompts/handoff.prompt.md index 2f7732c8..aa12a407 100644 --- a/.github/prompts/handoff.prompt.md +++ b/.github/prompts/handoff.prompt.md @@ -1,15 +1,15 @@ --- mode: 'agent' description: 'Generates a structured handoff document for the current session. Captures what was accomplished, what remains, open questions, and context needed by the next session or developer. Writes to docs/ai_handoffs/.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-04' # Format: YAML frontmatter + Markdown body. Copilot reusable prompt. # Docs: https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot --- -<!-- GENERATED by AgentKit Forge v0.2.1 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v0.2.1 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # handoff @@ -18,7 +18,7 @@ Generates a structured handoff document for the current session. Captures what w ## Instructions -When invoked, follow the AgentKit Forge orchestration lifecycle: +When invoked, follow the Retort orchestration lifecycle: 1. **Understand** the request and any arguments provided 2. **Scan** relevant files to build context @@ -28,7 +28,7 @@ When invoked, follow the AgentKit Forge orchestration lifecycle: ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.github/prompts/healthcheck.prompt.md b/.github/prompts/healthcheck.prompt.md index fb26a657..92d320f7 100644 --- a/.github/prompts/healthcheck.prompt.md +++ b/.github/prompts/healthcheck.prompt.md @@ -1,15 +1,15 @@ --- mode: 'agent' description: 'Performs a comprehensive health check of the repository: validates builds, runs tests, checks linting, verifies configuration files, and reports on the overall state of the codebase across all detected tech stacks.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-04' # Format: YAML frontmatter + Markdown body. Copilot reusable prompt. # Docs: https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot --- -<!-- GENERATED by AgentKit Forge v0.2.1 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v0.2.1 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # healthcheck @@ -18,7 +18,7 @@ Performs a comprehensive health check of the repository: validates builds, runs ## Instructions -When invoked, follow the AgentKit Forge orchestration lifecycle: +When invoked, follow the Retort orchestration lifecycle: 1. **Understand** the request and any arguments provided 2. **Scan** relevant files to build context @@ -28,7 +28,7 @@ When invoked, follow the AgentKit Forge orchestration lifecycle: ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.github/prompts/init.prompt.md b/.github/prompts/init.prompt.md new file mode 100644 index 00000000..136610fe --- /dev/null +++ b/.github/prompts/init.prompt.md @@ -0,0 +1,84 @@ +--- +mode: 'agent' +description: 'Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing.' +generated_by: 'retort' +last_model: 'sync-engine' +last_updated: '2026-03-20' +# Format: YAML frontmatter + Markdown body. Copilot reusable prompt. +# Docs: https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot +--- + +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> + +# init + +Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing. + +## Role + +You are the **Init Agent**. Guide users through initialising a new Retort project in the current repository. + +## How to Initialise + +Run the init command from the repository root: + +```bash +node .agentkit/engines/node/src/cli.mjs init +``` + +Or if pnpm is available: + +```bash +pnpm -C .agentkit agentkit:init +``` + +## Flags + +| Flag | Effect | +| ------------------- | ------------------------------------------------------ | +| `--dry-run` | Show what would be generated without writing any files | +| `--non-interactive` | Skip prompts, use auto-detected defaults | +| `--preset <name>` | Use a preset: minimal, full, team, infra | +| `--force` | Overwrite existing overlay configuration | +| `--repoName <name>` | Override the detected repository name | + +## Kit Selection + +During interactive init, Retort detects your tech stack and shows which +language kits will be activated (typescript, dotnet, rust, python, blockchain). +Universal kits (security, testing, git-workflow, documentation, ci-cd, +dependency-management, agent-conduct) are always included. + +Optional kits (iac, finops, ai-cost-ops) are presented for explicit opt-in. + +## Post-Init + +1. Review the generated `spec/project.yaml` — fill in any `null` fields +2. Run `/sync` to regenerate all AI tool configurations +3. Run `/validate` to verify generated outputs are well-formed +4. Commit both the spec and generated outputs together + +## Project Context + +- Repository: retort +- Default branch: main + - Tech stack: javascript, yaml, markdown + +## Conventions + +- Write minimal, focused diffs — change only what is necessary +- Maintain backwards compatibility +- Every behavioral change must include tests +- Never commit secrets or credentials +- Follow the project's coding standards and quality gates + +## References + +- See `AGENTS.md` for universal project instructions +- See `UNIFIED_AGENT_TEAMS.md` for team ownership and escalation +- See `AGENT_TEAMS.md` for repo-specific team boundaries +- See `AGENT_BACKLOG.md` for active work items +- See `CLAUDE.md` for project context and workflow +- See `docs/` for architecture, runbooks, and guides diff --git a/.github/prompts/project-review.prompt.md b/.github/prompts/project-review.prompt.md index a7e2b9da..1d5779ca 100644 --- a/.github/prompts/project-review.prompt.md +++ b/.github/prompts/project-review.prompt.md @@ -1,15 +1,15 @@ --- mode: 'agent' description: 'Comprehensive production-grade project review and assessment. Systematically analyzes code quality, architecture, security, UX, performance, documentation, and feature completeness. Produces structured findings with a prioritized roadmap organized into implementation waves.' -generated_by: 'agentkit-forge' +generated_by: 'retort' last_model: 'sync-engine' last_updated: '2026-03-04' # Format: YAML frontmatter + Markdown body. Copilot reusable prompt. # Docs: https://docs.github.com/en/copilot/customizing-copilot/adding-repository-custom-instructions-for-github-copilot --- -<!-- GENERATED by AgentKit Forge v0.2.1 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v0.2.1 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # project-review @@ -18,7 +18,7 @@ Comprehensive production-grade project review and assessment. Systematically ana ## Instructions -When invoked, follow the AgentKit Forge orchestration lifecycle: +When invoked, follow the Retort orchestration lifecycle: 1. **Understand** the request and any arguments provided 2. **Scan** relevant files to build context @@ -28,7 +28,7 @@ When invoked, follow the AgentKit Forge orchestration lifecycle: ## Project Context -- Repository: agentkit-forge +- Repository: retort - Default branch: main - Tech stack: javascript, yaml, markdown diff --git a/.github/scripts/README.md b/.github/scripts/README.md index 82e3388f..18256599 100644 --- a/.github/scripts/README.md +++ b/.github/scripts/README.md @@ -1,3 +1,6 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> <!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> <!-- Source: .agentkit/templates/github/scripts/ --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> diff --git a/.github/scripts/resolve-merge.ps1 b/.github/scripts/resolve-merge.ps1 index e4d295d2..d458f8fd 100644 --- a/.github/scripts/resolve-merge.ps1 +++ b/.github/scripts/resolve-merge.ps1 @@ -1,3 +1,6 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # ============================================================================= # resolve-merge.ps1 — Apply standard merge conflict resolutions (Windows) # GENERATED by AgentKit Forge v3.1.0 — regenerated on every sync diff --git a/.github/scripts/resolve-merge.sh b/.github/scripts/resolve-merge.sh index ad53eda5..6f400e0d 100755 --- a/.github/scripts/resolve-merge.sh +++ b/.github/scripts/resolve-merge.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # ============================================================================= # resolve-merge.sh — Apply standard merge conflict resolutions # GENERATED by AgentKit Forge v3.1.0 — regenerated on every sync diff --git a/.github/scripts/setup-branch-protection.ps1 b/.github/scripts/setup-branch-protection.ps1 index 551b6f24..b371e340 100644 --- a/.github/scripts/setup-branch-protection.ps1 +++ b/.github/scripts/setup-branch-protection.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # --------------------------------------------------------------------------- # setup-branch-protection.ps1 diff --git a/.github/scripts/setup-branch-protection.sh b/.github/scripts/setup-branch-protection.sh index 4f413d43..4f7ae845 100755 --- a/.github/scripts/setup-branch-protection.sh +++ b/.github/scripts/setup-branch-protection.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # --------------------------------------------------------------------------- # setup-branch-protection.sh diff --git a/.github/workflows/block-agentkit-changes.yml b/.github/workflows/block-agentkit-changes.yml index 0ab015ec..03820ce8 100644 --- a/.github/workflows/block-agentkit-changes.yml +++ b/.github/workflows/block-agentkit-changes.yml @@ -1,4 +1,4 @@ -name: Block AgentKit Changes +name: Block Retort Changes on: pull_request: @@ -20,8 +20,8 @@ jobs: - name: Detect .agentkit changes shell: bash run: | - if [[ "${{ github.repository }}" == "JustAGhosT/agentkit-forge" ]]; then - echo "Info: Skipping .agentkit/ change block for exception repository JustAGhosT/agentkit-forge." + if [[ "${{ github.repository }}" == "JustAGhosT/retort" ]]; then + echo "Info: Skipping .agentkit/ change block for exception repository JustAGhosT/retort." exit 0 fi diff --git a/.github/workflows/branch-protection.yml b/.github/workflows/branch-protection.yml index b05631fc..94cf1458 100644 --- a/.github/workflows/branch-protection.yml +++ b/.github/workflows/branch-protection.yml @@ -11,8 +11,8 @@ concurrency: # Enforce that all PRs to main pass required checks before merge. # Configure GitHub branch protection rules to require these status checks: -# - AgentKit Forge CI / Test (ubuntu-latest) -# - AgentKit Forge CI / Validate +# - Retort CI / Test (ubuntu-latest) +# - Retort CI / Validate # - Branch Protection / branch-rules jobs: @@ -101,20 +101,20 @@ jobs: const isAgentkitForgeRepo = context.repo.owner.toLowerCase() === 'justaghost' && - context.repo.repo.toLowerCase() === 'agentkit-forge'; + context.repo.repo.toLowerCase() === 'retort'; if (isAgentkitForgeRepo) { - core.info('Running in agentkit-forge source repo; upstream issue link check skipped.'); + core.info('Running in retort source repo; upstream issue link check skipped.'); return; } const body = pr.body || ''; - const hasUpstreamIssueLink = /https:\/\/github\.com\/JustAGhosT\/agentkit-forge\/issues\/\d+/i.test(body); + const hasUpstreamIssueLink = /https:\/\/github\.com\/JustAGhosT\/retort\/issues\/\d+/i.test(body); if (!hasUpstreamIssueLink) { core.setFailed( 'This PR modifies .agentkit/** and must include an upstream issue link in the PR body.\n' + - 'Required format example: https://github.com/JustAGhosT/agentkit-forge/issues/170' + 'Required format example: https://github.com/JustAGhosT/retort/issues/170' ); return; } diff --git a/.github/workflows/breaking-change-detection.yml b/.github/workflows/breaking-change-detection.yml index e14d10bc..1192b9d0 100644 --- a/.github/workflows/breaking-change-detection.yml +++ b/.github/workflows/breaking-change-detection.yml @@ -1,5 +1,8 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # # Detects potential breaking changes in PRs by analyzing version files, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df8fcdfe..23d66558 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: AgentKit Forge CI +name: Retort CI on: push: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e211b410..1c9a00bf 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,10 +1,14 @@ name: CodeQL on: + # Reduced to weekly + manual to cut GitHub Actions costs + # Was running on every push/PR including Renovate bot push: - branches: [main] + branches: + - main pull_request: - branches: [main] + branches: + - main schedule: - cron: '0 6 * * 1' workflow_dispatch: @@ -17,10 +21,10 @@ permissions: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true - jobs: analyze: name: analyze-javascript + if: github.actor != 'renovate[bot]' runs-on: self-hosted strategy: fail-fast: false diff --git a/.github/workflows/coverage-report.yml b/.github/workflows/coverage-report.yml index fcef4885..77afd5ab 100644 --- a/.github/workflows/coverage-report.yml +++ b/.github/workflows/coverage-report.yml @@ -1,5 +1,8 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # # Collects code coverage from test runs and reports regressions on PRs. diff --git a/.github/workflows/dependency-audit.yml b/.github/workflows/dependency-audit.yml index 9eaa1041..89461b35 100644 --- a/.github/workflows/dependency-audit.yml +++ b/.github/workflows/dependency-audit.yml @@ -1,5 +1,8 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # # Non-blocking dependency audit. Runs when lockfiles or manifests change. diff --git a/.github/workflows/documentation-quality.yml b/.github/workflows/documentation-quality.yml index e59f5df1..722f37d4 100644 --- a/.github/workflows/documentation-quality.yml +++ b/.github/workflows/documentation-quality.yml @@ -1,5 +1,8 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # # Lints and validates documentation quality for history records. diff --git a/.github/workflows/documentation-validation.yml b/.github/workflows/documentation-validation.yml index 104fb536..9918c180 100644 --- a/.github/workflows/documentation-validation.yml +++ b/.github/workflows/documentation-validation.yml @@ -1,5 +1,8 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # # Validates documentation requirements and structure on pull requests. diff --git a/.github/workflows/issue-label-validation.yml b/.github/workflows/issue-label-validation.yml index 1ad0b984..36a34d91 100644 --- a/.github/workflows/issue-label-validation.yml +++ b/.github/workflows/issue-label-validation.yml @@ -227,7 +227,7 @@ jobs: 'Please edit this issue and select valid options from the dropdowns.', '', '---', - '*This check is automated by AgentKit Forge issue field validation.*' + '*This check is automated by Retort issue field validation.*' ].join('\n'); await github.rest.issues.createComment({ diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml index 178b0372..0f37bb61 100644 --- a/.github/workflows/pr-validation.yml +++ b/.github/workflows/pr-validation.yml @@ -1,5 +1,8 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # # Validates PR changes: Terraform formatting, shell script linting, and diff --git a/.github/workflows/retrospective-quality.yml b/.github/workflows/retrospective-quality.yml index 9e62afdf..3d288da4 100644 --- a/.github/workflows/retrospective-quality.yml +++ b/.github/workflows/retrospective-quality.yml @@ -1,5 +1,8 @@ +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort +# Regenerate: pnpm -C .agentkit agentkit:sync # GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # # Non-blocking CI job that validates retrospective records (issues and lessons). diff --git a/.github/workflows/template-protection.yml b/.github/workflows/template-protection.yml index 7b89d9fa..8847d862 100644 --- a/.github/workflows/template-protection.yml +++ b/.github/workflows/template-protection.yml @@ -40,9 +40,9 @@ jobs: with: script: | const body = [ - '## AgentKit Forge Source Change Detected', + '## Retort Source Change Detected', '', - 'This PR modifies files in the AgentKit Forge source directories:', + 'This PR modifies files in the Retort source directories:', '- `.agentkit/templates/` — output templates', '- `.agentkit/spec/` — YAML specifications', '- `.agentkit/engines/` — sync engine code', @@ -69,7 +69,7 @@ jobs: }); const existing = comments.data.find(c => - c.body.includes('AgentKit Forge Source Change Detected') + c.body.includes('Retort Source Change Detected') ); if (!existing) { diff --git a/.gitignore b/.gitignore index b5bdfa73..27377406 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ temp_benchmark/ temp_discover_benchmark/ .benchmark/ bench-temp/ +.claude/worktrees/ diff --git a/.gitmessage b/.gitmessage index 6a267d2c..81ffc7af 100644 --- a/.gitmessage +++ b/.gitmessage @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # <type>(<scope>): <short description> # diff --git a/.roadmap.yaml b/.roadmap.yaml new file mode 100644 index 00000000..3ad51ec2 --- /dev/null +++ b/.roadmap.yaml @@ -0,0 +1,37 @@ +version: "1.0" +scope: roadmap +repo: phoenixvc/retort +updated_at: 2026-03-18 + +tasks: + - id: repo-rename + title: "Rename retort (avoid Google ADK / Coinbase Retort collision)" + description: "173 stars. agent-forge = independent open-source identity. phoenix-forge = Phoenix-branded. Decision must happen before 500+ stars to minimise redirect confusion." + priority: high + status: todo + quarter: "2026-Q2" + tags: [naming, brand, strategy] + + - id: agents-hub-overlay + title: "agents-hub overlay — port Mystira .agents/ pattern as syncable template" + description: "Extract session-startup skill, end-session lifecycle, users/ system, hookify guards into an overlay that agentkit:sync can deploy to any repo. Phase 5 of agent-consolidation roadmap." + priority: medium + status: todo + quarter: "2026-Q2" + tags: [agent, portability, template] + depends_on: [phoenixvc/mystira-workspace#agent-infra-enhancement] + + - id: mcp-integration + title: "Add /mcp/ endpoint (Tier 1 project MCP)" + priority: medium + status: todo + quarter: "2026-Q3" + tags: [mcp, agent] + depends_on: [phoenixvc/org-meta#mcp-ecosystem-build] + + - id: ai-gateway-connect + title: "Route retort agent calls through ai-gateway for cost tracking" + priority: low + status: todo + quarter: "2026-Q3" + tags: [ai-gateway, cost-ops] diff --git a/.todo.yaml b/.todo.yaml new file mode 100644 index 00000000..3060a36c --- /dev/null +++ b/.todo.yaml @@ -0,0 +1,19 @@ +version: "1.0" +scope: todo +repo: phoenixvc/retort +updated_at: 2026-03-18 + +tasks: + - id: rename-decision + title: "Decide rename: agent-forge vs phoenix-forge (or keep retort)" + description: "173 stars. Collides with Google ADK and Coinbase Retort. agent-forge = independent product, phoenix-forge = Phoenix-branded. Decide before 500+ stars." + priority: high + status: todo + tags: [naming, brand, strategy] + + - id: agents-hub-portability + title: "Extract Mystira .agents/ skeleton as Retort overlay template" + description: "Target: .agentkit/overlays/agents-hub/. Makes session-startup, end-session, skill-discovery portable via agentkit:sync." + priority: medium + status: todo + tags: [agent, portability, template] diff --git a/.vscode/settings.json b/.vscode/settings.json index 7c6c237d..0acb4939 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -91,7 +91,7 @@ "menu.separatorBackground": "#18232A" }, "_agentkit_theme": { - "brand": "AgentKit Forge", + "brand": "Retort", "mode": "both", "scheme": "dark", "tier": "full", diff --git a/.windsurf/commands/cicd-optimize.md b/.windsurf/commands/cicd-optimize.md new file mode 100644 index 00000000..49665f13 --- /dev/null +++ b/.windsurf/commands/cicd-optimize.md @@ -0,0 +1,99 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-20 --> +<!-- Format: Plain Markdown. Windsurf command template. --> +<!-- Docs: https://docs.windsurf.com/windsurf/cascade --> + +# /cicd-optimize — CI/CD pipeline and local hook optimizer. Audits GitHub Actions workflows, pre-commit/stop hooks, and test configurations for speed bottlenecks. Identifies caching gaps, sequential jobs that could parallelize, missing path filters, redundant installs, and slow hook steps. Produces a prioritized list of improvements with estimated time savings per fix. + +## When to Use + +Invoke this command when the user requests or implies the +`cicd-optimize` operation. + +## Purpose + +CI/CD pipeline and local hook optimizer. Audits GitHub Actions workflows, pre-commit/stop hooks, and test configurations for speed bottlenecks. Identifies caching gaps, sequential jobs that could parallelize, missing path filters, redundant installs, and slow hook steps. Produces a prioritized list of improvements with estimated time savings per fix. + +## Role + +You are the **CI/CD Optimization Agent**. Analyse this project's CI/CD pipelines and local hooks for speed bottlenecks. Produce a prioritized report with concrete, copy-paste-ready fixes. + +## Step 1 — Inventory + +Collect all CI/CD surface area: + +- `.github/workflows/*.yml` — list each workflow, its triggers, jobs, and steps +- `.claude/hooks/` — list each hook file and its purpose +- `package.json` scripts: `lint`, `test`, `build`, `typecheck` +- Test framework config: `vitest.config.*`, `jest.config.*`, `pytest.ini`, `Cargo.toml [profile.test]` +- Lock files: `pnpm-lock.yaml`, `Cargo.lock`, `poetry.lock` + +## Step 2 — Bottleneck Detection + +For each workflow, check: + +### Caching + +- [ ] Node modules cached? (`actions/cache` with `node_modules` or `pnpm store`) +- [ ] Cargo registry cached? (`~/.cargo/registry` and `target/`) +- [ ] pip/poetry cached? (`~/.cache/pip`) +- [ ] Docker layer cache used? (`cache-from: type=gha`) + +### Parallelization + +- [ ] Jobs that depend on each other but don't need to — should they be parallel? +- [ ] Test suites that could use matrix strategy or `--pool` (vitest), `pytest-xdist`, `cargo nextest` +- [ ] Lint and typecheck run sequentially when they're independent + +### Trigger efficiency + +- [ ] Workflows triggered on `push` to all branches — should use `paths:` filters +- [ ] PR workflows trigger on `push` AND `pull_request` — often redundant +- [ ] Scheduled workflows running more frequently than needed + +### Install efficiency + +- [ ] `npm install` / `pnpm install` without `--frozen-lockfile` (slower) +- [ ] Install steps duplicated across jobs (should use artifacts or caching) +- [ ] `node_modules` copied between jobs instead of restored from cache + +### Hook efficiency + +- [ ] Stop hook runs tests or full builds (should be lint-only with file-change gating) +- [ ] Pre-commit hook runs expensive operations without caching +- [ ] Hooks run regardless of which files changed + +## Step 3 — Test Suite Speed + +Check for parallelization opportunities: + +- vitest: `--pool=threads` or `--pool=forks`, `--reporter=verbose` adding noise +- pytest: `pytest-xdist` (`-n auto`), test isolation issues +- cargo: `cargo nextest` (2-3x faster than `cargo test`) +- jest: `--maxWorkers` configuration + +## Step 4 — Report + +Produce a table sorted by estimated time savings (highest first): + +| # | Area | Issue | Fix | Est. saving | +| --- | ---- | ----- | --- | ----------- | +| 1 | ... | ... | ... | ~Xs per run | + +Then provide **Ready-to-apply fixes** — code blocks for each high-impact change, in order. For workflow changes, show the exact YAML diff. For hook changes, show the exact shell change. For config changes, show the file and the new content. + +## Rules + +1. Only suggest changes with clear, measurable benefit. Skip micro-optimisations. +2. Preserve correctness — never suggest removing a cache that would break reproducibility. +3. Flag any changes that require secrets or environment variables. +4. If a fix requires a new dependency (e.g. cargo-nextest), note the install command. + +## Related Commands + +- `/orchestrate` — Full lifecycle coordination (uses this command as a phase) +- `/plan` — Structured planning before implementation +- `/project-review` — Comprehensive project audit +- See `COMMAND_GUIDE.md` for when to choose each command diff --git a/.windsurf/commands/handoff.md b/.windsurf/commands/handoff.md index 11203158..a49b2b75 100644 --- a/.windsurf/commands/handoff.md +++ b/.windsurf/commands/handoff.md @@ -1,7 +1,7 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -<!-- generated_by: agentkit-forge | last_model: sync-engine | last_updated: 2026-03-05 --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-05 --> <!-- Format: Plain Markdown. Windsurf command template. --> <!-- Docs: https://docs.windsurf.com/windsurf/cascade --> diff --git a/.windsurf/commands/healthcheck.md b/.windsurf/commands/healthcheck.md index 1de19aee..3ab1906b 100644 --- a/.windsurf/commands/healthcheck.md +++ b/.windsurf/commands/healthcheck.md @@ -1,7 +1,7 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -<!-- generated_by: agentkit-forge | last_model: sync-engine | last_updated: 2026-03-05 --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-05 --> <!-- Format: Plain Markdown. Windsurf command template. --> <!-- Docs: https://docs.windsurf.com/windsurf/cascade --> diff --git a/.windsurf/commands/init.md b/.windsurf/commands/init.md new file mode 100644 index 00000000..460ec08d --- /dev/null +++ b/.windsurf/commands/init.md @@ -0,0 +1,68 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-20 --> +<!-- Format: Plain Markdown. Windsurf command template. --> +<!-- Docs: https://docs.windsurf.com/windsurf/cascade --> + +# /init — Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing. + +## When to Use + +Invoke this command when the user requests or implies the +`init` operation. + +## Purpose + +Initialise the current repository as a Retort project. Runs the interactive setup wizard to detect the tech stack, select language kits, choose AI tools, and generate the initial project.yaml and overlay configuration. Supports --dry-run to preview without writing. + +## Role + +You are the **Init Agent**. Guide users through initialising a new Retort project in the current repository. + +## How to Initialise + +Run the init command from the repository root: + +```bash +node .agentkit/engines/node/src/cli.mjs init +``` + +Or if pnpm is available: + +```bash +pnpm -C .agentkit agentkit:init +``` + +## Flags + +| Flag | Effect | +| ------------------- | ------------------------------------------------------ | +| `--dry-run` | Show what would be generated without writing any files | +| `--non-interactive` | Skip prompts, use auto-detected defaults | +| `--preset <name>` | Use a preset: minimal, full, team, infra | +| `--force` | Overwrite existing overlay configuration | +| `--repoName <name>` | Override the detected repository name | + +## Kit Selection + +During interactive init, Retort detects your tech stack and shows which +language kits will be activated (typescript, dotnet, rust, python, blockchain). +Universal kits (security, testing, git-workflow, documentation, ci-cd, +dependency-management, agent-conduct) are always included. + +Optional kits (iac, finops, ai-cost-ops) are presented for explicit opt-in. + +## Post-Init + +1. Review the generated `spec/project.yaml` — fill in any `null` fields +2. Run `/sync` to regenerate all AI tool configurations +3. Run `/validate` to verify generated outputs are well-formed +4. Commit both the spec and generated outputs together + +## Related Commands + +- `/orchestrate` — Full lifecycle coordination (uses this command as a phase) +- `/plan` — Structured planning before implementation +- `/project-review` — Comprehensive project audit +- See `COMMAND_GUIDE.md` for when to choose each command diff --git a/.windsurf/commands/project-review.md b/.windsurf/commands/project-review.md index 814dad00..5357cb7e 100644 --- a/.windsurf/commands/project-review.md +++ b/.windsurf/commands/project-review.md @@ -1,7 +1,7 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -<!-- generated_by: agentkit-forge | last_model: sync-engine | last_updated: 2026-03-05 --> +<!-- generated_by: retort | last_model: sync-engine | last_updated: 2026-03-05 --> <!-- Format: Plain Markdown. Windsurf command template. --> <!-- Docs: https://docs.windsurf.com/windsurf/cascade --> diff --git a/.windsurf/settings.json b/.windsurf/settings.json index 95cb789e..0122b43d 100644 --- a/.windsurf/settings.json +++ b/.windsurf/settings.json @@ -79,7 +79,7 @@ "menu.separatorBackground": "#18232A" }, "_agentkit_theme": { - "brand": "AgentKit Forge", + "brand": "Retort", "mode": "both", "scheme": "dark", "tier": "full", diff --git a/.windsurf/workflows/full-assessment.yml b/.windsurf/workflows/full-assessment.yml index b384ac7a..1392da29 100644 --- a/.windsurf/workflows/full-assessment.yml +++ b/.windsurf/workflows/full-assessment.yml @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync name: full-assessment description: 'Run complete codebase assessment' diff --git a/.windsurf/workflows/phase-execution.yml b/.windsurf/workflows/phase-execution.yml index ceb93236..9e578027 100644 --- a/.windsurf/workflows/phase-execution.yml +++ b/.windsurf/workflows/phase-execution.yml @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync name: phase-execution description: 'Execute a specific workflow phase' diff --git a/AGENTS.md b/AGENTS.md index 2ee9e781..676d68ee 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,9 +1,9 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# agentkit-forge +# retort -AgentKit Forge framework for multi-tool AI agent team orchestration, sync generation, and quality-gated workflows. +Retort framework for multi-tool AI agent team orchestration, sync generation, and quality-gated workflows. ## Project Context diff --git a/AGENT_TEAMS.md b/AGENT_TEAMS.md index 83313985..a3af0062 100644 --- a/AGENT_TEAMS.md +++ b/AGENT_TEAMS.md @@ -1,8 +1,8 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Agent Teams — agentkit-forge +# Agent Teams — retort > Repo-local team mapping derived from `.agentkit/spec/teams.yaml`. > Customize the **Status**, **Primary Scope**, **Tech Stack**, and **Lead Agent** @@ -12,7 +12,7 @@ ## Overview -This document maps the canonical AgentKit team definitions (see +This document maps the canonical Retort team definitions (see [UNIFIED_AGENT_TEAMS.md](./UNIFIED_AGENT_TEAMS.md)) to the concrete structure of this repository. Not all teams may be active — mark inactive teams so the orchestrator skips them during dispatch. diff --git a/CHANGELOG.md b/CHANGELOG.md index 02e52678..eb9e65fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Changelog — agentkit-forge +# Changelog — retort All notable changes to this project will be documented in this file. @@ -17,8 +17,9 @@ Activate the commit template: `git config commit.template .gitmessage` ## [Unreleased] ### Added +- Kit-based domain selection and onboarding redesign ([#432](../../pull/432), [history](implementations/0001-2026-03-20-kit-based-domain-selection-and-onboarding-redesign-implementation.md)) -- Initial AgentKit Forge integration (v3.1.0) +- Initial Retort integration (v3.1.0) - Multi-agent team framework with 10 teams - 5-phase lifecycle orchestration model - Support for Claude Code, Cursor, Windsurf, Copilot, and MCP/A2A @@ -39,6 +40,6 @@ Activate the commit template: `git config commit.template .gitmessage` --- -_Maintained by AgentKit Forge. Update this file as part of the Ship phase._ +_Maintained by Retort. Update this file as part of the Ship phase._ _For significant changes, also create a history document: `./scripts/create-doc.sh <type> "<title>" <pr>`_ _See [Changelog Best Practices](docs/engineering/07_changelog.md) for tooling options._ diff --git a/COMMAND_GUIDE.md b/COMMAND_GUIDE.md index 8c2897a3..58b8f2e8 100644 --- a/COMMAND_GUIDE.md +++ b/COMMAND_GUIDE.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Command Guide — When to Use Which diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b62e6bfb..f75f12e1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contributing to agentkit-forge +# Contributing to retort > Guidelines for contributing to this project, including both human and > AI-assisted development workflows. @@ -81,7 +81,7 @@ Use [Conventional Commits](https://www.conventionalcommits.org/): When using AI agents (Claude Code, Cursor, Copilot, etc.): -- Generated configuration files (marked `GENERATED by AgentKit Forge`) should +- Generated configuration files (marked `GENERATED by Retort`) should not be edited directly — modify the spec and run `agentkit sync` instead - Use `/orchestrate` for multi-team coordination tasks - Use `/check` to validate changes before committing @@ -103,4 +103,4 @@ Key conventions: --- -This guide is maintained by AgentKit Forge. Run `pnpm -C .agentkit agentkit:sync` to regenerate. +This guide is maintained by Retort. Run `pnpm -C .agentkit agentkit:sync` to regenerate. diff --git a/MIGRATIONS.md b/MIGRATIONS.md index 31ca4a88..32f490f7 100644 --- a/MIGRATIONS.md +++ b/MIGRATIONS.md @@ -1,10 +1,10 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Migration Guide — agentkit-forge +# Migration Guide — retort -> How to upgrade between AgentKit Forge versions and handle breaking changes. +> How to upgrade between Retort versions and handle breaking changes. --- @@ -20,7 +20,7 @@ ### Standard Upgrade -1. Pull the latest AgentKit Forge changes +1. Pull the latest Retort changes 2. Review the changelog for breaking changes 3. Run `agentkit sync` to regenerate all configs 4. Run `agentkit validate` to verify integrity @@ -41,7 +41,7 @@ When upgrading introduces new spec fields: ### v0.1.0 (Initial) -- Initial release of AgentKit Forge +- Initial release of Retort - Spec-driven config generation for 6 AI tools - 10-team framework with 5-phase lifecycle - Hook-based security guardrails @@ -57,4 +57,4 @@ No breaking changes — this is the initial release. --- -_This guide is maintained by AgentKit Forge. Run `pnpm -C .agentkit agentkit:sync` to regenerate._ +_This guide is maintained by Retort. Run `pnpm -C .agentkit agentkit:sync` to regenerate._ diff --git a/QUALITY_GATES.md b/QUALITY_GATES.md index 92374755..6e1bc584 100644 --- a/QUALITY_GATES.md +++ b/QUALITY_GATES.md @@ -1,8 +1,11 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> <!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Quality Gates — agentkit-forge +# Quality Gates — retort > Definition of done for each lifecycle phase. No work item may advance to the > next phase until all quality gates for the current phase are satisfied. diff --git a/RUNBOOK_AI.md b/RUNBOOK_AI.md index f5e72bab..d203d4d4 100644 --- a/RUNBOOK_AI.md +++ b/RUNBOOK_AI.md @@ -1,4 +1,8 @@ -# AI Runbook — agentkit-forge +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> + +# AI Runbook — retort > Operational runbook for AI agent workflows. Covers common scenarios, > troubleshooting, and recovery procedures. diff --git a/SECURITY.md b/SECURITY.md index 1629d006..c4d5576d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,8 +1,8 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# Security Policy — agentkit-forge +# Security Policy — retort > Security policies, vulnerability reporting, and hardening guidelines > for this repository and its AI agent workflows. @@ -48,7 +48,7 @@ These conventions are enforced by the `security` rule domain ### Hook-based Protection -AgentKit Forge installs hook scripts that guard against common risks: +Retort installs hook scripts that guard against common risks: | Hook | Trigger | Protection | | ------------------------------- | --------------------- | ------------------------------------------------ | @@ -119,4 +119,4 @@ The `validate` command scans for common secret patterns: --- -_This policy is maintained by AgentKit Forge. Run `pnpm -C .agentkit agentkit:sync` to regenerate._ +_This policy is maintained by Retort. Run `pnpm -C .agentkit agentkit:sync` to regenerate._ diff --git a/UNIFIED_AGENT_TEAMS.md b/UNIFIED_AGENT_TEAMS.md index 1cb73678..7d4fb6b8 100644 --- a/UNIFIED_AGENT_TEAMS.md +++ b/UNIFIED_AGENT_TEAMS.md @@ -1,5 +1,8 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> <!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Unified Agent Teams Specification v1.0 diff --git a/agentkit_feedback.md b/agentkit_feedback.md index e9aca564..f82c348f 100644 --- a/agentkit_feedback.md +++ b/agentkit_feedback.md @@ -1,6 +1,6 @@ -# AgentKit Forge Sync Feedback (pvc-costops-analytics) +# Retort Sync Feedback (pvc-costops-analytics) -This document captures practical feedback from using AgentKit Forge v3.1.0 in this repository, with a focus on sync behavior, Windows developer experience, and documentation workflows. +This document captures practical feedback from using Retort v3.1.0 in this repository, with a focus on sync behavior, Windows developer experience, and documentation workflows. ## Summary @@ -82,7 +82,7 @@ Suggestion: - Multi-editor instructions and rules are consistently generated for Claude/Cursor/Windsurf/Copilot. - Documentation structure under `docs/` is scaffolded and kept consistent across runs (when not overridden). -## Recommended next steps (AgentKit) +## Recommended next steps (Retort) - Add official support for repo-local overrides of specific generated docs (e.g., incident response). - Improve unresolved placeholder diagnostics. diff --git a/db/README.md b/db/README.md index 4aa5463f..036128f3 100644 --- a/db/README.md +++ b/db/README.md @@ -1,6 +1,12 @@ +<<<<<<< HEAD +# Database — retort + +This repository (**retort**) is the Retort framework. It has **no database** and no ORM (see root `CLAUDE.md`: Database: none, ORM: none). +======= # Database — agentkit-forge This repository (**agentkit-forge**) is the AgentKit Forge framework. It has **no database** and no ORM (see root `CLAUDE.md`: Database: none, ORM: none). +>>>>>>> origin/main ## For adopters diff --git a/docs/README.md b/docs/README.md index 2456d94e..b2be74b6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,13 @@ +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> +<!-- Regenerate: pnpm -C .agentkit agentkit:sync --> <!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> -# agentkit-forge — Documentation +# retort — Documentation -Welcome to the agentkit-forge documentation hub. This index links to every +Welcome to the retort documentation hub. This index links to every documentation category maintained by this repository. ## Categories @@ -36,7 +39,7 @@ documentation category maintained by this repository. ## Conventions -- Placeholder tokens `agentkit-forge` and `3.1.0` are replaced at sync time. +- Placeholder tokens `retort` and `3.1.0` are replaced at sync time. - Do **not** edit generated files directly — run `pnpm -C .agentkit agentkit:sync` to regenerate them from the AgentKit Forge spec and overlays. diff --git a/docs/agents/README.md b/docs/agents/README.md index f8f7e3cb..1c37f398 100644 --- a/docs/agents/README.md +++ b/docs/agents/README.md @@ -1,6 +1,6 @@ # Agents Documentation -This category catalogs all agent personas, roles, and team mappings for AgentKit Forge. See: +This category catalogs all agent personas, roles, and team mappings for Retort. See: - [catalog.md](catalog.md) diff --git a/docs/api/01_overview.md b/docs/api/01_overview.md index 0fdb3944..f3e260ed 100644 --- a/docs/api/01_overview.md +++ b/docs/api/01_overview.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # API Overview ## Introduction -<!-- Describe the purpose and scope of the agentkit-forge API. --> +<!-- Describe the purpose and scope of the retort API. --> **Base URL:** `https://api.example.com/v1` **Current Version:** 3.1.0 diff --git a/docs/api/02_endpoints.md b/docs/api/02_endpoints.md index 04b9419c..59cc14b8 100644 --- a/docs/api/02_endpoints.md +++ b/docs/api/02_endpoints.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Endpoint Reference diff --git a/docs/api/03_authentication.md b/docs/api/03_authentication.md index 479dccad..b1dc1f0d 100644 --- a/docs/api/03_authentication.md +++ b/docs/api/03_authentication.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Authentication ## Overview -<!-- Describe the authentication strategy used by the agentkit-forge API. --> +<!-- Describe the authentication strategy used by the retort API. --> ## Authentication Methods diff --git a/docs/api/04_examples.md b/docs/api/04_examples.md index df295233..0e2728d1 100644 --- a/docs/api/04_examples.md +++ b/docs/api/04_examples.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # API Examples ## Overview -This document provides practical examples for common agentkit-forge API workflows. +This document provides practical examples for common retort API workflows. ## Prerequisites diff --git a/docs/api/05_errors.md b/docs/api/05_errors.md index 4bfee2f1..c6b07a1f 100644 --- a/docs/api/05_errors.md +++ b/docs/api/05_errors.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # API Errors diff --git a/docs/api/06_versioning.md b/docs/api/06_versioning.md index df77ebcc..b7cde98a 100644 --- a/docs/api/06_versioning.md +++ b/docs/api/06_versioning.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # API Versioning diff --git a/docs/api/07_framework-api-conventions.md b/docs/api/07_framework-api-conventions.md index 590e4ced..2bd134e6 100644 --- a/docs/api/07_framework-api-conventions.md +++ b/docs/api/07_framework-api-conventions.md @@ -1,6 +1,10 @@ # Framework API Conventions (Adopter Guide) +<<<<<<< HEAD +This repository (**retort**) is the Retort framework. It does **not** ship an application API or run an HTTP server. Adopters of the framework implement their own APIs in their repositories. +======= This repository (**agentkit-forge**) is the AgentKit Forge framework. It does **not** ship an application API or run an HTTP server. Adopters of the framework implement their own APIs in their repositories. +>>>>>>> origin/main ## Recommended API Route Structure diff --git a/docs/api/README.md b/docs/api/README.md index e91f44ae..a022da06 100644 --- a/docs/api/README.md +++ b/docs/api/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # API Docs Index diff --git a/docs/architecture/01_overview.md b/docs/architecture/01_overview.md index 6901a95e..a687eabe 100644 --- a/docs/architecture/01_overview.md +++ b/docs/architecture/01_overview.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Architecture Overview ## Introduction -<!-- High-level description of the agentkit-forge architecture. --> +<!-- High-level description of the retort architecture. --> ## Principles @@ -44,7 +44,7 @@ See [diagrams/](./diagrams/) for visual representations. Architecture Decision Records (ADRs) are stored in [decisions/](./decisions/). See -[ADR-01](./decisions/01-adopt-agentkit-forge.md) for the foundational decision. +[ADR-01](./decisions/01-adopt-retort.md) for the foundational decision. ## References diff --git a/docs/architecture/README.md b/docs/architecture/README.md index de2050fe..a2b4a5ed 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Architecture Docs Index diff --git a/docs/architecture/Retort System Connections.png b/docs/architecture/Retort System Connections.png new file mode 100644 index 00000000..b0cd7240 Binary files /dev/null and b/docs/architecture/Retort System Connections.png differ diff --git a/docs/architecture/decisions/02-fallback-policy-tokens-problem.md b/docs/architecture/decisions/02-fallback-policy-tokens-problem.md index 689b4fbc..fadcdbab 100644 --- a/docs/architecture/decisions/02-fallback-policy-tokens-problem.md +++ b/docs/architecture/decisions/02-fallback-policy-tokens-problem.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # ADR-02: Fallback Policy for Missing Evidence Metric @@ -14,9 +14,9 @@ Proposed ## Context -The `agentkit-forge` project uses one or more evidence-driven scoring or gating metrics (for example: cost evidence, telemetry confidence, quality signal confidence). In some workflows, required evidence can be missing at decision time. +The `retort` project uses one or more evidence-driven scoring or gating metrics (for example: cost evidence, telemetry confidence, quality signal confidence). In some workflows, required evidence can be missing at decision time. -Baseline source for this template: the current fallback ADR from `agentkit-forge`. +Baseline source for this template: the current fallback ADR from `retort`. ## Decision @@ -36,4 +36,4 @@ This fallback policy is approved by repository maintainers. ## Scope -Applies to `/infra-eval` scoring dimensions, `/review` quality gates, and related evaluation workflows in `agentkit-forge`. +Applies to `/infra-eval` scoring dimensions, `/review` quality gates, and related evaluation workflows in `retort`. diff --git a/docs/architecture/decisions/03-tooling-strategy.md b/docs/architecture/decisions/03-tooling-strategy.md index b17585b3..ac024b96 100644 --- a/docs/architecture/decisions/03-tooling-strategy.md +++ b/docs/architecture/decisions/03-tooling-strategy.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # ADR-03: Tooling Strategy — Tool Selection @@ -14,9 +14,9 @@ Proposed ## Context -This ADR defines the repository-specific tooling strategy for `agentkit-forge`, balancing delivery speed, quality, security, and dependency governance. +This ADR defines the repository-specific tooling strategy for `retort`, balancing delivery speed, quality, security, and dependency governance. -Baseline source for this template: the current ADR bundle from `agentkit-forge`. +Baseline source for this template: the current ADR bundle from `retort`. Evaluate needs across facets: @@ -77,5 +77,5 @@ Use the current ADR version as a baseline and fill in a repository-specific weig ## References -- [ADR-01: Adopt AgentKit Forge](01-adopt-agentkit-forge.md) +- [ADR-01: Adopt Retort](01-adopt-retort.md) - [Architecture Overview](../01_overview.md) diff --git a/docs/architecture/decisions/04-static-security-analysis-depth-tooling.md b/docs/architecture/decisions/04-static-security-analysis-depth-tooling.md index 38194f2b..47c0f787 100644 --- a/docs/architecture/decisions/04-static-security-analysis-depth-tooling.md +++ b/docs/architecture/decisions/04-static-security-analysis-depth-tooling.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # ADR-04: Static Security Analysis Depth — Tool Selection @@ -14,9 +14,9 @@ Proposed ## Context -This ADR evaluates alternatives for static security analysis depth in `agentkit-forge`. +This ADR evaluates alternatives for static security analysis depth in `retort`. -Baseline source for this template: the current `agentkit-forge` security-depth ADR. +Baseline source for this template: the current `retort` security-depth ADR. Decision scope: diff --git a/docs/architecture/decisions/05-dependency-supply-chain-detection-tooling.md b/docs/architecture/decisions/05-dependency-supply-chain-detection-tooling.md index 10720604..b4daffd3 100644 --- a/docs/architecture/decisions/05-dependency-supply-chain-detection-tooling.md +++ b/docs/architecture/decisions/05-dependency-supply-chain-detection-tooling.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # ADR-05: Dependency and Supply-Chain Detection — Tool Selection @@ -14,9 +14,9 @@ Proposed ## Context -This ADR evaluates dependency and supply-chain detection for package update workflows in `agentkit-forge`. +This ADR evaluates dependency and supply-chain detection for package update workflows in `retort`. -Baseline source for this template: the current `agentkit-forge` dependency ADR. +Baseline source for this template: the current `retort` dependency ADR. Decision scope: diff --git a/docs/architecture/decisions/06-code-quality-maintainability-signal-tooling.md b/docs/architecture/decisions/06-code-quality-maintainability-signal-tooling.md index a1a8416d..fb7fe613 100644 --- a/docs/architecture/decisions/06-code-quality-maintainability-signal-tooling.md +++ b/docs/architecture/decisions/06-code-quality-maintainability-signal-tooling.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # ADR-06: Code Quality and Maintainability Signal — Tool Selection @@ -14,9 +14,9 @@ Proposed ## Context -This ADR evaluates tooling for maintainability signal and code quality feedback in `agentkit-forge`. +This ADR evaluates tooling for maintainability signal and code quality feedback in `retort`. -Baseline source for this template: the current `agentkit-forge` quality ADR. +Baseline source for this template: the current `retort` quality ADR. Decision scope: diff --git a/docs/architecture/decisions/07-delivery-strategy.md b/docs/architecture/decisions/07-delivery-strategy.md index 39e9225b..fbabdc16 100644 --- a/docs/architecture/decisions/07-delivery-strategy.md +++ b/docs/architecture/decisions/07-delivery-strategy.md @@ -1,4 +1,4 @@ -# ADR-07: Delivery Strategy (Refined) — AgentKit Forge Distribution +# ADR-07: Delivery Strategy (Refined) — Retort Distribution ## Status @@ -10,7 +10,7 @@ ## Context -AgentKit Forge, a core platform for deploying mesh-native agents at scale, faces rising friction in delivering updates, onboarding new customers, and supporting diverse consumption models. Historically, Forge delivery methods lagged industry and developer best practices, relying on manual binary distribution and ad hoc integrations. This produced pain for both CLI-first engineers and UI-oriented operators, delayed onboarding, and created avoidable support overhead amid growing cloud-native adoption. +Retort, a core platform for deploying mesh-native agents at scale, faces rising friction in delivering updates, onboarding new customers, and supporting diverse consumption models. Historically, Forge delivery methods lagged industry and developer best practices, relying on manual binary distribution and ad hoc integrations. This produced pain for both CLI-first engineers and UI-oriented operators, delayed onboarding, and created avoidable support overhead amid growing cloud-native adoption. **Executive Summary:** Market analysis, customer interviews, and operational metrics all highlight these delivery inefficiencies as blockers for broader adoption and hamper ecosystem integration efforts. To support customer GTM targets for Q3–Q4 2024—especially for mid-market and enterprise cohorts—Forge must move to a modern, multi-modal distribution model. This ADR formalizes the shift to three distribution mechanisms: npm (modern package distribution), GitHub Actions (automation-centric CI/CD), and PWA (progressive web onboarding), providing consistency, reliability, and seamless migration for varied user segments. @@ -22,7 +22,7 @@ The forge repository is added as a git submodule at `.agentkit/`. All specs, tem **How it works today:** ```bash -git submodule add https://github.com/org/agentkit-forge.git .agentkit +git submodule add https://github.com/org/retort.git .agentkit pnpm -C .agentkit install node .agentkit/engines/node/src/cli.mjs init --repoName my-project node .agentkit/engines/node/src/cli.mjs sync @@ -30,14 +30,14 @@ node .agentkit/engines/node/src/cli.mjs sync ### Option B: npm Package with CLI -Publish agentkit-forge as an npm package (`agentkit-forge`). The consumer installs it as a devDependency. The CLI is exposed via `npx agentkit-forge <command>`. Specs and templates ship inside the package. Overlays remain in the consumer repo. +Publish retort as an npm package (`retort`). The consumer installs it as a devDependency. The CLI is exposed via `npx retort <command>`. Specs and templates ship inside the package. Overlays remain in the consumer repo. **Consumer workflow:** ```bash -npm install -D agentkit-forge -npx agentkit-forge init --repoName my-project -npx agentkit-forge sync +npm install -D retort +npx retort init --repoName my-project +npx retort sync ``` **Overlay location:** `.agentkit/overlays/<repoName>/` (same as today, but the engine and templates come from `node_modules/`). @@ -49,8 +49,8 @@ Publish a lightweight CLI tool that fetches templates and specs on demand from a **Consumer workflow:** ```bash -npx agentkit-forge@latest init --repoName my-project -npx agentkit-forge@latest sync +npx retort@latest init --repoName my-project +npx retort@latest sync ``` **Key difference from Option B:** no `devDependency` entry, no `node_modules/` footprint. The tool is ephemeral — invoked when needed, not installed permanently. @@ -63,7 +63,7 @@ Deliver the forge as a GitHub Action. Sync runs in CI on push/PR, and generated ```yaml # .github/workflows/agentkit-sync.yml -- uses: org/agentkit-forge-action@v3 +- uses: org/retort-action@v3 with: overlay: my-project version: '3.4.0' @@ -71,23 +71,23 @@ Deliver the forge as a GitHub Action. Sync runs in CI on push/PR, and generated ### Option E: Template Repository + Upstream Sync -Publish agentkit-forge as a GitHub template repository. Consumers create repos from the template. Updates are pulled via `git merge` from the upstream template remote. +Publish retort as a GitHub template repository. Consumers create repos from the template. Updates are pulled via `git merge` from the upstream template remote. **Consumer workflow:** ```bash # Initial -gh repo create my-project --template org/agentkit-forge-template +gh repo create my-project --template org/retort-template # Update -git remote add forge-upstream https://github.com/org/agentkit-forge-template.git +git remote add forge-upstream https://github.com/org/retort-template.git git fetch forge-upstream git merge forge-upstream/main --allow-unrelated-histories ``` ### Option F: Hybrid — npm Package + GitHub Action -Combine Options B and D. The npm package handles local development (`npx agentkit-forge sync`). The GitHub Action handles CI enforcement (drift detection, auto-sync on version bumps). Both share the same engine and templates from the npm package. +Combine Options B and D. The npm package handles local development (`npx retort sync`). The GitHub Action handles CI enforcement (drift detection, auto-sync on version bumps). Both share the same engine and templates from the npm package. ### Option G: PWA / Lightweight Desktop UI @@ -107,7 +107,7 @@ Wrap the forge engine in a small UI shell — either a Progressive Web App (serv │ │ Manager │ │ (add/remove) │ │ │ └───────────┘ └────────────────┘ │ ├─────────────────────────────────────┤ -│ agentkit-forge engine (npm pkg) │ +│ retort engine (npm pkg) │ │ specs ─► templates ─► outputs │ └─────────────────────────────────────┘ ``` @@ -115,7 +115,7 @@ Wrap the forge engine in a small UI shell — either a Progressive Web App (serv **Consumer workflow (PWA):** ```bash -npx agentkit-forge ui # launches localhost:4827 +npx retort ui # launches localhost:4827 # Browser opens → visual wizard for init, overlay editing, sync ``` @@ -123,8 +123,8 @@ npx agentkit-forge ui # launches localhost:4827 ```bash # Download from releases page or: -brew install agentkit-forge # macOS -winget install agentkit-forge # Windows +brew install retort # macOS +winget install retort # Windows # Open app → point at repo → visual init + sync ``` @@ -241,7 +241,7 @@ All legacy/manual mechanisms to be deprecated by end of Q3 2024. ### CLI-First Personas -**Install AgentKit Forge via npm:** +**Install Retort via npm:** | Layer | Audience | Problem it solves | | -------------------- | ---------- | ------------------------------------------------------ | | **npm package** | Developers | Local sync, version pinning, offline support | @@ -256,10 +256,10 @@ All legacy/manual mechanisms to be deprecated by end of Q3 2024. - `src/` — CLI entry point and engine (currently `engines/node/src/`) - `templates/` — all Mustache templates - `spec/` — canonical YAML specs - - `bin/agentkit-forge` — CLI binary entry point + - `bin/retort` — CLI binary entry point 2. **Add `package.json`** with: - - `"name": "agentkit-forge"` - - `"bin": { "agentkit-forge": "./bin/agentkit-forge" }` + - `"name": "retort"` + - `"bin": { "retort": "./bin/retort" }` - `"files": ["src/", "templates/", "spec/", "bin/"]` 3. **Update the sync engine** to resolve templates/specs from the package installation path (`import.meta.resolve` or `require.resolve`) instead of relative `../../` paths. 4. **Preserve overlay location** at `.agentkit/overlays/<repoName>/` in the consumer repo — this directory is the only forge artifact that lives in the consumer repo. @@ -269,7 +269,7 @@ All legacy/manual mechanisms to be deprecated by end of Q3 2024. 1. **Create `action.yml`** that: - Installs the npm package at the specified version. - - Runs `agentkit-forge sync` with the consumer's overlay. + - Runs `retort sync` with the consumer's overlay. - Compares generated outputs against committed files (drift detection). - Fails the check if drift is detected (with a diff summary). 2. **Add an optional auto-commit mode** for repos that want CI to keep outputs in sync automatically. @@ -277,7 +277,7 @@ All legacy/manual mechanisms to be deprecated by end of Q3 2024. #### Phase 3 — Migration (weeks 5–7) -1. **Write a migration script** (`agentkit-forge migrate-from-submodule`) that: +1. **Write a migration script** (`retort migrate-from-submodule`) that: - Reads the current overlay from `.agentkit/overlays/`. - Removes the git submodule. - Installs the npm package. @@ -288,7 +288,7 @@ All legacy/manual mechanisms to be deprecated by end of Q3 2024. #### Phase 4 — PWA / Desktop UI (weeks 7–12) 1. **Choose the shell framework:** - - **PWA (recommended first)** — lower build/distribution overhead. Ship as `npx agentkit-forge ui` which starts a local server on `localhost:4827`. Uses a lightweight framework (Preact, Svelte, or plain web components). Runs in any browser. No app store, no code signing, no platform-specific builds. + - **PWA (recommended first)** — lower build/distribution overhead. Ship as `npx retort ui` which starts a local server on `localhost:4827`. Uses a lightweight framework (Preact, Svelte, or plain web components). Runs in any browser. No app store, no code signing, no platform-specific builds. - **Tauri (follow-up)** — for teams that want a native app experience. Wraps the same web UI. Smaller binary than Electron (~5 MB vs ~150 MB). Auto-updater built in. Distribute via GitHub Releases, Homebrew, or winget. 2. **Core UI screens:** - **Init wizard** — repo name, tech stack detection (from `discover`), render target selection via checkboxes, overlay creation. @@ -298,8 +298,8 @@ All legacy/manual mechanisms to be deprecated by end of Q3 2024. - **Health report** — visual rendering of `doctor` and `healthcheck` output. Red/amber/green status per check. 3. **API boundary** — the UI communicates with the forge engine via a thin JSON-RPC or REST layer over the local server. No direct file system access from the browser. The same API can be consumed by IDE extensions later. 4. **Distribution:** - - PWA: `npx agentkit-forge ui` (zero install, opens browser). - - Tauri: GitHub Releases with `brew install agentkit-forge` / `winget install agentkit-forge`. + - PWA: `npx retort ui` (zero install, opens browser). + - Tauri: GitHub Releases with `brew install retort` / `winget install retort`. - Both auto-update when the underlying npm package updates. ### Consumer Experience After Migration @@ -307,7 +307,7 @@ All legacy/manual mechanisms to be deprecated by end of Q3 2024. **Developer (CLI-first):** ```bash -npm install -g agentkit-forge +npm install -g retort ``` - Immediate CLI and SDK access with autoupdate support @@ -329,14 +329,14 @@ Day-zero onboarding: minimal manual steps, rapid path to first agent deployed or **Non-developer / visual preference (UI):** ```bash -npx agentkit-forge ui +npx retort ui # Browser opens → visual wizard → click through init → toggle tools → sync ``` **Or with the desktop app:** ``` -1. Open AgentKit Forge app +1. Open Retort app 2. Click "Open Repo" → select project folder 3. Visual wizard detects stack, suggests render targets 4. Click "Sync" → see diff of generated files @@ -384,7 +384,7 @@ Adopting the Hybrid model unlocks growth and developer satisfaction, at the cost ## References -- AgentKit Forge Architectural Overview (Doc A1-Overview.pdf) +- Retort Architectural Overview (Doc A1-Overview.pdf) - CI/CD Integration Guide - Ecosystem Compatibility Matrix - Internal Security and Audit Policy @@ -393,7 +393,7 @@ Adopting the Hybrid model unlocks growth and developer satisfaction, at the cost - [PRD-007: Adopter Autoupdate](../../product/PRD-007-adopter-autoupdate.md) — follow-up capability building on the npm CLI distribution channel defined in this ADR; specifically the "Immediate CLI and SDK access with autoupdate support" requirement from the Consumer Experience section. -- [#196: adoption/startup-hooks: enforce required CLI toolchain availability](https://github.com/phoenixvc/agentkit-forge/issues/196) +- [#196: adoption/startup-hooks: enforce required CLI toolchain availability](https://github.com/phoenixvc/retort/issues/196) — prerequisite for the autoupdate preflight checks. -- [#194: governance: enforce agentkit sync pre-PR for adopters](https://github.com/phoenixvc/agentkit-forge/issues/194) +- [#194: governance: enforce agentkit sync pre-PR for adopters](https://github.com/phoenixvc/retort/issues/194) — sync enforcement gate that autoupdate must satisfy. diff --git a/docs/architecture/decisions/08-directive-classification-type-and-phase.md b/docs/architecture/decisions/08-directive-classification-type-and-phase.md index f0e9e706..a476303e 100644 --- a/docs/architecture/decisions/08-directive-classification-type-and-phase.md +++ b/docs/architecture/decisions/08-directive-classification-type-and-phase.md @@ -10,7 +10,7 @@ ## Context -AgentKit Forge's `rules.yaml` defines ~90 conventions across 14 domains. All +Retort's `rules.yaml` defines ~90 conventions across 14 domains. All conventions carry a `severity` field (critical / error / warning / info), but severity alone conflates two concerns: @@ -154,4 +154,4 @@ conventions: - [rules.yaml](../../../.agentkit/spec/rules.yaml) — canonical rule definitions - [spec-validator.mjs](../../../.agentkit/engines/node/src/spec-validator.mjs) — schema validation - [synchronize.mjs](../../../.agentkit/engines/node/src/synchronize.mjs) — template rendering -- [ADR-01: Adopt AgentKit Forge](./01-adopt-agentkit-forge.md) +- [ADR-01: Adopt Retort](./01-adopt-retort.md) diff --git a/docs/architecture/decisions/08-expansion-analyst-agent.md b/docs/architecture/decisions/08-expansion-analyst-agent.md index 6c3e166c..4b183de5 100644 --- a/docs/architecture/decisions/08-expansion-analyst-agent.md +++ b/docs/architecture/decisions/08-expansion-analyst-agent.md @@ -10,7 +10,7 @@ ## Context -AgentKit Forge has excellent execution infrastructure — orchestrator, task protocol, +Retort has excellent execution infrastructure — orchestrator, task protocol, team routing, review gates, handoff chains — but lacks a strategic analysis layer that identifies **what is missing** from a repository. The discovery engine reports what exists; nothing systematically identifies gaps in documentation, testing, diff --git a/docs/architecture/decisions/08-issue-sync-strategy.md b/docs/architecture/decisions/08-issue-sync-strategy.md index 34fdaeda..14f8c849 100644 --- a/docs/architecture/decisions/08-issue-sync-strategy.md +++ b/docs/architecture/decisions/08-issue-sync-strategy.md @@ -127,4 +127,4 @@ can pass `--label` for additional labels. - [docs/history/issues/README.md](../../history/issues/README.md) - [docs/history/README.md](../../history/README.md) - [scripts/sync-issues.sh](../../../scripts/sync-issues.sh) -- [ADR-01: Adopt AgentKit Forge](./01-adopt-agentkit-forge.md) +- [ADR-01: Adopt Retort](./01-adopt-retort.md) diff --git a/docs/architecture/decisions/10-tool-neutral-agent-hub.md b/docs/architecture/decisions/10-tool-neutral-agent-hub.md new file mode 100644 index 00000000..0e682fd0 --- /dev/null +++ b/docs/architecture/decisions/10-tool-neutral-agent-hub.md @@ -0,0 +1,69 @@ +# ADR-10: Adopt Tool-Neutral `.agents/` Hub Pattern + +**Status:** Proposed +**Date:** 2026-03-17 +**Deciders:** JustAGhosT +**Related:** [Findings Report](../specs/tool-neutral-agent-hub-findings.md), [Multi-IDE Plugin Plan](../../../.claude/projects/C--Users-smitj-repos-agentkit-forge/memory/project_multi_ide_plugin_plan.md) + +## Context + +AgentKit Forge currently generates tool-specific configuration into isolated directories (`.claude/`, `.cursor/`, `.github/instructions/`, `.gemini/`, etc.). Each tool gets its own copy of agents, rules, commands, and skills. This creates two problems: + +1. **No shared discovery layer.** An agent running in Cursor cannot read Claude's agent personas. An agent in Gemini cannot consume Claude's skills. Cross-tool collaboration requires reading another tool's proprietary directory format. + +2. **Governance is platform-coupled.** Enforcement hooks (`.claude/hooks/`) are shell scripts that only work for tools executing through a shell. Browser agents, API agents, and sandboxed environments bypass all governance. + +The Mystira.workspace project independently developed a `.agents/` directory pattern that addresses both problems through a tool-neutral hub with reflective guards. + +## Decision + +Adopt the `.agents/` directory as a **first-class sync output target** in AgentKit Forge, alongside existing tool-specific directories. + +### Directory Structure + +``` +.agents/ # Tool-neutral hub (NEW) + guards/ # Governance rules (portable) + skills/ # Shared skills (tool-agnostic) + traces/ # Cross-session reasoning context + roadmaps/ # Strategic multi-session goals + .readme.yaml # Directory metadata + +.claude/ # Claude-specific (existing, slimmed) + hooks/ # Platform hooks (generated from guards) + settings.json # Claude permissions + state/ # Runtime state (unchanged) + +.cursor/, .gemini/, etc. # Other tools (existing, slimmed) + rules/ # Platform-specific rule format only +``` + +### Principles + +1. **`.agents/` is the canonical shared layer.** Any content readable by multiple agent tools lives here. +2. **Tool-specific dirs become thin wrappers.** They contain only platform hooks, permissions, and format-specific adaptations. +3. **Guards are the canonical governance source.** Shell hooks are generated from guard definitions for tools that support automated enforcement. +4. **The sync engine owns `.agents/`.** It is generated from `.agentkit/spec/` — not hand-authored — preserving the spec-driven architecture. + +## Consequences + +### Positive + +- Any agent from any tool can discover shared agents, skills, guards, and roadmaps by reading `.agents/` +- Governance becomes portable — guards work for shell-based, browser-based, and API-based agents +- Cross-session continuity improves via traces and roadmaps +- Token cost decreases — agents read one shared location instead of parsing tool-specific dirs +- Path toward an industry convention for multi-agent repository configuration + +### Negative + +- Sync engine must generate an additional output target (development effort) +- Existing tool-specific content must be migrated or deduplicated (one-time cost) +- Projects already using `.agents/` for other purposes (rare) would conflict +- Guard "reflective enforcement" is weaker than hook-based enforcement — trust gap for non-cooperative agents + +### Neutral + +- `.agentkit/spec/` remains the single source of truth — no change to the authoring workflow +- Existing CI drift checks extend naturally to `.agents/` output +- Hook generation from guards is an optimisation, not a requirement — can ship incrementally diff --git a/docs/architecture/decisions/ADR-08-split-brain-analysis.md b/docs/architecture/decisions/ADR-08-split-brain-analysis.md index 06964b4d..581fe60f 100644 --- a/docs/architecture/decisions/ADR-08-split-brain-analysis.md +++ b/docs/architecture/decisions/ADR-08-split-brain-analysis.md @@ -8,7 +8,7 @@ ## 1. Context -AgentKit Forge governs agent behaviour through **three enforcement layers**: +Retort governs agent behaviour through **three enforcement layers**: | Layer | Mechanism | Binding? | Audience | | ------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------- | ---------------- | @@ -96,7 +96,7 @@ A "split-brain" occurs when two layers encode the **same rule with different sem | Source | Says | | ---------------------------------- | -------------------------------------------------------------------------------------- | -| **CLAUDE.md** safety rule #5 | "Never directly edit files marked `GENERATED by AgentKit Forge`" | +| **CLAUDE.md** safety rule #5 | "Never directly edit files marked `GENERATED by Retort`" | | **CLAUDE.md** safety rule #4 | "Never modify files in `.agentkit/spec/`" | | **CLAUDE.md** sync section | "Edit spec files in `.agentkit/spec/`" then run sync | | **rules.yaml** `tp-no-direct-edit` | "`.agentkit/spec/` is the intended edit point — users (not AI agents) may modify spec" | @@ -132,7 +132,7 @@ A "split-brain" occurs when two layers encode the **same rule with different sem | Source | Says | | ---------------------------------- | -------------------------------------------------------------------------------- | | **.gitignore** line 42 | Commented out: `# /.github/copilot-instructions.md` — scaffold-once, edit freely | -| **copilot-instructions.md** header | `<!-- GENERATED by AgentKit Forge v0.2.1 — DO NOT EDIT -->` | +| **copilot-instructions.md** header | `<!-- GENERATED by Retort v0.2.1 — DO NOT EDIT -->` | | **Sync engine** | Regenerates it every sync | **Split-brain**: The .gitignore explicitly **does not** ignore `copilot-instructions.md` (it's commented out as "scaffold-once — commit after first sync, edit freely"). But the file itself has a `GENERATED — DO NOT EDIT` header, and the sync engine overwrites it on every run. If a user edits it manually (as the gitignore pattern suggests), the next sync will silently overwrite their changes. The file is simultaneously "scaffold-once, owned by project" and "always-regenerated, don't edit." @@ -143,9 +143,9 @@ A "split-brain" occurs when two layers encode the **same rule with different sem | Source | Version | | ---------------------------------- | ----------------------- | -| **AGENTS.md** header | `AgentKit Forge v3.1.0` | -| **copilot-instructions.md** header | `AgentKit Forge v0.2.1` | -| **COMMAND_GUIDE.md** header | `AgentKit Forge v3.1.0` | +| **AGENTS.md** header | `Retort v3.1.0` | +| **copilot-instructions.md** header | `Retort v0.2.1` | +| **COMMAND_GUIDE.md** header | `Retort v3.1.0` | **Split-brain**: Different generated files claim different framework versions. This suggests the sync engine uses a per-template version or the files were generated at different times. Agents reading these files get inconsistent version signals. diff --git a/docs/architecture/decisions/README.md b/docs/architecture/decisions/README.md index e488986f..22a13552 100644 --- a/docs/architecture/decisions/README.md +++ b/docs/architecture/decisions/README.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # ADR Index ## Decision Records -- [01-adopt-agentkit-forge.md](./01-adopt-agentkit-forge.md) +- [01-adopt-retort.md](./01-adopt-retort.md) - [02-fallback-policy-tokens-problem.md](./02-fallback-policy-tokens-problem.md) - [03-tooling-strategy.md](./03-tooling-strategy.md) - [04-static-security-analysis-depth-tooling.md](./04-static-security-analysis-depth-tooling.md) diff --git a/docs/architecture/diagrams/README.md b/docs/architecture/diagrams/README.md index f93d1b98..11868964 100644 --- a/docs/architecture/diagrams/README.md +++ b/docs/architecture/diagrams/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Architecture Diagrams Index diff --git a/docs/architecture/expansion-agent-analysis.md b/docs/architecture/expansion-agent-analysis.md index 4e9e3dd8..746003ba 100644 --- a/docs/architecture/expansion-agent-analysis.md +++ b/docs/architecture/expansion-agent-analysis.md @@ -8,7 +8,7 @@ ## 1. Executive Summary -This document analyzes the feasibility, design considerations, and integration strategy for adding a **Feature Expansion/Addition Agent** to agentkit-forge. The agent would analyze a repository's current state and suggest new features, missing capabilities, documentation gaps, and architectural improvements — then optionally generate specification artifacts (ADR, PRD, functional specs, technical specs) for approved suggestions. +This document analyzes the feasibility, design considerations, and integration strategy for adding a **Feature Expansion/Addition Agent** to retort. The agent would analyze a repository's current state and suggest new features, missing capabilities, documentation gaps, and architectural improvements — then optionally generate specification artifacts (ADR, PRD, functional specs, technical specs) for approved suggestions. **Verdict**: The idea is **sound but must be carefully scoped**. The repository already has strong primitives that support this (team routing, task protocol, review gates, documentation structure, discovery engine). However, the agent carries unique risks around scope creep, hallucinated requirements, and autonomy overreach that demand explicit human-in-the-loop controls beyond what existing agents require. diff --git a/docs/architecture/specs/01_functional_spec.md b/docs/architecture/specs/01_functional_spec.md index e80d24c6..f0ade7a2 100644 --- a/docs/architecture/specs/01_functional_spec.md +++ b/docs/architecture/specs/01_functional_spec.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Functional Specification @@ -8,7 +8,7 @@ <!-- Describe what the system does from the user's perspective. --> -**Project:** agentkit-forge +**Project:** retort **Version:** 3.1.0 ## Feature Inventory diff --git a/docs/architecture/specs/02_technical_spec.md b/docs/architecture/specs/02_technical_spec.md index 1b87394b..f76e0778 100644 --- a/docs/architecture/specs/02_technical_spec.md +++ b/docs/architecture/specs/02_technical_spec.md @@ -1,14 +1,14 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Technical Specification ## Overview -<!-- High-level technical approach for agentkit-forge. --> +<!-- High-level technical approach for retort. --> -**Project:** agentkit-forge +**Project:** retort **Version:** 3.1.0 ## System Context diff --git a/docs/architecture/specs/03_api_spec.md b/docs/architecture/specs/03_api_spec.md index b965ceee..ae92aac1 100644 --- a/docs/architecture/specs/03_api_spec.md +++ b/docs/architecture/specs/03_api_spec.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # API Specification ## Overview -<!-- Describe the API surface for agentkit-forge. --> +<!-- Describe the API surface for retort. --> **Base URL:** `https://api.example.com/v1` **Version:** 3.1.0 diff --git a/docs/architecture/specs/04_data_models.md b/docs/architecture/specs/04_data_models.md index 1393f68c..adf9145c 100644 --- a/docs/architecture/specs/04_data_models.md +++ b/docs/architecture/specs/04_data_models.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Data Models ## Overview -<!-- Describe the data model layer for agentkit-forge. --> +<!-- Describe the data model layer for retort. --> ## Entity Relationship Summary diff --git a/docs/architecture/specs/PLAN-template-variable-audit.md b/docs/architecture/specs/PLAN-template-variable-audit.md index 69d8e256..f296772d 100644 --- a/docs/architecture/specs/PLAN-template-variable-audit.md +++ b/docs/architecture/specs/PLAN-template-variable-audit.md @@ -57,7 +57,7 @@ These variables are used **directly** (no conditional guard) and will render as | `version` | 88 | ✅ from package.json | Low | | `syncDate` | 74 | ✅ `new Date().toISOString()` | Low | | `lastModel` | 74 | ✅ env var or `'sync-engine'` | Low | -| `lastAgent` | 74 | ✅ env var or `'agentkit-forge'` | Low | +| `lastAgent` | 74 | ✅ env var or `'retort'` | Low | | `defaultBranch` | 26 | ✅ `'main'` | Low | | `testingCoverage` | 19 | ❌ No default, used bare | **Medium** — will render `{{testingCoverage}}` | | `commitConvention` | 7 | ❌ comes from project.yaml only | **Medium** | diff --git a/docs/architecture/specs/README.md b/docs/architecture/specs/README.md index abdab96a..2ea560d0 100644 --- a/docs/architecture/specs/README.md +++ b/docs/architecture/specs/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Specs Docs Index diff --git a/docs/architecture/specs/competitive-landscape-report.md b/docs/architecture/specs/competitive-landscape-report.md new file mode 100644 index 00000000..3e606412 --- /dev/null +++ b/docs/architecture/specs/competitive-landscape-report.md @@ -0,0 +1,396 @@ +# Strategic Research Report: AI Agent Configuration & Orchestration Landscape + +**Date:** 2026-03-17 +**Author:** Claude Opus 4.6 (strategic analysis) +**Scope:** Multi-tool AI agent configuration, orchestration frameworks, and developer tooling +**Status:** Complete + +--- + +## Executive Summary + +AgentKit Forge operates at the intersection of two converging markets: **multi-tool agent configuration sync** (getting rules/agents/skills into 15+ AI coding tools) and **multi-agent orchestration** (coordinating teams of agents to complete complex work). These markets are evolving rapidly: + +**Key findings:** + +1. **The "rules sync" category is commoditising.** Six open-source tools (Ruler, ai-rules-sync, agent-rules, ai-rules, rulesync, SyncAI) now offer basic rules-to-multiple-tools sync. None yet offer agent personas, team orchestration, or quality gates — this is AgentKit Forge's moat. + +2. **AGENTS.md is becoming the de facto instruction standard.** Backed by OpenAI and adopted by 10+ tools, AGENTS.md provides a universal instruction file. However, recent research (ETH Zurich, March 2026) questions its effectiveness — LLM-generated context files may hinder agents. + +3. **Agent orchestration frameworks (CrewAI, LangGraph, AG2) solve a different problem.** They orchestrate runtime agent execution (API calls, tool use, conversation flow). AgentKit Forge orchestrates **development-time agent configuration** (what agents know, what rules they follow, what they can do). These are complementary, not competing. + +4. **The market is missing a portable governance layer.** No competitor offers reflective guards — governance rules that agents self-check regardless of platform. This is the innovation from Mystira.workspace that AgentKit Forge should adopt. + +5. **Market size:** The AI coding assistant market is ~$8.5B in 2026 (24% CAGR to $47.3B by 2034). 62% of professional developers use AI coding tools. The configuration/orchestration tooling layer is pre-revenue but growing fast in OSS adoption. + +**Strategic recommendation:** Double down on the three capabilities no competitor has: (1) spec-driven multi-tool sync with CI validation, (2) team orchestration with task delegation, and (3) portable governance via reflective guards. Resist the urge to compete on simple rules sync — that's a race to the bottom. + +--- + +## 1. Industry Trends & Direction + +### 1.1 The Multi-Tool Reality (2025–2026) + +Developers now routinely use 2–4 AI coding tools simultaneously. A typical stack: Cursor for editing, Claude Code for CLI tasks, Copilot for inline completions, Gemini for research. This creates a configuration fragmentation problem — each tool has its own rules format, directory structure, and instruction mechanism. + +**Trajectory:** Tool proliferation will continue. JetBrains ACP (Agent Client Protocol), co-developed with Zed Industries, aims to standardise agent-to-IDE communication. Anthropic's MCP standardises tool discovery. But **no protocol standardises agent configuration** — this is the gap AgentKit Forge fills. + +### 1.2 The AGENTS.md Convergence + +OpenAI pushed AGENTS.md as an open standard in late 2025. It provides a single markdown file with instructions for AI coding agents — build commands, architecture overview, conventions, security rules. Key adoption: + +- Supported natively by: Codex, Kilo Code, Cursor, Windsurf, Builder.io +- Hierarchical: `AGENTS.md` at root, subdirectory `AGENTS.md` overrides +- Complementary to `CLAUDE.md`, `.cursorrules`, etc. + +**Critical caveat:** A March 2026 ETH Zurich paper found that LLM-generated AGENTS.md files often **hinder** agent performance. The recommendation: omit auto-generated context files; limit human-written instructions to genuinely non-inferable details. This validates AgentKit Forge's approach of generating tool-specific output from validated specs rather than dumping everything into one file. + +### 1.3 Protocol Standardisation Wave + +| Protocol | Owner | Scope | Status | +|----------|-------|-------|--------| +| MCP (Model Context Protocol) | Anthropic | Tool discovery & execution | Widely adopted | +| ACP (Agent Client Protocol) | JetBrains + Zed | Agent-to-IDE communication | Early adoption | +| Agent Protocol | LangChain | Agent runtime API | Moderate adoption | +| AGENTS.md | OpenAI / AAIF | Agent instruction files | Rapid adoption | +| W3C Agent Protocol | W3C CG | Web-standard agent comms | Spec drafting (2026–27) | + +**Missing from all protocols:** Agent configuration management, governance rules, cross-session continuity, team orchestration. This is AgentKit Forge's category. + +### 1.4 Inflection Points (Next 12–24 Months) + +1. **Rules sync becomes table stakes.** Every major IDE will support native agent configuration; basic sync tools will lose relevance. +2. **Governance becomes critical.** As agents gain more autonomy (Claude Code, Codex), preventing destructive actions becomes a production concern, not a nice-to-have. +3. **Multi-agent teams go mainstream.** Claude's sub-agent system, Codex's parallel tasks, and Cursor's background agents all point to multi-agent being the default. +4. **Cross-session memory matures.** Agents will need structured handoff, traces, and strategic context — not just chat history. + +--- + +## 2. Best Practices & Standards + +### 2.1 Configuration Management + +| Practice | Leaders | Adoption | +|----------|---------|----------| +| Single source of truth (YAML/MD → tool-specific output) | AgentKit Forge, Agent OS, Ruler | Growing | +| Hierarchical instructions (root + subdirectory overrides) | AGENTS.md, CLAUDE.md | Standard | +| CI drift validation (spec vs generated output) | AgentKit Forge | Unique | +| Reflective guards (portable governance) | Mystira.workspace | Novel | +| `.readme.yaml` (machine-readable metadata) | Mystira.workspace | Novel | + +### 2.2 What Industry Leaders Are Implementing + +**Block (formerly Square):** +- Open-sourced `ai-rules` for managing rules, commands, and skills across agents +- Built Goose, an open-source autonomous agent with extensible plugin architecture +- Uses AGENTS.md + repeatable "agent skills" as packaged workflows + +**Anthropic:** +- Claude Code hooks system for automated enforcement +- Sub-agent architecture for parallel task execution +- MCP for tool discovery standardisation + +**GitHub/Microsoft:** +- Copilot agents with `.github/agents/` directory +- Copilot chatmodes for team-based interaction patterns +- CODEOWNERS integration for agent access control + +**JetBrains:** +- ACP protocol for agent-IDE interop +- Moving toward agent-neutral IDE support + +### 2.3 Emerging Practices Gaining Traction + +1. **Spec-driven development** — Define what you want (spec), let agents implement. Agent OS calls this "enhanced specification shaping." +2. **Guard rails as code** — Governance rules checked into the repo alongside the code they protect. +3. **Cross-session traces** — Preserving agent reasoning context across sessions (pioneered by Mystira.workspace). +4. **Token budget awareness** — Monitoring and optimising agent token consumption per operation. +5. **Conventional commit enforcement** — CI-level validation that agents follow commit message conventions. + +--- + +## 3. Competitive Landscape + +### 3.1 Competitor Profiles + +#### Primary Competitors (Direct) + +**1. Ruler** (intellectronica/ruler) +- **What:** CLI tool that syncs a single rules file to 11+ AI coding tool directories +- **Stars:** ~2,500 GitHub stars +- **Mechanism:** Reads `ruler.md` (or config), writes to `.cursor/rules/`, `.claude/CLAUDE.md`, `.github/copilot-instructions.md`, etc. +- **Strengths:** Simple, focused, good tool coverage (11 targets), auto-manages `.gitignore` +- **Weaknesses:** Rules only (no agents, skills, commands, teams), no CI validation, no governance, no orchestration +- **Pricing:** Free, open source (MIT) + +**2. Agent OS** (buildermethods/agent-os) +- **What:** System for injecting coding standards into AI-powered development +- **Stars:** Moderate +- **Mechanism:** Discover patterns → document standards → inject into context → shape specifications +- **Strengths:** Standards discovery from existing codebases, spec-driven philosophy, Claude Code integration +- **Weaknesses:** Primarily Claude Code focused, no multi-tool sync engine, no team orchestration, no CI validation +- **Pricing:** Free and open source; paid training via Builder Methods Pro + +**3. ai-rules-sync** (lbb00/ai-rules-sync) +- **What:** Sync rules, skills, commands, and subagents across 8+ tools via symlinks +- **Stars:** Growing +- **Mechanism:** Git-based rule storage, symlink sync, web dashboard UI +- **Strengths:** Supports skills and commands (not just rules), multi-repo support, team sharing, web UI +- **Weaknesses:** Symlink-based (fragile on Windows), no spec validation, no governance, no orchestration +- **Pricing:** Free, open source + +**4. agent-rules** (jeejeeguan/agent-rules) +- **What:** Centralise rules in `AGENT_RULES.md`, auto-sync to each agent's directory via CI +- **Stars:** Small +- **Mechanism:** CI pipeline copies single file to `.claude/CLAUDE.md`, `.codex/AGENTS.md`, `.gemini/GEMINI.md`, etc. +- **Strengths:** CI-first approach (sync on push), backup before overwrite +- **Weaknesses:** One-file-fits-all (no per-tool customisation), no spec YAML, no agents/skills/commands, no orchestration +- **Pricing:** Free, open source + +**5. Block ai-rules** (block/ai-rules) +- **What:** Manage AI rules, commands, and skills across multiple agents from one place +- **Stars:** Notable (Block/Square backing) +- **Mechanism:** Centralised configuration with distribution +- **Strengths:** Enterprise backing (Block/Square), supports commands and skills +- **Weaknesses:** Less mature than Ruler, limited orchestration +- **Pricing:** Free, open source + +#### Secondary Competitors (Adjacent) + +**6. AGENTS.md (standard)** +- Not a tool but a standard. Competes by making per-tool configuration seem unnecessary — "just write one AGENTS.md." In practice, tools interpret it differently, and it doesn't cover governance, orchestration, or cross-session continuity. + +**7. LIDR-academy/ai-specs** +- Comprehensive development rules and AI agent configurations designed to work with multiple copilots. Portable, importable into any project. More of a "rules library" than a sync tool. + +**8. snowdreamtech/template** +- Enterprise-grade template claiming 50+ AI IDE support. Single source of truth for rules, workflows, and configurations. Template-based (copy/fork) rather than sync-engine-based. + +#### Runtime Orchestration (Different Category) + +**CrewAI, LangGraph, AG2 (AutoGen), Semantic Kernel** — These orchestrate agent *execution* at runtime (API calls, conversations, tool use). They don't manage agent *configuration* in repositories. Complementary to AgentKit Forge, not competing. + +### 3.2 Competitive Evaluation Matrix + +| Dimension | AgentKit Forge | Ruler | Agent OS | ai-rules-sync | agent-rules | Block ai-rules | AGENTS.md | +|-----------|---------------|-------|----------|---------------|-------------|----------------|-----------| +| **Multi-tool output** | 15+ targets | 11 targets | 1 (Claude) | 8+ targets | 5 targets | Multi | 1 file | +| **Spec-driven (YAML → output)** | Yes | No (MD only) | Partial | No | No | Partial | N/A | +| **Agent personas** | 39 agents | None | None | None | None | None | None | +| **Team orchestration** | 13 teams + task protocol | None | None | None | None | None | None | +| **Skills/commands** | 30+ skills, 42 commands | None | Standards | Skills, commands | None | Commands, skills | None | +| **CI drift validation** | Yes | None | None | None | CI copy | None | None | +| **Governance (hooks)** | 14 shell hooks | None | None | None | None | None | None | +| **Governance (guards)** | Roadmap (Phase 2) | None | None | None | None | None | None | +| **Quality gates** | 5-phase lifecycle | None | None | None | None | None | None | +| **Cross-session traces** | Roadmap (Phase 4) | None | None | None | None | None | None | +| **`.readme.yaml`** | Roadmap (Phase 3) | None | None | None | None | None | None | +| **Maturity** | Production | Stable | Active | Active | Early | Active | Standard | +| **Effort to adopt** | Medium | Low | Low | Low | Low | Low | Trivial | +| **Lock-in risk** | Medium (Node.js engine) | Low | Low | Low | Low | Low | None | + +### 3.3 Competitive Positioning Map + +``` + Complex (orchestration, teams, governance) + │ + │ ★ AgentKit Forge + │ + │ + ──────────────┼────────────── + Few tools │ Many tools + │ + Agent OS ● │ ● Ruler + │ ● ai-rules-sync + │ ● Block ai-rules + │ + │ ○ agent-rules + │ ○ AGENTS.md + │ + Simple (rules sync only) +``` + +AgentKit Forge occupies the **upper-right quadrant** — many tools + complex capabilities. No competitor is close. The risk is that the lower-right quadrant (many tools + simple) commoditises and "good enough" wins for most teams. + +--- + +## 4. SWOT Analysis + +### Strengths + +| Strength | Evidence | Strategic Value | +|----------|----------|-----------------| +| **Only spec-driven multi-tool engine with CI validation** | 15+ output targets, drift check in CI | Hard to replicate — requires deep knowledge of each tool's format | +| **Team orchestration is unique** | 13 teams, task delegation protocol, fan-out/chain handoff | No competitor offers development-time team coordination | +| **39 agent personas** | Categorised agents with defined roles, responsibilities, context | Competitors offer rules; Forge offers full agent definitions | +| **Quality gate framework** | 5-phase lifecycle with enforcement at each transition | Connects agent config to delivery discipline | +| **Proven at scale** | Deployed across 6+ repos (chaufher, PuffWise, etc.) in production | Not theoretical — validated in real projects | +| **Deep tool format knowledge** | Supports `.mdc` (Cursor), `.chatmode.md` (Copilot), `.agent.md` (GitHub), skill YAML, etc. | Barrier to entry — each format has undocumented quirks | + +### Weaknesses + +| Weakness | Impact | Mitigation Path | +|----------|--------|-----------------| +| **High adoption effort** | New users face `.agentkit/` directory, spec YAML, sync engine, hooks — steep learning curve vs "just add a `ruler.md`" | Guided `/start` command, progressive disclosure, "lite mode" | +| **Node.js dependency** | Sync engine requires Node.js/pnpm — excludes Python-only or Rust-only teams | Consider standalone binary (Go/Rust) or WASM-based engine | +| **No portable governance** | Shell hooks only work for Claude Code; other tools bypass governance | Reflective guards (Phase 2 roadmap) | +| **Generated file noise** | 300+ generated files across tool targets; PRs are overwhelming (see: PR #428 with 444 files) | Smarter sync (hash-based skip), `.gitattributes` to collapse diffs | +| **No schema versioning** | Format changes would break existing consumers with no migration path | Add `version` field to all generated frontmatter | +| **Timestamp churn** | Every sync bumps `last_updated` on all files even when content unchanged | Content-hash-based timestamps (only update if content actually changed) | + +### Opportunities + +| Opportunity | Market Signal | Action | +|-------------|--------------|--------| +| **Portable governance (guards)** | No competitor offers this; Mystira.workspace validated the pattern | ADR-10 Phase 2 — adopt reflective guards | +| **`.readme.yaml` standard** | Token cost is a growing concern (62% of devs use AI tools daily) | ADR-10 Phase 3 — generate machine-readable metadata | +| **ETH Zurich finding re: AGENTS.md** | Auto-generated context files may hinder agents | Position Forge's spec-validated, tool-specific output as superior to "dump everything in AGENTS.md" | +| **Enterprise demand for governance** | 90% of Fortune 100 use AI coding tools; compliance is lagging | Governance-as-code offering for enterprise teams | +| **Cross-session memory** | No tool solves agent continuity well; `/handoff` is a start | ADR-10 Phase 4 — traces + roadmaps | +| **Plugin marketplace** | Claude Code plugins, Cursor extensions, Copilot agents are all growing | Package team definitions as distributable plugins | +| **Standard body participation** | W3C Agent Protocol CG, AAIF — no configuration standard exists yet | Propose `.agents/` convention to AAIF or W3C | + +### Threats + +| Threat | Likelihood | Impact | Mitigation | +|--------|-----------|--------|------------| +| **IDE-native configuration** | High | Medium | IDEs add built-in agent config → sync tools become less needed. Counter: Forge syncs *across* IDEs, which IDE-native can't do | +| **AGENTS.md becomes sufficient** | Medium | High | If tools converge on one format, multi-tool sync loses value. Counter: Forge offers orchestration, governance, and team coordination beyond rules sync | +| **Ruler reaches feature parity** | Low | Medium | Ruler adds agents, skills, CI validation. Counter: Deep format knowledge and spec-driven architecture are hard to replicate | +| **Enterprise vendor enters** | Medium | High | GitHub/JetBrains build native multi-tool config. Counter: Move fast on governance and orchestration — features enterprises want but vendors are slow to ship | +| **Adoption friction kills growth** | Medium | High | Teams choose "good enough" simple tools over Forge's power. Counter: Lite mode, progressive adoption, one-command onboarding | + +--- + +## 5. KPI Framework & Metrics Dashboard + +### 5.1 Key Performance Indicators + +| # | KPI | Current Baseline | Target (6mo) | Measurement Method | +|---|-----|-----------------|--------------|-------------------| +| 1 | **Onboarded repos** | 6 | 15 | Count of repos with `.agentkit/` and passing CI drift check | +| 2 | **Tool targets supported** | 15 | 18 | Count of render targets in sync engine | +| 3 | **Agent persona count** | 39 | 45 | Count of agent definitions in spec | +| 4 | **Team count** | 13 | 13 | Stable — quality over quantity | +| 5 | **CI drift check pass rate** | ~90% (manual observation) | 99% | Ratio of drift-check-passing PRs to total PRs | +| 6 | **Governance coverage** | Hooks only (1 platform) | Guards + hooks (all platforms) | Count of platforms with automated or reflective governance | +| 7 | **Adoption effort (time to first sync)** | ~30 min | <10 min | Time from `git clone` to first successful `agentkit:sync` | +| 8 | **Generated file churn ratio** | High (all files bump on sync) | <10% (content-changed only) | Ratio of content-changed files to timestamp-only-changed files per sync | +| 9 | **Cross-session trace coverage** | 0% | 50% | Percentage of sessions that produce a structured trace | +| 10 | **PR review noise ratio** | 444 files for 3 docs (PR #428) | <50 files for docs-only changes | Count of files in PR vs count of meaningful changes | +| 11 | **External contributor onboarding** | 0 external contributors | 3 | Count of non-org contributors with merged PRs | +| 12 | **Competitive feature gap** | 6+ unique features | 8+ unique features | Count of features in evaluation matrix where Forge = "Yes" and all competitors = "None" | + +### 5.2 Benchmarks Against Competitors + +| KPI | AgentKit Forge | Ruler | Agent OS | ai-rules-sync | +|-----|---------------|-------|----------|---------------| +| Tool targets | **15** | 11 | 1 | 8 | +| Adoption effort | 30 min | **2 min** | 5 min | 5 min | +| Governance platforms | 1 | 0 | 0 | 0 | +| CI validation | **Yes** | No | No | No | +| Agent definitions | **39** | 0 | 0 | 0 | +| Team orchestration | **13 teams** | 0 | 0 | 0 | +| GitHub stars | ~50 | ~2,500 | ~200 | ~300 | +| Generated file noise | High | **None** | None | None | + +### 5.3 Scoring Methodology + +Each KPI maps to a SWOT quadrant: + +| SWOT Category | KPIs | Weight | +|---------------|------|--------| +| **Strengths (protect)** | #2, #3, #4, #5, #12 | 30% | +| **Weaknesses (fix)** | #7, #8, #10 | 30% | +| **Opportunities (pursue)** | #6, #9, #11 | 25% | +| **Threats (monitor)** | #1, #12 | 15% | + +**Scoring per KPI:** 0 = below baseline, 1 = at baseline, 2 = at target, 3 = exceeds target. + +**Composite score** = weighted average × 33.3 (normalised to 100). + +**Current estimated score:** ~55/100 (strong on strengths, weak on adoption friction and file churn). + +### 5.4 Tracking Dashboard Template + +``` +┌─────────────────────────────────────────────────────────┐ +│ AgentKit Forge — Strategic Health Dashboard │ +│ Last updated: YYYY-MM-DD │ +├──────────────────┬──────────┬──────────┬────────────────┤ +│ Metric │ Current │ Target │ Status │ +├──────────────────┼──────────┼──────────┼────────────────┤ +│ Onboarded repos │ 6 │ 15 │ 🟡 40% │ +│ Tool targets │ 15 │ 18 │ 🟢 83% │ +│ Agent personas │ 39 │ 45 │ 🟢 87% │ +│ CI pass rate │ ~90% │ 99% │ 🟡 91% │ +│ Governance plat. │ 1 │ all │ 🔴 17% │ +│ Time to 1st sync │ 30 min │ 10 min │ 🔴 33% │ +│ File churn ratio │ high │ <10% │ 🔴 5% │ +│ Trace coverage │ 0% │ 50% │ 🔴 0% │ +│ PR noise ratio │ 444:3 │ 50:3 │ 🔴 1% │ +│ Ext contributors │ 0 │ 3 │ 🔴 0% │ +│ Feature gap │ 6+ │ 8+ │ 🟢 75% │ +├──────────────────┴──────────┴──────────┴────────────────┤ +│ Composite Score: 55/100 │ +│ Priority: Fix file churn → Reduce adoption friction │ +│ → Add portable governance → Attract externals │ +└─────────────────────────────────────────────────────────┘ +``` + +### 5.5 Priority Matrix (What to Fix First) + +Based on the metrics, the prioritised action list for product/strategy teams: + +| Priority | Action | KPIs Improved | Effort | Impact | +|----------|--------|---------------|--------|--------| +| **P0** | Content-hash-based sync (skip unchanged files) | #8, #10 | Medium | High — eliminates the #1 user complaint (noisy PRs) | +| **P0** | One-command onboarding (`npx agentkit-forge init`) | #7, #11 | Medium | High — reduces adoption barrier from 30min to <5min | +| **P1** | Reflective guards (ADR-10 Phase 2) | #6, #12 | Medium | High — unique feature, governance for all platforms | +| **P1** | `.readme.yaml` generation (ADR-10 Phase 3) | #12 | Low | Medium — token cost reduction, machine-readable metadata | +| **P2** | Cross-session traces (ADR-10 Phase 4) | #9 | Low-Med | Medium — agent continuity improvement | +| **P2** | Publish as distributable package (npm/brew) | #7, #11 | Medium | High — prerequisite for external adoption | +| **P3** | Schema formalisation (ADR-10 Phase 5) | #11, #12 | Medium | Medium — enables ecosystem adoption | + +--- + +## 6. Actionable Recommendations + +### For Executive Leadership + +1. **Position AgentKit Forge as the "Terraform for AI agents"** — infrastructure-as-code for agent configuration. This resonates with enterprises who already think in IaC terms. +2. **The competitive moat is orchestration + governance, not rules sync.** Rules sync is commoditising. Invest in the features competitors can't easily replicate: team orchestration, quality gates, and portable governance. +3. **The ETH Zurich finding is an opportunity.** Auto-generated AGENTS.md files hurt agent performance. Position Forge's spec-validated, tool-specific output as the evidence-based alternative. + +### For Product/Strategy + +1. **Fix the noise problem first.** PR #428 had 444 files for 3 meaningful docs. Content-hash-based sync that skips unchanged files would dramatically improve the developer experience. +2. **Ship a "lite mode."** Not every team needs 13 teams and 39 agents. Offer a minimal config that generates basic rules for 3–5 tools from a single YAML file. Progressive disclosure to full power. +3. **Adopt the `.agents/` hub pattern.** Per ADR-10, this gives every AI tool a shared discovery point. Ship Phase 1 to validate before investing in Phases 2–5. + +### For R&D/Technical + +1. **Implement content-hash-based timestamps.** Only bump `last_updated` when file content actually changes. This is the single highest-impact technical change. +2. **Build guard-to-hook generation.** Reflective guards (markdown) as the canonical source; shell hooks generated from guards for tools that support automation. +3. **Publish JSON Schemas.** For guards, traces, `.readme.yaml`, and agent persona definitions. Enables IDE validation, external tool integration, and ecosystem adoption. +4. **Consider a standalone binary.** The Node.js/pnpm dependency limits adoption. A Go or Rust binary (or WASM) would make `agentkit-forge` installable via `brew`, `cargo`, or `go install` with zero runtime dependencies. + +--- + +## Sources + +- [AGENTS.md specification](https://agents.md/) +- [AGENTS.md GitHub repository](https://github.com/agentsmd/agents.md) +- [ETH Zurich — Reassessing AGENTS.md value (InfoQ)](https://www.infoq.com/news/2026/03/agents-context-file-value-review/) +- [Ruler — apply rules to all coding agents](https://github.com/intellectronica/ruler) +- [Agent OS — coding standards for AI development](https://buildermethods.com/agent-os) +- [ai-rules-sync](https://github.com/lbb00/ai-rules-sync) +- [agent-rules (AGENT_RULES.md sync)](https://github.com/jeejeeguan/agent-rules) +- [Block ai-rules](https://github.com/block/ai-rules) +- [JetBrains ACP](https://www.adwaitx.com/jetbrains-acp-ai-agent-ide-integration/) +- [AI coding market statistics 2026](https://www.getpanto.ai/blog/ai-coding-assistant-statistics) +- [Agentic coding 2026 guide](https://halallens.no/en/blog/agentic-coding-in-2026-the-complete-guide-to-plugins-multi-model-orchestration-and-ai-agent-teams) +- [AI agent protocols guide](https://www.ruh.ai/blogs/ai-agent-protocols-2026-complete-guide) +- [OpenAI Codex AGENTS.md guide](https://developers.openai.com/codex/guides/agents-md/) +- [Best multi-agent frameworks 2026](https://gurusup.com/blog/best-multi-agent-frameworks-2026) +- [Anthropic 2026 Agentic Coding Trends Report](https://resources.anthropic.com/hubfs/2026%20Agentic%20Coding%20Trends%20Report.pdf) diff --git a/docs/architecture/specs/tool-neutral-agent-hub-findings.md b/docs/architecture/specs/tool-neutral-agent-hub-findings.md new file mode 100644 index 00000000..8d9f779d --- /dev/null +++ b/docs/architecture/specs/tool-neutral-agent-hub-findings.md @@ -0,0 +1,262 @@ +# Architectural Findings: Tool-Neutral Agent Hub Pattern + +**Date:** 2026-03-17 +**Status:** Analysis complete — pending adoption decision +**Repositories analysed:** `agentkit-forge` (main), `Mystira.workspace` (dev) + +--- + +## Executive Summary + +AgentKit Forge and Mystira.workspace have independently evolved two complementary approaches to multi-agent configuration. AgentKit Forge uses a **spec-driven sync engine** that generates tool-specific output from YAML specs. Mystira.workspace uses a **hand-authored tool-neutral hub** (`.agents/`) shared across all agent tools. Neither approach alone is sufficient — but combining them creates a significantly stronger architecture. + +This document captures findings from a structural comparison and recommends a convergence path. + +--- + +## 1. Current Architecture: AgentKit Forge + +### Directory Map + +``` +.agentkit/ + spec/ ← YAML source of truth (project, teams, commands, rules) + templates/ ← Output templates for 15+ tools + engines/ ← Node.js sync engine + overlays/ ← Per-repo customisations + bin/ ← Cross-platform CLI scripts + +.claude/ + agents/ ← 39 agent persona definitions (generated) + commands/ ← 42 slash commands (generated) + rules/ ← Domain rules + languages/ subdirectory (generated) + skills/ ← 30+ skill definitions (generated) + hooks/ ← 14 lifecycle hooks (shell scripts) + state/ ← Orchestrator state, events log, task files + plans/ ← Implementation plans (runtime) +``` + +### Strengths + +| Capability | Detail | +|---|---| +| **Multi-tool sync** | One YAML change propagates to Claude, Cursor, Copilot, Gemini, Cline, Windsurf, Roo (15+ targets) | +| **Automated enforcement** | Shell hooks block destructive commands, protect templates, validate pre-push | +| **Spec-driven architecture** | CI drift check ensures generated output matches spec — no silent divergence | +| **Team orchestration** | 13 teams with task delegation protocol, fan-out, and chained handoff | +| **Quality gates** | 5-phase lifecycle with enforcement at each transition | + +### Weaknesses + +| Issue | Impact | +|---|---| +| **Tool-specific output dirs** | Every tool gets its own copy of agents, rules, commands — no shared layer agents can read across tools | +| **No cross-session traces** | `/handoff` captures session state but doesn't preserve reasoning context or mental models | +| **No directory-boundary metadata** | Agents must read full `README.md` or spec YAML to understand project structure | +| **Flat agent listing** | 39 agents in one directory with no categorisation (empty category dirs exist but unused) | +| **No reflective guards** | Enforcement is hook-based only — agents without shell access bypass all governance | +| **No strategic roadmaps** | Backlog tracks tasks; nothing tracks multi-session strategic goals | +| **State accumulation** | `events.log` grows unbounded; no rotation, archival, or freshness signals | + +--- + +## 2. Current Architecture: Mystira.workspace + +### Directory Map + +``` +.agents/ ← Tool-neutral hub (shared across ALL agents) + guards/ ← Constraint-based governance rules + memory-governance.md + respect-shared-docs.md + skill-autonomy-guard.md + skills/ ← Shared domain knowledge + end-session/SKILL.md + mystira-css-tokens/SKILL.md + obsidian-styling/SKILL.md + traces/ ← Cross-session investigative findings + 2026-03-16-handover-ui-infra-aesthetics.md + 2026-03-16-obsidian-washing-trace.md + history/ ← Per-conversation artifacts + {uuid}/ + task.md, walkthrough.md, implementation_plan.md + agent_trace_n7.md, media__*.png, *.resolved + roadmaps/ ← Strategic planning + agent-handover.md + guard-enforcement.md + multi-agent-collaboration.md + ui-finalization.md + +.claude/settings.json ← Claude-specific hooks/permissions only +.gemini/skills/ ← Gemini-specific skills (e.g. antigravity-trace-standard) +.serena/memories/ ← Serena MCP server memories (another tool-specific store) +.cursor/rules/ ← Empty placeholder +.windsurf/rules/ ← Empty placeholder + +.readme.yaml ← Machine-readable project metadata (root) +apps/.readme.yaml ← Per-directory metadata +packages/.readme.yaml ← Per-directory metadata +``` + +### Strengths + +| Capability | Detail | +|---|---| +| **Tool-neutral hub** | `.agents/` is readable by any agent regardless of platform — no tool-specific parsing required | +| **Reflective guards** | YAML frontmatter + regex patterns — agents self-check during planning; no shell dependency | +| **Cross-session traces** | Captures outgoing agent's mental model, blocked work, and first-3-tool-calls for incoming agent | +| **`.readme.yaml`** | Structured, parseable project metadata at directory boundaries — cheaper than parsing markdown | +| **Full audit trail** | Per-conversation-ID history with task lists, walkthroughs, plans, screenshots, `.resolved` copies | +| **Strategic roadmaps** | Multi-session goals that bridge individual task backlogs (4 active roadmaps) | +| **Investigation traces** | Dated traces capture root-cause analysis with architectural guards derived from debugging | + +### Weaknesses + +| Issue | Impact | +|---|---| +| **No automation** | Hand-authored files with no sync engine — changes don't propagate across tools | +| **Trust-based enforcement** | Reflective guards have zero automated consequences if an agent ignores them | +| **No spec validation** | No CI check that guard patterns are valid regex or that skills follow a schema | +| **Accumulation without lifecycle** | `traces/` and `history/` grow unbounded — no freshness signal or retention policy | +| **Dual maintenance** | `.readme.yaml` + `README.md` will drift without validation | +| **No team orchestration** | No task delegation protocol, no fan-out, no dependency chains | + +--- + +## 3. Pattern Comparison Matrix + +| Concern | AgentKit Forge | Mystira | Winner | Notes | +|---|---|---|---|---| +| Multi-tool output generation | Sync engine (15+ targets) | Manual per-tool | **Forge** | Automation beats manual every time | +| Agent discoverability across tools | Tool-specific dirs only | `.agents/` neutral hub | **Mystira** | Agents from any tool can read `.agents/` | +| Governance enforcement | Shell hooks (automated) | Guards (reflective) | **Draw** | Both needed — automated for capable tools, reflective for others | +| Cross-session continuity | `/handoff` (task state only) | Traces + history + roadmaps | **Mystira** | Mental model capture is qualitatively superior to task lists | +| Project structure discovery | `.agentkit/spec/project.yaml` | `.readme.yaml` at boundaries | **Mystira** | Boundary-level metadata is more granular and cheaper to read | +| Quality gate enforcement | CI drift check + hooks | None | **Forge** | Mystira has no automated validation | +| Team coordination | 13 teams + task protocol | None | **Forge** | Mystira is single-agent focused | +| Strategic planning | Backlog only | Roadmaps as first-class | **Mystira** | Roadmaps bridge session-level and project-level goals | +| Schema versioning | None | None | **Neither** | Both lack format evolution strategy | +| Cost attribution | Rules exist, no tracking | None | **Neither** | Both describe cost awareness but don't measure it | + +--- + +## 4. Key Innovations Worth Adopting + +### 4.1 `.agents/` as Tool-Neutral Hub + +**What it is:** A top-level directory (not nested under any tool-specific dir) containing shared agent infrastructure: guards, skills, traces, history, roadmaps. + +**Why it matters:** Currently, an agent running in Cursor cannot discover Claude's agent personas. An agent in Gemini cannot read Claude's skills. The sync engine generates parallel copies, but there's no shared canonical location. `.agents/` solves this by providing one directory that all tools can read natively. + +**Adoption implication:** The sync engine should generate `.agents/` content as a first-class output target alongside `.claude/`, `.cursor/`, etc. Tool-specific dirs become thin wrappers containing only platform hooks and permissions. + +### 4.2 Reflective Guards + +**What it is:** Markdown files with YAML frontmatter (name, enabled, regex pattern) and natural-language instructions that agents self-check during planning. + +**Why it matters:** Shell hooks only work for tools that execute commands through a shell. Browser-based agents, API-only agents, and agents in sandboxed environments bypass hook enforcement entirely. Guards provide a portable fallback. + +**Verified guard format (from Mystira):** + +```yaml +--- +name: memory-governance +enabled: true +description: Requires user consent before any memory write operation +--- +# Memory Governance Guard +**Pattern**: `\.claude/.*memory|\.serena/.*memories|\.gemini/.*brain` +**Instruction**: +1. Before writing to any memory path matching the pattern, pause +2. Inform the user what you intend to write and why +3. Proceed only with explicit consent +``` + +Three guards exist: `memory-governance` (protects cross-tool memory stores), `respect-shared-docs` (protects `CLAUDE.md`, `README.md`, shared docs from unasked modification), `skill-autonomy-guard` (prevents skills/subagents from writing to memory indices without human command). + +**Adoption implication:** Guards should complement (not replace) hooks. The sync engine can generate hooks from guard definitions for tools that support them, while the guard files themselves remain readable by any agent. + +### 4.3 `.readme.yaml` at Directory Boundaries + +**What it is:** Structured YAML files at directory boundaries containing machine-readable metadata: tech stack, workspace structure, build targets, local services. + +**Why it matters:** Agents currently parse human-written README.md files to understand project structure — expensive on tokens and error-prone. `.readme.yaml` provides the same information in a format that requires zero interpretation. + +**Verified `.readme.yaml` schema (from Mystira root):** + +```yaml +purpose: "Mystira — AI-powered interactive storytelling..." +version: "0.5.2-alpha" +tech_stack: + dotnet: "9.0" + node: "22.x" + react: "19.x" +workspace_type: "dotnet-sln + pnpm monorepo" +workspace_managers: ["dotnet sln", "pnpm workspaces"] +local_services: + api: { port: 5001, path: "apps/api" } + web: { port: 3000, path: "apps/web" } +agent_tooling: + guards: ".agents/guards/" + skills: ".agents/skills/" +last_synced: "2026-03-16" +``` + +Sub-directory variants (`apps/.readme.yaml`, `packages/.readme.yaml`) list contained projects with `name`, `path`, `stack`, `description`, and `sub_solutions` fields. + +**Adoption implication:** `.agentkit/spec/project.yaml` already contains most of this data. The sync engine should emit `.readme.yaml` files at relevant directory boundaries, derived from the spec. + +### 4.4 Cross-Session Traces + +**What it is:** Dated markdown files capturing the outgoing agent's mental model, design intuition, blocked/pending work, and concrete next steps for the incoming agent. + +**Why it matters:** Git commits and `/handoff` documents capture *what* happened. Traces capture *why* and *what the agent was thinking*. This reasoning context is exactly what's lost between sessions and what forces incoming agents to re-derive conclusions. + +**Adoption implication:** Extend the `/handoff` command to write structured traces. Add a freshness field (`valid_until` or `relevance_decay`) and implement cleanup in session-start hooks. + +### 4.5 Strategic Roadmaps + +**What it is:** Markdown files in `.agents/roadmaps/` that describe multi-session goals, phased delivery plans, and coordination protocols. + +**Why it matters:** Backlogs track individual tasks. Roadmaps provide the strategic frame that tells agents *why* tasks exist and how they fit together. An agent asked to "improve auth" can check the roadmap to know whether that means "patch the JWT bug" or "migrate to OAuth2 as part of the compliance initiative." + +**Adoption implication:** Add `.agents/roadmaps/` as a managed directory. Roadmaps should have lifecycle metadata (created, updated, status: active/completed/abandoned) and be referenced from the orchestrator state. + +--- + +## 5. Cross-Agent Ecosystem Implications + +### 5.1 Standardisation Opportunity + +The `.agents/` pattern is simple enough to become a cross-project convention. If formalised with a JSON Schema for guards and a directory layout spec, it could be adopted by any AI agent system — not just AgentKit Forge consumers. + +### 5.2 Lock-In Assessment + +| Component | Lock-in risk | Mitigation | +|---|---|---| +| `.agentkit/` sync engine | Medium — Node.js/pnpm dependency | Document the output format; allow alternative generators | +| `.agents/` hub | Low — plain markdown, no tooling dependency | Formalise the schema so other tools can generate/consume | +| `.claude/hooks/` | High — shell-specific, platform-specific | Generate from `.agents/guards/` so the canonical source is portable | +| `.readme.yaml` | Low — standard YAML | Publish a schema; align with existing conventions (`.devcontainer/`, `.editorconfig`) | + +### 5.3 Missing Capabilities (Neither Repo Addresses) + +1. **Agent capability declaration** — No mechanism for an agent to declare its tools, context window, or model capabilities for task routing +2. **Per-session cost attribution** — Cost rules exist but no measurement infrastructure +3. **Concurrent edit conflict resolution** — No protocol for when two agents modify the same file simultaneously +4. **Schema versioning** — No migration strategy when file formats evolve + +--- + +## 6. Recommendations + +| Priority | Action | Effort | Impact | +|---|---|---|---| +| **P0** | Adopt `.agents/` as sync output target | Medium | Enables tool-neutral agent discovery | +| **P0** | Resolve empty `.claude/agents/` category dirs | Low | Unblocks agent reorganisation | +| **P1** | Implement `.readme.yaml` generation | Low | Reduces token cost for project discovery | +| **P1** | Add guards to `.agents/guards/` with hook generation | Medium | Portable governance + automated enforcement | +| **P2** | Extend `/handoff` to write traces | Low | Preserves reasoning context across sessions | +| **P2** | Add roadmaps directory to state model | Low | Strategic context for multi-session work | +| **P3** | Formalise schemas (guards, traces, `.readme.yaml`) | Medium | Enables cross-project adoption | +| **P3** | Add retention policy for traces/history | Low | Prevents unbounded accumulation | diff --git a/docs/engineering/01_setup.md b/docs/engineering/01_setup.md index 11a28105..706a27d2 100644 --- a/docs/engineering/01_setup.md +++ b/docs/engineering/01_setup.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Development Setup ## Overview -Instructions for setting up a local development environment for agentkit-forge. +Instructions for setting up a local development environment for retort. ## Prerequisites @@ -22,7 +22,7 @@ Instructions for setting up a local development environment for agentkit-forge. ```bash # Clone the repository git clone <!-- REPO_URL --> -cd agentkit-forge +cd retort # Install dependencies pnpm install --frozen-lockfile diff --git a/docs/engineering/02_coding_standards.md b/docs/engineering/02_coding_standards.md index db652051..4aef4eb9 100644 --- a/docs/engineering/02_coding_standards.md +++ b/docs/engineering/02_coding_standards.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Coding Standards ## Overview -This document defines the coding standards and conventions for agentkit-forge. +This document defines the coding standards and conventions for retort. ## Language & Style diff --git a/docs/engineering/03_testing.md b/docs/engineering/03_testing.md index 0c7d706c..df586160 100644 --- a/docs/engineering/03_testing.md +++ b/docs/engineering/03_testing.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Testing Guide ## Overview -Testing strategy and conventions for agentkit-forge. +Testing strategy and conventions for retort. ## Test Pyramid diff --git a/docs/engineering/04_git_workflow.md b/docs/engineering/04_git_workflow.md index 6d8e40fa..3ab363de 100644 --- a/docs/engineering/04_git_workflow.md +++ b/docs/engineering/04_git_workflow.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Git Workflow ## Overview -Git branching strategy and contribution workflow for agentkit-forge. +Git branching strategy and contribution workflow for retort. ## Branch Strategy diff --git a/docs/engineering/05_security.md b/docs/engineering/05_security.md index 46b4ee19..bb69df4b 100644 --- a/docs/engineering/05_security.md +++ b/docs/engineering/05_security.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Security Practices ## Overview -Security guidelines and practices for agentkit-forge. +Security guidelines and practices for retort. ## Principles diff --git a/docs/engineering/06_pr_documentation.md b/docs/engineering/06_pr_documentation.md index 5e549210..16a365dc 100644 --- a/docs/engineering/06_pr_documentation.md +++ b/docs/engineering/06_pr_documentation.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # PR Documentation Strategy ## Overview -Standardized process for documenting completed PRs and implementations in agentkit-forge. +Standardized process for documenting completed PRs and implementations in retort. This ensures comprehensive historical context and effective knowledge transfer. ## When to Create Documentation diff --git a/docs/engineering/07_changelog.md b/docs/engineering/07_changelog.md index 1ace8889..bd2f675c 100644 --- a/docs/engineering/07_changelog.md +++ b/docs/engineering/07_changelog.md @@ -1,19 +1,19 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Changelog Best Practices & Tooling Guide ## Overview -This document covers changelog best practices adopted by agentkit-forge and +This document covers changelog best practices adopted by retort and the tooling options available for automating changelog maintenance. ## Principles ### Keep a Changelog Format -agentkit-forge follows [Keep a Changelog v1.1.0](https://keepachangelog.com/en/1.1.0/): +retort follows [Keep a Changelog v1.1.0](https://keepachangelog.com/en/1.1.0/): - All notable changes are documented in `CHANGELOG.md`. - Changes are grouped under: `Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security`. diff --git a/docs/engineering/08_code_quality_assessment.md b/docs/engineering/08_code_quality_assessment.md index 05c0c787..119e780a 100644 --- a/docs/engineering/08_code_quality_assessment.md +++ b/docs/engineering/08_code_quality_assessment.md @@ -1,6 +1,6 @@ # Code Quality Assessment: Refactoring, SOLID, DRY, Complexity & Class Size -> Comprehensive analysis of code quality practices in the agentkit-forge repository, +> Comprehensive analysis of code quality practices in the retort repository, > with language-specific baselines and actionable integration recommendations. --- @@ -18,7 +18,7 @@ ## 1. Executive Summary -AgentKit Forge is a Node.js (ESM) build-time framework that generates AI-tool +Retort is a Node.js (ESM) build-time framework that generates AI-tool configurations from YAML specs. The codebase is **well-structured** with strong foundations: comprehensive test coverage (23 test files for 24 source modules), CI/CD with drift checks, conventional commits, and an established rules system. @@ -160,11 +160,11 @@ The 30-second test timeout is a symptom of this coupling. ## 3. Language & Stack-Specific Baselines -AgentKit Forge's `teams.yaml` defines four tech stacks: **Node.js (JavaScript/TypeScript)**, **.NET (C#)**, **Rust**, and **Python**. The engine itself is pure JavaScript (ESM). Below are research-backed baselines for each. +Retort's `teams.yaml` defines four tech stacks: **Node.js (JavaScript/TypeScript)**, **.NET (C#)**, **Rust**, and **Python**. The engine itself is pure JavaScript (ESM). Below are research-backed baselines for each. ### 3.1 JavaScript / TypeScript (Node.js) -This is the **primary language** of the agentkit-forge engine. +This is the **primary language** of the retort engine. #### File & Class Size Targets @@ -662,7 +662,7 @@ provides unified dashboards with: Configuration via `sonar-project.properties`: ```properties -sonar.projectKey=agentkit-forge +sonar.projectKey=retort sonar.sources=.agentkit/engines/node/src sonar.tests=.agentkit/engines/node/src/__tests__ sonar.javascript.lcov.reportPaths=.agentkit/coverage/lcov.info diff --git a/docs/engineering/08_scaffold_management.md b/docs/engineering/08_scaffold_management.md index c600d448..baf2a20b 100644 --- a/docs/engineering/08_scaffold_management.md +++ b/docs/engineering/08_scaffold_management.md @@ -1,6 +1,6 @@ # Scaffold Management Guide -This guide explains how AgentKit Forge manages generated files, how drift detection +This guide explains how Retort manages generated files, how drift detection works, and how to control scaffold behavior for your project. ## What Are Scaffold Modes? @@ -23,7 +23,7 @@ Templates use YAML frontmatter to declare their mode: agentkit: scaffold: always --- -<!-- GENERATED by AgentKit Forge ... --> +<!-- GENERATED by Retort ... --> # My Template Content ``` @@ -155,7 +155,7 @@ If you've made improvements to a generated file that would benefit the template: 1. Modify the template in `.agentkit/templates/` 2. Run `pnpm -C .agentkit agentkit:sync` -3. Submit a PR to the agentkit-forge repository +3. Submit a PR to the retort repository ## Scaffold Cache diff --git a/docs/engineering/09_quality_framework_expansion_plan.md b/docs/engineering/09_quality_framework_expansion_plan.md index aa313b6e..0cb0d85f 100644 --- a/docs/engineering/09_quality_framework_expansion_plan.md +++ b/docs/engineering/09_quality_framework_expansion_plan.md @@ -1,6 +1,6 @@ # Strategic Plan: Code Quality Framework Expansion -> Expanding the agentkit-forge code quality assessment to cover TypeScript, HTML, +> Expanding the retort code quality assessment to cover TypeScript, HTML, > CSS, Bash, PowerShell, and their associated linting/testing ecosystems alongside > the already-documented JavaScript, Python, Rust, and C# stacks. @@ -162,7 +162,7 @@ type-aware analysis. | Framework | Role | Recommendation | | -------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Vitest** | Primary unit/integration | **Recommended primary.** Native ESM, TypeScript support via esbuild, API-compatible with Jest, fastest option for Vite-based projects. Already used by agentkit-forge itself. | +| **Vitest** | Primary unit/integration | **Recommended primary.** Native ESM, TypeScript support via esbuild, API-compatible with Jest, fastest option for Vite-based projects. Already used by retort itself. | | **Jest** | Legacy primary | **Secondary.** Still the most widely used; recommend for brownfield projects already using Jest. CJS-focused; ESM support requires configuration. | | **Playwright** | E2E testing | **Recommended for E2E.** Cross-browser, auto-wait, TypeScript-first. Already detected by discover.mjs. | | **Cypress** | Alternative E2E | **Secondary.** Excellent developer experience but limited to Chromium-based browsers for component testing. Already detected by discover.mjs. | @@ -310,7 +310,7 @@ variables, missing error handling) that cause the most shell script failures. Bash/shell scripts - **teams.yaml consideration:** Shell scripts are owned by the `devops` team. Not a separate techStack, but quality rules should apply to `.sh` files in scope. -- **CI integration:** Add ShellCheck to the CI pipeline for the agentkit-forge +- **CI integration:** Add ShellCheck to the CI pipeline for the retort repository itself (26 scripts currently unchecked). #### Recommended rules.yaml Conventions @@ -691,7 +691,7 @@ when the upstream specs and templates change: ### Phase 1: High-Impact, Low-Effort (Week 1-2) -These changes address real quality gaps in the agentkit-forge repository itself. +These changes address real quality gaps in the retort repository itself. | # | Action | Impact | Effort | Dependencies | | --- | -------------------------------------------------------------------------- | ---------- | ------ | -------------------------------------- | diff --git a/docs/engineering/12_package_management.md b/docs/engineering/12_package_management.md index a44ac448..4cbd9ff1 100644 --- a/docs/engineering/12_package_management.md +++ b/docs/engineering/12_package_management.md @@ -1,11 +1,11 @@ # Package Management Architecture -This guide explains how AgentKit Forge manages package dependencies, scripts, and +This guide explains how Retort manages package dependencies, scripts, and package managers across its two-layer architecture. ## Two-Layer Design -AgentKit Forge uses a two-layer package architecture: +Retort uses a two-layer package architecture: ``` ┌─────────────────────────────────────────────────────────┐ diff --git a/docs/engineering/13_template_system.md b/docs/engineering/13_template_system.md index b6613939..df0b3575 100644 --- a/docs/engineering/13_template_system.md +++ b/docs/engineering/13_template_system.md @@ -1,6 +1,6 @@ # Template System Guide -This guide explains how AgentKit Forge's template engine works, including scaffold +This guide explains how Retort's template engine works, including scaffold modes, frontmatter, three-way merge, and the rendering pipeline. ## Template Rendering Pipeline diff --git a/docs/engineering/14_brand_theming.md b/docs/engineering/14_brand_theming.md index 8fcccd28..75796cc7 100644 --- a/docs/engineering/14_brand_theming.md +++ b/docs/engineering/14_brand_theming.md @@ -1,6 +1,6 @@ # Brand & Theming Guide -This guide explains how AgentKit Forge generates editor themes and design tokens +This guide explains how Retort generates editor themes and design tokens from the brand specification. ## Brand Spec Structure diff --git a/docs/engineering/README.md b/docs/engineering/README.md index 9deaffc9..2fb206da 100644 --- a/docs/engineering/README.md +++ b/docs/engineering/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Engineering Docs Index diff --git a/docs/engineering/doc-audit-command-proposal.md b/docs/engineering/doc-audit-command-proposal.md index 972eb04f..18b0d527 100644 --- a/docs/engineering/doc-audit-command-proposal.md +++ b/docs/engineering/doc-audit-command-proposal.md @@ -2,7 +2,7 @@ > **Status**: Proposed > **Date**: 2026-03-04 -> **Purpose**: Add a repeatable documentation audit command to agentkit-forge +> **Purpose**: Add a repeatable documentation audit command to retort --- @@ -73,7 +73,7 @@ You are a documentation specialist performing a **systematic audit** of this pro 1. **Read before judging.** Always read the actual file content — never assume from filenames. 2. **Cross-reference the specs.** The source of truth for commands, agents, and teams lives in `.agentkit/spec/`. Compare published docs against spec YAML. -3. **Respect generated files.** Files marked `GENERATED by AgentKit Forge — DO NOT EDIT` should only be flagged if they are out of sync with their spec — never edit them directly. +3. **Respect generated files.** Files marked `GENERATED by Retort — DO NOT EDIT` should only be flagged if they are out of sync with their spec — never edit them directly. 4. **Prioritize impact.** A missing API doc is higher priority than a typo in a deep reference page. 5. **Use finding IDs.** Prefix findings with `DOC-GAP-*` (missing), `DOC-STALE-*` (outdated), `DOC-LINK-*` (broken link), `DOC-DRIFT-*` (spec/doc mismatch), `DOC-DUP-*` (duplicate/conflicting). diff --git a/docs/engineering/reviews/cicd-implementation-plan.md b/docs/engineering/reviews/cicd-implementation-plan.md index 4e62d1ad..bfcd5a32 100644 --- a/docs/engineering/reviews/cicd-implementation-plan.md +++ b/docs/engineering/reviews/cicd-implementation-plan.md @@ -29,7 +29,7 @@ Adopt the `[Category] Description` pattern for all workflow `name:` fields. This | -------------------------------- | -------------------------- | ------------------------------------- | ---------- | | `ci.yml` | `CI` | `[CI] Test & Validate` | CI | | `branch-protection.yml` | `Branch Protection` | `[Governance] Branch Rules` | Governance | -| `block-agentkit-changes.yml` | `block-agentkit-changes` | `[Governance] Block AgentKit Changes` | Governance | +| `block-agentkit-changes.yml` | `block-agentkit-changes` | `[Governance] Block Retort Changes` | Governance | | `template-protection.yml` | `Template Protection` | `[Framework] Template Protection` | Framework | | `codeql.yml` | `CodeQL` | `[Security] CodeQL Analysis` | Security | | `semgrep.yml` | `Semgrep (Advisory)` | `[Security] Semgrep Scan` | Security | @@ -45,7 +45,7 @@ Renaming workflows changes the status check names used by branch protection. All - `"CI / test (ubuntu-latest, 24)"` → `"[CI] Test & Validate / test (ubuntu-latest, 24)"` - `"CI / validate"` → `"[CI] Test & Validate / validate"` - `"Branch Protection / branch-rules"` → `"[Governance] Branch Rules / branch-rules"` - - `"block-agentkit-changes / check_agentkit_changes"` → `"[Governance] Block AgentKit Changes / check-agentkit-changes"` + - `"block-agentkit-changes / check_agentkit_changes"` → `"[Governance] Block Retort Changes / check-agentkit-changes"` 2. **`.agentkit/templates/github/scripts/setup-branch-protection.sh`** — update the generated template's `contexts` array similarly @@ -175,7 +175,7 @@ Update the sync engine to generate `a2a-config.json` agent capabilities from `te Extract the repeated pnpm + Node + install pattern into a reusable composite action: ```yaml -name: Setup AgentKit +name: Setup Retort description: Install pnpm, Node.js, and agentkit dependencies inputs: node-version: diff --git a/docs/engineering/reviews/cicd-infrastructure-review-2026-03-04.md b/docs/engineering/reviews/cicd-infrastructure-review-2026-03-04.md index 163d10db..ebb8bb74 100644 --- a/docs/engineering/reviews/cicd-infrastructure-review-2026-03-04.md +++ b/docs/engineering/reviews/cicd-infrastructure-review-2026-03-04.md @@ -7,7 +7,7 @@ ## Executive Summary -AgentKit Forge has a well-structured CI/CD foundation with 8 GitHub Actions workflows, comprehensive branch governance, and a powerful spec-driven generation pipeline. However, there are **meaningful gaps between the CI/CD infrastructure and the agentic workforce it supports**. The workflows validate the _forge itself_ but don't yet generate CI/CD that exercises the full agent team model, and several hardening opportunities exist in the existing pipelines. +Retort has a well-structured CI/CD foundation with 8 GitHub Actions workflows, comprehensive branch governance, and a powerful spec-driven generation pipeline. However, there are **meaningful gaps between the CI/CD infrastructure and the agentic workforce it supports**. The workflows validate the _forge itself_ but don't yet generate CI/CD that exercises the full agent team model, and several hardening opportunities exist in the existing pipelines. This review identifies **28 findings** organized into 4 categories: diff --git a/docs/history/README.md b/docs/history/README.md index ecab947d..0cce2880 100644 --- a/docs/history/README.md +++ b/docs/history/README.md @@ -1,10 +1,10 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # History -Historical documentation for significant PRs and implementations in agentkit-forge. +Historical documentation for significant PRs and implementations in retort. ## Directory Structure diff --git a/docs/history/bug-fixes/0001-2026-03-04-infra-eval-review-fixes-bugfix.md b/docs/history/bug-fixes/0001-2026-03-04-infra-eval-review-fixes-bugfix.md index cc344d2a..e839f662 100644 --- a/docs/history/bug-fixes/0001-2026-03-04-infra-eval-review-fixes-bugfix.md +++ b/docs/history/bug-fixes/0001-2026-03-04-infra-eval-review-fixes-bugfix.md @@ -67,7 +67,7 @@ These were review-stage findings caught before merge. No user impact. The drift ## Lessons Learned 1. **Sync-then-verify discipline**: Spec changes and sync output must be committed together. A CI drift check exists but wasn't catching this because it ran on the generated output dir, not the agent files. -2. **Template protection hook awareness**: The `protect-templates.sh` PreToolUse hook blocks Edit/Write tools on `.agentkit/` paths. When working in the agentkit-forge repo itself (not an adopting repo), Bash `sed` is the workaround, but this is fragile and should be documented. +2. **Template protection hook awareness**: The `protect-templates.sh` PreToolUse hook blocks Edit/Write tools on `.agentkit/` paths. When working in the retort repo itself (not an adopting repo), Bash `sed` is the workaround, but this is fragile and should be documented. 3. **Step numbering cascades**: Handlebars conditional numbering creates a maintenance burden — every step after a conditional insert must also be conditional. Consider using ordered lists (`1.` repeated) in Markdown instead, which auto-number. --- diff --git a/docs/history/bug-fixes/README.md b/docs/history/bug-fixes/README.md index 21146d8f..366e8d49 100644 --- a/docs/history/bug-fixes/README.md +++ b/docs/history/bug-fixes/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Bug Fixes diff --git a/docs/history/bug-fixes/TEMPLATE-bugfix.md b/docs/history/bug-fixes/TEMPLATE-bugfix.md index dc63ca8f..07938299 100644 --- a/docs/history/bug-fixes/TEMPLATE-bugfix.md +++ b/docs/history/bug-fixes/TEMPLATE-bugfix.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # [Bug Description] Resolution - Historical Summary diff --git a/docs/history/features/README.md b/docs/history/features/README.md index 9a4c6080..3d63abeb 100644 --- a/docs/history/features/README.md +++ b/docs/history/features/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Features diff --git a/docs/history/features/TEMPLATE-feature.md b/docs/history/features/TEMPLATE-feature.md index cb3075b7..caaaa905 100644 --- a/docs/history/features/TEMPLATE-feature.md +++ b/docs/history/features/TEMPLATE-feature.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # [Feature Name] Launch - Historical Summary diff --git a/docs/history/implementations/0001-2026-03-01-origin-main-merge-reconciliation-implementation.md b/docs/history/implementations/0001-2026-03-01-origin-main-merge-reconciliation-implementation.md index 93b3b5f5..b74c715e 100644 --- a/docs/history/implementations/0001-2026-03-01-origin-main-merge-reconciliation-implementation.md +++ b/docs/history/implementations/0001-2026-03-01-origin-main-merge-reconciliation-implementation.md @@ -3,7 +3,7 @@ **Completed**: 2026-03-01 **Duration**: Multi-session merge and validation pass **Status**: ✅ **Near completion — verification pending** -**PR**: [#72](https://github.com/phoenixvc/agentkit-forge/pull/72) ⚡ optimize sync command with async I/O and concurrency +**PR**: [#72](https://github.com/phoenixvc/retort/pull/72) ⚡ optimize sync command with async I/O and concurrency ## Overview @@ -88,7 +88,7 @@ Merge was completed without unresolved conflicts, and critical paths were valida ## Related Documentation - **Merge Matrix**: `MERGE_RESOLUTION_MATRIX.md` -- **PR**: <https://github.com/phoenixvc/agentkit-forge/pull/72> +- **PR**: <https://github.com/phoenixvc/retort/pull/72> --- diff --git a/docs/history/implementations/0001-2026-03-20-kit-based-domain-selection-and-onboarding-redesign-implementation.md b/docs/history/implementations/0001-2026-03-20-kit-based-domain-selection-and-onboarding-redesign-implementation.md new file mode 100644 index 00000000..fb5c6268 --- /dev/null +++ b/docs/history/implementations/0001-2026-03-20-kit-based-domain-selection-and-onboarding-redesign-implementation.md @@ -0,0 +1,86 @@ +# Kit-Based Domain Selection and Onboarding Redesign — Implementation + +**Completed**: 2026-03-20 +**Duration**: 2 sessions +**Status**: ✅ **SUCCESSFULLY COMPLETED** +**PR**: #432 — `feat/kit-domain-selection-onboarding` + +## Overview + +Retort was generating rules, agents, and commands for all 16 domains regardless of the +adopter's tech stack. A TypeScript-only project received dotnet, rust, python, and blockchain +rules it would never use. This implementation adds stack-aware domain filtering, an interactive +init wizard, a CLI-spec parity validator, and resolves the agentkit-forge → retort identity +rename. + +## Key Changes + +| Commit | Change | +|--------|--------| +| `chore(spec)` | Renamed `agentkit-forge` → `retort` across all 10 spec YAML files | +| `feat(engine)` | `filterDomainsByStack()` + `filterTechStacks()` in `template-utils.mjs` + `synchronize.mjs` | +| `feat(engine)` | 16 fixture-based generation tests in `__tests__/generation.test.mjs` | +| `feat(init)` | Interactive kit wizard with dry-run mode, stack detection, optional kit selection | +| `fix(hooks)` | Truncate `run_check()` output to prevent `jq: Argument list too long` (ARG_MAX crash) | +| `perf(hooks)` | Stop hook: removed full sync + full test suite; lint-only per stack | +| `perf(hooks)` | Changed-files gating — hook costs <0.1s when nothing relevant changed | +| `feat(validate)` | Phase 10 CLI-spec parity check in `validate.mjs` | +| `chore(spec)` | `skills.yaml` spec for skill distribution model | +| `docs` | TRAE compatibility audit stub — `docs/integrations/trae-compatibility.md` | + +## Implementation Approach + +### Phase 1 — Identity rename +Replaced all 16 `agentkit-forge` references in `.agentkit/spec/` with `retort`. + +### Phase 2+3 — Domain filtering +Added `filterDomainsByStack(rules, vars, project)` and `filterTechStacks(stacks, vars)` to +`template-utils.mjs`. Applied at all domain generation call sites in `synchronize.mjs`. +`languageProfile.mode: heuristic` preserves backward-compatible all-domains behaviour. + +### Phase 4 — Init wizard +`init.mjs` now runs an interactive flow: detect stack → show active kits → prompt for +opt-in extras → write `project.yaml` → run sync → validate. `--dry-run` shows the plan +without writing. + +### Phase 6 — Generation tests +4 fixture scenarios (`js-only`, `fullstack`, `explicit-domains`, `heuristic`) assert the +correct domains appear/are absent after a sync run. + +### Stop hook fixes (cross-cutting) +- ARG_MAX fix: `run_check()` truncates output to 3000 chars before passing to `jq --arg` +- Performance: replaced 30s+ drift sync + full test suite with lightweight `git diff` warn + and lint-only checks; changed-files gating skips all checks when nothing relevant changed + +### Phase 5 — Issue tracking +- Issue 006: `validate.mjs` Phase 10 CLI-spec parity; all checkboxes closed +- Issue 040: elegance-guidelines sync compatibility; final checkbox closed +- `/cicd-optimize` command added to `commands.yaml` +- `init` added as `type: framework`; `FRAMEWORK_COMMANDS` documented + +## Results + +- **Stop hook**: worst-case 277s → <5s; unchanged-code path <0.1s +- **Domain noise**: JS-only projects now receive 9 domains instead of 16 +- **Test suite**: 1243 tests, all passing (1 skipped Prettier formatting check) +- **Issues closed**: 006 (fully), 040 (fully) +- **Identity**: zero `agentkit-forge` references remain in `.agentkit/spec/` + +## Deferred + +- **TRAE format audit** (Issues 025/026/027): requires WebFetch — blocked this session. + Tracking doc at `docs/integrations/trae-compatibility.md` with 4 URLs and audit questions. + +## Lessons Learned + +- `jq --arg` silently fails on ARG_MAX-sized strings — truncate before passing +- Stop hooks must be <5s to avoid blocking interactive sessions; test suites are never appropriate +- Changed-files gating is the right pattern for all language checks in stop hooks +- `languageProfile.mode` as a three-way switch (heuristic / hybrid / configured) gives + clean backward-compat story for domain filtering + +--- + +**Implementation Team**: Claude Sonnet 4.6 + JustAGhosT +**Review Status**: PR #432 open, pending merge +**Next Steps**: Merge PR #432; TRAE audit in next session with web access diff --git a/docs/history/implementations/0002-2026-03-01-sync-test-performance-stabilization-implementation.md b/docs/history/implementations/0002-2026-03-01-sync-test-performance-stabilization-implementation.md index 34938d76..f70ddade 100644 --- a/docs/history/implementations/0002-2026-03-01-sync-test-performance-stabilization-implementation.md +++ b/docs/history/implementations/0002-2026-03-01-sync-test-performance-stabilization-implementation.md @@ -89,7 +89,7 @@ Sync integration suite became stable and significantly faster in hotspot cases w ## Related Documentation -- **PR**: <https://github.com/phoenixvc/agentkit-forge/pull/72> +- **PR**: <https://github.com/phoenixvc/retort/pull/72> - **Engine Source**: `.agentkit/engines/node/src/synchronize.mjs` - **Tests**: `.agentkit/engines/node/src/__tests__/sync-integration.test.mjs` diff --git a/docs/history/implementations/0003-2026-03-01-post-history-ci-and-config-stabilization-implementation.md b/docs/history/implementations/0003-2026-03-01-post-history-ci-and-config-stabilization-implementation.md index aca1de06..67dfe0df 100644 --- a/docs/history/implementations/0003-2026-03-01-post-history-ci-and-config-stabilization-implementation.md +++ b/docs/history/implementations/0003-2026-03-01-post-history-ci-and-config-stabilization-implementation.md @@ -3,7 +3,7 @@ **Completed**: 2026-03-01 **Duration**: Multi-pass validation and corrective updates **Status**: ✅ **SUCCESSFULLY COMPLETED** -**PR**: [#72](https://github.com/phoenixvc/agentkit-forge/pull/72) ⚡ optimize sync command with async I/O and concurrency +**PR**: [#72](https://github.com/phoenixvc/retort/pull/72) ⚡ optimize sync command with async I/O and concurrency ## Overview @@ -70,7 +70,7 @@ This phase restored CI alignment and reduced recurrence risk for test and genera - **Previous baseline**: `docs/history/implementations/0001-2026-03-01-origin-main-merge-reconciliation-implementation.md` - **Previous baseline**: `docs/history/implementations/0002-2026-03-01-sync-test-performance-stabilization-implementation.md` -- **PR**: <https://github.com/phoenixvc/agentkit-forge/pull/72> +- **PR**: <https://github.com/phoenixvc/retort/pull/72> --- diff --git a/docs/history/implementations/0004-2026-03-04-infra-eval-template-integration-implementation.md b/docs/history/implementations/0004-2026-03-04-infra-eval-template-integration-implementation.md index bd66d645..ab600188 100644 --- a/docs/history/implementations/0004-2026-03-04-infra-eval-template-integration-implementation.md +++ b/docs/history/implementations/0004-2026-03-04-infra-eval-template-integration-implementation.md @@ -67,7 +67,7 @@ The `/infra-eval` command is now available to any project that sets `evaluation. 1. **Handlebars conditional numbering is brittle**: When inserting a conditionally-numbered step in a Markdown ordered list, every subsequent step must also be conditionalized. This creates a maintenance cascade. A better pattern would be to use Markdown auto-numbering (all steps as `1.`) or to restructure the template to isolate conditional sections. -2. **Template protection hook blocks the forge repo too**: The `protect-templates.sh` hook doesn't distinguish between "adopting repo" and "the agentkit-forge repo itself." When developing templates in the forge repo, the hook blocks Edit/Write tools, forcing the use of Bash `sed` as a workaround. This is by design (protects against accidental edits) but should be documented in the contributing guide. +2. **Template protection hook blocks the forge repo too**: The `protect-templates.sh` hook doesn't distinguish between "adopting repo" and "the retort repo itself." When developing templates in the forge repo, the hook blocks Edit/Write tools, forcing the use of Bash `sed` as a workaround. This is by design (protects against accidental edits) but should be documented in the contributing guide. 3. **Event schema must be centrally registered**: Defining a new event type in a command template without adding it to the orchestrator's enum creates a silent inconsistency. The orchestrator won't recognize the event. Consider adding a spec-level validation that cross-references event types across command templates. diff --git a/docs/history/implementations/0005-2026-03-06-cost-management-plan-implementation.md b/docs/history/implementations/0005-2026-03-06-cost-management-plan-implementation.md index 99bd4d5f..3792ca2a 100644 --- a/docs/history/implementations/0005-2026-03-06-cost-management-plan-implementation.md +++ b/docs/history/implementations/0005-2026-03-06-cost-management-plan-implementation.md @@ -1,7 +1,7 @@ # Cost Management Infrastructure — Comprehensive Plan > **Context**: Recent incident where agent usage spiraled out of control. -> **Scope**: Three repos — `agentkit-forge` (spec/templates), `ai-gateway` (runtime), `pvc-costops-analytics` (FinOps analytics). +> **Scope**: Three repos — `retort` (spec/templates), `ai-gateway` (runtime), `pvc-costops-analytics` (FinOps analytics). > **Goal**: Unified cost governance spanning AI agent usage, Azure infrastructure, and resource group budgeting. --- @@ -12,16 +12,16 @@ | Capability | Repo | Status | Gap | | -------------------------------------------------------- | --------------------- | ---------------------------- | ----------------------------------------------------------- | -| Session cost tracking (duration, commands, files) | agentkit-forge | Implemented | Observation-only — no enforcement | -| Budget-guard module (circuit breaker) | agentkit-forge | **Just added** (this branch) | Not wired to hooks, no tests, no CLI integration | -| `/cost` CLI command | agentkit-forge | Implemented | Reports only — no limits | -| `/infra-eval` with cost dimension (16% weight) | agentkit-forge | Implemented | Evaluation-only — no remediation | -| `infra` agent with cost-optimization responsibility | agentkit-forge | Defined | Generic — not specialized for cost governance | -| FinOps integration spec (FINOPS_AGENTKIT_INTEGRATION.md) | agentkit-forge | Documented | Phase 1 spec exists but not implemented in templates | +| Session cost tracking (duration, commands, files) | retort | Implemented | Observation-only — no enforcement | +| Budget-guard module (circuit breaker) | retort | **Just added** (this branch) | Not wired to hooks, no tests, no CLI integration | +| `/cost` CLI command | retort | Implemented | Reports only — no limits | +| `/infra-eval` with cost dimension (16% weight) | retort | Implemented | Evaluation-only — no remediation | +| `infra` agent with cost-optimization responsibility | retort | Defined | Generic — not specialized for cost governance | +| FinOps integration spec (FINOPS_AGENTKIT_INTEGRATION.md) | retort | Documented | Phase 1 spec exists but not implemented in templates | | AI Gateway with rate limiting | ai-gateway | Deployed | No budget caps, no usage telemetry export, no chargeback | | Azure Container Apps (scale-to-zero) | ai-gateway | Deployed | No Azure Budget resources in Terraform | | ADX cost analytics (KQL, Grafana) | pvc-costops-analytics | Partial | Private repo; Phase 1 spec defined but checklist incomplete | -| pvc-costops-analytics overlay | agentkit-forge | Scaffolded | Empty — no rules, commands, or cost config | +| pvc-costops-analytics overlay | retort | Scaffolded | Empty — no rules, commands, or cost config | ### 1.2 What Caused the Spiral @@ -39,9 +39,9 @@ Building on the existing model from `FINOPS_AGENTKIT_INTEGRATION.md`: | Concern | Primary Repo | What It Owns | | ---------------------------------------------- | ----------------------- | ----------------------------------------------------------------- | -| **Budget policy schema & enforcement engine** | `agentkit-forge` | `budget-guard.mjs`, policy config in `settings.yaml`, hook wiring | -| **Agent session cost tracking** | `agentkit-forge` | `cost-tracker.mjs`, `/cost` command, session JSONL logs | -| **FinOps methodology & templates** | `agentkit-forge` | Rules, Phase 1 spec template, overlay config for FinOps repos | +| **Budget policy schema & enforcement engine** | `retort` | `budget-guard.mjs`, policy config in `settings.yaml`, hook wiring | +| **Agent session cost tracking** | `retort` | `cost-tracker.mjs`, `/cost` command, session JSONL logs | +| **FinOps methodology & templates** | `retort` | Rules, Phase 1 spec template, overlay config for FinOps repos | | **Cost centre / resource group management UX** | `pvc-costops-analytics` | ADX tables, KQL functions, Grafana dashboards, cost centre CRUD | | **Azure Budget resources (IaC)** | `ai-gateway` | Terraform `azurerm_consumption_budget_*` in infra/modules | | **Gateway usage metering & telemetry** | `ai-gateway` | Request logging, token counting, usage export to ADX | @@ -105,7 +105,7 @@ This is handled by the existing template rendering pipeline — no new agent nee --- -## Part 4: Implementation Plan — agentkit-forge +## Part 4: Implementation Plan — retort ### 4.1 Complete Budget-Guard Module (budget-guard.mjs) @@ -445,7 +445,7 @@ unbudgeted_resources(_since) — Resources not in any cost centre ## Part 7: Template & Integration Changes Summary -### 7.1 agentkit-forge Changes (This PR) +### 7.1 retort Changes (This PR) | File | Change | Priority | | ------------------------------------------------------------ | --------------------------------------------- | -------- | diff --git a/docs/history/implementations/0007-2026-03-06-standardize-github-issues-implementation.md b/docs/history/implementations/0007-2026-03-06-standardize-github-issues-implementation.md index eaf01567..6e2496ba 100644 --- a/docs/history/implementations/0007-2026-03-06-standardize-github-issues-implementation.md +++ b/docs/history/implementations/0007-2026-03-06-standardize-github-issues-implementation.md @@ -8,7 +8,7 @@ ## Problem Statement -When adopting AgentKit Forge into an existing repository, GitHub issues (and +When adopting Retort into an existing repository, GitHub issues (and potentially Linear issues) already exist in various formats, labels, and states. There is no automated mechanism to: diff --git a/docs/history/implementations/0008-2026-03-17-linear-workspace-setup-implementation.md b/docs/history/implementations/0008-2026-03-17-linear-workspace-setup-implementation.md new file mode 100644 index 00000000..06fa26c0 --- /dev/null +++ b/docs/history/implementations/0008-2026-03-17-linear-workspace-setup-implementation.md @@ -0,0 +1,126 @@ +# Linear PhoenixVC Workspace Setup - Historical Summary + +**Completed**: 2026-03-17 +**Duration**: Single session (~2 hours) +**Status**: ✅ **SUCCESSFULLY COMPLETED** (with pending manual items) +**PR**: N/A — Configuration-only, no code changes + +## Overview + +Set up the Linear PhoenixVC workspace with 7 sub-teams, label-based routing, issue templates, workflow automations, auto-triage via Tembo, and a Notion intake agent. This creates a structured workflow where new issues are automatically enriched with context (codebase, Notion, Sentry), labeled, prioritized, and routed to the appropriate team for action. + +## Implementation Summary + +### Projects/Components Affected + +- ✅ **Linear PhoenixVC Workspace** — 7 sub-teams created with distinct purposes +- ✅ **Label System** — 2 label groups (Routing + Type) with 13 labels total +- ✅ **Issue Templates** — 8 templates at workspace level with default properties +- ✅ **Workflow Automations** — PR-to-status mapping, auto-close stale issues +- ✅ **Tembo Auto-Triage** — "Enrich Linear Issue" automation with routing logic +- ✅ **Notion Intake Agent** — Automated Notion → Linear filing with research, dedup, and routing +- ✅ **Issue Statuses** — 6 custom statuses added (Investigating, Findings Ready, Testing, Waiting, Passed, Failed) + +### Key Changes Made + +1. **Team Structure** — Created Coding (COD), Research (RES), QA (QA), Ops (OPS), Design (DES), Docs (DOC), Support (SUP) as sub-teams under PhoenixVC (PHO) +2. **Label-Based Routing** — Each ticket gets 1 Routing label (determines team) + 1 Type label (Bug/Feature/Improvement/chore) +3. **Auto-Triage via Tembo** — Claude Code Opus 4.6 agent enriches every new issue and applies routing labels + moves to correct team +4. **Templates with Defaults** — Each template auto-sets Team and Labels via default properties +5. **Triage Enabled** — All teams have triage enabled, assigned to Jurie Smit +6. **Workspace Agent Guidance** — Drafted instructions for Linear's AI agents section + +### Issues Resolved + +- **No routing system**: Previously, all issues landed in one bucket with no clear assignment → Now label-based routing auto-assigns to teams +- **No agent differentiation**: Unclear which AI agent to use for what → Now Codex/Cursor/Copilot for coding, Tembo/ChatGPT/Solo for research, Stilla for design +- **No enrichment**: Issues created with minimal context → Tembo now enriches with codebase/Notion/Sentry context + +## Implementation Approach + +### Phase 1: Team & Label Design + +Analyzed available Linear integrations (8 agents, 30+ available). Designed 5 teams based on work type, not tool type. Created label groups for routing and classification. + +### Phase 2: Configuration + +Created teams, labels (via GraphQL API — some worked, some required manual creation), statuses (added to parent team for inheritance), and templates (workspace level with default properties). + +### Phase 3: Automation + +Extended existing Tembo "Enrich Linear Issue" automation to also apply routing labels, type labels, priority, and move issues to the correct team. + +## Results + +### Configuration + +- **Teams**: 7 sub-teams + 1 parent = 8 total +- **Labels**: 13 workspace-level labels in 2 groups +- **Templates**: 8 issue templates with default properties +- **Statuses**: 14 total (8 default + 6 custom) +- **Automations**: PR→status mapping, auto-close stale, Tembo enrichment + routing + +### Agent Assignment + +| Team | Primary Agents | +|------|---------------| +| Coding | Codex (autonomous), Cursor (interactive), GitHub Copilot (PR gen) | +| Research | Tembo (orchestrator), ChatGPT (deep research), Solo (codebase Q&A) | +| QA | Ranger (recommended), Tusk (recommended) — not yet enabled | +| Ops | GitHub integration (broken auth) | +| Design | Stilla (meeting context + drafts) | +| Docs | Claude Code, Notion AI | +| Support | Intercom (MCP), ChatGPT | + +## Lessons Learned + +### Technical Insights + +- Linear sub-teams cannot have their own workflow states — they inherit from the parent team +- Linear's MCP OAuth connects to whichever workspace you select during auth flow — re-auth needed to switch workspaces +- Label groups should be created at workspace level, not team level, for cross-team visibility +- Tembo's "Auto" repo setting can cause wrong-repo context — use explicit repo selection + +### Process Improvements + +- Templates with default properties (Team + Labels) reduce manual routing to zero +- Every ticket needs exactly 2 labels (1 routing + 1 type) for the system to work +- Cost awareness: Opus 4.6 for every new issue is expensive — Sonnet is sufficient for enrichment + +### Best Practices Established + +- Create labels at workspace level with descriptive group names +- Use templates' default properties to auto-route, not workflow automations +- Keep team count small (7) — more teams = more routing complexity +- Single triage owner (human) as safety net until automation is proven + +## Future Considerations + +- Enable Ranger and Tusk agents for QA team when budget allows +- Fix GitHub integration auth in Tembo for Auto Fix CI, Enrich GitHub Issue, PR Review automations +- Switch Tembo agent from Opus to Sonnet for cost reduction +- Re-authorize Linear MCP plugin to PhoenixVC workspace +- Evaluate whether to add CodeRabbit for automated PR reviews +- Consider adding priority-based assignment within teams (e.g., Urgent bugs → Codex for speed) + +## Pending Manual Items + +- [ ] Revoke "Claude MCP key" Linear API key (shared in chat) +- [ ] Fix GitHub auth in Tembo +- [ ] Change Tembo repo from "Auto" to explicit +- [ ] Paste workspace agent guidance into Linear Settings → Agents +- [ ] Change stale close from 6 months to 3 months +- [ ] Enable auto-close parent issues +- [ ] Re-authorize Linear MCP to PhoenixVC workspace + +## Related Documentation + +- **Session Memory**: `~/.claude/projects/.../memory/MEMORY.md` — Linear section added +- **MCP Knowledge Graph**: 12 entities + 11 relations saved covering full workspace config +- **Notion Intake Agent**: `docs/integrations/04_notion-linear-intake-agent.md` — Full agent instructions + +--- + +**Implementation Team**: Claude Code + Jurie Smit (manual UI config) +**Review Status**: Operational — Tembo enrichment running, routing labels created +**Next Steps**: Fix GitHub auth in Tembo, revoke exposed API key, switch to Sonnet model diff --git a/docs/history/implementations/README.md b/docs/history/implementations/README.md index 7ebdcca2..c4e567cb 100644 --- a/docs/history/implementations/README.md +++ b/docs/history/implementations/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Implementations diff --git a/docs/history/implementations/TEMPLATE-implementation.md b/docs/history/implementations/TEMPLATE-implementation.md index 43a64634..8f1dcb74 100644 --- a/docs/history/implementations/TEMPLATE-implementation.md +++ b/docs/history/implementations/TEMPLATE-implementation.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # [Feature/Change Name] Implementation - Historical Summary diff --git a/docs/history/issues/README.md b/docs/history/issues/README.md index a969007d..b7cd22f2 100644 --- a/docs/history/issues/README.md +++ b/docs/history/issues/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Issues diff --git a/docs/history/issues/TEMPLATE-issue.md b/docs/history/issues/TEMPLATE-issue.md index 58f7b75b..818b5cd3 100644 --- a/docs/history/issues/TEMPLATE-issue.md +++ b/docs/history/issues/TEMPLATE-issue.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # [Issue Title] - Issue Record diff --git a/docs/history/lessons-learned/README.md b/docs/history/lessons-learned/README.md index 2eaf3812..d6714a1c 100644 --- a/docs/history/lessons-learned/README.md +++ b/docs/history/lessons-learned/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Lessons Learned diff --git a/docs/history/lessons-learned/TEMPLATE-lesson.md b/docs/history/lessons-learned/TEMPLATE-lesson.md index 2a7eb9f6..54771cf8 100644 --- a/docs/history/lessons-learned/TEMPLATE-lesson.md +++ b/docs/history/lessons-learned/TEMPLATE-lesson.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # [Lesson Title] - Lesson Learned diff --git a/docs/history/migrations/README.md b/docs/history/migrations/README.md index a2f107b5..23c2d78c 100644 --- a/docs/history/migrations/README.md +++ b/docs/history/migrations/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Migrations diff --git a/docs/history/migrations/TEMPLATE-migration.md b/docs/history/migrations/TEMPLATE-migration.md index 6cbcb6dc..0025fbc9 100644 --- a/docs/history/migrations/TEMPLATE-migration.md +++ b/docs/history/migrations/TEMPLATE-migration.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # [Migration Name] - Historical Summary diff --git a/docs/integrations/01_external_apis.md b/docs/integrations/01_external_apis.md index 66f81771..4ceccf79 100644 --- a/docs/integrations/01_external_apis.md +++ b/docs/integrations/01_external_apis.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # External APIs ## Overview -This document catalogues the external APIs that agentkit-forge integrates with. +This document catalogues the external APIs that retort integrates with. ## Integration Inventory diff --git a/docs/integrations/02_webhooks.md b/docs/integrations/02_webhooks.md index f489153d..69d77092 100644 --- a/docs/integrations/02_webhooks.md +++ b/docs/integrations/02_webhooks.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Webhooks ## Overview -<!-- Describe the webhook system for agentkit-forge — both inbound and outbound. --> +<!-- Describe the webhook system for retort — both inbound and outbound. --> ## Outbound Webhooks diff --git a/docs/integrations/03_sdk.md b/docs/integrations/03_sdk.md index 578259bb..aa7c0ee1 100644 --- a/docs/integrations/03_sdk.md +++ b/docs/integrations/03_sdk.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # SDK Guide ## Overview -<!-- Describe available SDKs and client libraries for the agentkit-forge API. --> +<!-- Describe available SDKs and client libraries for the retort API. --> ## Available SDKs diff --git a/docs/integrations/04_notion-linear-intake-agent.md b/docs/integrations/04_notion-linear-intake-agent.md new file mode 100644 index 00000000..f5450196 --- /dev/null +++ b/docs/integrations/04_notion-linear-intake-agent.md @@ -0,0 +1,168 @@ +# Notion → Linear Intake Agent Instructions + +**Last updated**: 2026-03-17 +**Platform**: Notion Automation (AI agent) +**Trigger**: New item added to Linear Intake database +**Workspace**: PhoenixVC (Linear) ↔ PhoenixVC (Notion) + +--- + +## 📖 Overview + +When a new item is added to **Linear Intake**, you must ensure it ends up in exactly one place: + +- A **Linear issue** in the correct sub-team (then mark the intake item as **Filed**), or +- **Backlog** (if it should be tracked but not filed to Linear yet), or +- **Rejections** (if it should not be tracked). + +**Rule:** Nothing may remain in Intake after you process it. + +--- + +## ✅ What to do when triggered + +### Step 1 — Read the intake item + +Read the new page's properties and content: + +- Issue Title +- Type (Bug, Feature, Improvement, chore) +- Priority +- Area, Components, Environment +- Project (which repo/product this relates to) +- Linked PR +- Any text in the page body +- Any Attachments + +### Step 2 — Gather context + +- If **Linked PR** exists, open it and extract relevant details (error messages, stack traces, affected area). +- If **Attachments** exist, open them when possible and extract relevant details. +- Search within **Linear Intake** and **Backlog** for similar items (same or very similar title). +- In Linear, search for likely duplicates by title and key terms. + +### Step 3 — Ask if unclear + +If key information is missing or the filing decision is ambiguous, **ask clarifying questions instead of guessing**. + +Examples of when to ask: + +- Unclear expected vs actual behavior +- Missing repro steps +- Missing environment +- Unclear impact or severity +- Unclear whether it is a bug vs feature +- Cannot determine which project/repo it belongs to + +### Step 4 — Create the Linear issue + +Use the best available mapping from the intake item: + +**Title:** Use Issue Title as-is. + +**Project:** Match to the relevant Linear project based on the intake item's Project property, Area, or repo references. If no matching project exists, file under the parent team (PhoenixVC). + +**Team assignment:** Assign to the correct sub-team based on the routing label you apply (see labels below): + +| Routing label | Sub-team | +|---|---| +| `ready-to-code` | Coding (COD) | +| `needs-investigation` | Research (RES) | +| `needs-tests` | QA (QA) | +| `ci-cd` or `find-similar` | Ops (OPS) | +| `needs-visual-check` | Design (DES) | +| `needs-docs` | Docs (DOC) | +| `customer-issue` | Support (SUP) | + +**Assignees:** Leave unassigned by default — the team's triage process will handle assignment. Only assign `@Tembo` if your research was inconclusive and deeper investigation is needed before the issue is actionable. + +**Priority (Linear):** + +| Notion Priority | Linear Priority | +|---|---| +| Critical | P0 (Urgent) | +| High | P1 (High) | +| Medium | P2 (Medium) | +| Low | P3 (Low) | + +**Labels (required — exactly 2):** + +1. **ONE routing label** (determines which team receives the issue): + - `ready-to-code`, `needs-investigation`, `needs-tests`, `ci-cd`, `find-similar`, `needs-visual-check`, `needs-docs`, `customer-issue` +2. **ONE type label** (classifies the work): + - `Bug`, `Feature`, `Improvement`, or `chore` + - Map from the Notion Type property when available. If Type is missing, infer from the content. + +You may also add additional surface-area labels that help based on Area, Components, Environment, and the page body (e.g. `frontend`, `api`, `database`, `redis`, `auth`, `ui/ux`, `devops`). These are optional and supplementary — the two required labels above are mandatory. + +**Description:** Summarize the context you found and include a link back to the Notion page. When you performed research, include: + +- **Suggested approach** — what you found and a hypothesis (not a certainty) +- **Related incidents** — links to prior Linear issues or internal postmortems +- **Likely code location** — repo paths with candidate class/function names + +**Confidence flag:** If you are less than 80% confident in your routing label, type label, or priority assignment, add a comment on the issue: `⚠️ Low confidence on [label/priority] — please verify during triage`. + +### Step 5 — File the intake item + +Every intake item must end up somewhere — **never leave it in Intake**. + +| Outcome | Action | +|---|---| +| **Filed to Linear** | Set Status to `Filed`. Move page out of Intake. | +| **Duplicate** | Set Status to `Duplicate`. Move page to **Rejections**. Link the existing Linear issue in the page body or comments. | +| **Track but don't file** | Move page to **Backlog**. Set Status to `Backlog` or `To Do`. | +| **Not tracking** | Move page to **Rejections**. Set Status to `Rejected`. | + +--- + +## 🔁 Duplicate handling + +- Check for duplicates in **Linear** using a reasonable title and keyword search. +- Also search within **Linear Intake** and **Backlog** to avoid double-filing the same item. +- If a likely match exists, prefer marking as **Duplicate** instead of creating a new Linear issue. +- Include the existing Linear issue link in the Notion page body or comments when marking duplicate. + +--- + +## 🔎 Research (when it helps) + +Perform research when the issue seems non-trivial, unclear, or risky. Skip research for straightforward items where the routing and context are obvious. + +**Web search:** + +- Search for known causes, fixes, and best-practice remediation steps for the symptoms and stack involved. +- If relevant, search Notion helpdocs for product-behavior details. +- Prefer actionable, credible sources (official docs, vendor docs, well-known maintainers). + +**Historic incidents:** + +- Search Linear for prior incidents or issues with similar symptoms, affected area, or error messages. +- Search within Notion for earlier related intake items. +- If there are relevant incident reports or postmortems in Notion, link them. + +**Code search** (when it would materially improve the ticket — non-trivial issues, stack traces, specific endpoints, repeat incidents): + +- Identify the most likely surface area: app (frontend), backend service, API, database, cache/redis. +- Search the relevant repo (e.g. `https://github.com/phoenixvc/Mystira.workspace` for Mystira, or the repo matching the project) for relevant files and symbols. +- If you can identify the most likely function or code path, add permalinks to the relevant files/lines. + +**Add to the Linear description:** + +- **Suggested approach** — summarize what you found. Frame as a hypothesis, not certainty. +- **Related incidents** — links to prior Linear issues and internal incident/postmortem pages. +- **Likely code location** — repo paths plus any candidate class/function names with permalinks. + +--- + +## 📊 Team routing reference + +| # | Team | Key | Routing Label | Primary Agents | +|---|------|-----|---------------|----------------| +| 1 | Coding | COD | `ready-to-code` | Codex, Cursor, Copilot | +| 2 | Research | RES | `needs-investigation` | Tembo, ChatGPT, Solo | +| 3 | QA | QA | `needs-tests` | Ranger, Tusk | +| 4 | Ops | OPS | `ci-cd` / `find-similar` | GitHub integration | +| 5 | Design | DES | `needs-visual-check` | Stilla | +| 6 | Docs | DOC | `needs-docs` | Claude Code, Notion AI | +| 7 | Support | SUP | `customer-issue` | Intercom (MCP), ChatGPT | diff --git a/docs/integrations/README.md b/docs/integrations/README.md index 48aa94c7..9ec06fca 100644 --- a/docs/integrations/README.md +++ b/docs/integrations/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Integrations Docs Index diff --git a/docs/integrations/cognitive-mesh-skill.md b/docs/integrations/cognitive-mesh-skill.md new file mode 100644 index 00000000..8522a0de --- /dev/null +++ b/docs/integrations/cognitive-mesh-skill.md @@ -0,0 +1,76 @@ +# Cognitive Mesh Integration Skill + +> **Status:** Planned — blocked on cognitive-mesh Phase 5 (HTTP API not yet live) +> **API URL:** https://cognitive-mesh-api.blackmoss-00f95c9e.southafricanorth.azurecontainerapps.io +> **Tracked in:** org-meta/.roadmap.yaml → cognitive-mesh-http-api + +## Overview + +Integrate cognitive-mesh as a reasoning backend for retort quality gates and agent routing. Instead of static rule-based gates, retort agents can invoke cognitive-mesh to reason about output quality using chain-of-thought, debate, or strategic reasoning modes. + +## Endpoints to Integrate + +### 1. Health Check (implement first) +``` +GET /api/v1/cognitive/health +``` +No auth. Retort should check this before invoking any cognitive-mesh skill — fail gracefully if down. + +### 2. Core Reasoning (primary integration) +``` +POST /api/v1/cognitive/reason +``` +Used by quality gates to reason about agent output. Replace static pass/fail rules with dynamic reasoning. + +**Proposed request shape:** +```json +{ + "mode": "chain-of-thought" | "debate" | "strategic", + "context": "string", + "input": "string", + "criteria": ["string"] +} +``` + +**Proposed response shape:** +```json +{ + "conclusion": "string", + "confidence": 0.0-1.0, + "reasoning": ["string"], + "pass": true | false +} +``` + +### 3. Agency Routing (future — after reason is stable) +``` +POST /api/v1/cognitive/agency/route +``` +Replace retort's static team assignment with cognitive-mesh routing. Pass task description, get back recommended agent team. + +## Retort Integration Points + +### Quality Gate Skill +Create `skills/cognitive-mesh-gate.ts`: +- Invoke `/health` on init +- Call `/reason` with gate criteria + agent output +- Map `pass: false` + `confidence < threshold` to gate failure +- Surface `reasoning[]` in gate failure message (actionable feedback) + +### Orchestrator Hook +In `AGENT_TEAMS.md` or orchestrator config: +- Before dispatching to a team, optionally call `/agency/route` +- Use as a hint, not hard override (cognitive-mesh down = fall back to static routing) + +## Auth +TBD — cognitive-mesh API auth not yet designed. Likely Azure Managed Identity or API key via Key Vault (`cog-shared-kv-san`). + +## Dependencies +- cognitive-mesh Phase 5 complete (CognitiveMeshController.cs implemented) +- cognitive-mesh Phase 6 complete (deployed to CAE) +- retort skill scaffolding in place + +## Notes +- cognitive-mesh ACR: `myssharedacr.azurecr.io` (shared org registry) +- cognitive-mesh dev RG: `cog-dev-rg-san` (SAF North) +- Do not add cognitive-mesh as a hard dependency — degrade gracefully when unavailable diff --git a/docs/integrations/ide-settings-sync.md b/docs/integrations/ide-settings-sync.md new file mode 100644 index 00000000..b9f93768 --- /dev/null +++ b/docs/integrations/ide-settings-sync.md @@ -0,0 +1,104 @@ +# IDE Settings Sync Reference + +> Last updated: 2026-03-19 | Status: documentation + +## Overview + +Cross-IDE settings sync strategy for the phoenixvc workspace. Baseline editor: **Zed**. + +## Supported Editors + +| Editor | Config Location | Status | Notes | +|--------|----------------|--------|-------| +| Zed | `%APPDATA%/Zed/settings.json` | **baseline** | Most refined settings | +| VS Code | `%APPDATA%/Code/User/settings.json` | parity needed | | +| Cursor | `%APPDATA%/Cursor/User/settings.json` | parity needed | Fork of VS Code | +| Windsurf | `%APPDATA%/Windsurf/User/settings.json` | parity needed | Fork of VS Code | +| Antigravity | — | pending setup | | +| Trae | — | pending setup | | +| Qoder | — | pending setup | | +| Nimbalyst | — | pending setup | | +| Rider | — | pending setup | JetBrains .NET IDE | +| PyCharm | — | pending setup | Partner's IDE (Python) | + +## Zed Baseline Settings + +Located: `C:\Users\smitj\AppData\Roaming\Zed\settings.json` + +### Key Conventions + +| Setting | Zed Value | Target Parity | +|---------|-----------|---------------| +| Terminal shell | Git bash | All editors | +| Whitespace rendering | `"boundary"` | All editors | +| Tab size (C#) | 4 | All editors | +| Tab size (Python) | 4 | All editors | +| Tab size (Rust) | 4 | All editors | +| Tab size (TS/JSON/YAML) | 2 | All editors | +| Theme | Ayu Light/Dark | Align others | +| Format on save | `on` | All editors | +| Auto save | `on_focus_change` | Align | + +### Language-Specific Overrides + +```json +{ + "languages": { + "CSharp": { "tab_size": 4, "hard_tabs": false }, + "Python": { "tab_size": 4, "format_on_save": "on" }, + "Rust": { "tab_size": 4, "hard_tabs": false }, + "TypeScript": { "tab_size": 2 }, + "TSX": { "tab_size": 2 }, + "JSON": { "tab_size": 2 }, + "YAML": { "tab_size": 2 } + } +} +``` + +## Current Gaps + +### VS Code +- Terminal defaults to PowerShell (not Git bash) +- Whitespace rendering: `"none"` (vs `"boundary"`) +- No language-specific tab size overrides + +### Cursor +- Similar gaps to VS Code +- Has unique: `cursor.windowSwitcher.sidebarHoverCollapsed` + +### Windsurf +- Similar gaps to VS Code +- Has unique: `editor.tabCompletion: "on"` + +## Task + +Mark org-meta roadmap item `org-meta-foundation` > `Cross-IDE settings sync` as done when: +- [x] Document baseline (Zed) +- [x] Align VS Code settings +- [x] Align Cursor settings +- [x] Align Windsurf settings +- [ ] Document Antigravity, Trae, Qoder, Nimbalyst configs (once installed) +- [ ] Document Rider, PyCharm configs (once partner sets up) + +## Changes Applied (2026-03-19) + +### VS Code +- `files.autoSave`: `afterDelay` → `onFocusChange` +- `editor.renderWhitespace`: `none` → `boundary` +- `terminal.integrated.defaultProfile.windows`: `PowerShell` → `Git Bash` +- Added language overrides: C# (4), Python (4), Rust (4), TS/JSON/YAML (2) + +### Cursor +- `files.autoSave`: `afterDelay` → `onFocusChange` +- `editor.renderWhitespace`: `none` → `boundary` +- Added language overrides: C# (4), Python (4), Rust (4), TS/JSON/YAML (2) + +### Windsurf +- `files.autoSave`: `afterDelay` → `onFocusChange` +- `editor.renderWhitespace`: `none` → `boundary` +- Added language overrides: C# (4), Python (4), Rust (4), TS/JSON/YAML (2) + +## Related + +- User profile: `mystira-workspace/.agents/users/smitj.yaml` +- Original task: org-meta `.roadmap.yaml` > `org-meta-foundation` diff --git a/docs/integrations/trae-compatibility.md b/docs/integrations/trae-compatibility.md new file mode 100644 index 00000000..6c65323f --- /dev/null +++ b/docs/integrations/trae-compatibility.md @@ -0,0 +1,140 @@ +# TRAE Compatibility Audit + +**Status:** Research in progress — web fetch required to complete +**Issues:** [#025](../../.github/ISSUES/025-trae-rules-revisit.md) · [#026](../../.github/ISSUES/026-trae-skills-revisit.md) · [#027](../../.github/ISSUES/027-trae-agents-revisit.md) +**Priority:** P1 (agents), P2 (rules, skills) + +--- + +## URLs to fetch + +| Topic | URL | +|-------|-----| +| Rules format | `https://docs.trae.ai/ide/rules?_lang=en` | +| Skills format | `https://docs.trae.ai/ide/skills?_lang=en` | +| Agents / one-click import | `https://docs.trae.ai/ide/custom-agents-ready-for-one-click-import` | +| Agent overview | `https://docs.trae.ai/ide/agent-overview?_lang=en` | + +Fetch all four, then compare against Retort's current output (documented below). + +--- + +## Current Retort TRAE output + +Retort generates a `.ai/` directory via `.agentkit/templates/ai/`. As of 2026-03-20: + +### Files generated + +| File | Size | Content | +|------|------|---------| +| `.ai/cursorrules` | ~950 bytes | 12-line generic conventions pointer | +| `.ai/windsurfrules` | ~950 bytes | 12-line generic conventions pointer | +| `.ai/continuerules` | ~950 bytes | 12-line generic conventions pointer | +| `.ai/README.md` | ~1.7 KB | Explains purpose of `.ai/` directory | + +### What is NOT generated + +- `.ai/rules/` subdirectory (TRAE structured rules) +- `.ai/skills/` subdirectory (TRAE skills surface) +- `.ai/agents/` subdirectory (TRAE custom agents / one-click import) + +### Template source + +``` +.agentkit/templates/ai/ +├── README.md +├── continuerules +├── cursorrules +└── windsurfrules +``` + +No skill or agent templates exist for the `ai` platform. + +### Sample generated content (windsurfrules) + +``` +Follow UNIFIED_AGENT_TEAMS.md and CLAUDE.md. +Use /discover → /healthcheck → /plan → implement → /check → /review. +Never modify .env, secrets, or credential files. +Never modify files in .agentkit/templates/, .agentkit/spec/, .agentkit/engines/, + or .agentkit/overlays/, or .agentkit/bin/ — propose changes via PR instead. +Never edit files marked "GENERATED by AgentKit Forge — DO NOT EDIT" — + modify the spec and run agentkit sync. +Prefer small, reversible changes with tests. +All commits AND PR titles MUST use Conventional Commits: type(scope): description. + Types: feat|fix|docs|style|refactor|test|chore|ci|perf|build|revert. +After editing .agentkit/spec/, ALWAYS run: pnpm -C .agentkit agentkit:sync — + then commit the regenerated output. +``` + +--- + +## Audit questions (to answer from docs) + +### Rules (Issue 025) + +1. What file path does TRAE read rules from — `.ai/windsurfrules`, `.ai/rules/*.md`, or something else? +2. Does TRAE have a concept of rule scope (global vs project vs workspace)? +3. Are rules Markdown or plain text? Is there a frontmatter schema? +4. What is the size/token limit TRAE applies to rule files? +5. Does TRAE support multiple rule files or a single file? +6. How does TRAE handle rule precedence (user vs project vs team)? +7. Does the current 12-line format match what TRAE expects, or is richer structure needed? + +### Skills (Issue 026) + +1. What directory does TRAE read skills from? (`.ai/skills/`? `.trae/skills/`?) +2. What is the skill file format — Markdown with frontmatter? JSON? YAML? +3. Required metadata fields per skill (name, description, trigger, prompt)? +4. Is there a skill size/complexity limit? +5. How do TRAE skills relate to Retort's slash commands — 1:1 mapping, or different granularity? +6. Which of Retort's ~25 commands should become TRAE skills vs remain Claude-only? + +### Agents (Issue 027) + +1. What format does TRAE use for custom agents — JSON, Markdown, YAML? +2. Required fields for one-click import (name, description, model, system prompt, tools, avatar)? +3. What is the import URL/mechanism — a `.trae/agents/*.json` file? A hosted URL? +4. Does TRAE support agent tool access configuration (file read, web search, shell)? +5. Which of Retort's 13 teams map to TRAE agents? All 13, or a curated subset? +6. Does TRAE support agent teams / multi-agent coordination, or only single agents? + +--- + +## Expected deliverables from audit + +After fetching the docs, produce: + +1. **Gap table** — for each surface (rules/skills/agents), what Retort currently emits vs what TRAE expects +2. **New templates needed** — list files to create under `.agentkit/templates/ai/` +3. **spec.yaml changes** — any new settings needed in `settings.yaml` or `agents.yaml` to support TRAE metadata +4. **Sync engine changes** — does `synchronize.mjs` need a new rendering path for `.ai/skills/` and `.ai/agents/`? +5. **Implementation issues** — create follow-up issues in `.github/ISSUES/` for each gap that requires implementation work + +--- + +## Context from `feat/kit-domain-selection-onboarding` + +The kit-based domain filtering work (Phase 2+3) partially addresses Issue 025: +- Only stack-relevant domains are now generated, reducing rule noise for consumers +- A TypeScript-only project no longer gets dotnet/rust/python/blockchain rules +- This applies to all platforms including TRAE's `.ai/` output + +The per-agent `elegance-guidelines` field (Issue 040) improves agent quality independent +of platform, which feeds into Issue 027. + +--- + +## How to continue this audit + +In a session with WebFetch access: + +``` +Fetch https://docs.trae.ai/ide/rules?_lang=en +Fetch https://docs.trae.ai/ide/skills?_lang=en +Fetch https://docs.trae.ai/ide/custom-agents-ready-for-one-click-import +Fetch https://docs.trae.ai/ide/agent-overview?_lang=en + +Then read docs/integrations/trae-compatibility.md and complete the audit +using the questions and current-state documentation in that file. +``` diff --git a/docs/operations/01_deployment.md b/docs/operations/01_deployment.md index 2dc23d9f..c1003de9 100644 --- a/docs/operations/01_deployment.md +++ b/docs/operations/01_deployment.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Deployment Guide ## Overview -<!-- Describe the deployment strategy for agentkit-forge. --> +<!-- Describe the deployment strategy for retort. --> ## Environments diff --git a/docs/operations/02_monitoring.md b/docs/operations/02_monitoring.md index 73b224c7..84a91d88 100644 --- a/docs/operations/02_monitoring.md +++ b/docs/operations/02_monitoring.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Monitoring ## Overview -<!-- Describe the monitoring strategy for agentkit-forge. --> +<!-- Describe the monitoring strategy for retort. --> ## Health Checks diff --git a/docs/operations/03_incident_response.md b/docs/operations/03_incident_response.md index 32c0294f..cd15b497 100644 --- a/docs/operations/03_incident_response.md +++ b/docs/operations/03_incident_response.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Incident Response ## Overview -<!-- Describe the incident response process for agentkit-forge. --> +<!-- Describe the incident response process for retort. --> ## Severity Levels diff --git a/docs/operations/04_troubleshooting.md b/docs/operations/04_troubleshooting.md index 61fffc27..f3b6900f 100644 --- a/docs/operations/04_troubleshooting.md +++ b/docs/operations/04_troubleshooting.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Troubleshooting ## Overview -Common issues and their resolutions for agentkit-forge. +Common issues and their resolutions for retort. ## Quick Diagnostics @@ -15,10 +15,10 @@ Common issues and their resolutions for agentkit-forge. curl -s http://localhost:3000/health | jq . # Check logs for errors -<!-- e.g. kubectl logs -l app=agentkit-forge --tail=100 --> +<!-- e.g. kubectl logs -l app=retort --tail=100 --> # Check resource utilisation -<!-- e.g. kubectl top pods -l app=agentkit-forge --> +<!-- e.g. kubectl top pods -l app=retort --> ``` ## Common Issues diff --git a/docs/operations/05_slos_slis.md b/docs/operations/05_slos_slis.md index d89a1c69..f6a9d32a 100644 --- a/docs/operations/05_slos_slis.md +++ b/docs/operations/05_slos_slis.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # SLOs and SLIs diff --git a/docs/operations/README.md b/docs/operations/README.md index 5918083e..f1dab951 100644 --- a/docs/operations/README.md +++ b/docs/operations/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Operations Docs Index diff --git a/docs/orchestration/README.md b/docs/orchestration/README.md index 4e9cd0ce..d2bb6554 100644 --- a/docs/orchestration/README.md +++ b/docs/orchestration/README.md @@ -1,6 +1,6 @@ # Orchestration Documentation -This category covers orchestration guides, PM protocols, and concurrency patterns for AgentKit Forge. See: +This category covers orchestration guides, PM protocols, and concurrency patterns for Retort. See: - [concurrency-protocol.md](concurrency-protocol.md) - [overview.md](overview.md) diff --git a/docs/orchestration/concurrency-protocol.md b/docs/orchestration/concurrency-protocol.md index e32b34a4..ac8b0ebb 100644 --- a/docs/orchestration/concurrency-protocol.md +++ b/docs/orchestration/concurrency-protocol.md @@ -1,7 +1,7 @@ # Concurrency Protocol Reference This document describes the full file-locking and concurrency protocol used by -AgentKit Forge agents when accessing shared state files. Agents receive a brief +Retort agents when accessing shared state files. Agents receive a brief summary in their persona files; this is the complete reference. ## Overview diff --git a/docs/orchestration/overview.md b/docs/orchestration/overview.md index 488f94e0..5f7b7684 100644 --- a/docs/orchestration/overview.md +++ b/docs/orchestration/overview.md @@ -1,6 +1,6 @@ # How Orchestration Works -This guide explains the AgentKit Forge orchestration pipeline — how work flows from +This guide explains the Retort orchestration pipeline — how work flows from a user request through phases, team delegation, agent personas, and quality gates. ## The Pipeline diff --git a/docs/orchestration/pm-guide.md b/docs/orchestration/pm-guide.md index d6957c4b..a02dc183 100644 --- a/docs/orchestration/pm-guide.md +++ b/docs/orchestration/pm-guide.md @@ -1,6 +1,6 @@ -# Product Manager Guide to AgentKit Forge +# Product Manager Guide to Retort -A practical guide for using AgentKit Forge's orchestration system to manage +A practical guide for using Retort's orchestration system to manage features from idea through to shipped code. ## Quick Start @@ -27,7 +27,7 @@ features from idea through to shipped code. ## The Three PM Agents -AgentKit Forge includes three PM-oriented agent personas that are loaded into +Retort includes three PM-oriented agent personas that are loaded into relevant team commands: ### Product Manager diff --git a/docs/planning/PLAN-gh371-state-cleanup-validation-session-start.md b/docs/planning/PLAN-gh371-state-cleanup-validation-session-start.md index 8e666567..2d7d01ed 100644 --- a/docs/planning/PLAN-gh371-state-cleanup-validation-session-start.md +++ b/docs/planning/PLAN-gh371-state-cleanup-validation-session-start.md @@ -2,7 +2,11 @@ **Goal:** Agent state is reliable: required state directories exist before any command runs, orchestrator state is validated on load, and stale task files can be cleaned so agents never fail or misbehave due to missing or corrupt state. +<<<<<<< HEAD +**Scope:** P1 product backlog item [GH#371](https://github.com/JustAGhosT/retort/issues/371). +======= **Scope:** P1 product backlog item [GH#371](https://github.com/JustAGhosT/agentkit-forge/issues/371). +>>>>>>> origin/main --- diff --git a/docs/planning/README.md b/docs/planning/README.md index 55c0886c..bf88702f 100644 --- a/docs/planning/README.md +++ b/docs/planning/README.md @@ -1,6 +1,6 @@ # Planning Index -Central planning registry for agentkit-forge. Each entry tracks a discrete work item with status, priority, remaining actions, and dependencies. Organized by domain. +Central planning registry for retort. Each entry tracks a discrete work item with status, priority, remaining actions, and dependencies. Organized by domain. > **Last updated**: 2026-03-10 > **Source**: Consolidated from `plan.md`, `docs/reference/issues/`, `.agentkit/docs/`, and GitHub Issues @@ -105,7 +105,7 @@ Phase 3 (after P2): CM-006 (RepoGuardian P3) + CM-003 (CommsCrew) ## FinOps & Cost Management -Multi-repo cost governance spanning agentkit-forge, ai-gateway, and pvc-costops-analytics. +Multi-repo cost governance spanning retort, ai-gateway, and pvc-costops-analytics. | ID | Title | Priority | Status | Plan File | Blockers | GH Issue | | ------ | ------------------------------------------ | -------- | ----------- | ------------------------------------------------------------------------------ | ------------------------------------ | -------- | @@ -116,7 +116,7 @@ Multi-repo cost governance spanning agentkit-forge, ai-gateway, and pvc-costops- ## Cost Governance (Local) -Items scoped to agentkit-forge cost tooling. +Items scoped to retort cost tooling. | ID | Title | Priority | Status | Plan File | Blockers | GH Issue | | ------ | ---------------------------------------------- | -------- | ----------- | ------------------------------------------------------------------------------------------ | ------------------------------------------- | -------- | @@ -126,7 +126,7 @@ Items scoped to agentkit-forge cost tooling. ## Framework & Templates -Items related to AgentKit Forge framework structure, template organization, and tooling. +Items related to Retort framework structure, template organization, and tooling. | ID | Title | Priority | Status | Plan File | Blockers | GH Issue | | ------ | ------------------------------------------------------------ | -------- | ----------- | ------------------------------------------------------------------------------------------ | ------------------------------------ | -------- | diff --git a/docs/planning/TEMPLATE-plan.md b/docs/planning/TEMPLATE-plan.md index f41c482b..16a6d0f8 100644 --- a/docs/planning/TEMPLATE-plan.md +++ b/docs/planning/TEMPLATE-plan.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # [Plan-ID]: [Plan Title] diff --git a/docs/planning/agents-teams/finops-specialist.md b/docs/planning/agents-teams/finops-specialist.md index 2d8f3316..d6e190e4 100644 --- a/docs/planning/agents-teams/finops-specialist.md +++ b/docs/planning/agents-teams/finops-specialist.md @@ -1,6 +1,6 @@ # feat(agents): Consider splitting a FinOps Specialist agent from Data Engineer -> **Target repo**: `agentkit-forge` +> **Target repo**: `retort` > **Labels**: `enhancement`, `finops`, `agents`, `cost-management` > **Priority**: P3 (future consideration) diff --git a/docs/planning/agents-teams/forge-team.md b/docs/planning/agents-teams/forge-team.md index 4a416207..08eab901 100644 --- a/docs/planning/agents-teams/forge-team.md +++ b/docs/planning/agents-teams/forge-team.md @@ -9,7 +9,7 @@ It is the "team that builds teams." ## Origin - **Source**: `phoenixvc/cognitive-mesh` issue #130 — TeamForge pipeline architecture -- **Adapted for**: agentkit-forge spec-driven architecture (YAML specs → sync → generated configs) +- **Adapted for**: retort spec-driven architecture (YAML specs → sync → generated configs) ## Pipeline Architecture diff --git a/docs/planning/agents-teams/restructuring-gaps.md b/docs/planning/agents-teams/restructuring-gaps.md index c3dee407..fed3c3af 100644 --- a/docs/planning/agents-teams/restructuring-gaps.md +++ b/docs/planning/agents-teams/restructuring-gaps.md @@ -1,6 +1,6 @@ # refactor(agents): Address team/agent mapping gaps and missing dedicated agents -> **Target repo**: `agentkit-forge` +> **Target repo**: `retort` > **Labels**: `enhancement`, `agents`, `teams`, `tech-debt` > **Priority**: P3 diff --git a/docs/planning/agents-teams/strategic-ops-team.md b/docs/planning/agents-teams/strategic-ops-team.md index a19acae8..de142107 100644 --- a/docs/planning/agents-teams/strategic-ops-team.md +++ b/docs/planning/agents-teams/strategic-ops-team.md @@ -4,11 +4,11 @@ Strategic Ops is the cross-project coordination team responsible for framework governance, portfolio-level planning, adoption strategy, impact assessment, and -release coordination across all repos using AgentKit Forge. +release coordination across all repos using Retort. ## Motivation -As AgentKit Forge scales to manage multiple downstream repos, the need for +As Retort scales to manage multiple downstream repos, the need for portfolio-level visibility and governance becomes critical. Individual teams (backend, frontend, etc.) operate within a single repo — Strategic Ops operates _across_ repos, ensuring consistency, managing breaking changes, and coordinating diff --git a/docs/planning/archive/cost-budget-flag-duplicate.md b/docs/planning/archive/cost-budget-flag-duplicate.md index 7867cde3..27611003 100644 --- a/docs/planning/archive/cost-budget-flag-duplicate.md +++ b/docs/planning/archive/cost-budget-flag-duplicate.md @@ -1,6 +1,6 @@ # chore(cost): Add `--budget` flag documentation to `/cost` command template -> **Target repo**: `agentkit-forge` +> **Target repo**: `retort` > **Labels**: `chore`, `finops`, `cost-management` > **Priority**: P2 diff --git a/docs/planning/finops/wave5-integration.md b/docs/planning/finops/wave5-integration.md index 31971956..d00b2458 100644 --- a/docs/planning/finops/wave5-integration.md +++ b/docs/planning/finops/wave5-integration.md @@ -1,6 +1,6 @@ # Wave 5: End-to-End Integration & Hardening -> **Target repos**: `agentkit-forge` (orchestration), `phoenixvc/ai-gateway` (runtime), `phoenixvc/pvc-costops-analytics` (analytics) +> **Target repos**: `retort` (orchestration), `phoenixvc/ai-gateway` (runtime), `phoenixvc/pvc-costops-analytics` (analytics) > **Labels**: `finops`, `integration`, `cost-management` > **Priority**: P2 @@ -21,7 +21,7 @@ Wire together the three enforcement layers (session budget guard → gateway spe **Data flow**: ``` -Agent session (agentkit-forge) +Agent session (retort) → cost-tracker.mjs logs to JSONL → session metrics: duration, commands, files @@ -67,7 +67,7 @@ GitHub Actions cron job (monthly, 1st of month): ### 5.4 Budget Approval Workflow (GitHub Issues) -**Repo**: `pvc-costops-analytics` (or `agentkit-forge` for template) +**Repo**: `pvc-costops-analytics` (or `retort` for template) Flesh out the budget approval process: diff --git a/docs/planning/framework/docs-wiki-generation.md b/docs/planning/framework/docs-wiki-generation.md index e2800bda..6658339a 100644 --- a/docs/planning/framework/docs-wiki-generation.md +++ b/docs/planning/framework/docs-wiki-generation.md @@ -45,7 +45,7 @@ Template-generated documentation files use numbered prefixes (`01_prd.md`, `02_e | **Cursor + MkDocs** | Use AI to auto-generate/maintain docs, serve via MkDocs | DIY approach; flexible | | **GitHub Copilot Docs** | Generate docs from code context | In-editor; no standalone site | -### 4. Considerations for AgentKit Forge +### 4. Considerations for Retort - **Numbered files**: Current `01_`, `02_` prefixes provide ordering. Most static site generators support sidebar ordering via frontmatter (`sidebar_position`) or config files, making numeric prefixes unnecessary. - **Generated files**: Docs are regenerated by `agentkit sync`. The chosen tool must work with generated markdown (not require custom frontmatter that sync doesn't produce). diff --git a/docs/planning/framework/tool-neutral-hub-adoption-roadmap.md b/docs/planning/framework/tool-neutral-hub-adoption-roadmap.md new file mode 100644 index 00000000..f13ddbcd --- /dev/null +++ b/docs/planning/framework/tool-neutral-hub-adoption-roadmap.md @@ -0,0 +1,309 @@ +# Adoption Roadmap: Tool-Neutral Agent Hub + +**Date:** 2026-03-17 +**ADR:** [ADR-10](../../architecture/decisions/10-tool-neutral-agent-hub.md) +**Findings:** [Full analysis](../../architecture/specs/tool-neutral-agent-hub-findings.md) +**Status:** Proposed + +--- + +## Overview + +This roadmap converges the AgentKit Forge sync engine with the `.agents/` hub pattern pioneered in Mystira.workspace. The goal: every AI agent tool can discover shared agents, skills, guards, traces, and roadmaps from one canonical location, while the sync engine continues to generate tool-specific output where platform differences require it. + +**5 phases, each independently shippable.** No phase depends on a later phase, but each builds on the previous. + +--- + +## Phase 1: `.agents/` Directory as Sync Target + +**Goal:** The sync engine generates `.agents/` alongside `.claude/`, `.cursor/`, etc. +**Effort:** Medium (2–3 sessions) +**Depends on:** Nothing + +### Deliverables + +| # | Task | Detail | +|---|------|--------| +| 1.1 | Define `.agents/` directory schema | Document the 5-folder structure (`guards/`, `skills/`, `traces/`, `history/`, `roadmaps/`) with file naming conventions and frontmatter schemas | +| 1.2 | Add `.agents/` output target to sync engine | New template directory `.agentkit/templates/agents/` renders shared content from spec YAML | +| 1.3 | Generate shared skills to `.agents/skills/` | Skills currently land in `.claude/skills/`, `.agents/skills/` (Claude), and `.cursor/commands/` (Cursor) separately — generate a canonical copy to `.agents/skills/` | +| 1.4 | Generate shared agents to `.agents/agents/` | Agent personas currently in `.claude/agents/` and `.github/agents/` — generate canonical versions to `.agents/agents/` with category subdirectories | +| 1.5 | CI drift check covers `.agents/` | Extend the existing drift check workflow to validate `.agents/` output against spec | +| 1.6 | Update CLAUDE.md references | Add `.agents/` to the architecture section and safety rules | + +### Success Criteria + +- `pnpm -C .agentkit agentkit:sync` generates `.agents/` directory +- CI drift check validates `.agents/` content +- Any agent tool can `ls .agents/skills/` to discover available skills without knowing tool-specific paths + +### Architecture Decision + +`.agents/` content is **generated** by the sync engine (not hand-authored). This preserves the spec-driven architecture. The `.agentkit/spec/` YAML remains the single source of truth. + +Exception: `traces/`, `history/`, and `roadmaps/` are **runtime directories** — written by agents during sessions, not generated by sync. The sync engine creates the directory structure and any seed files; agents populate content. + +--- + +## Phase 2: Reflective Guards + +**Goal:** Portable governance rules that work for any agent, regardless of shell access. +**Effort:** Medium (2–3 sessions) +**Depends on:** Phase 1 (directory structure exists) + +### Deliverables + +| # | Task | Detail | +|---|------|--------| +| 2.1 | Define guard schema | YAML frontmatter (`name`, `enabled`, `description`, `severity: warn|block`, `applies_to: glob[]`) + markdown body with `**Pattern**` regex and `**Instruction**` steps | +| 2.2 | Add `guards` section to `rules.yaml` | Each guard defined in spec YAML, rendered to `.agents/guards/` | +| 2.3 | Migrate existing hook logic to guards | Extract the governance intent from shell hooks (`protect-templates`, `guard-destructive-commands`, `protect-sensitive-files`) into guard definitions | +| 2.4 | Generate shell hooks from guards | For tools that support hooks (Claude Code), auto-generate shell hook scripts from guard definitions — the guard is the source, the hook is the platform-specific enforcement | +| 2.5 | Add guard validation to CI | Validate that guard patterns are valid regex, frontmatter follows schema, and all guards have both `Pattern` and `Instruction` sections | +| 2.6 | Seed default guards | Ship with baseline guards: `no-secrets-in-code`, `protect-generated-files`, `no-destructive-commands`, `protect-shared-docs`, `memory-governance` | + +### Guard Format (Canonical) + +```yaml +--- +name: no-secrets-in-code +enabled: true +severity: block +description: Prevents hardcoded credentials in source files +applies_to: + - "**/*.ts" + - "**/*.py" + - "**/*.cs" +--- +# No Secrets in Code + +**Pattern**: `(ConnectionString|ApiKey|Secret|Password|Bearer)\s*[=:]\s*["'][^"']{8,}` + +**Instruction**: +1. Before writing any file matching the applies_to globs, check your output against the pattern +2. If the pattern matches, do NOT write the file +3. Instead, use an environment variable reference or secret manager lookup +4. Inform the user that you detected a potential hardcoded secret +``` + +### Relationship: Guards vs Hooks vs Hookify + +| Layer | Scope | Enforcement | Portable? | +|-------|-------|-------------|-----------| +| `.agents/guards/` | All agents, all tools | Reflective (self-check) | Yes — any agent can read markdown | +| `.claude/hooks/` | Claude Code only | Automated (shell intercept) | No — requires shell execution | +| Hookify rules | Claude Code only | Automated (hook system) | No — Claude Code plugin | + +Guards are the **canonical governance source**. Hooks and hookify rules are **platform-specific enforcement** generated from or inspired by guards. An agent that can only read files (no shell) still gets governance via guards. + +--- + +## Phase 3: `.readme.yaml` Generation + +**Goal:** Machine-readable project metadata at directory boundaries, generated from spec. +**Effort:** Low (1 session) +**Depends on:** Phase 1 (sync engine changes) + +### Deliverables + +| # | Task | Detail | +|---|------|--------| +| 3.1 | Define `.readme.yaml` schema | JSON Schema for the file format: `purpose`, `version`, `tech_stack`, `workspace_type`, `local_services`, `agent_tooling`, `last_synced` | +| 3.2 | Generate root `.readme.yaml` | Derived from `.agentkit/spec/project.yaml` — purpose, version, stack languages, infrastructure config | +| 3.3 | Generate sub-directory `.readme.yaml` | For monorepo-style projects: `apps/.readme.yaml`, `packages/.readme.yaml` listing contained projects | +| 3.4 | Add `agent_tooling` section | Points agents to `.agents/guards/`, `.agents/skills/`, etc. — acts as a directory map | +| 3.5 | CI validation | Ensure `.readme.yaml` content matches spec — same drift check pattern as other generated files | + +### Schema (v1) + +```yaml +# .readme.yaml — Machine-readable project metadata for AI agents +# GENERATED by AgentKit Forge — DO NOT EDIT +purpose: "AgentKit Forge framework for multi-tool AI agent orchestration" +version: "3.1.0" +default_branch: "main" +tech_stack: + languages: [javascript, yaml, markdown] + backend: node.js + test_runner: vitest + package_manager: pnpm +infrastructure: + org_prefix: akf + default_region: global + iac_tools: [terraform, terragrunt] +agent_tooling: + guards: ".agents/guards/" + skills: ".agents/skills/" + roadmaps: ".agents/roadmaps/" + traces: ".agents/traces/" + spec: ".agentkit/spec/" +last_synced: "2026-03-17T12:00:00Z" +``` + +### Token Cost Impact + +An agent entering a new directory currently reads `README.md` (typically 200–500 lines) + `CLAUDE.md` (300+ lines) to orient. `.readme.yaml` provides the same structural data in ~30 lines of parseable YAML. For a 13-team orchestration with per-team discovery, this saves ~6,000–10,000 tokens per orchestration cycle. + +--- + +## Phase 4: Cross-Session Traces & Roadmaps + +**Goal:** Preserve reasoning context across sessions and provide strategic framing for multi-session work. +**Effort:** Low–Medium (1–2 sessions) +**Depends on:** Phase 1 (directory structure) + +### Deliverables + +| # | Task | Detail | +|---|------|--------| +| 4.1 | Define trace format | Frontmatter: `date`, `agent`, `branch`, `valid_until`, `tags[]`. Body sections: Current State, Mental Model, Blocked/Pending, Next Steps | +| 4.2 | Extend `/handoff` command | Write structured trace to `.agents/traces/YYYY-MM-DD-<topic>.md` in addition to existing `docs/handoffs/` output | +| 4.3 | Add `end-session` skill | Skill that agents invoke at session end: writes trace, updates roadmap status, flags stale traces | +| 4.4 | Define roadmap format | Frontmatter: `title`, `status` (active/completed/abandoned), `created`, `updated`, `phases[]`. Body: phased delivery plan with acceptance criteria | +| 4.5 | Seed `.agents/roadmaps/` in sync | Sync engine creates the directory and a `README.md` explaining the convention. Roadmap content is user/agent-authored (not generated) | +| 4.6 | Session-start hook reads traces | On session start, check `.agents/traces/` for recent traces (< 7 days). Surface the most recent relevant trace to the incoming agent | +| 4.7 | Retention policy | Traces older than 30 days move to `.agents/traces/archive/`. History dirs older than 90 days are candidates for deletion (warn, don't auto-delete) | + +### Trace Format + +```markdown +--- +date: 2026-03-17 +agent: claude-opus-4 +branch: feat/tool-neutral-hub +valid_until: 2026-03-24 +tags: [architecture, sync-engine, .agents] +--- +# Handover: Tool-Neutral Hub Implementation + +## Current State +- Phase 1 complete: `.agents/` directory generates via sync +- Phase 2 in progress: guard schema defined, 3/6 guards migrated + +## Mental Model +The key insight is that guards are the *canonical* governance layer and hooks +are platform-specific *enforcement*. Don't try to make guards do what hooks do +(automated blocking) — they serve different populations of agents. + +## Blocked / Pending +- [ ] Guard-to-hook generation needs a template for each hook type (PreToolUse, PostToolUse, Stop) +- [ ] Unclear whether `.agents/guards/` should be flat or categorised by domain + +## Next Steps (for incoming agent) +1. Read `.agentkit/templates/claude/hooks/` to understand current hook structure +2. Prototype guard → hook rendering in the sync engine +3. Test with `protect-templates` guard as the first migration candidate +``` + +### Roadmap Format + +```markdown +--- +title: Tool-Neutral Agent Hub Adoption +status: active +created: 2026-03-17 +updated: 2026-03-17 +phases: + - name: ".agents/ sync target" + status: in-progress + - name: "Reflective guards" + status: planned + - name: ".readme.yaml generation" + status: planned + - name: "Traces & roadmaps" + status: planned + - name: "Schema formalisation" + status: planned +--- +# Tool-Neutral Agent Hub Adoption + +## Phase 1: .agents/ Sync Target +... +``` + +--- + +## Phase 5: Schema Formalisation & Cross-Project Adoption + +**Goal:** Publish schemas so other projects (and other agent frameworks) can adopt the `.agents/` convention. +**Effort:** Medium (2 sessions) +**Depends on:** Phases 1–4 (patterns validated in practice) + +### Deliverables + +| # | Task | Detail | +|---|------|--------| +| 5.1 | JSON Schema for guards | Formal schema for guard frontmatter + body structure. Published in `.agents/schemas/` | +| 5.2 | JSON Schema for traces | Formal schema for trace frontmatter + required sections | +| 5.3 | JSON Schema for `.readme.yaml` | Formal schema for project metadata | +| 5.4 | JSON Schema for roadmaps | Formal schema for roadmap frontmatter + phase structure | +| 5.5 | `.agents/` convention spec | Single markdown document describing the full convention: directory layout, file formats, lifecycle rules, retention policy | +| 5.6 | Onboard Mystira.workspace | Migrate Mystira's hand-authored `.agents/` to use the sync engine while preserving its existing content | +| 5.7 | Onboard 2 additional repos | Validate the pattern works for different project types (e.g., `chaufher` as .NET + Next.js, `PhoenixRooivalk` as Rust + Next.js) | +| 5.8 | Publish as standalone spec | Extract `.agents/` convention into its own repository or document for adoption outside the phoenixvc org | + +### Cross-Project Compatibility + +The `.agents/` convention should work for projects that: + +- Use AgentKit Forge (sync-generated) +- Don't use AgentKit Forge (hand-authored, like Mystira today) +- Use a different agent framework entirely + +This means the convention must be **framework-independent**. The sync engine is one way to populate `.agents/` — not the only way. The schemas and convention spec must stand alone. + +--- + +## Timeline Summary + +``` +Phase 1 ─── .agents/ sync target ──────────── [2-3 sessions] +Phase 2 ─── Reflective guards ─────────────── [2-3 sessions] +Phase 3 ─── .readme.yaml generation ────────── [1 session] +Phase 4 ─── Traces & roadmaps ─────────────── [1-2 sessions] +Phase 5 ─── Schema formalisation & adoption ── [2 sessions] + Total: 8-11 sessions +``` + +Phases 1–3 can overlap (different parts of the sync engine). Phases 4–5 are sequential. + +--- + +## Risk Register + +| Risk | Likelihood | Impact | Mitigation | +|------|-----------|--------|------------| +| `.agents/` conflicts with existing directory in consumer repos | Low | Medium | Document in onboarding; provide migration guide | +| Guard reflective enforcement is ignored by non-cooperative agents | Medium | Medium | Guards complement hooks, not replace; hooks remain for tools that support them | +| `.readme.yaml` drifts from README.md | Medium | Low | Generate both from spec; add CI check for consistency | +| Trace accumulation fills repos | Medium | Low | Retention policy (30d archive, 90d deletion candidates); `.gitignore` history/ for large projects | +| Schema evolution breaks existing consumers | Low | High | Semver the schemas; use `version` field in frontmatter; maintain backwards compatibility | +| Onboarded repos resist generated `.agents/` | Low | Medium | Offer opt-in per subdirectory; support `agents.enabled: false` in spec | + +--- + +## Decision Points + +Before proceeding to each phase, confirm: + +1. **Phase 1 → 2:** Does the sync engine reliably generate `.agents/`? Has CI drift check been extended? +2. **Phase 2 → 3:** Are guards working in at least one tool (Claude Code)? Have 3+ guards been migrated from hooks? +3. **Phase 3 → 4:** Does `.readme.yaml` generate correctly for at least 2 project types? +4. **Phase 4 → 5:** Have traces been written and consumed across at least 3 sessions? Is the retention policy working? +5. **Phase 5:** Are schemas stable enough that changing them would be a breaking change? + +--- + +## Appendix: Mystira → Forge Migration Path + +Mystira.workspace currently uses hand-authored `.agents/`. When onboarding to AgentKit Forge: + +1. **Guards** → Extract guard frontmatter into `.agentkit/spec/guards.yaml` (new spec file). Sync engine renders `.agents/guards/` from this spec. +2. **Skills** → Move skill content to `.agentkit/spec/skills.yaml` or keep as `once`-mode scaffolded files that sync doesn't overwrite. +3. **Traces** → No migration needed. Traces are runtime content, not generated. +4. **History** → No migration needed. History is runtime content. +5. **Roadmaps** → No migration needed. Roadmaps are user-authored. +6. **`.readme.yaml`** → Generated from new `.agentkit/spec/project.yaml` for Mystira. +7. **`.claude/settings.json`** → Preserved as-is (Claude-specific hooks/permissions). +8. **`.serena/memories/`** → Remains tool-specific. Consider migrating governance-relevant memories to `.agents/guards/`. diff --git a/docs/product/01_prd.md b/docs/product/01_prd.md index 7f162bc7..1cdde67e 100644 --- a/docs/product/01_prd.md +++ b/docs/product/01_prd.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Product Requirements Document @@ -8,7 +8,7 @@ <!-- Provide a high-level summary of the product and its purpose. --> -**Product Name:** agentkit-forge +**Product Name:** retort **Version:** 3.1.0 **Last Updated:** <!-- DATE --> diff --git a/docs/product/02_user_stories.md b/docs/product/02_user_stories.md index bbf6844e..a93a80c0 100644 --- a/docs/product/02_user_stories.md +++ b/docs/product/02_user_stories.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # User Stories diff --git a/docs/product/03_roadmap.md b/docs/product/03_roadmap.md index 4c26cc54..0eaaaebe 100644 --- a/docs/product/03_roadmap.md +++ b/docs/product/03_roadmap.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Roadmap ## Overview -This document outlines the planned timeline and milestones for `agentkit-forge`. +This document outlines the planned timeline and milestones for `retort`. ## Timeline diff --git a/docs/product/04_personas.md b/docs/product/04_personas.md index d41fbece..2b38cac4 100644 --- a/docs/product/04_personas.md +++ b/docs/product/04_personas.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # User Personas ## Overview -Personas represent the primary user archetypes for agentkit-forge. Use these +Personas represent the primary user archetypes for retort. Use these profiles to guide feature prioritisation and UX decisions. --- diff --git a/docs/product/PRD-001-llm-decision-engine.md b/docs/product/PRD-001-llm-decision-engine.md index b5c7481d..d79f9b4d 100644 --- a/docs/product/PRD-001-llm-decision-engine.md +++ b/docs/product/PRD-001-llm-decision-engine.md @@ -1,4 +1,4 @@ -# PRD-001: AgentKit Forge LLM Decision Engine +# PRD-001: Retort LLM Decision Engine ## Status @@ -6,11 +6,11 @@ Draft ## Module / Feature Name -Multi-LLM Agent Model Optimization and Routing in AgentKit Forge +Multi-LLM Agent Model Optimization and Routing in Retort ## Marketing Name -AgentKit Forge LLM Decision Engine +Retort LLM Decision Engine ## Platform / Mesh Layers @@ -95,7 +95,7 @@ competitive advantage for team productivity, governance, and cost control. ### Business Goals - Streamline model routing and mapping for teams. -- Increase AgentKit Forge adoption. +- Increase Retort adoption. - Improve output quality and delivery speed. - Establish Forge as a mesh-native source of truth for model selection. @@ -410,7 +410,7 @@ Project start date: **2026-03-03** | Product | Centralized Mapping | Coding Scorecards | Drift Detection | Gotcha Docs | | ------------------------ | ------------------- | ----------------- | --------------- | ----------- | -| AgentKit Forge | Yes | Yes | Planned | Yes | +| Retort | Yes | Yes | Planned | Yes | | LangChain | No | Partial | No | No | | OSS Agent Bundles | No | No | No | No | | Enterprise RAG Platforms | Yes | Partial | Yes | Partial | diff --git a/docs/product/PRD-002-llm-selection-scorecard-guide.md b/docs/product/PRD-002-llm-selection-scorecard-guide.md index 8b2e842a..5d126e9b 100644 --- a/docs/product/PRD-002-llm-selection-scorecard-guide.md +++ b/docs/product/PRD-002-llm-selection-scorecard-guide.md @@ -1,4 +1,4 @@ -# PRD-002: AgentKit Forge LLM Selection and Scorecard Guide +# PRD-002: Retort LLM Selection and Scorecard Guide ## Status @@ -8,15 +8,15 @@ This document is a living draft. The appendix contains TBD markers and data that ## Module / Feature Name -AgentKit Forge LLM Model Selection and Scorecard System +Retort LLM Model Selection and Scorecard System ## Marketing Name -AgentKit Forge Model Scorecard and Recommender +Retort Model Scorecard and Recommender ## Platform / Mesh Layers -- AgentKit Forge orchestration layer +- Retort orchestration layer - Agent execution layer - Model selection engine - Reporting and telemetry layer @@ -51,7 +51,7 @@ Pro and Enterprise ## Integration Points -- AgentKit Forge model mapping config (YAML and JSON) +- Retort model mapping config (YAML and JSON) - Agent execution APIs - Reporting and analytics dashboards - Third-party LLM endpoints diff --git a/docs/product/PRD-003-agent-to-llm-weighted-matrix-config-guide.md b/docs/product/PRD-003-agent-to-llm-weighted-matrix-config-guide.md index bd176c4a..1cd8500f 100644 --- a/docs/product/PRD-003-agent-to-llm-weighted-matrix-config-guide.md +++ b/docs/product/PRD-003-agent-to-llm-weighted-matrix-config-guide.md @@ -10,11 +10,11 @@ In Review ## Module / Feature Name -AgentKit Forge: Agent-to-LLM Weighted Selection and Configuration Layer +Retort: Agent-to-LLM Weighted Selection and Configuration Layer ## Marketing Name -AgentKit Forge - Polyglot LLM Decision Matrix Configurator +Retort - Polyglot LLM Decision Matrix Configurator ## Platform / Mesh Layers @@ -62,7 +62,7 @@ Enterprise ## Integration Points -- AgentKit orchestration layer +- Retort orchestration layer - Team and agent assignment modules - Model APIs (OpenAI, Anthropic, Google, Kimi, etc.) - Audit and logging services @@ -70,7 +70,7 @@ Enterprise ## TL;DR -AgentKit Forge enables declarative, team-aware agent-to-LLM mapping through +Retort enables declarative, team-aware agent-to-LLM mapping through YAML and JSON overlays so organizations can optimize quality and spend as model capabilities, pricing, and constraints evolve. diff --git a/docs/product/PRD-005-mesh-native-distribution.md b/docs/product/PRD-005-mesh-native-distribution.md index 8bd694e9..83a203f8 100644 --- a/docs/product/PRD-005-mesh-native-distribution.md +++ b/docs/product/PRD-005-mesh-native-distribution.md @@ -1,4 +1,4 @@ -# PRD-005: AgentKit Forge Mesh-Native Distribution +# PRD-005: Retort Mesh-Native Distribution ## Status @@ -6,11 +6,11 @@ Draft ## Module / Feature Name -AgentKit Forge Distribution & Orchestration Layer +Retort Distribution & Orchestration Layer ## Marketing Name -AgentKit Forge (Unified Delivery) +Retort (Unified Delivery) ## Platform / Mesh Layers @@ -49,7 +49,7 @@ timeline below. ## TL;DR -Unified, frictionless delivery of AgentKit Forge via npm, GitHub Action, and a +Unified, frictionless delivery of Retort via npm, GitHub Action, and a GA PWA UI — accelerating onboarding and enabling configuration by any team member with minimal operational burden. This PRD codifies the delivery strategy approved in [ADR-07](../architecture/decisions/07-delivery-strategy.md). @@ -100,7 +100,7 @@ forge's core differentiator. ### Business Goals -- Maximize AgentKit Forge adoption across all user segments. +- Maximize Retort adoption across all user segments. - Eliminate configuration drift in all enabled project repositories. - Minimize operational support needs (L2/L3 ticket reduction). - Establish veritasvault.ai as the standard for mesh-native AI configuration. @@ -157,14 +157,14 @@ environment parity. **Pain:** Submodules, multiple manual steps, repo drift. -As a developer, I can install and sync AgentKit Forge in one minute using +As a developer, I can install and sync Retort in one minute using npm/CLI. Acceptance criteria: -- Clean install with a single command (`npm install -D agentkit-forge`). +- Clean install with a single command (`npm install -D retort`). - Overlays auto-pulled from package; no submodule checkout required. -- `npx agentkit-forge sync` produces identical outputs to the submodule flow. +- `npx retort sync` produces identical outputs to the submodule flow. ### DevOps / Platform Owner @@ -229,9 +229,9 @@ Acceptance criteria: #### Flow 1: CLI Onboarding (Developer) ``` -npm install -D agentkit-forge - → npx agentkit-forge init --repoName my-project - → npx agentkit-forge sync +npm install -D retort + → npx retort init --repoName my-project + → npx retort sync → git add . && git commit ``` @@ -239,7 +239,7 @@ npm install -D agentkit-forge ```yaml # .github/workflows/agentkit-sync.yml -- uses: org/agentkit-forge-action@v3 +- uses: org/retort-action@v3 with: overlay: my-project version: '3.4.0' @@ -249,7 +249,7 @@ npm install -D agentkit-forge #### Flow 3: UI Onboarding (Non-CLI User) ``` -npx agentkit-forge ui +npx retort ui → Browser opens PWA at localhost:4827 → Visual wizard: detect stack → select render targets → create overlay → Click "Sync" → review diff → apply @@ -259,8 +259,8 @@ npx agentkit-forge ui | Step | CLI / Automation | UI Path | Outcome | | ------------ | ------------------------- | ---------------------- | ---------------------- | -| Install | `npm i -D agentkit-forge` | PWA onboarding wizard | AgentKit Forge ready | -| Sync / init | `npx agentkit-forge sync` | "Sync Now" in UI | Overlays in place | +| Install | `npm i -D retort` | PWA onboarding wizard | Retort ready | +| Sync / init | `npx retort sync` | "Sync Now" in UI | Overlays in place | | Overlay mgmt | CLI commands | Dashboard editor | Changes committed | | Drift check | GitHub Action step | CI status in UI | Drift flagged/cleared | | Update | `npm update` + sync | "Apply/Rollback" in UI | State current/restored | @@ -276,19 +276,19 @@ npx agentkit-forge ui - **Failed sync in CI:** CI job fails with actionable error message and diff summary; rollback queued if auto-commit mode is enabled. - **Partial update rollbacks:** Allow restoring last known good state via - `npm install agentkit-forge@previous-version` + sync, or one-click rollback in + `npm install retort@previous-version` + sync, or one-click rollback in UI with version history. ## Functional Requirements ### Distribution Channels -- **npm package** — CLI and SDK bundled as `agentkit-forge`. Published to npm +- **npm package** — CLI and SDK bundled as `retort`. Published to npm (and optionally private registries). Supports `--registry` flag for GitHub Packages / Artifactory. -- **GitHub Action** — `org/agentkit-forge-action@v3`. Drift detection, overlay +- **GitHub Action** — `org/retort-action@v3`. Drift detection, overlay validation, and optional auto-commit. Published to GitHub Actions marketplace. -- **PWA UI** — launched via `npx agentkit-forge ui` on `localhost:4827`. +- **PWA UI** — launched via `npx retort ui` on `localhost:4827`. Schema-driven overlay editor, sync dashboard, version manager, health report. ### Core Capabilities @@ -306,11 +306,11 @@ npx agentkit-forge ui | Command | Description | | ----------------------------- | -------------------------------------------------- | -| `agentkit-forge init` | Initialize overlays for a new consumer repo | -| `agentkit-forge sync` | Regenerate outputs from current overlays and specs | -| `agentkit-forge ui` | Launch PWA UI on localhost:4827 | -| `agentkit-forge doctor` | Health check — validate environment and config | -| `agentkit-forge overlay edit` | Open overlay in editor with schema validation | +| `retort init` | Initialize overlays for a new consumer repo | +| `retort sync` | Regenerate outputs from current overlays and specs | +| `retort ui` | Launch PWA UI on localhost:4827 | +| `retort doctor` | Health check — validate environment and config | +| `retort overlay edit` | Open overlay in editor with schema validation | ### UI Screens @@ -353,7 +353,7 @@ npx agentkit-forge ui ### Required APIs -- **CLI commands** — `agentkit-forge init`, `sync`, `ui`, `doctor`, +- **CLI commands** — `retort init`, `sync`, `ui`, `doctor`, `overlay edit`. - **UI ↔ Engine API** — JSON-RPC bridge over local HTTP. The UI is a presentation layer only; all logic lives in the engine. Same API can be @@ -385,22 +385,22 @@ npx agentkit-forge ui **CLI path:** ```bash -npm install -D agentkit-forge # or npm install -g agentkit-forge -npx agentkit-forge init --repoName my-project -npx agentkit-forge sync +npm install -D retort # or npm install -g retort +npx retort init --repoName my-project +npx retort sync ``` **UI path:** ```bash -npx agentkit-forge ui +npx retort ui # Browser opens → visual wizard → detect stack → select tools → create overlay → sync ``` **CI path:** ```yaml -- uses: org/agentkit-forge-action@v3 +- uses: org/retort-action@v3 with: overlay: my-project version: '3.4.0' @@ -564,7 +564,7 @@ Minimal manual steps, rapid path to first agent deployed or registered: ### Competitive Analysis -| Capability | GitHub Copilot | Claude | Cursor | AgentKit Forge | +| Capability | GitHub Copilot | Claude | Cursor | Retort | | ------------------------- | -------------- | ------ | ------ | --------------------- | | Multi-tool overlay system | No | No | No | **Yes** | | PWA / UI-based editing | No | No | No | **Yes** | @@ -577,12 +577,12 @@ drift detection across AI tooling. This is a first-mover opportunity. ### Related Documents - [ADR-07: Delivery Strategy (Refined)](../architecture/decisions/07-delivery-strategy.md) -- [ADR-01: Adopt AgentKit Forge](../architecture/decisions/01-adopt-agentkit-forge.md) +- [ADR-01: Adopt Retort](../architecture/decisions/01-adopt-retort.md) - [ADR-03: Tooling Strategy](../architecture/decisions/03-tooling-strategy.md) - [Architecture Overview](../architecture/01_overview.md) - [PRD-001: LLM Decision Engine](PRD-001-llm-decision-engine.md) - [PRD-007: Adopter Autoupdate](PRD-007-adopter-autoupdate.md) — follow-on CLI capability for keeping adopter repositories current with the latest forge version; builds on the npm/CLI delivery channel established by this PRD. - See also: [#196](https://github.com/phoenixvc/agentkit-forge/issues/196), - [#194](https://github.com/phoenixvc/agentkit-forge/issues/194). + See also: [#196](https://github.com/phoenixvc/retort/issues/196), + [#194](https://github.com/phoenixvc/retort/issues/194). diff --git a/docs/product/PRD-006-pwa-desktop-visual-configuration.md b/docs/product/PRD-006-pwa-desktop-visual-configuration.md index c2bc326f..a536784b 100644 --- a/docs/product/PRD-006-pwa-desktop-visual-configuration.md +++ b/docs/product/PRD-006-pwa-desktop-visual-configuration.md @@ -1,4 +1,4 @@ -# PRD-006: AgentKit Forge PWA/Desktop Visual Configuration +# PRD-006: Retort PWA/Desktop Visual Configuration ## Status @@ -6,11 +6,11 @@ Draft ## Module / Feature Name -AgentKit Forge Visual Configuration PWA/Desktop Module +Retort Visual Configuration PWA/Desktop Module ## Marketing Name -AgentKit Forge Visual Editor (PWA/Desktop) +Retort Visual Editor (PWA/Desktop) ## Platform / Mesh Layers @@ -55,7 +55,7 @@ CLI/GitHub Action strategy per A schema-driven visual overlay/config editor and sync dashboard, deployable as a PWA or desktop app, that democratizes orchestration and delivers CLI parity and safety for the whole team. The UI is a presentation layer only — all logic lives -in the agentkit-forge engine, communicated via a JSON-RPC bridge. +in the retort engine, communicated via a JSON-RPC bridge. ## Problem Statement @@ -111,7 +111,7 @@ can update or validate configuration. ### Business Goals -- Expand agentkit-forge adoption in large organizations beyond the engineering +- Expand retort adoption in large organizations beyond the engineering team. - Drive engagement from PMs, designers, and team leads (not just developers). - Reduce dev team support and onboarding burden by at least 70%. @@ -219,7 +219,7 @@ identical sync outputs to CLI-created overlays. Acceptance criteria: -- UI sync output is byte-identical to `npx agentkit-forge sync` output. +- UI sync output is byte-identical to `npx retort sync` output. - "Show YAML" view displays the exact YAML that will be written. - All CLI capabilities for overlay management are accessible in the UI. @@ -240,7 +240,7 @@ Acceptance criteria: ``` 1. Launch PWA/Desktop App - └─ PWA: `npx agentkit-forge ui` → browser opens localhost:4827 + └─ PWA: `npx retort ui` → browser opens localhost:4827 └─ Desktop: open Tauri app → select repo folder 2. Select or connect to a repository @@ -266,7 +266,7 @@ Acceptance criteria: | Step | PWA Path | Desktop Path | Outcome | | -------------- | ----------------------- | ----------------------- | --------------- | -| Launch | `npx agentkit-forge ui` | Open app | UI ready | +| Launch | `npx retort ui` | Open app | UI ready | | Connect repo | Auto-detect from CWD | "Open Repo" file picker | Repo linked | | Create overlay | Wizard form | Wizard form | Overlay created | | Edit overlay | Schema-driven editor | Schema-driven editor | Changes staged | @@ -294,12 +294,12 @@ Acceptance criteria: ### Application Shell - **PWA (primary):** Single-page application served by - `npx agentkit-forge ui` on `localhost:4827`. Lightweight framework (Preact, + `npx retort ui` on `localhost:4827`. Lightweight framework (Preact, Svelte, or plain web components). Service worker for offline caching. Runs in any modern browser. - **Tauri desktop (follow-up):** Wraps the same web UI. ~5 MB binary (vs. ~150 MB for Electron). Built-in auto-updater. Distributed via GitHub Releases, - Homebrew (`brew install agentkit-forge`), or winget. + Homebrew (`brew install retort`), or winget. ### Overlay CRUD @@ -324,7 +324,7 @@ Acceptance criteria: ### Engine Communication -- JSON-RPC bridge over local HTTP to the agentkit-forge engine. +- JSON-RPC bridge over local HTTP to the retort engine. - No direct file system access from the browser — all mutations go through the engine API. - Same API contract consumed by CLI internally, ensuring parity. @@ -383,10 +383,10 @@ Acceptance criteria: | --------------------- | --------------------------------------------------------- | | Presentation / UI | Orchestration interface for `.agentkit/spec` overlays | | JSON-RPC bridge | Communication layer between UI and engine | -| agentkit-forge engine | All sync, validation, and output logic (shared with CLI) | +| retort engine | All sync, validation, and output logic (shared with CLI) | | Overlay directory | `.agentkit/overlays/` — source of truth persisted in repo | -State manipulations are routed through the agentkit-forge sync engine. The UI +State manipulations are routed through the retort sync engine. The UI never bypasses the engine to write files directly — no runtime-layer or team bypass is possible. @@ -421,7 +421,7 @@ bypass is possible. **PWA:** ```bash -npx agentkit-forge ui +npx retort ui # Browser opens → guided repo selection → scan overlays → wizard ``` @@ -530,7 +530,7 @@ npx agentkit-forge ui ### Technical Constraints -- Node.js / agentkit-forge CLI required for validation and sync (engine is not +- Node.js / retort CLI required for validation and sync (engine is not duplicated in the UI). - Tauri desktop app has full file system access; browser PWA is limited by browser security model (all FS operations via engine API). @@ -549,7 +549,7 @@ npx agentkit-forge ui | Dependency | Owner | Risk Level | | ---------------------------------------- | ---------------- | -------------- | -| agentkit-forge CLI/engine (JSON-RPC API) | Engineering Lead | Low (in-house) | +| retort CLI/engine (JSON-RPC API) | Engineering Lead | Low (in-house) | | UX/design collaboration | UX/UI Designer | Medium | | QA test coverage (GUI flows, parity) | QA Lead | Medium | | Pilot users for early feedback | Product Owner | Medium | @@ -610,7 +610,7 @@ npx agentkit-forge ui ### Competitive Analysis -| Capability | GitHub Copilot | Claude | Cursor | AgentKit Forge | +| Capability | GitHub Copilot | Claude | Cursor | Retort | | ------------------------------ | -------------- | ------ | ------ | -------------- | | Multi-tool overlay system | No | No | No | **Yes** | | Visual GUI overlay editing | No | No | No | **Yes** | @@ -628,5 +628,5 @@ first-mover opportunity for non-developer personas. parent PRD covering the full hybrid delivery strategy - [ADR-07: Delivery Strategy (Refined)](../architecture/decisions/07-delivery-strategy.md) — architectural decision record -- [ADR-01: Adopt AgentKit Forge](../architecture/decisions/01-adopt-agentkit-forge.md) +- [ADR-01: Adopt Retort](../architecture/decisions/01-adopt-retort.md) - [PRD-001: LLM Decision Engine](PRD-001-llm-decision-engine.md) diff --git a/docs/product/PRD-007-adopter-autoupdate.md b/docs/product/PRD-007-adopter-autoupdate.md index 55cedc56..bcf79e2c 100644 --- a/docs/product/PRD-007-adopter-autoupdate.md +++ b/docs/product/PRD-007-adopter-autoupdate.md @@ -1,4 +1,4 @@ -# PRD-007: AgentKit Forge Adopter Autoupdate +# PRD-007: Retort Adopter Autoupdate ## Status @@ -6,15 +6,15 @@ Draft ## Module / Feature Name -AgentKit Forge Autoupdate for Adopter Repositories +Retort Autoupdate for Adopter Repositories ## Marketing Name -AgentKit Forge Autoupdate +Retort Autoupdate ## Platform / Mesh Layers -- CLI toolchain (npm/npx-delivered `agentkit-forge` binary) +- CLI toolchain (npm/npx-delivered `retort` binary) - GitHub Actions CI/CD automation layer - Adopter repository bootstrap and governance pipeline @@ -22,14 +22,14 @@ AgentKit Forge Autoupdate - Developers (CLI-first) who manage adopter repositories - DevOps / Platform Engineers automating config drift detection and remediation -- Repository maintainers responsible for keeping AgentKit Forge versions current +- Repository maintainers responsible for keeping Retort versions current ## Core Value Proposition Eliminates manual version tracking in adopter repositories by providing a first-class autoupdate mechanism — delivered via CLI command, scheduled GitHub Action, and/or Renovate/Dependabot integration — so adopting teams always run -on a supported AgentKit Forge version without manual intervention. +on a supported Retort version without manual intervention. ## Priority @@ -50,13 +50,13 @@ Planned — design phase pending delivery channel GA (see PRD-005 Phase 1–3). ## TL;DR Provide a safe, opt-in autoupdate capability so that repositories adopting -AgentKit Forge can receive new forge versions without error-prone multi-step +Retort can receive new forge versions without error-prone multi-step manual upgrade ceremonies. Delivers update notifications, one-command upgrades, and CI-enforced version freshness. ## Problem Statement -Repositories that adopt AgentKit Forge via git submodule or npm devDependency +Repositories that adopt Retort via git submodule or npm devDependency today face a painful multi-step upgrade process: 1. Enter the submodule directory (or check npm for new versions manually) @@ -82,10 +82,10 @@ Specific pain points in the current state: forge version is more than N versions behind the current release. - **CLI toolchain dependency gap** — related issue: adopter repos may not have the required CLI tools installed to even perform an upgrade - (see issue [#196](https://github.com/phoenixvc/agentkit-forge/issues/196)). + (see issue [#196](https://github.com/phoenixvc/retort/issues/196)). - **Sync enforcement gap** — autoupdate is tightly coupled with the enforced sync contract described in issue - [#194](https://github.com/phoenixvc/agentkit-forge/issues/194); upgrading + [#194](https://github.com/phoenixvc/retort/issues/194); upgrading the forge version must trigger a re-sync before the PR passes validation. ## Core Challenge @@ -99,7 +99,7 @@ governance already planned for adopter repos. - PRD-005 (Mesh-Native Distribution) targets GA for the npm package delivery channel; autoupdate is a natural complement once the package is published. - ADR-07 explicitly calls out "autoupdate support" as part of the `npm install --g agentkit-forge` CLI consumer experience. +-g retort` CLI consumer experience. - Governance enforcement (#194) and CLI toolchain requirements (#196) create the prerequisite infrastructure for autoupdate to function safely. - Growing adopter base amplifies the support cost of manual upgrades. @@ -159,9 +159,9 @@ check for and apply a forge update, with a dry-run preview of what changes. Acceptance criteria: -- `agentkit-forge update` checks for new versions and prints a changelog summary. -- `agentkit-forge update --apply` upgrades and re-runs sync in one step. -- `agentkit-forge update --rollback` restores the previous version and outputs. +- `retort update` checks for new versions and prints a changelog summary. +- `retort update --apply` upgrades and re-runs sync in one step. +- `retort update --rollback` restores the previous version and outputs. - The command fails fast with clear guidance if prerequisite CLI tools are missing (see issue #196). @@ -198,13 +198,13 @@ Acceptance criteria: ### Primary Use Cases -- **CLI upgrade:** Developer runs `agentkit-forge update --apply` → version +- **CLI upgrade:** Developer runs `retort update --apply` → version bumped, sync re-run, outputs validated, PR opened. - **Automated PR:** Scheduled GitHub Action opens a forge-version bump PR automatically when a new release is available. -- **Version check only:** `agentkit-forge update --check` prints current vs +- **Version check only:** `retort update --check` prints current vs latest version without modifying anything. -- **Rollback:** `agentkit-forge update --rollback` restores the previous version +- **Rollback:** `retort update --rollback` restores the previous version if the new one broke overlay outputs. ### Core Flows @@ -212,12 +212,12 @@ Acceptance criteria: #### Flow 1: CLI One-Step Upgrade (Developer) ```text -agentkit-forge update --apply +retort update --apply → checks latest published version → compares with pinned version in adopter repo → prints changelog summary → bumps version (npm or submodule) - → re-runs agentkit-forge sync + → re-runs retort sync → validates generated output parity → opens draft PR on dev branch with diff ``` @@ -231,7 +231,7 @@ on: - cron: '0 9 * * 1' # weekly Monday 9am jobs: autoupdate: - uses: org/agentkit-forge-action@v3 + uses: org/retort-action@v3 with: mode: update overlay: my-project @@ -241,10 +241,10 @@ jobs: #### Flow 3: Version Check Only ```text -agentkit-forge update --check +retort update --check → Current: 3.2.1 (pinned in package.json) → Latest: 3.4.0 - → 2 minor versions behind. Run `agentkit-forge update --apply` to upgrade. + → 2 minor versions behind. Run `retort update --apply` to upgrade. → Changelog: [link to release notes] ``` @@ -252,11 +252,11 @@ agentkit-forge update --check | Step | CLI Path | Automated CI Path | Outcome | | ----------------- | ---------------------------------- | ------------------------------ | -------------------------------- | -| Detect update | `agentkit-forge update --check` | Scheduled Action detects delta | New version identified | +| Detect update | `retort update --check` | Scheduled Action detects delta | New version identified | | Preview changelog | Printed in CLI output | PR body contains changelog | Team informed of changes | -| Apply update | `agentkit-forge update --apply` | Action bumps version, re-syncs | Overlay outputs regenerated | +| Apply update | `retort update --apply` | Action bumps version, re-syncs | Overlay outputs regenerated | | Validate | Sync output diff printed; CI check | PR checks validate drift | Regression surfaced before merge | -| Rollback | `agentkit-forge update --rollback` | Close PR / revert commit | Previous state restored | +| Rollback | `retort update --rollback` | Close PR / revert commit | Previous state restored | ## Functional Requirements @@ -264,11 +264,11 @@ agentkit-forge update --check | Command | Description | | ----------------------------------- | ------------------------------------------------------ | -| `agentkit-forge update` | Check for updates and print summary (no-op, dry-run) | -| `agentkit-forge update --apply` | Upgrade to latest version and re-run sync | -| `agentkit-forge update --check` | Alias for default: check-only, machine-readable output | -| `agentkit-forge update --version X` | Upgrade to a specific version X (pinned upgrade) | -| `agentkit-forge update --rollback` | Restore previously pinned version and sync outputs | +| `retort update` | Check for updates and print summary (no-op, dry-run) | +| `retort update --apply` | Upgrade to latest version and re-run sync | +| `retort update --check` | Alias for default: check-only, machine-readable output | +| `retort update --version X` | Upgrade to a specific version X (pinned upgrade) | +| `retort update --rollback` | Restore previously pinned version and sync outputs | ### GitHub Action @@ -290,7 +290,7 @@ agentkit-forge update --check ### Prerequisite Checks -- `update --apply` runs a preflight check equivalent to `agentkit-forge doctor` +- `update --apply` runs a preflight check equivalent to `retort doctor` to validate CLI toolchain availability (addresses #196 requirements). - If required tools are missing, upgrade is blocked with an actionable error message including installation instructions. @@ -313,11 +313,11 @@ agentkit-forge update --check | Issue | Title | Relationship | | -------------------------------------------------------------- | ------------------------------------------------------ | --------------------------------------------------------------------- | -| [#196](https://github.com/phoenixvc/agentkit-forge/issues/196) | adoption/startup-hooks: enforce required CLI toolchain | Prerequisite: autoupdate preflight reuses CLI toolchain validation | -| [#194](https://github.com/phoenixvc/agentkit-forge/issues/194) | governance: enforce agentkit sync pre-PR for adopters | Prerequisite: `update --apply` must trigger sync to satisfy this gate | +| [#196](https://github.com/phoenixvc/retort/issues/196) | adoption/startup-hooks: enforce required CLI toolchain | Prerequisite: autoupdate preflight reuses CLI toolchain validation | +| [#194](https://github.com/phoenixvc/retort/issues/194) | governance: enforce agentkit sync pre-PR for adopters | Prerequisite: `update --apply` must trigger sync to satisfy this gate | | [PRD-005](./PRD-005-mesh-native-distribution.md) | Mesh-Native Distribution | Parent delivery strategy; autoupdate is a Phase 4+ CLI capability | | [ADR-07](../architecture/decisions/07-delivery-strategy.md) | Delivery Strategy | Architectural decisions that autoupdate must respect (npm, GH Action) | -| [#241](https://github.com/phoenixvc/agentkit-forge/issues/241) | feat(analytics): cross-repo usage telemetry | Future: telemetry can track autoupdate adoption and version currency | +| [#241](https://github.com/phoenixvc/retort/issues/241) | feat(analytics): cross-repo usage telemetry | Future: telemetry can track autoupdate adoption and version currency | ## Milestone @@ -326,14 +326,14 @@ which groups delivery-method improvements for adopter repositories. Related issues to include in this milestone: - This autoupdate feature issue -- [#196](https://github.com/phoenixvc/agentkit-forge/issues/196) — CLI toolchain enforcement -- [#194](https://github.com/phoenixvc/agentkit-forge/issues/194) — agentkit sync enforcement +- [#196](https://github.com/phoenixvc/retort/issues/196) — CLI toolchain enforcement +- [#194](https://github.com/phoenixvc/retort/issues/194) — agentkit sync enforcement ## Acceptance Criteria -- [ ] `agentkit-forge update` (check-only) prints current vs. latest version with changelog link. -- [ ] `agentkit-forge update --apply` upgrades, re-syncs, and validates output parity in one command. -- [ ] `agentkit-forge update --rollback` restores previous version and outputs. +- [ ] `retort update` (check-only) prints current vs. latest version with changelog link. +- [ ] `retort update --apply` upgrades, re-syncs, and validates output parity in one command. +- [ ] `retort update --rollback` restores previous version and outputs. - [ ] GitHub Action template generated by agentkit:sync supports weekly auto-update PRs. - [ ] Preflight check validates CLI toolchain availability before attempting upgrade (covers #196). - [ ] Upgrade flow always triggers sync, satisfying the pre-PR sync contract (covers #194). @@ -347,5 +347,5 @@ issues to include in this milestone: - [ADR-07: Delivery Strategy](../architecture/decisions/07-delivery-strategy.md) - [PRD-005: Mesh-Native Distribution](./PRD-005-mesh-native-distribution.md) - [PRD-006: PWA/Desktop Visual Configuration](./PRD-006-pwa-desktop-visual-configuration.md) -- [Issue #196: CLI Toolchain Enforcement](https://github.com/phoenixvc/agentkit-forge/issues/196) -- [Issue #194: agentkit sync Enforcement for Adopters](https://github.com/phoenixvc/agentkit-forge/issues/194) +- [Issue #196: CLI Toolchain Enforcement](https://github.com/phoenixvc/retort/issues/196) +- [Issue #194: agentkit sync Enforcement for Adopters](https://github.com/phoenixvc/retort/issues/194) diff --git a/docs/product/README.md b/docs/product/README.md index ce11aaf5..2054f1b9 100644 --- a/docs/product/README.md +++ b/docs/product/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Product Docs Index diff --git a/docs/reference/01_glossary.md b/docs/reference/01_glossary.md index 17b0ee9d..41e7e5b0 100644 --- a/docs/reference/01_glossary.md +++ b/docs/reference/01_glossary.md @@ -1,14 +1,14 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Glossary -## AgentKit Forge Terms +## Retort Terms | Term | Definition | | -------------------- | ----------------------------------------------------------------------------------------------------------------------- | -| **AgentKit Forge** | An opinionated project scaffolding and documentation generation tool. | +| **Retort** | An opinionated project scaffolding and documentation generation tool. | | **Spec** | The source-of-truth configuration that defines project structure and templates. | | **Overlay** | A per-project customisation layer applied on top of the base spec. | | **Sync** | The process of regenerating files from the spec and overlays (`agentkit:sync`). | diff --git a/docs/reference/02_faq.md b/docs/reference/02_faq.md index a2e2d460..e7f82905 100644 --- a/docs/reference/02_faq.md +++ b/docs/reference/02_faq.md @@ -1,12 +1,12 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Frequently Asked Questions ## General -### What is agentkit-forge? +### What is retort? <!-- Provide a brief description of the project. --> @@ -14,13 +14,13 @@ See the [Development Setup](../engineering/01_setup.md) guide. -## AgentKit Forge +## Retort ### What are the generated files? -Files with the `GENERATED by AgentKit Forge` header are produced by the sync +Files with the `GENERATED by Retort` header are produced by the sync process and should not be edited directly. Customise them via overlays at -`.agentkit/overlays/agentkit-forge`. +`.agentkit/overlays/retort`. ### How do I regenerate the documentation? diff --git a/docs/reference/03_changelog.md b/docs/reference/03_changelog.md index 3b95b019..ed02bfb1 100644 --- a/docs/reference/03_changelog.md +++ b/docs/reference/03_changelog.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Changelog diff --git a/docs/reference/04_contributing.md b/docs/reference/04_contributing.md index fc81dae2..0a12bdc7 100644 --- a/docs/reference/04_contributing.md +++ b/docs/reference/04_contributing.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Contributing diff --git a/docs/reference/05_project_yaml_reference.md b/docs/reference/05_project_yaml_reference.md index ded3b7eb..6420c00e 100644 --- a/docs/reference/05_project_yaml_reference.md +++ b/docs/reference/05_project_yaml_reference.md @@ -1,7 +1,7 @@ # project.yaml Reference > Canonical configuration for project-level metadata consumed by -> AgentKit Forge's sync engine. All fields are **optional** — if +> Retort's sync engine. All fields are **optional** — if > missing, sync produces generic output. ## Sections diff --git a/docs/reference/README.md b/docs/reference/README.md index 3921959d..45620ea4 100644 --- a/docs/reference/README.md +++ b/docs/reference/README.md @@ -1,5 +1,5 @@ -<!-- GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT --> -<!-- Source: .agentkit/spec + .agentkit/overlays/agentkit-forge --> +<!-- GENERATED by Retort v3.1.0 — DO NOT EDIT --> +<!-- Source: .agentkit/spec + .agentkit/overlays/retort --> <!-- Regenerate: pnpm -C .agentkit agentkit:sync --> # Reference Docs Index diff --git a/docs/reference/agent-prompt-comparative-analysis.md b/docs/reference/agent-prompt-comparative-analysis.md index 3312f29a..cf2c308e 100644 --- a/docs/reference/agent-prompt-comparative-analysis.md +++ b/docs/reference/agent-prompt-comparative-analysis.md @@ -8,7 +8,7 @@ | **Prompt 2** | Structured markdown with meta-instructions | CLAUDE.md-style developer persona | ~2,200 | | **Prompt 3** | YAML frontmatter + concise markdown | `.github/agents/backend.agent.md` (Copilot agent) | ~750 | -All three prompts define the same "Senior Backend Engineer" role within the AgentKit Forge multi-agent system. They share identical focus areas, responsibilities, domain rules, and tooling. The differences lie in structure, depth, and operational guidance. +All three prompts define the same "Senior Backend Engineer" role within the Retort multi-agent system. They share identical focus areas, responsibilities, domain rules, and tooling. The differences lie in structure, depth, and operational guidance. --- @@ -140,7 +140,7 @@ All three prompts define the same "Senior Backend Engineer" role within the Agen ### 3rd Place: Prompt 3 (Copilot Agent YAML + Markdown) -**Why it's third:** Extremely token-efficient and well-structured for a configuration-driven system. However, it critically lacks concurrency controls, error handling guidance, and an autonomous decision framework. In a single-agent or human-supervised context, this prompt would be adequate. In a multi-agent autonomous environment like AgentKit Forge, the missing operational guidance makes it insufficient without heavy reliance on external documentation. +**Why it's third:** Extremely token-efficient and well-structured for a configuration-driven system. However, it critically lacks concurrency controls, error handling guidance, and an autonomous decision framework. In a single-agent or human-supervised context, this prompt would be adequate. In a multi-agent autonomous environment like Retort, the missing operational guidance makes it insufficient without heavy reliance on external documentation. --- diff --git a/docs/reference/agentkit_adopter_branch_governance_checklist.md b/docs/reference/agentkit_adopter_branch_governance_checklist.md index 42e1d54c..455ad0b8 100644 --- a/docs/reference/agentkit_adopter_branch_governance_checklist.md +++ b/docs/reference/agentkit_adopter_branch_governance_checklist.md @@ -1,23 +1,23 @@ -# AgentKit Adopter Branch Governance Checklist +# Retort Adopter Branch Governance Checklist ## Purpose -Apply the branch-governance profile to repositories that implement AgentKit Forge until template/spec automation is merged. +Apply the branch-governance profile to repositories that implement Retort until template/spec automation is merged. ## Governance source -- Rollout tracker: [Issue #167](https://github.com/phoenixvc/agentkit-forge/issues/167) -- Policy issue: [Issue #168](https://github.com/phoenixvc/agentkit-forge/issues/168) -- Infrastructure issue: [Issue #169](https://github.com/phoenixvc/agentkit-forge/issues/169) +- Rollout tracker: [Issue #167](https://github.com/phoenixvc/retort/issues/167) +- Policy issue: [Issue #168](https://github.com/phoenixvc/retort/issues/168) +- Infrastructure issue: [Issue #169](https://github.com/phoenixvc/retort/issues/169) ## Implementation checklist (per adopting repo) -- [ ] Confirm repository is enrolled in AgentKit implementer policy profile. +- [ ] Confirm repository is enrolled in Retort implementer policy profile. - [ ] Set default branch to `dev` (with owner approval and migration notice). - [ ] Enable branch protection for `dev` with required status checks and reviews. - [ ] Enable branch protection for `main` with required status checks and reviews. - [ ] Add/enable a required check that blocks direct changes to `.agentkit/**` in PRs targeting `dev` or `main`. -- [ ] Require upstream issue linkage for `.agentkit/**` change requests (must reference `phoenixvc/agentkit-forge` issue URL). +- [ ] Require upstream issue linkage for `.agentkit/**` change requests (must reference `phoenixvc/retort` issue URL). - [ ] Document exception path for maintainers (emergency only, audited): [Maintainer Exception Policy](maintainer_exception_policy.md). - [ ] Update contributor docs in the adopting repo to reflect `dev` default and upstream-first `.agentkit` policy. @@ -32,7 +32,7 @@ Apply the branch-governance profile to repositories that implement AgentKit Forg If a PR targets `dev` or `main` and includes `.agentkit/**` changes: -1. It must link a tracking issue in `phoenixvc/agentkit-forge`. +1. It must link a tracking issue in `phoenixvc/retort`. 2. If no upstream issue exists, PR must fail with actionable guidance to open one. 3. Local/direct template-source edits are rejected unless explicitly approved under [Maintainer Exception Policy](maintainer_exception_policy.md). diff --git a/docs/reference/agentkit_sync_integration_patch_plan.md b/docs/reference/agentkit_sync_integration_patch_plan.md index fd524ede..56d0de6d 100644 --- a/docs/reference/agentkit_sync_integration_patch_plan.md +++ b/docs/reference/agentkit_sync_integration_patch_plan.md @@ -1,8 +1,8 @@ -# AgentKit Sync Integration Patch Plan +# Retort Sync Integration Patch Plan ## Why this exists -This plan provides a maintainer-ready implementation blueprint to move branch-governance guardrails from runtime repo files into AgentKit sync source-of-truth. +This plan provides a maintainer-ready implementation blueprint to move branch-governance guardrails from runtime repo files into Retort sync source-of-truth. ## Target outcome @@ -41,7 +41,7 @@ In generated branch-protection workflow: - Trigger applies to PRs targeting `dev` and `main`. - If PR touches `.agentkit/**`, PR body must contain upstream issue URL pattern: - - [https://github.com/phoenixvc/agentkit-forge/issues/<number>](https://github.com/phoenixvc/agentkit-forge/issues/<number>) + - [https://github.com/phoenixvc/retort/issues/<number>](https://github.com/phoenixvc/retort/issues/<number>) - On missing link, required check fails with clear remediation message. ### 2) Branch protection script behavior diff --git a/docs/reference/analysis/README.md b/docs/reference/analysis/README.md index 37eccfc7..458e36e9 100644 --- a/docs/reference/analysis/README.md +++ b/docs/reference/analysis/README.md @@ -15,4 +15,4 @@ defined in [PRD-001](../../product/PRD-001-llm-decision-engine.md). - [PRD-001: LLM Decision Engine](../../product/PRD-001-llm-decision-engine.md) - [PRD-004: Technical API Contracts](../../architecture/specs/PRD-004-technical-api-contracts.md) -- Phase tracking issues: [#220](https://github.com/phoenixvc/agentkit-forge/issues/220), [#221](https://github.com/phoenixvc/agentkit-forge/issues/221), [#222](https://github.com/phoenixvc/agentkit-forge/issues/222), [#223](https://github.com/phoenixvc/agentkit-forge/issues/223), [#224](https://github.com/phoenixvc/agentkit-forge/issues/224), [#225](https://github.com/phoenixvc/agentkit-forge/issues/225) +- Phase tracking issues: [#220](https://github.com/phoenixvc/retort/issues/220), [#221](https://github.com/phoenixvc/retort/issues/221), [#222](https://github.com/phoenixvc/retort/issues/222), [#223](https://github.com/phoenixvc/retort/issues/223), [#224](https://github.com/phoenixvc/retort/issues/224), [#225](https://github.com/phoenixvc/retort/issues/225) diff --git a/docs/reference/analysis/language-aware-hooks-phase-plan.md b/docs/reference/analysis/language-aware-hooks-phase-plan.md index 8ae842ac..b233e83b 100644 --- a/docs/reference/analysis/language-aware-hooks-phase-plan.md +++ b/docs/reference/analysis/language-aware-hooks-phase-plan.md @@ -157,15 +157,15 @@ This sequence preserves current correctness while adding bootstrap resilience wi ### Phase 2 issues (Templates) -- #220 — https://github.com/phoenixvc/agentkit-forge/issues/220 — `OPEN` -- #221 — https://github.com/phoenixvc/agentkit-forge/issues/221 — `OPEN` -- #222 — https://github.com/phoenixvc/agentkit-forge/issues/222 — `OPEN` +- #220 — https://github.com/phoenixvc/retort/issues/220 — `OPEN` +- #221 — https://github.com/phoenixvc/retort/issues/221 — `OPEN` +- #222 — https://github.com/phoenixvc/retort/issues/222 — `OPEN` ### Phase 3 issues (CSS & HTML) -- #223 — https://github.com/phoenixvc/agentkit-forge/issues/223 — `OPEN` -- #224 — https://github.com/phoenixvc/agentkit-forge/issues/224 — `OPEN` -- #225 — https://github.com/phoenixvc/agentkit-forge/issues/225 — `OPEN` +- #223 — https://github.com/phoenixvc/retort/issues/223 — `OPEN` +- #224 — https://github.com/phoenixvc/retort/issues/224 — `OPEN` +- #225 — https://github.com/phoenixvc/retort/issues/225 — `OPEN` ### Current implementation alignment diff --git a/docs/reference/analysis/model-quirks-analysis.md b/docs/reference/analysis/model-quirks-analysis.md index 2fe565a7..9460cfc9 100644 --- a/docs/reference/analysis/model-quirks-analysis.md +++ b/docs/reference/analysis/model-quirks-analysis.md @@ -1,7 +1,7 @@ # Model Quirks Analysis **Last Updated:** 2026-02-26 -**Scope:** Systematic exploration of model-specific quirks for the AgentKit decision engine +**Scope:** Systematic exploration of model-specific quirks for the Retort decision engine **Purpose:** Enhance the "quirks" scoring dimension with specific, actionable model behaviors ## Overview diff --git a/docs/reference/analysis/quirks-scoring-implementation.md b/docs/reference/analysis/quirks-scoring-implementation.md index 2c8c971d..9f2f20be 100644 --- a/docs/reference/analysis/quirks-scoring-implementation.md +++ b/docs/reference/analysis/quirks-scoring-implementation.md @@ -1,7 +1,7 @@ # Quirks Scoring Implementation Guide **Last Updated:** 2026-02-26 -**Purpose:** Implement numerical scoring for model quirks in the AgentKit decision engine +**Purpose:** Implement numerical scoring for model quirks in the Retort decision engine **Scope:** Integration with PRD-001 weighted decision matrix ## Overview diff --git a/docs/reference/cli_delivery_improvements_milestone.md b/docs/reference/cli_delivery_improvements_milestone.md index a83442cc..73ec8c62 100644 --- a/docs/reference/cli_delivery_improvements_milestone.md +++ b/docs/reference/cli_delivery_improvements_milestone.md @@ -5,11 +5,11 @@ Delivery-method improvements for adopter repositories: CLI toolchain enforcement, agentkit sync governance, and first-class autoupdate capability. This milestone groups the issues that collectively complete the "adoption lifecycle loop" for -repositories that have integrated AgentKit Forge. +repositories that have integrated Retort. ## Milestone -- Repository: `phoenixvc/agentkit-forge` +- Repository: `phoenixvc/retort` - Milestone: `CLI Distribution & Delivery Improvements` - Milestone number: `#2` (created) @@ -17,16 +17,16 @@ repositories that have integrated AgentKit Forge. | # | Title | Status | PRD / Spec | | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------ | --------------------------------------------------- | -| [#196](https://github.com/phoenixvc/agentkit-forge/issues/196) | adoption/startup-hooks: enforce required CLI toolchain availability (gh, az, etc.) | Open | N/A | -| [#194](https://github.com/phoenixvc/agentkit-forge/issues/194) | governance: enforce agentkit sync pre-PR (blocking) and post-commit (non-blocking) for adopters | Open | N/A | -| [#258](https://github.com/phoenixvc/agentkit-forge/issues/258) | feat(cli): implement autoupdate functionality for repositories adopting AgentKit Forge | Open | [PRD-007](../product/PRD-007-adopter-autoupdate.md) | +| [#196](https://github.com/phoenixvc/retort/issues/196) | adoption/startup-hooks: enforce required CLI toolchain availability (gh, az, etc.) | Open | N/A | +| [#194](https://github.com/phoenixvc/retort/issues/194) | governance: enforce agentkit sync pre-PR (blocking) and post-commit (non-blocking) for adopters | Open | N/A | +| [#258](https://github.com/phoenixvc/retort/issues/258) | feat(cli): implement autoupdate functionality for repositories adopting Retort | Open | [PRD-007](../product/PRD-007-adopter-autoupdate.md) | > **Status update:** Milestone and autoupdate issue have been created. > -> - Milestone: [#2](https://github.com/phoenixvc/agentkit-forge/milestone/2) -> - Autoupdate issue: [#258](https://github.com/phoenixvc/agentkit-forge/issues/258) -> - Cross-reference comments added on [#196](https://github.com/phoenixvc/agentkit-forge/issues/196) -> and [#194](https://github.com/phoenixvc/agentkit-forge/issues/194) +> - Milestone: [#2](https://github.com/phoenixvc/retort/milestone/2) +> - Autoupdate issue: [#258](https://github.com/phoenixvc/retort/issues/258) +> - Cross-reference comments added on [#196](https://github.com/phoenixvc/retort/issues/196) +> and [#194](https://github.com/phoenixvc/retort/issues/194) ## Cross-References (Issue Updates Applied) @@ -40,7 +40,7 @@ Template that was added to the issue body/comment: ```markdown ## Related -- See also: [feat(cli): implement autoupdate for adopter repositories](https://github.com/phoenixvc/agentkit-forge/issues/258) +- See also: [feat(cli): implement autoupdate for adopter repositories](https://github.com/phoenixvc/retort/issues/258) — autoupdate preflight checks reuse the CLI toolchain validation requirements defined here. - Milestone: CLI Distribution & Delivery Improvements ``` @@ -52,7 +52,7 @@ Template that was added to the issue body/comment: ```markdown ## Related -- See also: [feat(cli): implement autoupdate for adopter repositories](https://github.com/phoenixvc/agentkit-forge/issues/258) +- See also: [feat(cli): implement autoupdate for adopter repositories](https://github.com/phoenixvc/retort/issues/258) — `update --apply` must trigger sync as part of its upgrade flow, satisfying the pre-PR sync enforcement contract defined here. - Milestone: CLI Distribution & Delivery Improvements @@ -64,7 +64,7 @@ Copy the following as the body for the new GitHub issue: --- -**Title:** `feat(cli): implement autoupdate functionality for repositories adopting AgentKit Forge` +**Title:** `feat(cli): implement autoupdate functionality for repositories adopting Retort` **Labels:** `enhancement` @@ -76,7 +76,7 @@ Copy the following as the body for the new GitHub issue: ## Summary Implement a first-class autoupdate mechanism so that repositories adopting -AgentKit Forge can receive and apply new forge versions without manual, +Retort can receive and apply new forge versions without manual, multi-step upgrade ceremonies. ## Context @@ -87,17 +87,17 @@ adopter repos accumulate version drift, triggering avoidable CI failures when new forge versions introduce breaking template changes. This issue tracks delivery of the autoupdate capability as described in -[PRD-007](https://github.com/phoenixvc/agentkit-forge/blob/dev/docs/product/PRD-007-adopter-autoupdate.md), building on the +[PRD-007](https://github.com/phoenixvc/retort/blob/dev/docs/product/PRD-007-adopter-autoupdate.md), building on the delivery channel established in -[ADR-07](https://github.com/phoenixvc/agentkit-forge/blob/dev/docs/architecture/decisions/07-delivery-strategy.md) and -[PRD-005](https://github.com/phoenixvc/agentkit-forge/blob/dev/docs/product/PRD-005-mesh-native-distribution.md). +[ADR-07](https://github.com/phoenixvc/retort/blob/dev/docs/architecture/decisions/07-delivery-strategy.md) and +[PRD-005](https://github.com/phoenixvc/retort/blob/dev/docs/product/PRD-005-mesh-native-distribution.md). ## Scope -- [ ] Add `agentkit-forge update` CLI command (check-only, dry-run by default). -- [ ] Add `agentkit-forge update --apply` — upgrades version, re-runs sync, validates outputs. -- [ ] Add `agentkit-forge update --rollback` — restores previous version and sync outputs. -- [ ] Add `agentkit-forge update --version X` — pin-upgrade to a specific version. +- [ ] Add `retort update` CLI command (check-only, dry-run by default). +- [ ] Add `retort update --apply` — upgrades version, re-runs sync, validates outputs. +- [ ] Add `retort update --rollback` — restores previous version and sync outputs. +- [ ] Add `retort update --version X` — pin-upgrade to a specific version. - [ ] GitHub Action template: scheduled workflow that opens an auto-update PR when the pinned forge version is behind the latest stable release. - [ ] Preflight checks validate CLI toolchain availability before attempting upgrade @@ -108,9 +108,9 @@ delivery channel established in ## Acceptance Criteria -- [ ] `agentkit-forge update` (check-only) prints current vs. latest version with changelog link. -- [ ] `agentkit-forge update --apply` upgrades, re-syncs, and validates output parity in one command. -- [ ] `agentkit-forge update --rollback` restores previous version and outputs. +- [ ] `retort update` (check-only) prints current vs. latest version with changelog link. +- [ ] `retort update --apply` upgrades, re-syncs, and validates output parity in one command. +- [ ] `retort update --rollback` restores previous version and outputs. - [ ] GitHub Action template supports weekly auto-update PRs. - [ ] Preflight check validates CLI toolchain (covers #196). - [ ] Upgrade triggers sync, satisfying pre-PR sync contract (covers #194). @@ -121,8 +121,8 @@ delivery channel established in - Prereq: #196 — CLI toolchain enforcement (preflight check dependency) - Prereq: #194 — agentkit sync pre-PR enforcement (sync gate dependency) -- Parent PRD: [PRD-007: Adopter Autoupdate](https://github.com/phoenixvc/agentkit-forge/blob/dev/docs/product/PRD-007-adopter-autoupdate.md) -- Delivery strategy: [ADR-07](https://github.com/phoenixvc/agentkit-forge/blob/dev/docs/architecture/decisions/07-delivery-strategy.md) +- Parent PRD: [PRD-007: Adopter Autoupdate](https://github.com/phoenixvc/retort/blob/dev/docs/product/PRD-007-adopter-autoupdate.md) +- Delivery strategy: [ADR-07](https://github.com/phoenixvc/retort/blob/dev/docs/architecture/decisions/07-delivery-strategy.md) - Analytics: #241 (telemetry events for version tracking) ``` diff --git a/docs/reference/governance_issue_file_impact_map.md b/docs/reference/governance_issue_file_impact_map.md index d3aa8a63..7dcc5299 100644 --- a/docs/reference/governance_issue_file_impact_map.md +++ b/docs/reference/governance_issue_file_impact_map.md @@ -35,7 +35,7 @@ Epic-level impacted files/components: Ownership: -- Primary: `phoenixvc/agentkit-forge` maintainers +- Primary: `phoenixvc/retort` maintainers - Linked downstream: `phoenixvc/ai-gateway`, `phoenixvc/pvc-costops-analytics` --- diff --git a/docs/reference/issue_170_patch_blocks.md b/docs/reference/issue_170_patch_blocks.md index e91a5012..d38bead3 100644 --- a/docs/reference/issue_170_patch_blocks.md +++ b/docs/reference/issue_170_patch_blocks.md @@ -22,7 +22,7 @@ Use the same logic as current runtime workflow in `.github/workflows/branch-prot - `pull_request` branches: `[main, dev]` - dynamic secret-scan diff base: `origin/${{ github.event.pull_request.base.ref }}...HEAD` - guardrail step: fail PR when `.agentkit/**` changed and PR body lacks upstream issue URL matching: - - `https://github.com/phoenixvc/agentkit-forge/issues/<number>` + - `https://github.com/phoenixvc/retort/issues/<number>` Recommended source for exact content: diff --git a/docs/reference/maintainer_exception_policy.md b/docs/reference/maintainer_exception_policy.md index cae9cca2..6f77790c 100644 --- a/docs/reference/maintainer_exception_policy.md +++ b/docs/reference/maintainer_exception_policy.md @@ -2,7 +2,7 @@ ## Purpose -Define the exception process for emergency changes that would otherwise be blocked by AgentKit branch-governance guardrails. +Define the exception process for emergency changes that would otherwise be blocked by Retort branch-governance guardrails. ## Allowed use @@ -12,7 +12,7 @@ Define the exception process for emergency changes that would otherwise be block ## Required controls -1. Open or reference a tracking issue in `phoenixvc/agentkit-forge`. +1. Open or reference a tracking issue in `phoenixvc/retort`. 2. Include rationale, scope, and rollback plan in the PR description. 3. Require at least one maintainer approval before merge. 4. Add post-incident follow-up task to restore normal policy path. diff --git a/docs/reference/research/aider-polyglot-leaderboard-2025.md b/docs/reference/research/aider-polyglot-leaderboard-2025.md index 45b0a772..b8e0775c 100644 --- a/docs/reference/research/aider-polyglot-leaderboard-2025.md +++ b/docs/reference/research/aider-polyglot-leaderboard-2025.md @@ -83,7 +83,7 @@ a meaningful uplift, but Claude still trails GPT-5 on this benchmark. **Agentic scaffolding inflates scores.** The Refact.ai 93.3 % result highlights that the _workflow_ (plan, code, test, iterate) is often more important than the underlying model. This is consistent with the -AgentKit Forge design principle of optimising the agent harness alongside +Retort design principle of optimising the agent harness alongside model selection. --- @@ -100,7 +100,7 @@ Key data points available in the dossiers: --- -## Implications for AgentKit Forge model guides +## Implications for Retort model guides - GPT-5.2 / 5.3 Codex High justifies its Tier 1 placement in Backend and Security guides despite a weaker long-context story — it wins on @@ -110,6 +110,6 @@ Key data points available in the dossiers: - Claude Opus 4.x should remain primary where multi-file reasoning and large context are needed, but should not be assumed best for all coding scenarios — GPT-5 family and Gemini are stronger on narrow code-edit tasks. -- The agentic scaffold (how AgentKit Forge chains tool calls) may have +- The agentic scaffold (how Retort chains tool calls) may have more impact on end-to-end results than the ±5 % differences between top-tier models. diff --git a/docs/reference/research/best-llm-for-coding-teams-2026.md b/docs/reference/research/best-llm-for-coding-teams-2026.md index 9e465a64..b964dc77 100644 --- a/docs/reference/research/best-llm-for-coding-teams-2026.md +++ b/docs/reference/research/best-llm-for-coding-teams-2026.md @@ -146,7 +146,7 @@ operational constraints on API-based models. --- -## Implications for AgentKit Forge model guides +## Implications for Retort model guides - The hybrid recommendation is already reflected in the 10 team guides: each guide has a primary and 1–2 cost-aware or context-specific diff --git a/docs/reference/research/swe-bench-leaderboard-feb-2026.md b/docs/reference/research/swe-bench-leaderboard-feb-2026.md index c9ddf459..1ddbdffa 100644 --- a/docs/reference/research/swe-bench-leaderboard-feb-2026.md +++ b/docs/reference/research/swe-bench-leaderboard-feb-2026.md @@ -77,11 +77,11 @@ more general Pro variants. **Benchmark harness matters.** Results can vary materially depending on agent scaffold (SWE-agent, Moatless, OpenHands, etc.). The leaderboard numbers above are for the published scaffold reported by each team; -internal AgentKit evaluations using a custom scaffold may differ. +internal Retort evaluations using a custom scaffold may differ. --- -## Implications for AgentKit Forge model guides +## Implications for Retort model guides - The Tier 1 choices in the team guides (Claude Opus 4.6, GPT-5.3 Codex High) are consistent with this leaderboard. diff --git a/docs/reference/router_integration_governance_rollout.md b/docs/reference/router_integration_governance_rollout.md index b9ba8785..71b085a8 100644 --- a/docs/reference/router_integration_governance_rollout.md +++ b/docs/reference/router_integration_governance_rollout.md @@ -6,26 +6,26 @@ Issue-first governance rollout for router-specialist integration with no direct ## Milestone -- Repository: `phoenixvc/agentkit-forge` +- Repository: `phoenixvc/retort` - Milestone: `Router Integration Governance Rollout` (`#1`) ## Epic and child issues -- Epic: #159 — [Issue #159](https://github.com/phoenixvc/agentkit-forge/issues/159) -- A: #160 — [Issue #160](https://github.com/phoenixvc/agentkit-forge/issues/160) -- B: #161 — [Issue #161](https://github.com/phoenixvc/agentkit-forge/issues/161) -- C: #162 — [Issue #162](https://github.com/phoenixvc/agentkit-forge/issues/162) -- D: #163 — [Issue #163](https://github.com/phoenixvc/agentkit-forge/issues/163) -- E: #164 — [Issue #164](https://github.com/phoenixvc/agentkit-forge/issues/164) -- F: #165 — [Issue #165](https://github.com/phoenixvc/agentkit-forge/issues/165) -- G: #166 — [Issue #166](https://github.com/phoenixvc/agentkit-forge/issues/166) +- Epic: #159 — [Issue #159](https://github.com/phoenixvc/retort/issues/159) +- A: #160 — [Issue #160](https://github.com/phoenixvc/retort/issues/160) +- B: #161 — [Issue #161](https://github.com/phoenixvc/retort/issues/161) +- C: #162 — [Issue #162](https://github.com/phoenixvc/retort/issues/162) +- D: #163 — [Issue #163](https://github.com/phoenixvc/retort/issues/163) +- E: #164 — [Issue #164](https://github.com/phoenixvc/retort/issues/164) +- F: #165 — [Issue #165](https://github.com/phoenixvc/retort/issues/165) +- G: #166 — [Issue #166](https://github.com/phoenixvc/retort/issues/166) ## Branch governance rollout (new) -- Tracker: #167 — [Issue #167](https://github.com/phoenixvc/agentkit-forge/issues/167) -- Policy: #168 — [Issue #168](https://github.com/phoenixvc/agentkit-forge/issues/168) -- Infrastructure: #169 — [Issue #169](https://github.com/phoenixvc/agentkit-forge/issues/169) -- Immediate guardrail: #170 — [Issue #170](https://github.com/phoenixvc/agentkit-forge/issues/170) +- Tracker: #167 — [Issue #167](https://github.com/phoenixvc/retort/issues/167) +- Policy: #168 — [Issue #168](https://github.com/phoenixvc/retort/issues/168) +- Infrastructure: #169 — [Issue #169](https://github.com/phoenixvc/retort/issues/169) +- Immediate guardrail: #170 — [Issue #170](https://github.com/phoenixvc/retort/issues/170) ## Dependency map @@ -53,7 +53,7 @@ Each child issue must include and satisfy this closure gate before status moves ## Plan decisions (locked) -- Issue-first governance only in `agentkit-forge` for this phase. +- Issue-first governance only in `retort` for this phase. - One dedicated milestone for coordinated execution. - Full render-target matrix is in scope. - FinOps scope includes rule domain + Phase 1 spec doc + skill note. diff --git a/infra/README.md b/infra/README.md index bcb82b5d..9f2b12e6 100644 --- a/infra/README.md +++ b/infra/README.md @@ -1,6 +1,12 @@ +<<<<<<< HEAD +# Infrastructure — retort + +This directory holds infrastructure and staging guidance for the Retort framework repository. +======= # Infrastructure — agentkit-forge This directory holds infrastructure and staging guidance for the AgentKit Forge framework repository. +>>>>>>> origin/main ## Staging and local validation @@ -8,7 +14,11 @@ This repo is **framework-only**: it does not deploy a runnable application. Ther - **Local:** Run `pnpm install` and `pnpm -C .agentkit agentkit:sync` (and optionally `pnpm -C .agentkit agentkit:validate`) from the repo root. - **Staging-like:** Use the root `docker-compose.yml` to run sync in a container: `docker compose --profile sync run --rm agentkit-sync`. +<<<<<<< HEAD +- **Adopters:** Projects that use Retort should define their own staging (e.g. in their `infra/`, Terraform, or Docker Compose) and deploy their application there. +======= - **Adopters:** Projects that use AgentKit Forge should define their own staging (e.g. in their `infra/`, Terraform, or Docker Compose) and deploy their application there. +>>>>>>> origin/main ## Naming and IaC diff --git a/migrations/README.md b/migrations/README.md index 2b0b3678..4a3d5868 100644 --- a/migrations/README.md +++ b/migrations/README.md @@ -1,6 +1,12 @@ +<<<<<<< HEAD +# Migrations — retort + +This repository (**retort**) is the framework and has **no database or migrations**. This directory is a placeholder for adopters. +======= # Migrations — agentkit-forge This repository (**agentkit-forge**) is the framework and has **no database or migrations**. This directory is a placeholder for adopters. +>>>>>>> origin/main ## For adopters diff --git a/package-lock.json b/package-lock.json index a38b2945..24372cf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,10 +1,10 @@ { - "name": "agentkit-forge-root", + "name": "retort-root", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "agentkit-forge-root", + "name": "retort-root", "dependencies": { "js-yaml": "^4.1.1" } diff --git a/pnpm-setup.sh b/pnpm-setup.sh index 2c5d0130..1d30cf72 100644 --- a/pnpm-setup.sh +++ b/pnpm-setup.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -euo pipefail -# Shortcut script for AgentKit Forge setup +# Shortcut script for Retort setup # Install dependencies pnpm -C .agentkit install diff --git a/renovate.json b/renovate.json index 89757635..b7fd86d5 100644 --- a/renovate.json +++ b/renovate.json @@ -33,7 +33,7 @@ "labels": ["dependencies", "breaking-change"] }, { - "description": "AgentKit engine dependencies — require maintainer review", + "description": "Retort engine dependencies — require maintainer review", "matchFileNames": [".agentkit/package.json"], "labels": ["dependencies", "forge-source-change"], "automerge": false diff --git a/scripts/analyze-agents.ps1 b/scripts/analyze-agents.ps1 index 924a38b0..5b34fe8a 100644 --- a/scripts/analyze-agents.ps1 +++ b/scripts/analyze-agents.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync <# agentkit: scaffold: managed #> # scripts/analyze-agents.ps1 diff --git a/scripts/analyze-agents.sh b/scripts/analyze-agents.sh index fd5324d6..6ba0e5e6 100755 --- a/scripts/analyze-agents.sh +++ b/scripts/analyze-agents.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # scripts/analyze-agents.sh # Generates agent/team relationship matrices from spec files. diff --git a/scripts/check-documentation-requirement.sh b/scripts/check-documentation-requirement.sh index 944d7501..98d752c2 100755 --- a/scripts/check-documentation-requirement.sh +++ b/scripts/check-documentation-requirement.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # scripts/check-documentation-requirement.sh # Analyzes staged or changed files to determine whether PR documentation is required. diff --git a/scripts/consolidate-branches.ps1 b/scripts/consolidate-branches.ps1 index befb78ba..3cdda437 100644 --- a/scripts/consolidate-branches.ps1 +++ b/scripts/consolidate-branches.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync <# agentkit: scaffold: managed #> # ============================================================================= diff --git a/scripts/consolidate-branches.sh b/scripts/consolidate-branches.sh index 9aa9b746..2444a67b 100755 --- a/scripts/consolidate-branches.sh +++ b/scripts/consolidate-branches.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # ============================================================================= # consolidate-branches.sh — Merge all unmerged feature branches into one diff --git a/scripts/create-doc.ps1 b/scripts/create-doc.ps1 index 3b50b5d1..6e6c06ee 100644 --- a/scripts/create-doc.ps1 +++ b/scripts/create-doc.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync <# agentkit: scaffold: managed #> # scripts/create-doc.ps1 diff --git a/scripts/create-doc.sh b/scripts/create-doc.sh index 318e7fe7..e3765290 100755 --- a/scripts/create-doc.sh +++ b/scripts/create-doc.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # scripts/create-doc.sh # Creates a new history document from the appropriate template. diff --git a/scripts/resolve-merge.ps1 b/scripts/resolve-merge.ps1 index 9baee2b1..2d147f32 100644 --- a/scripts/resolve-merge.ps1 +++ b/scripts/resolve-merge.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync <# agentkit: scaffold: managed #> # ============================================================================= diff --git a/scripts/resolve-merge.sh b/scripts/resolve-merge.sh index a3daecff..0435d607 100755 --- a/scripts/resolve-merge.sh +++ b/scripts/resolve-merge.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # ============================================================================= # resolve-merge.sh — Apply standard merge conflict resolutions @@ -8,7 +8,7 @@ # Usage: scripts/resolve-merge.sh [target-branch] # # Merges origin/<target-branch> into the current branch and auto-resolves -# generated/framework-managed files per the AgentKit merge resolution matrix. +# generated/framework-managed files per the Retort merge resolution matrix. # Remaining conflicts (engine source, spec files) are listed for manual review. # ============================================================================= set -euo pipefail diff --git a/scripts/setup-agentkit-branch-governance.ps1 b/scripts/setup-agentkit-branch-governance.ps1 index 98e21a26..cd2e727b 100644 --- a/scripts/setup-agentkit-branch-governance.ps1 +++ b/scripts/setup-agentkit-branch-governance.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync <# agentkit: scaffold: managed #> [CmdletBinding()] diff --git a/scripts/setup-agentkit-branch-governance.sh b/scripts/setup-agentkit-branch-governance.sh index f955e11b..350ef362 100755 --- a/scripts/setup-agentkit-branch-governance.sh +++ b/scripts/setup-agentkit-branch-governance.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync set -euo pipefail @@ -61,7 +61,7 @@ if [[ -z "$REPO" ]]; then exit 1 fi -echo "=== AgentKit Branch Governance Setup ===" +echo "=== Retort Branch Governance Setup ===" echo "Repository: $REPO" echo "DryRun: $DRY_RUN" echo diff --git a/scripts/sync-issues.sh b/scripts/sync-issues.sh index 9ace772a..25effcb2 100755 --- a/scripts/sync-issues.sh +++ b/scripts/sync-issues.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # scripts/sync-issues.sh # Syncs local issue docs (docs/history/issues/) to GitHub Issues. diff --git a/scripts/sync-split-pr.ps1 b/scripts/sync-split-pr.ps1 index 68a9b32b..871ca5f0 100644 --- a/scripts/sync-split-pr.ps1 +++ b/scripts/sync-split-pr.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync <# agentkit: scaffold: managed #> [CmdletBinding()] diff --git a/scripts/sync-split-pr.sh b/scripts/sync-split-pr.sh index 1bbf61ac..69d5a06a 100755 --- a/scripts/sync-split-pr.sh +++ b/scripts/sync-split-pr.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync set -euo pipefail diff --git a/scripts/update-changelog.ps1 b/scripts/update-changelog.ps1 index 5c9c9e15..f64bdb0d 100644 --- a/scripts/update-changelog.ps1 +++ b/scripts/update-changelog.ps1 @@ -1,5 +1,5 @@ -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync <# agentkit: scaffold: managed #> # scripts/update-changelog.ps1 diff --git a/scripts/update-changelog.sh b/scripts/update-changelog.sh index e5693e00..16244613 100755 --- a/scripts/update-changelog.sh +++ b/scripts/update-changelog.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # scripts/update-changelog.sh # Inserts an entry into the [Unreleased] section of CHANGELOG.md. diff --git a/scripts/validate-documentation.sh b/scripts/validate-documentation.sh index e5a60220..0d8797ab 100755 --- a/scripts/validate-documentation.sh +++ b/scripts/validate-documentation.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # scripts/validate-documentation.sh # Validates that history documents meet structural requirements. diff --git a/scripts/validate-numbering.sh b/scripts/validate-numbering.sh index 00c2a506..7e31bf84 100755 --- a/scripts/validate-numbering.sh +++ b/scripts/validate-numbering.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# GENERATED by AgentKit Forge v3.1.0 — DO NOT EDIT -# Source: .agentkit/spec + .agentkit/overlays/agentkit-forge +# GENERATED by Retort v3.1.0 — DO NOT EDIT +# Source: .agentkit/spec + .agentkit/overlays/retort # Regenerate: pnpm -C .agentkit agentkit:sync # scripts/validate-numbering.sh # Validates the sequential numbering of history documents against .index.json. diff --git a/src/start/index.js b/src/start/index.js index 60d33785..af84d0e2 100755 --- a/src/start/index.js +++ b/src/start/index.js @@ -1,7 +1,7 @@ #!/usr/bin/env node /** - * ak-start — interactive entry point for AgentKit Forge. + * ak-start — interactive entry point for Retort. * * Replaces the static markdown output of `/start` with a terminal UI * that combines two modes: @@ -27,7 +27,7 @@ const args = process.argv.slice(2); if (args.includes('--help') || args.includes('-h')) { process.stdout.write( [ - 'ak-start — interactive entry point for AgentKit Forge', + 'ak-start — interactive entry point for Retort', '', 'Usage:', ' ak-start Interactive TUI (requires a terminal)',