From 2fa068842562bcd6c1b2865b470225b37175c247 Mon Sep 17 00:00:00 2001 From: Frantz Priou Date: Wed, 2 Sep 2026 13:43:45 +0200 Subject: [PATCH] feat(cli): add Kilo Code support --- .github/workflows/ci.yml | 5 +- README.md | 13 +- cli/README.md | 13 +- cli/assets/configs/kilo/kilo.json | 4 + cli/package.json | 1 + cli/src/application/commands/ai.ts | 2 +- cli/src/application/commands/framework.ts | 5 +- .../framework/strategies/tool-contracts.ts | 75 ++++ .../install-runtime-config-use-case.ts | 24 +- .../built-tree-materialization-translator.ts | 88 ++++- cli/src/domain/errors.ts | 7 + .../domain/formats/opencode-marketplace.ts | 58 +++- cli/src/domain/models/framework-build.ts | 3 +- cli/src/domain/models/normalized-plugin.ts | 2 +- cli/src/domain/models/plugin-format.ts | 3 +- cli/src/domain/models/tool-ids.ts | 3 +- cli/src/domain/tools/ai/kilo.ts | 120 +++++++ cli/src/domain/tools/ai/opencode.ts | 11 +- .../plugin-catalog-repository-adapter.ts | 11 +- cli/src/infrastructure/assets/asset-loader.ts | 2 + cli/src/infrastructure/deps.ts | 17 + ...stall-runtime-config-use-case.unit.test.ts | 18 + ...encode-materialization.integration.test.ts | 65 +++- .../formats/opencode-marketplace.unit.test.ts | 19 +- .../domain/models/tool-config.unit.test.ts | 21 +- cli/tests/domain/models/tool-ids.unit.test.ts | 1 + cli/tests/domain/tools/ai/kilo.unit.test.ts | 61 ++++ .../domain/tools/ai/opencode.unit.test.ts | 21 ++ .../tools/registry-conformance.unit.test.ts | 1 + .../golden/framework-build-golden.e2e.test.ts | 12 +- .../snapshots/framework-build/golden.json | 327 ++++++++++++++---- cli/tests/helpers/ports/build-unit-deps.ts | 1 + .../assets/asset-loader.unit.test.ts | 8 + .../framework-build-registry.unit.test.ts | 1 + docs/FAQ.md | 4 +- docs/MAINTAINERS.md | 2 +- 36 files changed, 896 insertions(+), 133 deletions(-) create mode 100644 cli/assets/configs/kilo/kilo.json create mode 100644 cli/src/domain/tools/ai/kilo.ts create mode 100644 cli/tests/domain/tools/ai/kilo.unit.test.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd90271c3..b0ef25452 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -145,8 +145,8 @@ jobs: runs-on: ubuntu-latest strategy: fail-fast: false - # 9-cell matrix: 4 marketplace (claude/cursor/copilot/codex) + 5 flat - # (+opencode, which is flat-only). Mirrors the CLI golden snapshot matrix. + # 10-cell matrix: 4 marketplace (claude/cursor/copilot/codex) + 6 flat + # (+opencode and kilo, which are flat-only). Mirrors the CLI golden snapshot matrix. matrix: include: - { tool: claude, mode: marketplace, flag: "" } @@ -158,6 +158,7 @@ jobs: - { tool: copilot, mode: flat, flag: "--flat" } - { tool: codex, mode: flat, flag: "--flat" } - { tool: opencode, mode: flat, flag: "--flat" } + - { tool: kilo, mode: flat, flag: "--flat" } steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 diff --git a/README.md b/README.md index b286b4623..4c3111741 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Why not just write your own commands? → [FAQ](docs/FAQ.md#-why-aidd-instead-of ## ✅ Prerequisites -- **An AI coding tool** — Claude Code (native), or Cursor / Copilot / Codex / OpenCode (see [Compatibility](#-compatibility)). +- **An AI coding tool** — Claude Code (native), or Cursor / Copilot / Codex / OpenCode / Kilo Code (see [Compatibility](#-compatibility)). - **[Node](https://nodejs.org)** on your `PATH` — for the plugin that ships hooks ([what they do](docs/ARCHITECTURE.md#-bundled-hooks)). ## 🔌 Compatibility @@ -49,6 +49,7 @@ Why not just write your own commands? → [FAQ](docs/FAQ.md#-why-aidd-instead-of | **GitHub Copilot** | ✅ Supported | Marketplace · Flat | | **Codex** | ✅ Supported | Marketplace · Flat | | **OpenCode** | ✅ Supported | Flat | +| **Kilo Code** | ✅ Supported | Flat | | **Gemini · Mistral** | 🚧 In progress | — | **Marketplace** = installed and updated through your tool's plugin manager. **Flat** = files copied directly into your project, no plugin manager involved. Install steps per tool → [Other tools](#other-tools). @@ -176,6 +177,16 @@ codex plugin add aidd-context@aidd-framework # per plugin +
+Kilo Code — Flat only + +1. Unzip the `kilo-flat` archive, then copy its contents into your project root → `.kilo/` and `kilo.json`. +2. Start a new Kilo session, or run `/reload` in an existing session. + +[Docs](https://kilo.ai/docs/customize/skills) + +
+ ## 🚀 Quick start Three ways in — pick one: diff --git a/cli/README.md b/cli/README.md index b6b221937..aa199e096 100644 --- a/cli/README.md +++ b/cli/README.md @@ -2,7 +2,7 @@ The **AIDD CLI** (`@ai-driven-dev/cli`) installs AI tool runtime configs, IDE integrations, and plugins from the [AIDD marketplace](https://github.com/ai-driven-dev/framework) across AI coding assistants. Runtime configs are bundled in the CLI binary; memory and context files are provided by the `aidd-context` plugin, not the binary. Plugins are fetched from the marketplace on demand. Every installed file is hash-tracked in a manifest for drift detection. -**Supported tools:** Claude Code · Cursor · GitHub Copilot · OpenCode · Codex · VS Code (IDE integration) +**Supported tools:** Claude Code · Cursor · GitHub Copilot · OpenCode · Kilo Code · Codex · VS Code (IDE integration) --- @@ -405,6 +405,7 @@ Marketplace registration and plugin enable state are written to per-tool setting | GitHub Copilot | `.github/copilot/settings.json` | | Codex | `.codex/config.json` | | OpenCode | `opencode.json` (project root) | +| Kilo Code | `kilo.json` (project root) | > **GitHub Copilot — workspace recommendations only.** Per [VS Code docs](https://code.visualstudio.com/docs/copilot/customization/agent-plugins), `.github/copilot/settings.json` registers marketplaces as **team recommendations**, not auto-activated. On first chat in the workspace VS Code shows a notification — the user must accept it (or filter Extensions by `@agentPlugins @recommended` and enable manually) before plugins load. To skip the per-project click, add the marketplace to the user-level setting `chat.plugins.marketplaces` (application-scoped, not writable from workspace). See [End-to-end: distribute a framework to Copilot](#end-to-end-distribute-a-framework-to-copilot-marketplace) for the full flow. @@ -423,7 +424,7 @@ aidd framework build \ | Flag | Required | Description | |---|---|---| | `--source` | yes | Path to a framework root with `plugins//.claude-plugin/plugin.json` entries | -| `--target` | yes | `claude`, `cursor`, `copilot`, `codex`, or `opencode` | +| `--target` | yes | `claude`, `cursor`, `copilot`, `codex`, `opencode`, or `kilo` | | `--out` | yes | Output directory. Marketplace mode: dist root (auto-wiped + recreated). Flat mode: the project root to materialize into | | `--flat` | no | Materialize directly into a project workspace, bypassing the marketplace layer | | `--force` | no | Overwrite existing files at canonical paths. **Flat mode only** (rejected without `--flat`) | @@ -435,7 +436,7 @@ aidd framework build \ #### Per-tool / per-mode matrix -`opencode` is **flat-only** (no native marketplace). The other four support both modes. +`opencode` and `kilo` are **flat-only** (no native marketplace). The other four support both modes. | Target | Marketplace layout (`/`) | Plugin-root token | Flat layout (`/`) | |---|---|---|---| @@ -444,6 +445,7 @@ aidd framework build \ | `copilot` | `.plugin/marketplace.json` · `plugins//.plugin/plugin.json` (OpenPlugin spec) · `agents/*.md` | `${PLUGIN_ROOT}` | `.github/` (+ `.vscode/`) | | `codex` | `.claude-plugin/marketplace.json` · `plugins//.codex-plugin/plugin.json` · `codex-agents/*.toml` | `${PLUGIN_ROOT}` | `.codex/` | | `opencode` | — (flat-only) | — | `.opencode/` (+ `opencode.json` for MCP) | +| `kilo` | — (flat-only) | — | `.kilo/` (+ `kilo.json` for MCP) | Copilot uses the [OpenPlugin spec](https://github.com/vercel/open-plugin-spec) (`.plugin/plugin.json`, `${PLUGIN_ROOT}`) — the only layout where Copilot's editor + CLI resolve the plugin-root token at runtime. Codex requires the manifest `skills` field as a **string** (`"./skills"`), and project subagents (`.codex/agents/*.toml`) load only when the project is **trusted**. @@ -476,7 +478,7 @@ To skip the per-project notification, add the dist path to the user-level `chat. The CLI cannot write this setting programmatically (VS Code enforces application scope on it). -#### Flat materialization (e.g. opencode) +#### Flat materialization (e.g. OpenCode or Kilo Code) ```bash # Materialize the framework straight into a project workspace @@ -487,6 +489,8 @@ aidd framework build --source ./framework --target opencode --out ./my-project - Flat mode writes directly under the project's tool directory — no `aidd marketplace add` / `aidd plugin install` step. opencode hooks are skipped (its runtime is JS modules, not declarative `hooks.json`). +For Kilo Code, replace `opencode` with `kilo`; the build writes `.kilo/` and `kilo.json`. + #### Build every target for a release ```bash @@ -494,6 +498,7 @@ for t in claude cursor copilot codex; do aidd framework build --source ./framework --target "$t" --out "./dist/aidd-framework-$t" done aidd framework build --source ./framework --target opencode --out ./dist/aidd-framework-opencode-flat --flat +aidd framework build --source ./framework --target kilo --out ./dist/aidd-framework-kilo-flat --flat ``` ### Manifest schema upgrades diff --git a/cli/assets/configs/kilo/kilo.json b/cli/assets/configs/kilo/kilo.json new file mode 100644 index 000000000..9f2bb73a0 --- /dev/null +++ b/cli/assets/configs/kilo/kilo.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://app.kilo.ai/config.json", + "instructions": [".kilo/rules/**/*.md"] +} diff --git a/cli/package.json b/cli/package.json index 579d5d9ec..fc88ec520 100644 --- a/cli/package.json +++ b/cli/package.json @@ -11,6 +11,7 @@ "github-copilot", "codex", "opencode", + "kilo-code", "developer-tools", "ai-coding-assistant" ], diff --git a/cli/src/application/commands/ai.ts b/cli/src/application/commands/ai.ts index bc29bb513..66a64ce95 100644 --- a/cli/src/application/commands/ai.ts +++ b/cli/src/application/commands/ai.ts @@ -19,7 +19,7 @@ function assertAiToolId(toolId: string): asserts toolId is AiToolId { export function registerAiCommand(program: Command): void { const ai = program .command("ai") - .description("Manage AI tools (claude, cursor, copilot, codex, opencode)"); + .description("Manage AI tools (claude, cursor, copilot, codex, opencode, kilo)"); ai.action(async () => { if (!process.stdout.isTTY) { diff --git a/cli/src/application/commands/framework.ts b/cli/src/application/commands/framework.ts index 9c0eba7a0..41bea54c0 100644 --- a/cli/src/application/commands/framework.ts +++ b/cli/src/application/commands/framework.ts @@ -20,7 +20,10 @@ export function registerFrameworkCommand(program: Command): void { "Build a Claude-format framework into a target-native plugin marketplace tree or project workspace" ) .requiredOption("--source ", "Path to the source framework directory") - .requiredOption("--target ", "Build target (claude, cursor, copilot, codex, opencode)") + .requiredOption( + "--target ", + "Build target (claude, cursor, copilot, codex, opencode, kilo)" + ) .requiredOption("--out ", "Output directory (marketplace dist or project root)") .option("--flat", "Materialize directly into project workspace, bypass marketplace") .option("--force", "Overwrite existing files at canonical paths (flat mode only)") diff --git a/cli/src/application/use-cases/framework/strategies/tool-contracts.ts b/cli/src/application/use-cases/framework/strategies/tool-contracts.ts index dfbc49ddf..ca7a86587 100644 --- a/cli/src/application/use-cases/framework/strategies/tool-contracts.ts +++ b/cli/src/application/use-cases/framework/strategies/tool-contracts.ts @@ -818,3 +818,78 @@ export function buildOpencodeFlatContract(): ToolBuildContract { }, }; } + +// ── Kilo flat contract ──────────────────────────────────────────────────────── + +function kiloFlatAgentPath(plugin: string, rel: string): string { + return genericFlatAgentPath(".kilo/agents/", plugin, rel.replace(/^agents\//, ""), ".md"); +} + +function kiloFlatSkillPath(plugin: string, rel: string): string { + return genericFlatSkillPath(".kilo/skills/", plugin, rel.replace(/^skills\//, "")); +} + +function kiloFlatResolveTarget(plugin: string, rel: string): string { + if (rel.startsWith("agents/")) return kiloFlatAgentPath(plugin, rel); + if (rel.startsWith("skills/")) return kiloFlatSkillPath(plugin, rel); + return rel; +} + +function transformKiloFlatAgent(content: string, plugin: string, outName: string): string { + const { frontmatter, body } = parseFrontmatter(content); + const flatRelPath = kiloFlatAgentPath(plugin, `agents/${outName}`); + const rewrittenBody = rewriteRelativeLinks(body, { + currentFilePluginRelative: flatRelPath, + resolveTargetPath: (rel) => kiloFlatResolveTarget(plugin, rel), + }); + const prefixedName = `${plugin}-${outName.replace(/\.md$/, "")}`; + return serializeFrontmatter( + { ...frontmatter, name: prefixedName, mode: "subagent" }, + rewrittenBody + ); +} + +async function resolveKiloJsonPath(outDir: string, fs: FsType): Promise { + const jsoncExists = await fs.fileExists(`${outDir}/kilo.jsonc`); + if (jsoncExists) return `${outDir}/kilo.jsonc`; + return `${outDir}/kilo.json`; +} + +export function buildKiloFlatContract(): ToolBuildContract { + return { + manifestDir: null, + marketplaceRelative: null, + manifestFileRelative: null, + synthesizeManifest: null, + manifestSchemaName: null, + artifacts: { + skills: { + supported: true, + source: { kind: "fullTree", srcDir: "skills" }, + path: kiloFlatSkillPath, + rewriteSkillName: true, + }, + agents: { + supported: true, + source: { kind: "filteredTree", srcDir: "agents", inputExt: ".md" }, + path: kiloFlatAgentPath, + transform: transformKiloFlatAgent, + }, + mcp: { supported: false }, + hooks: { supported: false }, + rules: { supported: false }, + commands: { supported: false }, + }, + buildMarketplaceCatalog: null, + buildMarketplaceEntry: null, + emitConfigArtifact: async (builtPlugins, outDir, sourceDir, fs, _validator, assetProvider) => { + const configPath = await resolveKiloJsonPath(outDir, fs); + const existing = (await fs.fileExists(configPath)) ? await fs.readFile(configPath) : null; + const incoming = await collectOpencodeMcp(builtPlugins, sourceDir, fs); + const baseAsset = assetProvider.loadConfigAsset("kilo", "kilo.json"); + const base = typeof baseAsset === "string" ? baseAsset : JSON.stringify(baseAsset); + await fs.writeFile(configPath, buildOpencodeFlatConfig(base, existing, incoming)); + return 1; + }, + }; +} diff --git a/cli/src/application/use-cases/install/install-runtime-config-use-case.ts b/cli/src/application/use-cases/install/install-runtime-config-use-case.ts index a4739db15..4b5f15328 100644 --- a/cli/src/application/use-cases/install/install-runtime-config-use-case.ts +++ b/cli/src/application/use-cases/install/install-runtime-config-use-case.ts @@ -1,5 +1,6 @@ import { join } from "node:path"; import { SettingsCapability } from "../../../domain/capabilities/settings-capability.js"; +import { KiloDualConfigError } from "../../../domain/errors.js"; import { InstallationFile } from "../../../domain/models/file.js"; import type { Manifest } from "../../../domain/models/manifest.js"; import { extractMergeEntries, type MergeFileEntry } from "../../../domain/models/merge.js"; @@ -77,7 +78,13 @@ export class InstallRuntimeConfigUseCase { const toolConfig = getToolConfig(options.toolId); if (!isAiTool(toolConfig) || !toolConfig.configOutputPaths) return []; const files: InstallationFile[] = []; - for (const [fileName, outputPath] of Object.entries(toolConfig.configOutputPaths)) { + for (const [fileName, configuredOutputPath] of Object.entries(toolConfig.configOutputPaths)) { + const outputPath = await this.resolveConfigOutputPath( + options.toolId, + fileName, + configuredOutputPath, + options.projectRoot + ); const asset = this.assets.loadConfigAsset(options.toolId, fileName); const content = typeof asset === "string" ? asset : JSON.stringify(asset, null, 2); if (await this.isUserOwned(outputPath, options)) continue; @@ -88,6 +95,21 @@ export class InstallRuntimeConfigUseCase { return files; } + private async resolveConfigOutputPath( + toolId: AiToolId, + fileName: string, + configuredOutputPath: string, + projectRoot: string + ): Promise { + if (toolId !== "kilo" || fileName !== "kilo.json") return configuredOutputPath; + const jsonPath = join(projectRoot, "kilo.json"); + const jsoncPath = join(projectRoot, "kilo.jsonc"); + const jsonExists = await this.fs.fileExists(jsonPath); + const jsoncExists = await this.fs.fileExists(jsoncPath); + if (jsonExists && jsoncExists) throw new KiloDualConfigError(); + return jsoncExists ? "kilo.jsonc" : configuredOutputPath; + } + private buildStaticSettingsFiles(options: InstallRuntimeConfigOptions): InstallationFile[] { const toolConfig = getToolConfig(options.toolId); if (!isAiTool(toolConfig)) return []; diff --git a/cli/src/application/use-cases/plugin/translator/built-tree-materialization-translator.ts b/cli/src/application/use-cases/plugin/translator/built-tree-materialization-translator.ts index 0c4fadfad..f30339c56 100644 --- a/cli/src/application/use-cases/plugin/translator/built-tree-materialization-translator.ts +++ b/cli/src/application/use-cases/plugin/translator/built-tree-materialization-translator.ts @@ -1,17 +1,27 @@ import { join } from "node:path"; +import type { McpCapability } from "../../../../domain/capabilities/mcp-capability.js"; +import { mergeOpencodeMcp } from "../../../../domain/formats/opencode-mcp-merge.js"; import { InstallationFile } from "../../../../domain/models/file.js"; import type { Manifest } from "../../../../domain/models/manifest.js"; import { Plugin } from "../../../../domain/models/plugin.js"; import type { PluginDistribution } from "../../../../domain/models/plugin-distribution.js"; import type { PluginSource } from "../../../../domain/models/plugin-source.js"; -import type { ReadonlySkipList } from "../../../../domain/models/plugin-translation-skip.js"; +import type { + PluginTranslationSkip, + ReadonlySkipList, +} from "../../../../domain/models/plugin-translation-skip.js"; import type { AiToolId } from "../../../../domain/models/tool-ids.js"; import type { FileReader } from "../../../../domain/ports/file-reader.js"; import type { FileWriter } from "../../../../domain/ports/file-writer.js"; import type { Hasher } from "../../../../domain/ports/hasher.js"; import type { MarketplaceRegistry } from "../../../../domain/ports/marketplace-registry.js"; +import { getToolConfig, isAiTool } from "../../../../domain/tools/registry.js"; import type { EnsureBuiltMarketplaceUseCase } from "../../shared/ensure-built-marketplace-use-case.js"; -import { isPluginFileAtDesiredState, resolvePluginBaseDir } from "../plugin-helpers.js"; +import { + isPluginFileAtDesiredState, + qualifiesForOpencodeMcpMerge, + resolvePluginBaseDir, +} from "../plugin-helpers.js"; import { ModeBFlatMaterializationTranslator } from "./mode-b-flat-materialization-translator.js"; import type { PluginTranslator } from "./plugin-translator.js"; @@ -59,7 +69,7 @@ export class BuiltTreeMaterializationTranslator implements PluginTranslator { previousMcpEntries ); } - const mode = toolId === "opencode" ? "flat" : "marketplace"; + const mode = toolId === "opencode" || toolId === "kilo" ? "flat" : "marketplace"; const { builtDir } = await this.ensureBuilt.execute({ projectRoot, marketplace: resolved, @@ -68,7 +78,7 @@ export class BuiltTreeMaterializationTranslator implements PluginTranslator { }); const files = mode === "flat" - ? await this.readFlatFiles(builtDir, dist.manifest.name) + ? await this.readFlatFiles(builtDir, dist.manifest.name, toolId) : await this.readBuiltFiles( join(builtDir, "plugins", dist.manifest.name), dist.manifest.name @@ -76,11 +86,17 @@ export class BuiltTreeMaterializationTranslator implements PluginTranslator { const baseDir = mode === "flat" ? projectRoot : resolvePluginBaseDir(toolId, projectRoot, this.homedir); const written = await this.writeChangedFiles(files, baseDir); + const { entries: mcpEntries, skipped: mcpSkipped } = await this.mergeFlatMcp( + dist, + toolId, + projectRoot, + previousMcpEntries + ); manifest.addPlugin( toolId, - Plugin.fromDistribution(dist, source, files, new Map(), marketplace) + Plugin.fromDistributionWithMcp(dist, source, files, mcpEntries, new Map(), marketplace) ); - return { skipped: [], written }; + return { skipped: mcpSkipped, written }; } // Verbatim-copies the built subtree, but skips files already matching the built @@ -117,12 +133,16 @@ export class BuiltTreeMaterializationTranslator implements PluginTranslator { // Flat build emits the whole marketplace into one workspace, namespaced by // .opencode/
/-/...; install copies only this plugin's files. - private async readFlatFiles(builtDir: string, name: string): Promise { + private async readFlatFiles( + builtDir: string, + name: string, + toolId: AiToolId + ): Promise { const absPaths = await this.fs.listFilesRecursive(builtDir); const files: InstallationFile[] = []; for (const abs of absPaths) { const rel = abs.slice(builtDir.length + 1); - if (!this.belongsToPlugin(rel, name)) continue; + if (!this.belongsToPlugin(rel, name, toolId)) continue; const content = await this.fs.readFile(abs); files.push( new InstallationFile({ relativePath: rel, content, hash: this.hasher.hash(content) }) @@ -131,11 +151,57 @@ export class BuiltTreeMaterializationTranslator implements PluginTranslator { return files; } - private belongsToPlugin(rel: string, name: string): boolean { + private belongsToPlugin(rel: string, name: string, toolId: AiToolId): boolean { const segments = rel.split("/"); - return ( - segments[0] === ".opencode" && segments.length >= 3 && segments[2].startsWith(`${name}-`) + const root = toolId === "kilo" ? ".kilo" : ".opencode"; + return segments[0] === root && segments.length >= 3 && segments[2].startsWith(`${name}-`); + } + + private async mergeFlatMcp( + dist: PluginDistribution, + toolId: AiToolId, + projectRoot: string, + previousEntries: ReadonlyMap + ): Promise<{ entries: ReadonlyMap; skipped: ReadonlySkipList }> { + const toolConfig = getToolConfig(toolId); + if (!isAiTool(toolConfig) || dist.components.mcp.length === 0) { + return { entries: new Map(), skipped: [] }; + } + const caps = toolConfig.capabilities as Record; + if (!qualifiesForOpencodeMcpMerge(caps)) return { entries: new Map(), skipped: [] }; + const mcpCap = caps.mcp as McpCapability; + const outputPath = join(projectRoot, await mcpCap.resolveOutput(projectRoot, this.fs)); + const existing = await this.readExistingJson(outputPath); + const transformed = mcpCap.transform(dist.components.mcp[0].content); + const { mergedContent, contributedEntries, collisions } = mergeOpencodeMcp( + existing, + transformed, + previousEntries, + this.hasher ); + if (contributedEntries.size > 0 || previousEntries.size > 0) { + await this.fs.writeFile(outputPath, mergedContent); + } + return { + entries: contributedEntries, + skipped: collisions.map( + (reason): PluginTranslationSkip => ({ + pluginName: dist.manifest.name, + component: "mcp", + toolId, + reason, + }) + ), + }; + } + + private async readExistingJson(path: string): Promise { + try { + return await this.fs.readFile(path); + } catch (err) { + if ((err as NodeJS.ErrnoException).code === "ENOENT") return null; + throw err; + } } private async findMarketplace(name: string, projectRoot: string) { diff --git a/cli/src/domain/errors.ts b/cli/src/domain/errors.ts index d84c9ffda..6c7b0d384 100644 --- a/cli/src/domain/errors.ts +++ b/cli/src/domain/errors.ts @@ -137,6 +137,13 @@ export class OpencodeDualConfigError extends Error { } } +export class KiloDualConfigError extends Error { + constructor() { + super("Both kilo.json and kilo.jsonc exist. Remove one."); + this.name = "KiloDualConfigError"; + } +} + export class PackageManagerDetectionError extends Error { constructor(commands: readonly string[]) { super(`Could not detect package manager. Run manually:\n ${commands.join("\n ")}`); diff --git a/cli/src/domain/formats/opencode-marketplace.ts b/cli/src/domain/formats/opencode-marketplace.ts index 2f3071f40..250315cab 100644 --- a/cli/src/domain/formats/opencode-marketplace.ts +++ b/cli/src/domain/formats/opencode-marketplace.ts @@ -20,59 +20,83 @@ */ import { ForeignSchemaValidationError } from "../errors.js"; -import type { NormalizedCatalog, NormalizedPlugin } from "../models/normalized-plugin.js"; +import type { + ForeignMarketplaceSource, + NormalizedCatalog, + NormalizedPlugin, +} from "../models/normalized-plugin.js"; const SOURCE = "opencode"; export function parseOpencodeMarketplace(rawJson: string): NormalizedCatalog { - const parsed = parseJson(rawJson); - const plugins = extractPlugins(parsed); - return { source: SOURCE, plugins }; + return parseCompatibleMarketplace(rawJson, SOURCE, "opencode.json"); } -function parseJson(rawJson: string): unknown { +export function parseKiloMarketplace(rawJson: string): NormalizedCatalog { + return parseCompatibleMarketplace(rawJson, "kilo", "kilo.json"); +} + +function parseCompatibleMarketplace( + rawJson: string, + source: ForeignMarketplaceSource, + fileName: string +): NormalizedCatalog { + const parsed = parseJson(rawJson, source, fileName); + const plugins = extractPlugins(parsed, source, fileName); + return { source, plugins }; +} + +function parseJson(rawJson: string, source: ForeignMarketplaceSource, fileName: string): unknown { try { return JSON.parse(rawJson); } catch { - throw new ForeignSchemaValidationError(SOURCE, "opencode.json is not valid JSON"); + throw new ForeignSchemaValidationError(source, `${fileName} is not valid JSON`); } } -function extractPlugins(parsed: unknown): readonly NormalizedPlugin[] { +function extractPlugins( + parsed: unknown, + source: ForeignMarketplaceSource, + fileName: string +): readonly NormalizedPlugin[] { if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) { - throw new ForeignSchemaValidationError(SOURCE, "opencode.json must be a JSON object"); + throw new ForeignSchemaValidationError(source, `${fileName} must be a JSON object`); } const obj = parsed as Record; if (!("plugin" in obj) || obj.plugin === undefined) { return []; } if (!Array.isArray(obj.plugin)) { - throw new ForeignSchemaValidationError(SOURCE, '"plugin" must be an array'); + throw new ForeignSchemaValidationError(source, '"plugin" must be an array'); } - return obj.plugin.map((entry, i) => parseEntry(entry, i)); + return obj.plugin.map((entry, i) => parseEntry(entry, i, source)); } -function parseEntry(raw: unknown, index: number): NormalizedPlugin { - const spec = extractSpec(raw, index); +function parseEntry( + raw: unknown, + index: number, + source: ForeignMarketplaceSource +): NormalizedPlugin { + const spec = extractSpec(raw, index, source); if (typeof spec !== "string" || spec.length === 0) { throw new ForeignSchemaValidationError( - SOURCE, + source, `plugin[${index}] specifier must be a non-empty string` ); } - return { name: spec, source: SOURCE }; + return { name: spec, source }; } -function extractSpec(raw: unknown, index: number): unknown { +function extractSpec(raw: unknown, index: number, source: ForeignMarketplaceSource): unknown { if (typeof raw === "string") return raw; if (Array.isArray(raw)) { if (raw.length === 0) { - throw new ForeignSchemaValidationError(SOURCE, `plugin[${index}] tuple must not be empty`); + throw new ForeignSchemaValidationError(source, `plugin[${index}] tuple must not be empty`); } return raw[0]; } throw new ForeignSchemaValidationError( - SOURCE, + source, `plugin[${index}] must be a string or [string, options] tuple` ); } diff --git a/cli/src/domain/models/framework-build.ts b/cli/src/domain/models/framework-build.ts index 0d06ab2b0..85b4aa0d6 100644 --- a/cli/src/domain/models/framework-build.ts +++ b/cli/src/domain/models/framework-build.ts @@ -1,7 +1,7 @@ import { COPILOT_VSCODE_MCP_PATH, COPILOT_WORKSPACE_DIR } from "../tools/ai/copilot-paths.js"; /** Build target: supported tool identifiers for framework build. */ -export type FrameworkBuildTarget = "claude" | "cursor" | "copilot" | "codex" | "opencode"; +export type FrameworkBuildTarget = "claude" | "cursor" | "copilot" | "codex" | "opencode" | "kilo"; /** Output layout discriminant: marketplace dist (Mode A) vs direct workspace inject (Mode B flat). */ export type FrameworkBuildMode = "marketplace" | "flat"; @@ -26,6 +26,7 @@ export const FRAMEWORK_BUILD_TARGET_MODES: readonly FrameworkBuildTargetMode[] = { target: "codex", mode: "marketplace" }, { target: "codex", mode: "flat" }, { target: "opencode", mode: "flat" }, + { target: "kilo", mode: "flat" }, ]; /** Every target with at least one supported build mode, derived from FRAMEWORK_BUILD_TARGET_MODES. */ diff --git a/cli/src/domain/models/normalized-plugin.ts b/cli/src/domain/models/normalized-plugin.ts index 9149be11d..25ed6f875 100644 --- a/cli/src/domain/models/normalized-plugin.ts +++ b/cli/src/domain/models/normalized-plugin.ts @@ -12,7 +12,7 @@ * NOT versioned — internal type only, no schema versioning. */ -export type ForeignMarketplaceSource = "cursor" | "copilot" | "codex" | "opencode"; +export type ForeignMarketplaceSource = "cursor" | "copilot" | "codex" | "opencode" | "kilo"; export interface NormalizedPlugin { readonly name: string; diff --git a/cli/src/domain/models/plugin-format.ts b/cli/src/domain/models/plugin-format.ts index 77d8a569f..0b9cca9d4 100644 --- a/cli/src/domain/models/plugin-format.ts +++ b/cli/src/domain/models/plugin-format.ts @@ -1,4 +1,4 @@ -export type PluginFormat = "claude" | "cursor" | "codex" | "copilot" | "opencode"; +export type PluginFormat = "claude" | "cursor" | "codex" | "copilot" | "opencode" | "kilo"; export const PLUGIN_MANIFEST_PROBES: readonly { format: PluginFormat; relativePath: string }[] = [ { format: "claude", relativePath: ".claude-plugin/plugin.json" }, @@ -15,4 +15,5 @@ export const MARKETPLACE_PROBES: readonly { format: PluginFormat; relativePath: { format: "codex", relativePath: ".agents/plugins/marketplace.json" }, { format: "copilot", relativePath: ".github/plugin/plugin.json" }, { format: "opencode", relativePath: "opencode.json" }, + { format: "kilo", relativePath: "kilo.json" }, ]; diff --git a/cli/src/domain/models/tool-ids.ts b/cli/src/domain/models/tool-ids.ts index 050afa33c..555102fa8 100644 --- a/cli/src/domain/models/tool-ids.ts +++ b/cli/src/domain/models/tool-ids.ts @@ -1,6 +1,6 @@ import { UnknownAiToolIdError } from "../errors.js"; -export type AiToolId = "claude" | "cursor" | "copilot" | "opencode" | "codex"; +export type AiToolId = "claude" | "cursor" | "copilot" | "opencode" | "kilo" | "codex"; export type IdeToolId = "vscode"; export type ToolId = AiToolId | IdeToolId; export type ToolCategory = "ai" | "ide"; @@ -10,6 +10,7 @@ export const AI_TOOL_IDS: readonly AiToolId[] = [ "cursor", "copilot", "opencode", + "kilo", "codex", ]; export const IDE_TOOL_IDS: readonly IdeToolId[] = ["vscode"]; diff --git a/cli/src/domain/tools/ai/kilo.ts b/cli/src/domain/tools/ai/kilo.ts new file mode 100644 index 000000000..28eb96d4e --- /dev/null +++ b/cli/src/domain/tools/ai/kilo.ts @@ -0,0 +1,120 @@ +import { join } from "node:path"; +import { AgentsCapability } from "../../capabilities/agents-capability.js"; +import { CommandsCapability } from "../../capabilities/commands-capability.js"; +import { McpCapability } from "../../capabilities/mcp-capability.js"; +import { PluginsCapability } from "../../capabilities/plugins-capability.js"; +import { RulesCapability } from "../../capabilities/rules-capability.js"; +import { SkillsCapability } from "../../capabilities/skills-capability.js"; +import { KiloDualConfigError } from "../../errors.js"; +import { + buildAiddCommandFilePath, + convertCommandFrontmatterNoHint, + detectSectionKeyFromPrefixes, + reverseConvertCommandFrontmatterNoHint, + stripToolSuffix, +} from "../../formats/command.js"; +import { baseReverseRewriteContent, baseRewriteContent } from "../../formats/placeholders.js"; +import { CONFIG_MCP } from "../../models/framework.js"; +import type { + AiTool, + HasAgents, + HasCommands, + HasMcp, + HasPlugins, + HasRules, + HasSkills, + UserFileSectionKey, +} from "../contracts.js"; +import { registerTool } from "../registry.js"; +import { transformMcpToOpencode } from "./opencode.js"; + +const DIRECTORY = ".kilo/"; +const TOOL_SUFFIX = ".kilo.md"; + +export const kilo: AiTool = { + kind: "ai", + toolId: "kilo", + directory: DIRECTORY, + toolSuffix: TOOL_SUFFIX, + signalDir: ".kilo/commands", + configOutputPaths: { "kilo.json": "kilo.json" }, + + capabilities: { + agents: new AgentsCapability({ + directory: DIRECTORY, + toolSuffix: TOOL_SUFFIX, + format: "markdown", + convertFrontmatter: (fm) => ({ description: fm.description, mode: "subagent" }), + reverseConvertFrontmatter: (fm) => ({ description: fm.description }), + }), + skills: new SkillsCapability({ + directory: DIRECTORY, + toolSuffix: TOOL_SUFFIX, + buildInstallPath: (fileName) => + `${DIRECTORY}skills/${stripToolSuffix(TOOL_SUFFIX, fileName)}`, + convertFrontmatter: (fm) => fm, + reverseConvertFrontmatter: (fm) => fm, + }), + commands: new CommandsCapability({ + directory: DIRECTORY, + toolSuffix: TOOL_SUFFIX, + buildInstallPath: (fileName) => buildAiddCommandFilePath(DIRECTORY, fileName), + convertFrontmatter: (fm, relativeFileName) => + convertCommandFrontmatterNoHint(fm, relativeFileName), + reverseConvertFrontmatter: (fm) => reverseConvertCommandFrontmatterNoHint(fm), + }), + rules: new RulesCapability({ + directory: DIRECTORY, + toolSuffix: TOOL_SUFFIX, + buildInstallPath: (fileName) => `${DIRECTORY}rules/${stripToolSuffix(TOOL_SUFFIX, fileName)}`, + convertFrontmatter: (fm) => { + if (fm.alwaysApply === false && fm.description !== undefined) { + return { description: fm.description }; + } + return {}; + }, + reverseConvertFrontmatter: () => ({}), + }), + mcp: new McpCapability({ + outputPath: "kilo.json", + format: "json", + entrySection: "mcp", + mergeStrategy: "framework-prime", + transformContent: transformMcpToOpencode, + consumes: [CONFIG_MCP], + resolveOutputPath: async (projectRoot, fs) => { + const jsonExists = await fs.fileExists(join(projectRoot, "kilo.json")); + const jsoncExists = await fs.fileExists(join(projectRoot, "kilo.jsonc")); + if (jsonExists && jsoncExists) throw new KiloDualConfigError(); + if (jsoncExists) return "kilo.jsonc"; + return "kilo.json"; + }, + }), + plugins: new PluginsCapability({ + mode: "flat", + flatNamespacePrefix: "aidd-", + }), + }, + + rewriteContent(content: string, docsDir: string): string { + return baseRewriteContent(content, DIRECTORY, docsDir).replace( + /(@?)\.kilo\/commands\/(\d+)[_-][^/]+\/([^\s]+)/g, + "$1.kilo/commands/aidd/$2/$3" + ); + }, + + reverseRewriteContent(content: string, docsDir: string): string { + return baseReverseRewriteContent(content, DIRECTORY, docsDir); + }, + + detectUserFileSectionKey(relativePath: string): UserFileSectionKey | null { + return detectSectionKeyFromPrefixes(relativePath, [ + [`${DIRECTORY}agents/`, "agents"], + [`${DIRECTORY}commands/aidd/`, "commands"], + [`${DIRECTORY}rules/`, "rules"], + [`${DIRECTORY}skills/`, "skills"], + ]); + }, +}; + +registerTool(kilo); diff --git a/cli/src/domain/tools/ai/opencode.ts b/cli/src/domain/tools/ai/opencode.ts index d8b15f2db..f4d8d9879 100644 --- a/cli/src/domain/tools/ai/opencode.ts +++ b/cli/src/domain/tools/ai/opencode.ts @@ -36,7 +36,11 @@ const TOOL_SUFFIX = ".opencode.md"; type RawServer = | { command: string; args?: string[]; env?: Record; disabled?: boolean } - | { url: string; disabled?: boolean }; + | { + url: string; + headers?: Record; + disabled?: boolean; + }; interface OpencodeMcpLocalServer { type: "local"; @@ -49,6 +53,7 @@ interface OpencodeMcpRemoteServer { type: "remote"; url: string; enabled: boolean; + headers?: Record; } type OpencodeMcpServer = OpencodeMcpLocalServer | OpencodeMcpRemoteServer; @@ -62,7 +67,9 @@ function convertRawServer(name: string, server: RawServer): OpencodeMcpServer { return local; } if ("url" in server) { - return { type: "remote", url: server.url, enabled }; + const remote: OpencodeMcpRemoteServer = { type: "remote", url: server.url, enabled }; + if (server.headers && Object.keys(server.headers).length > 0) remote.headers = server.headers; + return remote; } throw new InvalidMcpServerConfigError(name); } diff --git a/cli/src/infrastructure/adapters/plugin-catalog-repository-adapter.ts b/cli/src/infrastructure/adapters/plugin-catalog-repository-adapter.ts index bf3690839..f7f0e4617 100644 --- a/cli/src/infrastructure/adapters/plugin-catalog-repository-adapter.ts +++ b/cli/src/infrastructure/adapters/plugin-catalog-repository-adapter.ts @@ -4,7 +4,10 @@ import { parseCodexMarketplace } from "../../domain/formats/codex-marketplace.js import { parseCopilotMarketplace } from "../../domain/formats/copilot-marketplace.js"; import { parseCopilotMarketplaceCatalog } from "../../domain/formats/copilot-marketplace-catalog.js"; import { parseCursorMarketplace } from "../../domain/formats/cursor-marketplace.js"; -import { parseOpencodeMarketplace } from "../../domain/formats/opencode-marketplace.js"; +import { + parseKiloMarketplace, + parseOpencodeMarketplace, +} from "../../domain/formats/opencode-marketplace.js"; import type { NormalizedPlugin } from "../../domain/models/normalized-plugin.js"; import { MARKETPLACE_CACHE_SUBDIR } from "../../domain/models/paths.js"; import { type PluginCatalog, parsePluginCatalog } from "../../domain/models/plugin-catalog.js"; @@ -42,6 +45,7 @@ export class PluginCatalogRepositoryAdapter implements PluginCatalogRepository { if (probe.format === "codex") return this.readCodexCatalog(fullPath); if (probe.format === "copilot") return this.readCopilotCatalog(fullPath); if (probe.format === "opencode") return this.readOpencodeCatalog(fullPath); + if (probe.format === "kilo") return this.readKiloCatalog(fullPath); } return []; } @@ -103,6 +107,11 @@ export class PluginCatalogRepositoryAdapter implements PluginCatalogRepository { return [...parseOpencodeMarketplace(raw).plugins]; } + private async readKiloCatalog(fullPath: string): Promise { + const raw = await this.fs.readFile(fullPath); + return [...parseKiloMarketplace(raw).plugins]; + } + private resolveLocalPaths(catalog: PluginCatalog, frameworkPath: string): PluginCatalog { const plugins = catalog.plugins.map((entry) => ({ ...entry, diff --git a/cli/src/infrastructure/assets/asset-loader.ts b/cli/src/infrastructure/assets/asset-loader.ts index d3eb1d0ae..581f66da6 100644 --- a/cli/src/infrastructure/assets/asset-loader.ts +++ b/cli/src/infrastructure/assets/asset-loader.ts @@ -6,6 +6,7 @@ import copilotVscodeSettings from "../../../assets/configs/copilot/vscode-settin type: "json", }; import cursorSettings from "../../../assets/configs/cursor/settings.json" with { type: "json" }; +import kiloJson from "../../../assets/configs/kilo/kilo.json" with { type: "json" }; import opencodeJson from "../../../assets/configs/opencode/opencode.json" with { type: "json" }; import vscodeExtensions from "../../../assets/configs/vscode/extensions.json" with { type: "json" }; import vscodeKeybindings from "../../../assets/configs/vscode/keybindings.json" with { @@ -35,6 +36,7 @@ const CONFIG_ASSETS: Readonly = { d.logger ) ), + "kilo:flat": (deps, ctx) => + buildFrameworkUseCase( + deps, + (d, av) => + new FlatBuildStrategy( + d.fs, + av, + d.assetProvider, + buildKiloFlatContract(), + ctx.force, + ctx.outDir, + isDirectory, + d.logger + ) + ), }; export function createFrameworkBuildUseCase( diff --git a/cli/tests/application/use-cases/install-runtime-config-use-case.unit.test.ts b/cli/tests/application/use-cases/install-runtime-config-use-case.unit.test.ts index 5b7897e6e..797f8cc5e 100644 --- a/cli/tests/application/use-cases/install-runtime-config-use-case.unit.test.ts +++ b/cli/tests/application/use-cases/install-runtime-config-use-case.unit.test.ts @@ -116,6 +116,24 @@ describe("InstallRuntimeConfigUseCase", () => { expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining(".claude/settings.json")); }); + it("does not create kilo.json next to an existing kilo.jsonc", async () => { + const deps = await buildUnitDeps(PROJECT_ROOT); + await initProject(deps, PROJECT_ROOT); + await deps.fs.writeFile(join(PROJECT_ROOT, "kilo.jsonc"), '{ "model": "kilo/default" }'); + + const manifest = (await deps.manifestRepo.load()) ?? Manifest.create(); + await buildUseCase(deps).execute({ + toolId: "kilo", + projectRoot: PROJECT_ROOT, + manifest, + force: false, + version: "1.0.0", + }); + + expect(deps.fs.has(join(PROJECT_ROOT, "kilo.json"))).toBe(false); + expect(deps.fs.getFile(join(PROJECT_ROOT, "kilo.jsonc"))).toContain("kilo/default"); + }); + describe("copilot requiresTool gate", () => { it("does not create .vscode/settings.json when vscode is not installed", async () => { const deps = await buildUnitDeps(PROJECT_ROOT); diff --git a/cli/tests/application/use-cases/plugin/translator/built-tree-opencode-materialization.integration.test.ts b/cli/tests/application/use-cases/plugin/translator/built-tree-opencode-materialization.integration.test.ts index b2d01ae11..001058f79 100644 --- a/cli/tests/application/use-cases/plugin/translator/built-tree-opencode-materialization.integration.test.ts +++ b/cli/tests/application/use-cases/plugin/translator/built-tree-opencode-materialization.integration.test.ts @@ -1,4 +1,6 @@ import "../../../../../src/domain/tools/ai/opencode.js"; +import "../../../../../src/domain/tools/ai/kilo.js"; +import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { BuiltTreeMaterializationTranslator } from "../../../../../src/application/use-cases/plugin/translator/built-tree-materialization-translator.js"; import { Manifest } from "../../../../../src/domain/models/manifest.js"; @@ -12,12 +14,19 @@ import { InMemoryMarketplaceRegistry } from "../../../../helpers/ports/in-memory const PROJECT_ROOT = "/proj"; const BUILT = "/built/opencode"; -function dist(): PluginDistribution { +function dist(mcpContent?: string): PluginDistribution { return new PluginDistribution({ manifest: { name: "aidd-vcs", version: "1.0.0" }, format: "claude", files: [], - components: { commands: [], agents: [], rules: [], skills: [], hooks: [], mcp: [] }, + components: { + commands: [], + agents: [], + rules: [], + skills: [], + hooks: [], + mcp: mcpContent === undefined ? [] : [{ relativePath: ".mcp.json", content: mcpContent }], + }, }); } @@ -65,12 +74,56 @@ describe("BuiltTreeMaterializationTranslator — opencode (integration)", () => "docs" ); - expect(fs.getFile(`${PROJECT_ROOT}/.opencode/skills/aidd-vcs-01-commit/SKILL.md`)).toBe(skill); - expect(fs.getFile(`${PROJECT_ROOT}/.opencode/agents/aidd-vcs-helper.md`)).toBe("agent body"); + expect(fs.getFile(join(PROJECT_ROOT, ".opencode/skills/aidd-vcs-01-commit/SKILL.md"))).toBe( + skill + ); + expect(fs.getFile(join(PROJECT_ROOT, ".opencode/agents/aidd-vcs-helper.md"))).toBe( + "agent body" + ); // Other plugin's files and the sentinel are NOT installed. - expect(fs.has(`${PROJECT_ROOT}/.opencode/skills/aidd-dev-00-sdlc/SKILL.md`)).toBe(false); - expect(fs.has(`${PROJECT_ROOT}/.build-version`)).toBe(false); + expect(fs.has(join(PROJECT_ROOT, ".opencode/skills/aidd-dev-00-sdlc/SKILL.md"))).toBe(false); + expect(fs.has(join(PROJECT_ROOT, ".build-version"))).toBe(false); const installed = manifest.getPlugins("opencode").find((p) => p.name === "aidd-vcs"); expect(installed?.files.size).toBe(2); }); + + it("merges Kilo MCP entries and records them for removal", async () => { + const fs = new InMemoryFileAdapter(); + fs.setFile( + `${BUILT.replace("opencode", "kilo")}/.kilo/skills/aidd-vcs-01-commit/SKILL.md`, + "skill" + ); + const manifest = Manifest.create(); + manifest.addTool("kilo", "test", []); + const translator = new BuiltTreeMaterializationTranslator( + fs, + new DeterministicHasher(), + () => "/home/u", + fakeEnsureBuiltMarketplace(), + await makeRegistry() + ); + const mcpContent = JSON.stringify({ + mcpServers: { github: { url: "https://mcp.github.example" } }, + }); + + await translator.addPlugin( + dist(mcpContent), + "kilo", + { kind: "local", path: "/plugin-source" }, + PROJECT_ROOT, + manifest, + "aidd-framework", + "docs" + ); + + expect(JSON.parse(fs.getFile(join(PROJECT_ROOT, "kilo.json")) ?? "{}")).toEqual({ + mcp: { github: { type: "remote", url: "https://mcp.github.example", enabled: true } }, + }); + expect( + manifest + .getPlugins("kilo") + .find((p) => p.name === "aidd-vcs") + ?.mcpEntries.has("github") + ).toBe(true); + }); }); diff --git a/cli/tests/domain/formats/opencode-marketplace.unit.test.ts b/cli/tests/domain/formats/opencode-marketplace.unit.test.ts index d5b7d1224..b31c77ffc 100644 --- a/cli/tests/domain/formats/opencode-marketplace.unit.test.ts +++ b/cli/tests/domain/formats/opencode-marketplace.unit.test.ts @@ -1,6 +1,9 @@ import { describe, expect, it } from "vitest"; import { ForeignSchemaValidationError } from "../../../src/domain/errors.js"; -import { parseOpencodeMarketplace } from "../../../src/domain/formats/opencode-marketplace.js"; +import { + parseKiloMarketplace, + parseOpencodeMarketplace, +} from "../../../src/domain/formats/opencode-marketplace.js"; const VALID_JSON = JSON.stringify({ $schema: "https://opencode.ai/config.json", @@ -8,6 +11,20 @@ const VALID_JSON = JSON.stringify({ plugin: ["opencode-dev-tools", "@my-org/opencode-testing", ["opencode-minimal", { debug: true }]], }); +describe("parseKiloMarketplace", () => { + it("parses Kilo's OpenCode-compatible plugin array with Kilo provenance", () => { + const catalog = parseKiloMarketplace(JSON.stringify({ plugin: ["@example/kilo-plugin"] })); + expect(catalog).toEqual({ + source: "kilo", + plugins: [{ name: "@example/kilo-plugin", source: "kilo" }], + }); + }); + + it("reports kilo.json for malformed Kilo configuration", () => { + expect(() => parseKiloMarketplace("not json")).toThrow(/kilo\.json is not valid JSON/); + }); +}); + describe("parseOpencodeMarketplace", () => { describe("happy path", () => { it("returns a NormalizedCatalog with source opencode", () => { diff --git a/cli/tests/domain/models/tool-config.unit.test.ts b/cli/tests/domain/models/tool-config.unit.test.ts index 7982107f0..21a30c55d 100644 --- a/cli/tests/domain/models/tool-config.unit.test.ts +++ b/cli/tests/domain/models/tool-config.unit.test.ts @@ -25,8 +25,16 @@ const makeStubConfig = (toolId: AiToolId, toolSuffix: string): AiTool = }); describe("VALID_TOOL_IDS", () => { - it("contains exactly claude, cursor, copilot, opencode, codex, vscode", () => { - expect(VALID_TOOL_IDS).toEqual(["claude", "cursor", "copilot", "opencode", "codex", "vscode"]); + it("contains every supported AI and IDE tool", () => { + expect(VALID_TOOL_IDS).toEqual([ + "claude", + "cursor", + "copilot", + "opencode", + "kilo", + "codex", + "vscode", + ]); }); }); @@ -52,7 +60,14 @@ describe("stripToolSuffix()", () => { describe("toolIdsForCategory()", () => { it("returns AI tool IDs for 'ai'", () => { - expect(toolIdsForCategory("ai")).toEqual(["claude", "cursor", "copilot", "opencode", "codex"]); + expect(toolIdsForCategory("ai")).toEqual([ + "claude", + "cursor", + "copilot", + "opencode", + "kilo", + "codex", + ]); }); it("returns IDE tool IDs for 'ide'", () => { diff --git a/cli/tests/domain/models/tool-ids.unit.test.ts b/cli/tests/domain/models/tool-ids.unit.test.ts index d1a8e8f87..fa098c566 100644 --- a/cli/tests/domain/models/tool-ids.unit.test.ts +++ b/cli/tests/domain/models/tool-ids.unit.test.ts @@ -12,6 +12,7 @@ describe("isAiToolId", () => { expect(isAiToolId("cursor")).toBe(true); expect(isAiToolId("copilot")).toBe(true); expect(isAiToolId("opencode")).toBe(true); + expect(isAiToolId("kilo")).toBe(true); expect(isAiToolId("codex")).toBe(true); }); diff --git a/cli/tests/domain/tools/ai/kilo.unit.test.ts b/cli/tests/domain/tools/ai/kilo.unit.test.ts new file mode 100644 index 000000000..5390f09f3 --- /dev/null +++ b/cli/tests/domain/tools/ai/kilo.unit.test.ts @@ -0,0 +1,61 @@ +import { describe, expect, it } from "vitest"; +import { KiloDualConfigError } from "../../../../src/domain/errors.js"; +import type { FileReader } from "../../../../src/domain/ports/file-reader.js"; +import { kilo } from "../../../../src/domain/tools/ai/kilo.js"; + +function makeFs(existingPaths: string[]): FileReader { + return { + fileExists: async (path: string) => existingPaths.some((p) => path.endsWith(p)), + } as unknown as FileReader; +} + +describe("kilo", () => { + it("installs native skills, agents, commands, and rules under .kilo", () => { + expect(kilo.capabilities.skills.buildInstallPath("my-skill/SKILL.md")).toBe( + ".kilo/skills/my-skill/SKILL.md" + ); + expect(kilo.capabilities.agents.buildInstallPath("reviewer.kilo.md")).toBe( + ".kilo/agents/reviewer.md" + ); + expect(kilo.capabilities.commands?.buildInstallPath("04_code/implement.md")).toBe( + ".kilo/commands/aidd/04/implement.md" + ); + expect(kilo.capabilities.rules?.buildInstallPath("01-standards/naming.md")).toBe( + ".kilo/rules/01-standards/naming.md" + ); + }); + + it("uses Kilo-compatible subagent frontmatter", () => { + expect( + kilo.capabilities.agents.convertFrontmatter({ + name: "reviewer", + description: "Review code", + }) + ).toEqual({ description: "Review code", mode: "subagent" }); + }); + + it("writes MCP configuration to kilo.json and preserves JSONC ownership", async () => { + expect(kilo.capabilities.mcp.params.outputPath).toBe("kilo.json"); + expect(await kilo.capabilities.mcp.resolveOutput("/project", makeFs([]))).toBe("kilo.json"); + expect(await kilo.capabilities.mcp.resolveOutput("/project", makeFs(["kilo.jsonc"]))).toBe( + "kilo.jsonc" + ); + }); + + it("rejects ambiguous kilo.json and kilo.jsonc configuration", async () => { + await expect( + kilo.capabilities.mcp.resolveOutput("/project", makeFs(["kilo.json", "kilo.jsonc"])) + ).rejects.toThrow(KiloDualConfigError); + }); + + it("detects Kilo user-file sections", () => { + expect(kilo.detectUserFileSectionKey(".kilo/skills/my-skill/SKILL.md")).toEqual({ + section: "skills", + key: "my-skill/SKILL.md", + }); + expect(kilo.detectUserFileSectionKey(".kilo/agents/reviewer.md")).toEqual({ + section: "agents", + key: "reviewer.md", + }); + }); +}); diff --git a/cli/tests/domain/tools/ai/opencode.unit.test.ts b/cli/tests/domain/tools/ai/opencode.unit.test.ts index 8b211bf35..4e49f63ed 100644 --- a/cli/tests/domain/tools/ai/opencode.unit.test.ts +++ b/cli/tests/domain/tools/ai/opencode.unit.test.ts @@ -212,6 +212,27 @@ describe("opencode", () => { }); }); + it("preserves remote authentication headers and OAuth settings", () => { + const input = JSON.stringify({ + mcpServers: { + protected: { + url: "https://mcp.example.com", + headers: { Authorization: "Bearer $" + "{MCP_TOKEN}" }, + }, + }, + }); + expect(JSON.parse(transform("mcp", input))).toEqual({ + mcp: { + protected: { + type: "remote", + url: "https://mcp.example.com", + headers: { Authorization: "Bearer $" + "{MCP_TOKEN}" }, + enabled: true, + }, + }, + }); + }); + it("handles mixed local and remote servers in the same config", () => { const input = JSON.stringify({ mcpServers: { diff --git a/cli/tests/domain/tools/registry-conformance.unit.test.ts b/cli/tests/domain/tools/registry-conformance.unit.test.ts index 4eab75ba7..a5d6febbc 100644 --- a/cli/tests/domain/tools/registry-conformance.unit.test.ts +++ b/cli/tests/domain/tools/registry-conformance.unit.test.ts @@ -5,6 +5,7 @@ import "../../../src/domain/tools/ai/claude.js"; import "../../../src/domain/tools/ai/codex.js"; import "../../../src/domain/tools/ai/copilot.js"; import "../../../src/domain/tools/ai/cursor.js"; +import "../../../src/domain/tools/ai/kilo.js"; import "../../../src/domain/tools/ai/opencode.js"; import { FRAMEWORK_BUILD_TARGET_MODES } from "../../../src/domain/models/framework-build.js"; import { diff --git a/cli/tests/golden/framework-build-golden.e2e.test.ts b/cli/tests/golden/framework-build-golden.e2e.test.ts index 50e72f4fe..e058aeac6 100644 --- a/cli/tests/golden/framework-build-golden.e2e.test.ts +++ b/cli/tests/golden/framework-build-golden.e2e.test.ts @@ -13,7 +13,7 @@ * FROZEN CELLS (marketplace baseline, never regenerate casually): * claude — re-baselined once in the agents-manifest-fix pass (see below), still frozen since. * RE-BASELINED CELLS (flat-discovery-fix pass: bare paths, no plugin segment): - * claude:flat, cursor:flat, copilot:flat, codex:flat, opencode:flat + * claude:flat, cursor:flat, copilot:flat, codex:flat, opencode:flat, kilo:flat * RE-BASELINED CELLS (agents-manifest-fix pass: `agents` is now a list of * ./agents/*.md file paths instead of the invalid `["./agents"]` dir form): * claude, cursor, copilot (marketplace) @@ -40,7 +40,7 @@ type GoldenSnapshot = Record; // key → files /** All marketplace targets */ const MARKETPLACE_TARGETS = ["copilot", "codex", "claude", "cursor"] as const; /** All flat targets (including opencode which is flat-only) */ -const FLAT_TARGETS = ["claude", "cursor", "copilot", "codex", "opencode"] as const; +const FLAT_TARGETS = ["claude", "cursor", "copilot", "codex", "opencode", "kilo"] as const; /** * Frozen marketplace cell: its fresh build is byte-compared to the stored hash on @@ -112,7 +112,7 @@ async function captureAllCells( return captured; } -describe.concurrent("Framework build golden — 9-cell matrix", () => { +describe.concurrent("Framework build golden — 10-cell matrix", () => { it("snapshot is deterministic (two captures of each target are byte-identical)", async () => { const env1 = await createTestEnv("fb-golden-det-1"); const env2 = await createTestEnv("fb-golden-det-2"); @@ -157,7 +157,7 @@ describe.concurrent("Framework build golden — 9-cell matrix", () => { } }); - it("stored golden baseline covers all 9 cells and the frozen claude cell is byte-identical (AC #1)", async () => { + it("stored golden baseline covers all 10 cells and the frozen claude cell is byte-identical (AC #1)", async () => { const { tempDir, projectDir, fakeHome, cleanup } = await createTestEnv("fb-golden-baseline"); try { const captured = await captureAllCells(projectDir, fakeHome, tempDir); @@ -171,7 +171,7 @@ describe.concurrent("Framework build golden — 9-cell matrix", () => { const stored = JSON.parse(await readFile(SNAPSHOT_FILE, "utf-8")) as GoldenSnapshot; - // Assert all 9 cells exist in stored + // Assert all 10 cells exist in stored const expectedCells = [...MARKETPLACE_TARGETS, ...FLAT_TARGETS.map((t) => `${t}:flat`)]; for (const key of expectedCells) { expect(stored[key], `stored snapshot missing cell: ${key}`).toBeDefined(); @@ -192,7 +192,7 @@ describe.concurrent("Framework build golden — 9-cell matrix", () => { } }); - it("all 9 cells are non-empty", async () => { + it("all 10 cells are non-empty", async () => { const stored = JSON.parse(await readFile(SNAPSHOT_FILE, "utf-8")) as GoldenSnapshot; const expectedCells = [...MARKETPLACE_TARGETS, ...FLAT_TARGETS.map((t) => `${t}:flat`)]; for (const key of expectedCells) { diff --git a/cli/tests/golden/snapshots/framework-build/golden.json b/cli/tests/golden/snapshots/framework-build/golden.json index 1de3fda93..a372a001b 100644 --- a/cli/tests/golden/snapshots/framework-build/golden.json +++ b/cli/tests/golden/snapshots/framework-build/golden.json @@ -11,10 +11,10 @@ "plugins/aidd-vcs/skills/03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", "plugins/aidd-vcs/skills/02-pull-request/SKILL.md": "cea82673d19b5a77d2fbbb60c6961802b3cd3c04fd098da0ab32ed6ef5e596d7", "plugins/aidd-vcs/skills/02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", "plugins/aidd-vcs/skills/02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", "plugins/aidd-vcs/skills/01-commit/SKILL.md": "9d4fb8c3091dbc72e77bb8be77e8842d1204add3589e8dffccebb36ec5e5d680", "plugins/aidd-vcs/skills/01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -130,17 +130,17 @@ "plugins/aidd-context/skills/02-project-init/SKILL.md": "771551e0929afbf631088e98e4d0ddc267b1ef87e393381e493171c599a50762", "plugins/aidd-context/skills/02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", "plugins/aidd-context/skills/02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", "plugins/aidd-context/skills/02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", "plugins/aidd-context/skills/02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -200,36 +200,36 @@ ".plugin/marketplace.json": "fda47ddacff304f5bc06b1807f5c1c1be3f787995ed2f26cc8791c0c38ee3d19" }, "codex": { - "plugins/aidd-vcs/skills/04-issue-create/SKILL.md": "41fb7f904c88a07eb3ab94c6137c130166fa44069ed76322fc6eb78b81a7b5a4", + "plugins/aidd-vcs/skills/04-issue-create/SKILL.md": "0cf1a20e837f7afaf874c0827f345f51a82bab1cec44e4e68130483a919ea686", "plugins/aidd-vcs/skills/04-issue-create/evals/scenarios.json": "d113c62aae4867e425737948c39c9f687f56c3d37234eca345a2f65f1a234c30", "plugins/aidd-vcs/skills/04-issue-create/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", "plugins/aidd-vcs/skills/04-issue-create/assets/issue-template.md": "66b4ef6090208512205fce0bb16edbbcf0ffb19009eae76dc317d738c7a10cdc", "plugins/aidd-vcs/skills/04-issue-create/actions/01-issue-create.md": "e3f60414fa3ce2d78583e5cb118dad8df956927aa86e2f6e802031a7d742d7ed", - "plugins/aidd-vcs/skills/03-release-tag/SKILL.md": "8f95bd82f55c0e0a1362f2cc0fbd536b94717191f0eeb8d5f724d922704c9e5b", + "plugins/aidd-vcs/skills/03-release-tag/SKILL.md": "58fd2a7c23c989e09eeeefcb0db18e44ecec2e1c50285216149d9c29ed9a085b", "plugins/aidd-vcs/skills/03-release-tag/evals/scenarios.json": "fdba5d61f815b956512f84baf712cde92be651593282b43ac173b2459ee9eca3", "plugins/aidd-vcs/skills/03-release-tag/assets/release-template.md": "bce05178ae5ea7da6c356849ba69eebd249ba344c94a3c571d7d40be9d4e9e27", "plugins/aidd-vcs/skills/03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", - "plugins/aidd-vcs/skills/02-pull-request/SKILL.md": "cea82673d19b5a77d2fbbb60c6961802b3cd3c04fd098da0ab32ed6ef5e596d7", + "plugins/aidd-vcs/skills/02-pull-request/SKILL.md": "9a4258f4b2206b7502469191b628f4dccf70ef194cbec839c8992fd08bf74d2f", "plugins/aidd-vcs/skills/02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", "plugins/aidd-vcs/skills/02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", - "plugins/aidd-vcs/skills/01-commit/SKILL.md": "9d4fb8c3091dbc72e77bb8be77e8842d1204add3589e8dffccebb36ec5e5d680", + "plugins/aidd-vcs/skills/01-commit/SKILL.md": "613de1c46477fa90b18b12145cb032bb481b6d75afbc55020129643351a6ee47", "plugins/aidd-vcs/skills/01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", "plugins/aidd-vcs/skills/01-commit/assets/commit-template.md": "b3c392c5c3faecc903bf80eb2bd287d2a02e42d4c3896490a5745d66fca60bf2", "plugins/aidd-vcs/skills/01-commit/actions/01-commit.md": "06ded7f8c23e950b3b1a76b0bb89c219d1ca161cb8f9a02e04e8083ad7061dc0", "plugins/aidd-vcs/.codex-plugin/plugin.json": "6dc4af8e3d409bddb934a6ff4a6a6505ac6a858add78518e38131547d1f12b89", - "plugins/aidd-refine/skills/03-condense/SKILL.md": "8dd2e967d5c18e8e14194bbd96d79333a005410cf20fcb48735f0ff09a70b9e9", + "plugins/aidd-refine/skills/03-condense/SKILL.md": "1289ba9010aa3ff1e56adc4511ba1400215ca5da88d6a20173fcc41d428e4d80", "plugins/aidd-refine/skills/03-condense/references/intensity-levels.md": "8e6aa26fc675a2d30dbb4df13e68d0ce6d2844c88bafd39e0ea3f2945e3276f1", "plugins/aidd-refine/skills/03-condense/evals/scenarios.json": "c03016b5e98c5a9a8b6680035bf8ee0f2a75edc5ce33e33cf1e1430cd91f55ec", "plugins/aidd-refine/skills/03-condense/actions/01-condense.md": "bffb26d5a306bc90f40614b29ca21e9a2151dc5ba82880c857e29c39486a16fd", - "plugins/aidd-refine/skills/02-challenge/SKILL.md": "040fed9ffad13d0fa13b1ad5222b5996bbf6dfa8ed1552aa17da22ad30bd1186", + "plugins/aidd-refine/skills/02-challenge/SKILL.md": "ba43da6ed877866a39c6024a2f228a0c1b3bf7f78b7fef831d5afc8e99562ded", "plugins/aidd-refine/skills/02-challenge/references/confidence-rubric.md": "714f1bfd0c33f2adf911c93e9bb2f113be9fd29bad07d83e54be293fc44de823", "plugins/aidd-refine/skills/02-challenge/evals/scenarios.json": "332403843b5b5d99a9dcb3464f298ca3b7274edbd1b5c337407a4dd977bc19a5", "plugins/aidd-refine/skills/02-challenge/actions/01-challenge.md": "6f47920ccec8682708789e07583e32698695f1274bf883757ab13fca6f3e76c0", - "plugins/aidd-refine/skills/01-brainstorm/SKILL.md": "accc6503b13159031ab9a135b9b5591bd15b6aea13f3ded52b2f0a1b0f062687", + "plugins/aidd-refine/skills/01-brainstorm/SKILL.md": "d2e5e7af93ded94141f961cd0b7df3c0abcffc61dce3e56dd0ed28a0f8d6a938", "plugins/aidd-refine/skills/01-brainstorm/references/ambiguity-detection.md": "c869338af0d8e0bdde5915000ce44980fef750cc40d070d4055bcba4c1334e0f", "plugins/aidd-refine/skills/01-brainstorm/evals/scenarios.json": "c6858f3b6b8efa666e2c7f21f4325f5e57297e3fdfc475b836f3ce5de9d635bf", "plugins/aidd-refine/skills/01-brainstorm/assets/question-templates.md": "bd744429e69f26caf37359e2b1d1c38dc4faba1a2c54dfaa99bfde48da0dc3c8", @@ -240,51 +240,51 @@ "plugins/aidd-refine/skills/01-brainstorm/actions/05-confirm-approval.md": "3c6c8184910a210bb6698c2c010aebec88a28313b31bbed0ef9c1189530cd6fe", "plugins/aidd-refine/.codex-plugin/plugin.json": "465c87f116263a0e985cab09f2b009edcd3ea0673e7d0e6410eee6fdccee4d1f", "plugins/aidd-pm/.mcp.json": "3da12ff20b463bcabbb0493a72b8d214977c542c71d173913484937f7d7bd555", - "plugins/aidd-pm/skills/05-spec/SKILL.md": "4312ad75dcca0603aa7f3237ee1caa989c41f366c6fe8d795e62b16821e06465", + "plugins/aidd-pm/skills/05-spec/SKILL.md": "7a53f639bae11eb9ed45292f7df9bf63674606ef4316cd2de9ab56053f3ead71", "plugins/aidd-pm/skills/05-spec/assets/spec-template.md": "2f7e446c4ec58d05a471212e9ab3ba64395bdd059943620d02bf1bf5c98777c2", "plugins/aidd-pm/skills/05-spec/assets/spec-validator.yml": "2358c6f0baa5656ddcff9410149cf8261d54199d8722f77769f76ca0d7c8cf18", - "plugins/aidd-pm/skills/04-clarity/SKILL.md": "51b800be6dd3c252ebc965d191e0a09eac3642da5e01cd70780bcf8201da9d3a", - "plugins/aidd-pm/skills/03-prd/SKILL.md": "860269fc27c4c876a636143d7ab89690256e5b9e8d1c42627f9540f24d6d343e", + "plugins/aidd-pm/skills/04-clarity/SKILL.md": "78c7ab0c5f81b0a214a1788c365091d72eeecc5482a5e19bdc49da7ab6b18a36", + "plugins/aidd-pm/skills/03-prd/SKILL.md": "3178498abc049e3ab9888c101002b57634f6f9d6ef387d566d2dc122bc616960", "plugins/aidd-pm/skills/03-prd/assets/prd-template.md": "af01423720e8c9527ff12a2e9ad1de39c6e63c6569359be08defd0a059aabea9", "plugins/aidd-pm/skills/03-prd/assets/task-template.md": "c0069ed2ecce4742629dccd6be709d4e5a71f3db3821310c381c054aeb479289", "plugins/aidd-pm/skills/03-prd/actions/01-prd.md": "c0da6597f8c465ad50a17a07543152f53de1fbccc28cd906763d439004084a22", - "plugins/aidd-pm/skills/02-user-stories-create/SKILL.md": "9f41d257b48aa2e74d62ec2574d2f29270e158f51483ca36dc9d9583eca71e41", + "plugins/aidd-pm/skills/02-user-stories-create/SKILL.md": "405e21b32748ea8394fbd2dfaec39c8a6346dd6c5177cd4cd39ae1dbdeeace31", "plugins/aidd-pm/skills/02-user-stories-create/assets/user-story-template.md": "59ecd98d00057313414a74a94c19c0f2d167957e1080b880ee68a69a31948320", "plugins/aidd-pm/skills/02-user-stories-create/actions/01-create-user-stories.md": "6fad8968a1e787c197764c4a8c09b17c521ae5ea2286a5082addc717bd72b1e6", - "plugins/aidd-pm/skills/01-ticket-info/SKILL.md": "1fe8a382df62e590582f2dd0e771741370fe785cc96f1a9570f08790e140ed0c", + "plugins/aidd-pm/skills/01-ticket-info/SKILL.md": "63a627d468fc9bc81e897912d15cce667a4b5dba8f5a34efa57d5028696921ed", "plugins/aidd-pm/skills/01-ticket-info/actions/01-ticket-info.md": "f075ea6ff626534dbe0826d06b67fae93b6488ec4c5c7a3d857f1d05f73d0630", "plugins/aidd-pm/.codex-plugin/plugin.json": "807bc7690f264bcf9dafc0869ec18945a973c951688b213c93383571f72df0ca", "plugins/aidd-dev/.mcp.json": "39d66899223270ca6dd92d874f819d8d357472566657dec87592b7ec8c7bd92c", - "plugins/aidd-dev/skills/08-for-sure/SKILL.md": "d05c9108d6899abc82778671a7a1c9ef6fd5781c6ebc9136e43b783274d00318", + "plugins/aidd-dev/skills/08-for-sure/SKILL.md": "f4b0c1e1249fa0634e40473c4f3621d8c4a03f1094fd9ca162a466e2e33e9d25", "plugins/aidd-dev/skills/08-for-sure/actions/01-init-tracking.md": "3ce6bb19135e5d31c4d2ad1c2151c1563886a611f2399b47624368268a79dcdf", "plugins/aidd-dev/skills/08-for-sure/actions/02-auto-accept.md": "235818118c772c0f499ea0668bfbc7bd00c2aae34e6bbd8b13b912fddfa79705", "plugins/aidd-dev/skills/08-for-sure/actions/03-autonomous-loop.md": "b19d4520ad716def3c2a4611c37725cba9af713cd4bcb668c237e874e1e43843", - "plugins/aidd-dev/skills/07-debug/SKILL.md": "ed8dba0f337bb0776c598a2721effef7ca8d2904e36b2b3cb33cc02afc464152", + "plugins/aidd-dev/skills/07-debug/SKILL.md": "bb7dde02a41123d298faf803a9de37cf91bf017c414e21959550f7a39e6b3865", "plugins/aidd-dev/skills/07-debug/references/mermaid-conventions.md": "85826285744909dd4c4706b82f0dbeff4f88a8f191cb22d538aa12c3c96365eb", "plugins/aidd-dev/skills/07-debug/assets/task-template.md": "c0069ed2ecce4742629dccd6be709d4e5a71f3db3821310c381c054aeb479289", "plugins/aidd-dev/skills/07-debug/actions/01-reproduce.md": "7e902e5aadc9162b444b341deb33f2a683000c1cc4722ad856496f9d740ec17d", "plugins/aidd-dev/skills/07-debug/actions/02-debug.md": "dc3900ce6fb76074b88034d7b7316f4051d78a1828caa3acef9786e8ea582b18", "plugins/aidd-dev/skills/07-debug/actions/03-reflect-issue.md": "3d5f18634618737870da4c783c7525cee25e09d942faee80125dd7536978ce12", - "plugins/aidd-dev/skills/06-refactor/SKILL.md": "15c79a4fd40abea83ad5b52460aeafc777674de48950755b83d0e30935647923", + "plugins/aidd-dev/skills/06-refactor/SKILL.md": "b0405a301999e336ceaf2df8468235243c5ede80e03c127553d7483d645abf70", "plugins/aidd-dev/skills/06-refactor/actions/01-performance.md": "1f7d500967de58875aeb14b732a1af377b17edff8654f4365b3f29743debb3c7", "plugins/aidd-dev/skills/06-refactor/actions/02-security.md": "db55b81ab824d81b765189296deb1ce31fdb134edac186baf22a2c3bb1cde938", - "plugins/aidd-dev/skills/05-test/SKILL.md": "073a4c14cff464001a026e13d9f8b122cc2370a76b11424697a4fbcab39b0da3", + "plugins/aidd-dev/skills/05-test/SKILL.md": "88d68332405c0009cfe33ee8fa3a9e622296bc61c7804e1d8078b8a0091e12d2", "plugins/aidd-dev/skills/05-test/actions/01-test.md": "f6db9653cd29729c51653df7afe473fae4ae45bb126a694a367bfd84fa1785a4", "plugins/aidd-dev/skills/05-test/actions/02-test-journey.md": "1eeb85da69abc3f1fc3e5671e83962f44fcb5686d9ca5972eeb2ba4cab31306d", - "plugins/aidd-dev/skills/04-review/SKILL.md": "b98bbc1e330927fda3b1b26c38eff1348804a83545d75543ef50d5da8ea8d3c5", + "plugins/aidd-dev/skills/04-review/SKILL.md": "5731bda90accd77dfcd790189d1e65b74e78e2553a16df452d44e9aab96f4b71", "plugins/aidd-dev/skills/04-review/assets/code-review-template.md": "e270c4b6b8c69e4fbbbcc08c2f91cc9a09fc8ad155b6f52cec3e3d34a262324d", "plugins/aidd-dev/skills/04-review/assets/review-functional-template.md": "a84b48347caf4d09d84994b07329e4d05c8053d45630b37d47ca3ccb386e3146", "plugins/aidd-dev/skills/04-review/assets/review-template.md": "b0ad0ab703e4d9ed960bd324bc37efe5f682cbcd40ed6293791d9074f174201c", "plugins/aidd-dev/skills/04-review/actions/01-review-code.md": "8d5e4fc6c9243a83025961ae40146f1d96f321d9ff4d93ab74c370bbc53c18ed", "plugins/aidd-dev/skills/04-review/actions/02-review-functional.md": "9e5d837715f5610a42f1c294b0fa71277538e2629dc47cf09675487dcfa98324", - "plugins/aidd-dev/skills/03-audit/SKILL.md": "37b9318c81624142326588fb8e5b602fd449927b990fe2745919f706db402ca7", + "plugins/aidd-dev/skills/03-audit/SKILL.md": "994cdeb0e16071e5a92a27956cea25c9bb04bd68c1392243fa0bebe0038cd01e", "plugins/aidd-dev/skills/03-audit/actions/01-audit.md": "0371ae3d0c9a383f8b90657f3381717f323742bad922df2c1c508f6db013267e", - "plugins/aidd-dev/skills/02-assert/SKILL.md": "c32f74b1d60837ca92d095b3547e615f25cf31faa348a78441012a30805418a3", + "plugins/aidd-dev/skills/02-assert/SKILL.md": "3abe857a8279243fccc21bcfa4bdfcc622aaff636ec21e0751a433afaa02c06e", "plugins/aidd-dev/skills/02-assert/assets/task-template.md": "c0069ed2ecce4742629dccd6be709d4e5a71f3db3821310c381c054aeb479289", "plugins/aidd-dev/skills/02-assert/actions/01-assert.md": "b8a9680e7cf956f2e1ff7720f755586e2523d6951c35ec686ded659f7fa3a4b1", "plugins/aidd-dev/skills/02-assert/actions/02-assert-architecture.md": "e5d7effa39f33c045e4d605ed909d46ddf7562e2a0199eb2e39fcc8f3fc92620", "plugins/aidd-dev/skills/02-assert/actions/03-assert-frontend.md": "ed9751b32580c7fd3fbe02a8205cbb5d85a8e7bc38f982b5130b810950bbd091", - "plugins/aidd-dev/skills/01-plan/SKILL.md": "fc0bdfe637e61fc2fd1f430e6840340c3843813a32510e61f4d597172af4379a", + "plugins/aidd-dev/skills/01-plan/SKILL.md": "97e0a7c794c420d6244b1eca50c37190297b370e6ea6f1e32344a486bb4982cb", "plugins/aidd-dev/skills/01-plan/references/mermaid-conventions.md": "85826285744909dd4c4706b82f0dbeff4f88a8f191cb22d538aa12c3c96365eb", "plugins/aidd-dev/skills/01-plan/assets/master-plan-template.md": "f793f2bc8fad34f056e824def49527552f50cf12e43f0929731d64278376b822", "plugins/aidd-dev/skills/01-plan/assets/plan-template.md": "cf462e831d994230c811c71eaa72a8f9880536ba3b657b70342083dee00ab254", @@ -292,21 +292,21 @@ "plugins/aidd-dev/skills/01-plan/actions/01-plan.md": "c480fc1cffe39f117003b5aeea23e10f808952a0eeea067dbc0ab44c0af992ff", "plugins/aidd-dev/skills/01-plan/actions/02-components-behavior.md": "cacb673334d8947c3c252feaaf0ef50c269c06c5cf8f51b45663cbd42402e094", "plugins/aidd-dev/skills/01-plan/actions/03-image-extract-details.md": "6f6cddd0893888c71b0aed5ecfe48217afe0eef10feec6415db433bfcc69f8e3", - "plugins/aidd-dev/skills/00-sdlc/SKILL.md": "19bd4a8cf8c6531a6db232c31855e39475c71e2b58c91b439832d813ff594b78", + "plugins/aidd-dev/skills/00-sdlc/SKILL.md": "e961d919f13d1650d7c47dc0fa118f8cdce7d434c2ae31aa9c30a203463c86f4", "plugins/aidd-dev/codex-agents/implementer.toml": "d6b2739193ecc12b546f17a994af4e2949ccbea3f2560139b3bf7693fca9604d", "plugins/aidd-dev/codex-agents/planner.toml": "347e72e5beb8d0b493618c2d03f37d765c10e407f3404539fa5dc822fd2fecad", "plugins/aidd-dev/codex-agents/reviewer.toml": "9dd3b9e0420601fc35c287636a6553ef5e404689347313d05e53ec99f034011a", "plugins/aidd-dev/.codex-plugin/plugin.json": "20aed94921aed1aaa0dfcd83528601273582558f72ed33f23077605197dba94d", - "plugins/aidd-context/skills/06-discovery/SKILL.md": "28f82e034ed5707ad6e59b012680a94ff5935bc7f8a0b5407caeea20ccb2667a", + "plugins/aidd-context/skills/06-discovery/SKILL.md": "e057466afc4603a1fcac65db17f36d4d03c8403c6b2ed8b49abdcec43bc69aaf", "plugins/aidd-context/skills/06-discovery/actions/01-find-skill.md": "600caf7822017bfe75d40773e1673ada784227b98f5b88d4ba98a57822fa0dcf", - "plugins/aidd-context/skills/05-learn/SKILL.md": "a1628b6311634de75b8260df3ab1271713dcb06136c6e66bad1e290594f81339", + "plugins/aidd-context/skills/05-learn/SKILL.md": "5e9a8b4ddaa35de78239891a9a0f54e91963f9e68779206b9d02f756204c0cdf", "plugins/aidd-context/skills/05-learn/assets/adr-template.md": "1f9feb18109b178226885ab7edabc3d1c4dd2a77dd1fa7345be856643107ac16", "plugins/aidd-context/skills/05-learn/assets/decision-template.md": "1e6229157fd0a07c090ce0bd159336a13554975e146966b306bf25665a179938", "plugins/aidd-context/skills/05-learn/actions/01-learn.md": "92400bfcc2cdfe9f0bad8f2feadd7d28dce882240fe58971d25dfa880521d8bb", - "plugins/aidd-context/skills/04-mermaid/SKILL.md": "1be61dff15ba6f1a7686c5577517985f59266f0aee774fc3d67fe2a5aa5a558a", + "plugins/aidd-context/skills/04-mermaid/SKILL.md": "67418c9e759e3b39f95e3260269070f0f0f5c87c4b4b85ec8100aa1693464a86", "plugins/aidd-context/skills/04-mermaid/references/mermaid-conventions.md": "85826285744909dd4c4706b82f0dbeff4f88a8f191cb22d538aa12c3c96365eb", "plugins/aidd-context/skills/04-mermaid/actions/01-mermaid.md": "f70b18f429701d0c3b46a4c6e75153c732ee9e06a16aa01efec05e810ac7a6dd", - "plugins/aidd-context/skills/03-context-generate/SKILL.md": "94b9151a75e80d07de56418eb476641c7f50608834ac7f01e5a0b7526c755975", + "plugins/aidd-context/skills/03-context-generate/SKILL.md": "bbb19f88272463d15ffbd41a7ff27ed72fd207386af5ba21c4472ada65afd426", "plugins/aidd-context/skills/03-context-generate/references/agents-coordination.md": "eaaa31ed554a53f7870151307853e1add7e3ddd1de8e442b8d5e7c5698ab0098", "plugins/aidd-context/skills/03-context-generate/references/ai-mapping.md": "4ad192b5ae53c7ceadff165a1cef8c3f24949498375bedc0cc359194dea3117e", "plugins/aidd-context/skills/03-context-generate/references/naming-conventions.md": "fd39d00b1449f0770ee89aad9f6e84d21e1fee2efc0ff547a240b0e18f648cd8", @@ -327,20 +327,20 @@ "plugins/aidd-context/skills/03-context-generate/actions/skills/06-validate.md": "658c1077b03c461bb0c3fa17db047e4d2fbc3874f4d4fbd2e3dc5df606aa03ee", "plugins/aidd-context/skills/03-context-generate/actions/rules/01-generate-rules.md": "855b9adf65b0b0cc31ca15c68b8ac37da6a816c9a6416fbc3aea424cffa238c3", "plugins/aidd-context/skills/03-context-generate/actions/agents/01-generate-agent.md": "3dce30335eba1d60c5a62d43184d133eed621bbc344e9277ab0f05ead443e0ba", - "plugins/aidd-context/skills/02-project-init/SKILL.md": "771551e0929afbf631088e98e4d0ddc267b1ef87e393381e493171c599a50762", + "plugins/aidd-context/skills/02-project-init/SKILL.md": "f957b5662aaa85b206916067d8a91dba7dac6660df1bb6f1f8772530726bfa08", "plugins/aidd-context/skills/02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", "plugins/aidd-context/skills/02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", "plugins/aidd-context/skills/02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", "plugins/aidd-context/skills/02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -355,7 +355,7 @@ "plugins/aidd-context/skills/02-project-init/actions/04-review-memory.md": "211ad0ad0d7c4925acbd8a41f775a16b09de51b85d9f3fc6f972170ac63fd353", "plugins/aidd-context/skills/02-project-init/actions/05-init-rules-skeleton.md": "12924f4535c083e114a5a4a4ef148e4aa2c8c4c436d23c8f50e152f869e3be2c", "plugins/aidd-context/skills/02-project-init/actions/06-sync-memory.md": "3f6825c8d230cea72f729aee15cf6136b613b7a9b07ddec237b91fe5ad3be59b", - "plugins/aidd-context/skills/01-bootstrap/SKILL.md": "73685c32640bd6a7ebb77e36464ddbb1ab2c254bc4e02dfe923e53aac858a1cc", + "plugins/aidd-context/skills/01-bootstrap/SKILL.md": "cff89e30857b72b6c4870da67ec4adf97b0d238acdeff857ecd422e8aec4b926", "plugins/aidd-context/skills/01-bootstrap/references/stack-heuristics.md": "17f7c0df7b19090f42c26ddf70df1049897b3973d9c1bf8df358b87a1cc9985a", "plugins/aidd-context/skills/01-bootstrap/evals/scenarios.json": "c5998a91c584d561618dbabe66f21bd8f446260731778de4f467a70a6da21784", "plugins/aidd-context/skills/01-bootstrap/assets/checklist.md": "64b84a7712ca78bc1901d2c78c183310336a4abe1b5890a689c3cf166b026d21", @@ -368,14 +368,14 @@ "plugins/aidd-context/hooks/hooks.json": "fb9534241deca3ad28f23c1f364d444d6f0e83a1aa2328796a295aa2ebbe65f6", "plugins/aidd-context/hooks/update_memory.js": "140d7db788452f5f4c32316d522f595a36e06638b19a42d32e42a1a7324b7149", "plugins/aidd-context/.codex-plugin/plugin.json": "e0e25ec3ca27ca2bcf49fd4d2b32587efbf1237280d732c9477de2c178109c3b", - "plugins/aidd-async-dev/skills/03-review/SKILL.md": "e5ad0469954cfc92de1f95e3cb53e70b9f682e35491430aeba1d3c5511a41c06", + "plugins/aidd-async-dev/skills/03-review/SKILL.md": "883d7cd780d121e6a39e3a9fcde2b3a1799485601a76ce4c1073a82556df319e", "plugins/aidd-async-dev/skills/03-review/references/stop-conditions.md": "47280ec7ebb0bd2d25bb7bf7dd716f5ef41a0ad8163653fa139981b5283e7ba0", "plugins/aidd-async-dev/skills/03-review/evals/scenarios.json": "562d462eedcb589487585a6840d3077a8cce760ea4ecd5e416a8a01b8472d995", "plugins/aidd-async-dev/skills/03-review/actions/skills/01-collect-comments.md": "a7494fcd9ec705cf76d36ed9b7ce59b2d9ed6e82ce64084e2ed935d52ab57527", "plugins/aidd-async-dev/skills/03-review/actions/skills/02-detect-stop.md": "b5d40992028d2e0a1d59f31dd699237005ebb51d9c70a648aca7f757f7449659", "plugins/aidd-async-dev/skills/03-review/actions/skills/03-fix-iteration.md": "a3133409542ed6fc8e9b814658be68504e646cc44ed58ca749251c6b6dd45f25", "plugins/aidd-async-dev/skills/03-review/actions/skills/04-finalize.md": "bf01c103e3940fda6fd07092bd35f44993f24cdd25ec7ff5c52004b20a37cb17", - "plugins/aidd-async-dev/skills/02-run/SKILL.md": "ebd6bfaa5c75066b57f65148aae514eb660bb93460897d37272b260b5e2348a0", + "plugins/aidd-async-dev/skills/02-run/SKILL.md": "15c134c0d1a8b5566fdab2272d30a5ed6162395248d6a90a71bc0b481e529656", "plugins/aidd-async-dev/skills/02-run/evals/scenarios.json": "cf78e4c46ac988912a7de98b1a1143c439d3c744bef234d7294f17b4836a84d0", "plugins/aidd-async-dev/skills/02-run/actions/skills/01-poll-ready.md": "38b0767d080c60149fc4dd1b04395c72b6cda204bd2152d2f9be54db814626fd", "plugins/aidd-async-dev/skills/02-run/actions/skills/02-resolve-deps.md": "9ede89ff3396287bde2ed9fed6e8068a8411b9190dc446ec392badaf31a52a5f", @@ -384,7 +384,7 @@ "plugins/aidd-async-dev/skills/02-run/actions/skills/05-delegate-sdlc.md": "3142a7d2ee15d1871fecc1b4977ff3fb43b9a343f25913a54cc943d9fab31a7c", "plugins/aidd-async-dev/skills/02-run/actions/skills/06-write-audit.md": "3cfbabf8f6c6e267994afcf189d17234eac4c3bb35ab68408776f1acb644b6ba", "plugins/aidd-async-dev/skills/02-run/actions/skills/07-emit-webhook.md": "4c8fe76bdf265386247a636dafc9365946114afa54c479ef13abfd929d7af3db", - "plugins/aidd-async-dev/skills/01-setup/SKILL.md": "5be35bde964ef4cc7b05be341984d478bfdb66ff5c30ff806a7e3715fb3bb900", + "plugins/aidd-async-dev/skills/01-setup/SKILL.md": "a0164200c439431091bd4a682440b8f3e2bf4bbb97081548a25f3e463a8405bc", "plugins/aidd-async-dev/skills/01-setup/references/auth-modes.md": "4122f895e4b210fce0e8f4cac81a79f6711eca56edac02ac43235359a77c2f62", "plugins/aidd-async-dev/skills/01-setup/evals/scenarios.json": "79b49984a0999a3f34348bedbf8e7fe815ebdddf825701fabfedbe39f7a1ede2", "plugins/aidd-async-dev/skills/01-setup/assets/config-template.json": "d47d1d93014157d525f48f3c96626472d940fafffc0deb106af2371db97b4e83", @@ -411,10 +411,10 @@ "plugins/aidd-vcs/skills/03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", "plugins/aidd-vcs/skills/02-pull-request/SKILL.md": "cea82673d19b5a77d2fbbb60c6961802b3cd3c04fd098da0ab32ed6ef5e596d7", "plugins/aidd-vcs/skills/02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", "plugins/aidd-vcs/skills/02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", "plugins/aidd-vcs/skills/01-commit/SKILL.md": "9d4fb8c3091dbc72e77bb8be77e8842d1204add3589e8dffccebb36ec5e5d680", "plugins/aidd-vcs/skills/01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -530,17 +530,17 @@ "plugins/aidd-context/skills/02-project-init/SKILL.md": "771551e0929afbf631088e98e4d0ddc267b1ef87e393381e493171c599a50762", "plugins/aidd-context/skills/02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", "plugins/aidd-context/skills/02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", "plugins/aidd-context/skills/02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", "plugins/aidd-context/skills/02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -611,10 +611,10 @@ "plugins/aidd-vcs/skills/03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", "plugins/aidd-vcs/skills/02-pull-request/SKILL.md": "cea82673d19b5a77d2fbbb60c6961802b3cd3c04fd098da0ab32ed6ef5e596d7", "plugins/aidd-vcs/skills/02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + "plugins/aidd-vcs/skills/02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", "plugins/aidd-vcs/skills/02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + "plugins/aidd-vcs/skills/02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", "plugins/aidd-vcs/skills/02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", "plugins/aidd-vcs/skills/01-commit/SKILL.md": "9d4fb8c3091dbc72e77bb8be77e8842d1204add3589e8dffccebb36ec5e5d680", "plugins/aidd-vcs/skills/01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -730,17 +730,17 @@ "plugins/aidd-context/skills/02-project-init/SKILL.md": "771551e0929afbf631088e98e4d0ddc267b1ef87e393381e493171c599a50762", "plugins/aidd-context/skills/02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", "plugins/aidd-context/skills/02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", "plugins/aidd-context/skills/02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - "plugins/aidd-context/skills/02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", "plugins/aidd-context/skills/02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", "plugins/aidd-context/skills/02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + "plugins/aidd-context/skills/02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", "plugins/aidd-context/skills/02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -813,10 +813,10 @@ ".claude/skills/aidd-vcs-03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", ".claude/skills/aidd-vcs-02-pull-request/SKILL.md": "80c8d4f2dc28e4d1b67d418c12a865ba74ffc8b57720eb05bdf1e1fca3b82a6a", ".claude/skills/aidd-vcs-02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - ".claude/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - ".claude/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".claude/skills/aidd-vcs-02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + ".claude/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", ".claude/skills/aidd-vcs-02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + ".claude/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".claude/skills/aidd-vcs-02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", ".claude/skills/aidd-vcs-01-commit/SKILL.md": "1825b3994a89c0394271c3437a772e74892e4bfb5fac9c2dbc90739544404585", ".claude/skills/aidd-vcs-01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -923,17 +923,17 @@ ".claude/skills/aidd-context-02-project-init/SKILL.md": "4bd40beb8290018b6fa58b651d3681e13465b39b84c3e4c0c39964aefcc52002", ".claude/skills/aidd-context-02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", ".claude/skills/aidd-context-02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + ".claude/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".claude/skills/aidd-context-02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", ".claude/skills/aidd-context-02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - ".claude/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".claude/skills/aidd-context-02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", ".claude/skills/aidd-context-02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - ".claude/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + ".claude/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", ".claude/skills/aidd-context-02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -1004,10 +1004,10 @@ ".cursor/skills/aidd-vcs-03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", ".cursor/skills/aidd-vcs-02-pull-request/SKILL.md": "80c8d4f2dc28e4d1b67d418c12a865ba74ffc8b57720eb05bdf1e1fca3b82a6a", ".cursor/skills/aidd-vcs-02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - ".cursor/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - ".cursor/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".cursor/skills/aidd-vcs-02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + ".cursor/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", ".cursor/skills/aidd-vcs-02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + ".cursor/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".cursor/skills/aidd-vcs-02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", ".cursor/skills/aidd-vcs-01-commit/SKILL.md": "1825b3994a89c0394271c3437a772e74892e4bfb5fac9c2dbc90739544404585", ".cursor/skills/aidd-vcs-01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -1114,17 +1114,17 @@ ".cursor/skills/aidd-context-02-project-init/SKILL.md": "4bd40beb8290018b6fa58b651d3681e13465b39b84c3e4c0c39964aefcc52002", ".cursor/skills/aidd-context-02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", ".cursor/skills/aidd-context-02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + ".cursor/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".cursor/skills/aidd-context-02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", ".cursor/skills/aidd-context-02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - ".cursor/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".cursor/skills/aidd-context-02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", ".cursor/skills/aidd-context-02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", ".cursor/skills/aidd-context-02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -1194,10 +1194,10 @@ ".github/skills/aidd-vcs-03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", ".github/skills/aidd-vcs-02-pull-request/SKILL.md": "80c8d4f2dc28e4d1b67d418c12a865ba74ffc8b57720eb05bdf1e1fca3b82a6a", ".github/skills/aidd-vcs-02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - ".github/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - ".github/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".github/skills/aidd-vcs-02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + ".github/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", ".github/skills/aidd-vcs-02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + ".github/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".github/skills/aidd-vcs-02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", ".github/skills/aidd-vcs-01-commit/SKILL.md": "1825b3994a89c0394271c3437a772e74892e4bfb5fac9c2dbc90739544404585", ".github/skills/aidd-vcs-01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -1304,17 +1304,17 @@ ".github/skills/aidd-context-02-project-init/SKILL.md": "4bd40beb8290018b6fa58b651d3681e13465b39b84c3e4c0c39964aefcc52002", ".github/skills/aidd-context-02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", ".github/skills/aidd-context-02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + ".github/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".github/skills/aidd-context-02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", ".github/skills/aidd-context-02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - ".github/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".github/skills/aidd-context-02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", ".github/skills/aidd-context-02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - ".github/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".github/skills/aidd-context-02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", ".github/skills/aidd-context-02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", ".github/skills/aidd-context-02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", ".github/skills/aidd-context-02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", ".github/skills/aidd-context-02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + ".github/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".github/skills/aidd-context-02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", ".github/skills/aidd-context-02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", ".github/skills/aidd-context-02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -1365,8 +1365,8 @@ ".github/skills/aidd-async-dev-01-setup/actions/skills/03-generate-workflow.md": "11f7ec6c03284d0524179f71337691301a6362cf77bf3aa666fe41686b4df40b", ".github/skills/aidd-async-dev-01-setup/actions/skills/04-write-config.md": "eb7ecb812e8bdaaeba2e56c71c77bf8c14fce0a2c44311ff7985444617635dd5", ".github/skills/aidd-async-dev-01-setup/actions/skills/05-bootstrap-labels.md": "f53177ce1c58767f1bdfcfa3e72f7d4cc5e3d4fd782c35c3998815317be108b1", - ".github/hooks/aidd-async-dev.hooks.json": "ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356", - ".github/hooks/aidd-context.hooks.json": "c4ad80f5e74910c21c5eff56753759e6fd619415e5302a4e6a9830d95ad46824", + ".github/hooks/aidd-async-dev.hooks.json": "4b8894d57dfa621e534ef4eb25263e8f00254cbcb4327f1f98796314ac279dde", + ".github/hooks/aidd-context.hooks.json": "35e484606fe0c4a0e8b6f6a106b91fc1bf02dae266efac762446f2d5f8a66da9", ".github/hooks/aidd-context/update_memory.js": "140d7db788452f5f4c32316d522f595a36e06638b19a42d32e42a1a7324b7149", ".github/agents/aidd-async-dev-async-orchestrator.agent.md": "5ca31d8117dcc4800265ab04093432090485fdda1de8a867b29c3d3e55d30e3d", ".github/agents/aidd-dev-implementer.agent.md": "3447d0684155742c21a8692cf95057dd4f90019298e9e5cb6c4e613993393365", @@ -1374,7 +1374,7 @@ ".github/agents/aidd-dev-reviewer.agent.md": "7d501f19569f48a2bfa04e134b26323645ab08987f88ae8a59ed6e65992a9d3d" }, "codex:flat": { - ".codex/config.toml": "9dff38fa8a3a275e73c3a3ee8b8632a6313e6a52f9c43eb79523cb8477191e4e", + ".codex/config.toml": "0ff7327daa069f076fa664ab373dc04730f68692f7f3a8f008ef00479fca382e", ".codex/hooks.json": "f85805f8ed17f990b1d7a2e2f966cb47f46f9bdd21bc8911325df190b7784ea9", ".codex/hooks/aidd-context/update_memory.js": "140d7db788452f5f4c32316d522f595a36e06638b19a42d32e42a1a7324b7149", ".codex/agents/aidd-async-dev-async-orchestrator.toml": "8212b724fdacd2a20f35a2c11782c7d50b717b742f59f1a9ae08c0d831e42b4a", @@ -1392,10 +1392,10 @@ ".agents/skills/aidd-vcs-03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", ".agents/skills/aidd-vcs-02-pull-request/SKILL.md": "80c8d4f2dc28e4d1b67d418c12a865ba74ffc8b57720eb05bdf1e1fca3b82a6a", ".agents/skills/aidd-vcs-02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - ".agents/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - ".agents/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".agents/skills/aidd-vcs-02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + ".agents/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", ".agents/skills/aidd-vcs-02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + ".agents/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".agents/skills/aidd-vcs-02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", ".agents/skills/aidd-vcs-01-commit/SKILL.md": "1825b3994a89c0394271c3437a772e74892e4bfb5fac9c2dbc90739544404585", ".agents/skills/aidd-vcs-01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -1502,17 +1502,17 @@ ".agents/skills/aidd-context-02-project-init/SKILL.md": "4bd40beb8290018b6fa58b651d3681e13465b39b84c3e4c0c39964aefcc52002", ".agents/skills/aidd-context-02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", ".agents/skills/aidd-context-02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + ".agents/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".agents/skills/aidd-context-02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", ".agents/skills/aidd-context-02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - ".agents/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".agents/skills/aidd-context-02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", ".agents/skills/aidd-context-02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - ".agents/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + ".agents/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", ".agents/skills/aidd-context-02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -1577,10 +1577,10 @@ ".opencode/skills/aidd-vcs-03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", ".opencode/skills/aidd-vcs-02-pull-request/SKILL.md": "80c8d4f2dc28e4d1b67d418c12a865ba74ffc8b57720eb05bdf1e1fca3b82a6a", ".opencode/skills/aidd-vcs-02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", - ".opencode/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", - ".opencode/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".opencode/skills/aidd-vcs-02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + ".opencode/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", ".opencode/skills/aidd-vcs-02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + ".opencode/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", ".opencode/skills/aidd-vcs-02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", ".opencode/skills/aidd-vcs-01-commit/SKILL.md": "1825b3994a89c0394271c3437a772e74892e4bfb5fac9c2dbc90739544404585", ".opencode/skills/aidd-vcs-01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", @@ -1687,17 +1687,17 @@ ".opencode/skills/aidd-context-02-project-init/SKILL.md": "4bd40beb8290018b6fa58b651d3681e13465b39b84c3e4c0c39964aefcc52002", ".opencode/skills/aidd-context-02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", ".opencode/skills/aidd-context-02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + ".opencode/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".opencode/skills/aidd-context-02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", ".opencode/skills/aidd-context-02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", - ".opencode/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", ".opencode/skills/aidd-context-02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", ".opencode/skills/aidd-context-02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", - ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", ".opencode/skills/aidd-context-02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", @@ -1752,5 +1752,194 @@ ".opencode/agents/aidd-dev-implementer.md": "4b4fe709e0ed56b097b697a49f6adfc200cccaad36a0e978a12e4f062a3a5e38", ".opencode/agents/aidd-dev-planner.md": "c83648c34068b6fa762fdc6b073e31cb3e9dfe5bd5bf2fd7e2cb4ad3e865feee", ".opencode/agents/aidd-dev-reviewer.md": "30e2dbb93309d23fc99cbce36a4fcfd0b6d76e49c3425979827727327ba697a6" + }, + "kilo:flat": { + "kilo.json": "2a0f1462f19fb169d4258eb3934e64e48a0a5c54dd5ad64ae903ca01b9de6588", + ".kilo/skills/aidd-vcs-04-issue-create/SKILL.md": "3983ed1c71124786fdf737ec5447637a31b1cc146eff43003978cec50c2ddc67", + ".kilo/skills/aidd-vcs-04-issue-create/evals/scenarios.json": "d113c62aae4867e425737948c39c9f687f56c3d37234eca345a2f65f1a234c30", + ".kilo/skills/aidd-vcs-04-issue-create/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", + ".kilo/skills/aidd-vcs-04-issue-create/assets/issue-template.md": "66b4ef6090208512205fce0bb16edbbcf0ffb19009eae76dc317d738c7a10cdc", + ".kilo/skills/aidd-vcs-04-issue-create/actions/01-issue-create.md": "e3f60414fa3ce2d78583e5cb118dad8df956927aa86e2f6e802031a7d742d7ed", + ".kilo/skills/aidd-vcs-03-release-tag/SKILL.md": "0052405cdf2deeb07b123e8f94ee47a2b4ecea6031641315ce71fc6cff3faabb", + ".kilo/skills/aidd-vcs-03-release-tag/evals/scenarios.json": "fdba5d61f815b956512f84baf712cde92be651593282b43ac173b2459ee9eca3", + ".kilo/skills/aidd-vcs-03-release-tag/assets/release-template.md": "bce05178ae5ea7da6c356849ba69eebd249ba344c94a3c571d7d40be9d4e9e27", + ".kilo/skills/aidd-vcs-03-release-tag/actions/01-release-tag.md": "b2f6c6cce5f7c83f83e4b2fd84c7aae3888bdfcd29f1be3d3e2bc362b18eae6b", + ".kilo/skills/aidd-vcs-02-pull-request/SKILL.md": "80c8d4f2dc28e4d1b67d418c12a865ba74ffc8b57720eb05bdf1e1fca3b82a6a", + ".kilo/skills/aidd-vcs-02-pull-request/evals/scenarios.json": "63f63e6b13038672fbe325509deb32a9b25a50a996b687c001dfc74815a0dccd", + ".kilo/skills/aidd-vcs-02-pull-request/assets/branch.md": "92880244478c3e48c4f105e3ab2f9c09850778f84f1e44108ff8e912ccb0bea3", + ".kilo/skills/aidd-vcs-02-pull-request/assets/CONTRIBUTING.md": "1372c7512c02c26e21643ae523a98d7c90ff92c03633532a8c417b4ca8d9e75f", + ".kilo/skills/aidd-vcs-02-pull-request/assets/pull_request.md": "66939eaae42c729f3b05f8dcc2546a1e4227441d9d156d692fc7ced89d07a11f", + ".kilo/skills/aidd-vcs-02-pull-request/assets/README.md": "fb774bb7e5a19a39b21619879ee5045d7b3a0952be3f4b61aea524b93e9c9086", + ".kilo/skills/aidd-vcs-02-pull-request/actions/01-pull-request.md": "3c3753569b5f336e6c53ac8312ba6f9538ccc711e16fb7847ca1ebf04250a790", + ".kilo/skills/aidd-vcs-01-commit/SKILL.md": "1825b3994a89c0394271c3437a772e74892e4bfb5fac9c2dbc90739544404585", + ".kilo/skills/aidd-vcs-01-commit/evals/scenarios.json": "bdefba21f63f7ef737ff3431077278cc45b722e85ba4b66e3a4adf4d34e0b2ff", + ".kilo/skills/aidd-vcs-01-commit/assets/commit-template.md": "b3c392c5c3faecc903bf80eb2bd287d2a02e42d4c3896490a5745d66fca60bf2", + ".kilo/skills/aidd-vcs-01-commit/actions/01-commit.md": "06ded7f8c23e950b3b1a76b0bb89c219d1ca161cb8f9a02e04e8083ad7061dc0", + ".kilo/skills/aidd-refine-03-condense/SKILL.md": "2d6db1071f826db1cf030fb8a34aeaf0adc79884a29750efa9fe378ab12d8593", + ".kilo/skills/aidd-refine-03-condense/references/intensity-levels.md": "8e6aa26fc675a2d30dbb4df13e68d0ce6d2844c88bafd39e0ea3f2945e3276f1", + ".kilo/skills/aidd-refine-03-condense/evals/scenarios.json": "c03016b5e98c5a9a8b6680035bf8ee0f2a75edc5ce33e33cf1e1430cd91f55ec", + ".kilo/skills/aidd-refine-03-condense/actions/01-condense.md": "bffb26d5a306bc90f40614b29ca21e9a2151dc5ba82880c857e29c39486a16fd", + ".kilo/skills/aidd-refine-02-challenge/SKILL.md": "0e05299821bb3e41834cd8ff97ffa23f48342974b4e20c1e9ea59ce83255eed8", + ".kilo/skills/aidd-refine-02-challenge/references/confidence-rubric.md": "714f1bfd0c33f2adf911c93e9bb2f113be9fd29bad07d83e54be293fc44de823", + ".kilo/skills/aidd-refine-02-challenge/evals/scenarios.json": "332403843b5b5d99a9dcb3464f298ca3b7274edbd1b5c337407a4dd977bc19a5", + ".kilo/skills/aidd-refine-02-challenge/actions/01-challenge.md": "6f47920ccec8682708789e07583e32698695f1274bf883757ab13fca6f3e76c0", + ".kilo/skills/aidd-refine-01-brainstorm/SKILL.md": "e29675b330838d6bd843f40c227fd64ae46e9162c3c3b5db4d8695d9f6b38f17", + ".kilo/skills/aidd-refine-01-brainstorm/references/ambiguity-detection.md": "c869338af0d8e0bdde5915000ce44980fef750cc40d070d4055bcba4c1334e0f", + ".kilo/skills/aidd-refine-01-brainstorm/evals/scenarios.json": "c6858f3b6b8efa666e2c7f21f4325f5e57297e3fdfc475b836f3ce5de9d635bf", + ".kilo/skills/aidd-refine-01-brainstorm/assets/question-templates.md": "bd744429e69f26caf37359e2b1d1c38dc4faba1a2c54dfaa99bfde48da0dc3c8", + ".kilo/skills/aidd-refine-01-brainstorm/actions/01-capture-request.md": "bc133963be4eeb68d6653a65f88f2e1820d711d6d7bf74b79a6225fff7b8e6c8", + ".kilo/skills/aidd-refine-01-brainstorm/actions/02-ask-probing-questions.md": "d8a25b7e2c0861bc4bce878e7d10dcda279855fa0db06d1997ad84f3e5682d54", + ".kilo/skills/aidd-refine-01-brainstorm/actions/03-integrate-answers.md": "b6f2c34f4f03cca48e83ed6fff5936e8ddbecae5fef1f597e99fd764e13f32cd", + ".kilo/skills/aidd-refine-01-brainstorm/actions/04-refine-and-validate.md": "4a6368a3e189c3022f133050f996eda3d9195281a3e4bbabdd120f5b8b414c3c", + ".kilo/skills/aidd-refine-01-brainstorm/actions/05-confirm-approval.md": "3c6c8184910a210bb6698c2c010aebec88a28313b31bbed0ef9c1189530cd6fe", + ".kilo/skills/aidd-pm-05-spec/SKILL.md": "32a14c6e9b275630363a0cca29ebd3c6c35271fa38be9eb79cc0e41e8e6e478b", + ".kilo/skills/aidd-pm-05-spec/assets/spec-template.md": "2f7e446c4ec58d05a471212e9ab3ba64395bdd059943620d02bf1bf5c98777c2", + ".kilo/skills/aidd-pm-05-spec/assets/spec-validator.yml": "2358c6f0baa5656ddcff9410149cf8261d54199d8722f77769f76ca0d7c8cf18", + ".kilo/skills/aidd-pm-04-clarity/SKILL.md": "5f50dcfdf1c96f1ce71eed10dd791e1a2945eb9e761e8d42beca3519370ba55b", + ".kilo/skills/aidd-pm-03-prd/SKILL.md": "b3ac6ea89c9642651135cb9f7dea8bdf47fb3bc4ea777216d2f65b5459dd0c6b", + ".kilo/skills/aidd-pm-03-prd/assets/prd-template.md": "af01423720e8c9527ff12a2e9ad1de39c6e63c6569359be08defd0a059aabea9", + ".kilo/skills/aidd-pm-03-prd/assets/task-template.md": "c0069ed2ecce4742629dccd6be709d4e5a71f3db3821310c381c054aeb479289", + ".kilo/skills/aidd-pm-03-prd/actions/01-prd.md": "c0da6597f8c465ad50a17a07543152f53de1fbccc28cd906763d439004084a22", + ".kilo/skills/aidd-pm-02-user-stories-create/SKILL.md": "d95bad3cfd000c1e8dba905a152384320a177f5891bdaa218819ffe55f6ad710", + ".kilo/skills/aidd-pm-02-user-stories-create/assets/user-story-template.md": "59ecd98d00057313414a74a94c19c0f2d167957e1080b880ee68a69a31948320", + ".kilo/skills/aidd-pm-02-user-stories-create/actions/01-create-user-stories.md": "6fad8968a1e787c197764c4a8c09b17c521ae5ea2286a5082addc717bd72b1e6", + ".kilo/skills/aidd-pm-01-ticket-info/SKILL.md": "26e0491f8527a073f6685ffe7c3e15a22f230a22837aea92694d34a7a2f2f29d", + ".kilo/skills/aidd-pm-01-ticket-info/actions/01-ticket-info.md": "f075ea6ff626534dbe0826d06b67fae93b6488ec4c5c7a3d857f1d05f73d0630", + ".kilo/skills/aidd-dev-08-for-sure/SKILL.md": "07a94d0a975a8b6f4e2be89b3fd9d68b9b71bd9843836c76e1aa074685cc4376", + ".kilo/skills/aidd-dev-08-for-sure/actions/01-init-tracking.md": "3ce6bb19135e5d31c4d2ad1c2151c1563886a611f2399b47624368268a79dcdf", + ".kilo/skills/aidd-dev-08-for-sure/actions/02-auto-accept.md": "235818118c772c0f499ea0668bfbc7bd00c2aae34e6bbd8b13b912fddfa79705", + ".kilo/skills/aidd-dev-08-for-sure/actions/03-autonomous-loop.md": "b19d4520ad716def3c2a4611c37725cba9af713cd4bcb668c237e874e1e43843", + ".kilo/skills/aidd-dev-07-debug/SKILL.md": "860f4137ca48a43470d52f76ae8e631204e5fd7dd82a661905d40bd583bf56fc", + ".kilo/skills/aidd-dev-07-debug/references/mermaid-conventions.md": "85826285744909dd4c4706b82f0dbeff4f88a8f191cb22d538aa12c3c96365eb", + ".kilo/skills/aidd-dev-07-debug/assets/task-template.md": "c0069ed2ecce4742629dccd6be709d4e5a71f3db3821310c381c054aeb479289", + ".kilo/skills/aidd-dev-07-debug/actions/01-reproduce.md": "7e902e5aadc9162b444b341deb33f2a683000c1cc4722ad856496f9d740ec17d", + ".kilo/skills/aidd-dev-07-debug/actions/02-debug.md": "dc3900ce6fb76074b88034d7b7316f4051d78a1828caa3acef9786e8ea582b18", + ".kilo/skills/aidd-dev-07-debug/actions/03-reflect-issue.md": "3d5f18634618737870da4c783c7525cee25e09d942faee80125dd7536978ce12", + ".kilo/skills/aidd-dev-06-refactor/SKILL.md": "6fbf8c363728a11288c58f6967d36845aa4709a9a69a62bd6c6d9ca6d39135ba", + ".kilo/skills/aidd-dev-06-refactor/actions/01-performance.md": "1f7d500967de58875aeb14b732a1af377b17edff8654f4365b3f29743debb3c7", + ".kilo/skills/aidd-dev-06-refactor/actions/02-security.md": "db55b81ab824d81b765189296deb1ce31fdb134edac186baf22a2c3bb1cde938", + ".kilo/skills/aidd-dev-05-test/SKILL.md": "131c810499c0673ace51a2385640dc533203ca89560f72a381bef4a2abf9d388", + ".kilo/skills/aidd-dev-05-test/actions/01-test.md": "f6db9653cd29729c51653df7afe473fae4ae45bb126a694a367bfd84fa1785a4", + ".kilo/skills/aidd-dev-05-test/actions/02-test-journey.md": "1eeb85da69abc3f1fc3e5671e83962f44fcb5686d9ca5972eeb2ba4cab31306d", + ".kilo/skills/aidd-dev-04-review/SKILL.md": "87b2de872bd37fa19b12f458f6c30d60ca65de8ce2988dc63d0811cdec4720cc", + ".kilo/skills/aidd-dev-04-review/assets/code-review-template.md": "e270c4b6b8c69e4fbbbcc08c2f91cc9a09fc8ad155b6f52cec3e3d34a262324d", + ".kilo/skills/aidd-dev-04-review/assets/review-functional-template.md": "a84b48347caf4d09d84994b07329e4d05c8053d45630b37d47ca3ccb386e3146", + ".kilo/skills/aidd-dev-04-review/assets/review-template.md": "b0ad0ab703e4d9ed960bd324bc37efe5f682cbcd40ed6293791d9074f174201c", + ".kilo/skills/aidd-dev-04-review/actions/01-review-code.md": "8d5e4fc6c9243a83025961ae40146f1d96f321d9ff4d93ab74c370bbc53c18ed", + ".kilo/skills/aidd-dev-04-review/actions/02-review-functional.md": "9e5d837715f5610a42f1c294b0fa71277538e2629dc47cf09675487dcfa98324", + ".kilo/skills/aidd-dev-03-audit/SKILL.md": "da84a82a3446283034f26ad5a335d7f8a48ecd501c254af2f4ddaccd09cd4e0f", + ".kilo/skills/aidd-dev-03-audit/actions/01-audit.md": "0371ae3d0c9a383f8b90657f3381717f323742bad922df2c1c508f6db013267e", + ".kilo/skills/aidd-dev-02-assert/SKILL.md": "a75c5fe87f257fe476129d8eb5b89267df6563924e5c84bb4ea6c1d7215b14ad", + ".kilo/skills/aidd-dev-02-assert/assets/task-template.md": "c0069ed2ecce4742629dccd6be709d4e5a71f3db3821310c381c054aeb479289", + ".kilo/skills/aidd-dev-02-assert/actions/01-assert.md": "b8a9680e7cf956f2e1ff7720f755586e2523d6951c35ec686ded659f7fa3a4b1", + ".kilo/skills/aidd-dev-02-assert/actions/02-assert-architecture.md": "e5d7effa39f33c045e4d605ed909d46ddf7562e2a0199eb2e39fcc8f3fc92620", + ".kilo/skills/aidd-dev-02-assert/actions/03-assert-frontend.md": "ed9751b32580c7fd3fbe02a8205cbb5d85a8e7bc38f982b5130b810950bbd091", + ".kilo/skills/aidd-dev-01-plan/SKILL.md": "272aaa80349b438a1536c78e91d5c55c1ef26b65f942caa1c47edc062e0591c9", + ".kilo/skills/aidd-dev-01-plan/references/mermaid-conventions.md": "85826285744909dd4c4706b82f0dbeff4f88a8f191cb22d538aa12c3c96365eb", + ".kilo/skills/aidd-dev-01-plan/assets/master-plan-template.md": "f793f2bc8fad34f056e824def49527552f50cf12e43f0929731d64278376b822", + ".kilo/skills/aidd-dev-01-plan/assets/plan-template.md": "cf462e831d994230c811c71eaa72a8f9880536ba3b657b70342083dee00ab254", + ".kilo/skills/aidd-dev-01-plan/assets/tech-choice-template.md": "c9f16f9b598aded5953127b4bf2768b95d7abda0b75d937e0b31dfee9317c40a", + ".kilo/skills/aidd-dev-01-plan/actions/01-plan.md": "c480fc1cffe39f117003b5aeea23e10f808952a0eeea067dbc0ab44c0af992ff", + ".kilo/skills/aidd-dev-01-plan/actions/02-components-behavior.md": "cacb673334d8947c3c252feaaf0ef50c269c06c5cf8f51b45663cbd42402e094", + ".kilo/skills/aidd-dev-01-plan/actions/03-image-extract-details.md": "6f6cddd0893888c71b0aed5ecfe48217afe0eef10feec6415db433bfcc69f8e3", + ".kilo/skills/aidd-dev-00-sdlc/SKILL.md": "34964c02e338adbf393c25abc4f5862e28452f874c7640f85c950e170130c17c", + ".kilo/skills/aidd-context-06-discovery/SKILL.md": "45cf7373cddfe1614b6edba32b36a9411d9136b8eab29a3ae9b43dab7ee4e912", + ".kilo/skills/aidd-context-06-discovery/actions/01-find-skill.md": "600caf7822017bfe75d40773e1673ada784227b98f5b88d4ba98a57822fa0dcf", + ".kilo/skills/aidd-context-05-learn/SKILL.md": "9ca8b41c8a8fac66d943ad1658ae7a2f374373d13a8a2edd66e1f7fd058694de", + ".kilo/skills/aidd-context-05-learn/assets/adr-template.md": "1f9feb18109b178226885ab7edabc3d1c4dd2a77dd1fa7345be856643107ac16", + ".kilo/skills/aidd-context-05-learn/assets/decision-template.md": "1e6229157fd0a07c090ce0bd159336a13554975e146966b306bf25665a179938", + ".kilo/skills/aidd-context-05-learn/actions/01-learn.md": "92400bfcc2cdfe9f0bad8f2feadd7d28dce882240fe58971d25dfa880521d8bb", + ".kilo/skills/aidd-context-04-mermaid/SKILL.md": "d25ac37dc7e065a1bf6eafc5a49dfaef14af85cb947e26095d6b376a32c3b416", + ".kilo/skills/aidd-context-04-mermaid/references/mermaid-conventions.md": "85826285744909dd4c4706b82f0dbeff4f88a8f191cb22d538aa12c3c96365eb", + ".kilo/skills/aidd-context-04-mermaid/actions/01-mermaid.md": "f70b18f429701d0c3b46a4c6e75153c732ee9e06a16aa01efec05e810ac7a6dd", + ".kilo/skills/aidd-context-03-context-generate/SKILL.md": "e0f9b6c4a2eadc331c5611e1cc18c74d10633e94180bf56a6fee5aed6f984f07", + ".kilo/skills/aidd-context-03-context-generate/references/agents-coordination.md": "eaaa31ed554a53f7870151307853e1add7e3ddd1de8e442b8d5e7c5698ab0098", + ".kilo/skills/aidd-context-03-context-generate/references/ai-mapping.md": "4ad192b5ae53c7ceadff165a1cef8c3f24949498375bedc0cc359194dea3117e", + ".kilo/skills/aidd-context-03-context-generate/references/naming-conventions.md": "fd39d00b1449f0770ee89aad9f6e84d21e1fee2efc0ff547a240b0e18f648cd8", + ".kilo/skills/aidd-context-03-context-generate/references/rule-structure.md": "c8ce6eea6dbaae5309a77237d702db193a7748db5c581d0918f17db3989e414f", + ".kilo/skills/aidd-context-03-context-generate/references/rule-writing.md": "e4cddd88dca3162d576a1b616c419f5ff2f3b7681a09a569da68358f3713c9e6", + ".kilo/skills/aidd-context-03-context-generate/references/skill-structure.md": "2b6114ff8aa30f1a5d7bfd3bf0d7d87e429cb8d65ba13b369e6cdc9c8bec501c", + ".kilo/skills/aidd-context-03-context-generate/evals/scenarios.json": "db355f13f2ca3499f912f39ada136472f9bc993846564aeaeb6eab371d485520", + ".kilo/skills/aidd-context-03-context-generate/assets/skills/action-template.md": "8bd80e05dcbb10e24adb668778fd9dfb058c92193c52c6012e9f5cc11305103c", + ".kilo/skills/aidd-context-03-context-generate/assets/skills/evals-template.md": "c0468fe9869895b42f7a59b48f7613ca4ef3b1af93acb7c41dc063559964ff27", + ".kilo/skills/aidd-context-03-context-generate/assets/skills/skill-template.md": "f30bc5a47574cc85dc0daddfa1abd0d7f8bd8a39e201fbb3df5784506a61b13a", + ".kilo/skills/aidd-context-03-context-generate/assets/rules/rule-template.md": "200ec56d8ed43acd51b94df783f7de9236b00a6e5398a98a30640d02edb76ba1", + ".kilo/skills/aidd-context-03-context-generate/assets/agents/agent-template.md": "476802721ac4947d741b4bd17626860c4914037992a2ebf0ef282553f819aa25", + ".kilo/skills/aidd-context-03-context-generate/actions/skills/01-capture-intent.md": "850c9b7dab101eba66284950eb3b8b612aca3ad40a1b13fcdc5ac181d1f72069", + ".kilo/skills/aidd-context-03-context-generate/actions/skills/02-design-evals.md": "fc51fb2c85a7462fe27586ddc3cc5c2699214dcd059c28f7ab8daf26a6479ced", + ".kilo/skills/aidd-context-03-context-generate/actions/skills/03-decompose-actions.md": "8bf7ff1ac05d968fc7a3e9b6aa5de3df3be04b07e96517cbe06268baec4151fc", + ".kilo/skills/aidd-context-03-context-generate/actions/skills/04-draft-skill.md": "08946a56b720408bee9c63cd7141e6c869e6818610546f8a42628fe6d2e12514", + ".kilo/skills/aidd-context-03-context-generate/actions/skills/05-write-actions.md": "948ac436af5e9c9e897b8c4e44b12a278943bff2b93afc10b4ddaee587d58cc5", + ".kilo/skills/aidd-context-03-context-generate/actions/skills/06-validate.md": "658c1077b03c461bb0c3fa17db047e4d2fbc3874f4d4fbd2e3dc5df606aa03ee", + ".kilo/skills/aidd-context-03-context-generate/actions/rules/01-generate-rules.md": "855b9adf65b0b0cc31ca15c68b8ac37da6a816c9a6416fbc3aea424cffa238c3", + ".kilo/skills/aidd-context-03-context-generate/actions/agents/01-generate-agent.md": "3dce30335eba1d60c5a62d43184d133eed621bbc344e9277ab0f05ead443e0ba", + ".kilo/skills/aidd-context-02-project-init/SKILL.md": "4bd40beb8290018b6fa58b651d3681e13465b39b84c3e4c0c39964aefcc52002", + ".kilo/skills/aidd-context-02-project-init/references/mapping-ai-context-file.md": "cf251454634037d4affd1d27cee2593c555dfe29305b521d3bed4564f4cad273", + ".kilo/skills/aidd-context-02-project-init/assets/AGENTS.md": "8b3d349220e9f96b45dedf316eeb2b3418666d96d0a4f64d315cadfc9ef337ae", + ".kilo/skills/aidd-context-02-project-init/assets/golden-principles.md": "e83c582a9e1477a42531734deed90061f4e004ea28e1b1616bf714070856c888", + ".kilo/skills/aidd-context-02-project-init/assets/GUIDELINES.md": "bf41995402b46268ba53ceec41be00c455004603f69035349b6ff3bef14cc18a", + ".kilo/skills/aidd-context-02-project-init/assets/README.md": "575086cda27a386806a28c1bb4865cb5f974dc3fe6e39ca8bdd2c19764cf2059", + ".kilo/skills/aidd-context-02-project-init/assets/templates/workflows/README.md": "33d50760dfde22feb8878cf3e24d399a748eef8ed2df630f465d673d9f125a53", + ".kilo/skills/aidd-context-02-project-init/assets/templates/stack/README.md": "8dbccfc7d47424411b7725374247b50973a962fff777b272a23109b7e0f2a099", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/architecture.md": "f00c02db4135a43e99f5bdd7888f40f290e39dd4a65bb1539eca9a06c9873427", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/codebase-map.md": "5d1d184bc70c93e0073cb64312f4fa8d50fcf465b0da982f37bde25d624a5386", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/coding-assertions.md": "2e3d7b16f85e8af3cf9971c3b0c23409653e8d693c969ff11892c5a4f10bea90", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/deployment.md": "361e80ebbddda1f0497856530e7a5a35cd2c8ae56df2a6ef64268657de333d28", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/project-brief.md": "0240ee41e05c6091bd136b7c3b18f603731128941c987449917886b191e38e90", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/README.md": "66e6275cd7e7187ca520ad8f2f3c57ebecf967742901e00085c139fd9eea5892", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/testing.md": "760e58855270ee9210b20987b3f01b537b25f6108f8d164e2a88000f4cb278b7", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/vcs.md": "3eccc51898b8c0c17245a737c9fa540f30706676ea01ff771d6898f3861060f1", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/frontend/browsing.md": "f8ab234ba45571979a5dbc2181859a8f6859cd56c9d86371560516b3323dd8a1", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/frontend/design.md": "edcaa8ab125acd64d330a32abac102fa3d0b37b45ef03a9552c71c885c1ea847", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/frontend/forms.md": "662dd1b62a9d3fef587cf38f1c2f6fe3de2d0cb226a9ec50dd7b576bf824115b", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/backend/api-docs.md": "09b9633c1d8c3b5a11bf0d171abf148bf159836ae96223a78a52b9e56ffb52e8", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/backend/backend-communication.md": "87d548e12bed0fa2a2d7601fe1c36d810f40051abd713cc3d4462582319babde", + ".kilo/skills/aidd-context-02-project-init/assets/templates/memory/backend/database.md": "899ceb107598c8b9a1adc3ff7cf8b6217e4582553f5c27f3e22b9e7fb0f555b9", + ".kilo/skills/aidd-context-02-project-init/actions/01-init-context-file.md": "33c907084418ec22f8c22381fbefecfbf3d88c250781c852059bf611be0f2ae2", + ".kilo/skills/aidd-context-02-project-init/actions/02-scaffold-docs.md": "c07f175692241d477b029441a2a984c2fff6de0041ff6f47a6851d73900a1ac3", + ".kilo/skills/aidd-context-02-project-init/actions/03-generate-memory.md": "f7cde767985a1d7ca8c2d74c1ffcc11eac2232a97e26b46573533eefcdd5ac96", + ".kilo/skills/aidd-context-02-project-init/actions/04-review-memory.md": "211ad0ad0d7c4925acbd8a41f775a16b09de51b85d9f3fc6f972170ac63fd353", + ".kilo/skills/aidd-context-02-project-init/actions/05-init-rules-skeleton.md": "12924f4535c083e114a5a4a4ef148e4aa2c8c4c436d23c8f50e152f869e3be2c", + ".kilo/skills/aidd-context-02-project-init/actions/06-sync-memory.md": "3f6825c8d230cea72f729aee15cf6136b613b7a9b07ddec237b91fe5ad3be59b", + ".kilo/skills/aidd-context-01-bootstrap/SKILL.md": "be11990b997d32ff2acb7c49eba7d63899ffbe161827e4c25d330debace71805", + ".kilo/skills/aidd-context-01-bootstrap/references/stack-heuristics.md": "17f7c0df7b19090f42c26ddf70df1049897b3973d9c1bf8df358b87a1cc9985a", + ".kilo/skills/aidd-context-01-bootstrap/evals/scenarios.json": "c5998a91c584d561618dbabe66f21bd8f446260731778de4f467a70a6da21784", + ".kilo/skills/aidd-context-01-bootstrap/assets/checklist.md": "64b84a7712ca78bc1901d2c78c183310336a4abe1b5890a689c3cf166b026d21", + ".kilo/skills/aidd-context-01-bootstrap/assets/install-template.md": "cd67115a7b11fddea0258810b9cee1d35c3e12840f515c5364fa769cad9d6a60", + ".kilo/skills/aidd-context-01-bootstrap/actions/01-gather-needs.md": "b3251034285434b06775ab4a59ffe27259bb23cb97ac65927c946a4846ea946d", + ".kilo/skills/aidd-context-01-bootstrap/actions/02-propose-candidates.md": "57376071d9d0b011c5f19ba218a3ef28c3bf1fba1220a87260806a2d79e341d6", + ".kilo/skills/aidd-context-01-bootstrap/actions/03-audit-candidates.md": "def30caedeca0babb4500b2081fe46bdcaf72ee911e4ad94ae860b068c2ee0e0", + ".kilo/skills/aidd-context-01-bootstrap/actions/04-pick-and-design.md": "1444ede4a16e6df368792d7f214e0bb61912621a9c266205e031ec73151606e7", + ".kilo/skills/aidd-context-01-bootstrap/actions/05-write-install-md.md": "c94afb152683cc29f10d2d4451632265b7fdc763a8a41b69f8ddc2c00b81dfd0", + ".kilo/skills/aidd-async-dev-03-review/SKILL.md": "12577d34b7e03ac89407075bbeb998925e9d1043620913767d390d1153151e39", + ".kilo/skills/aidd-async-dev-03-review/references/stop-conditions.md": "47280ec7ebb0bd2d25bb7bf7dd716f5ef41a0ad8163653fa139981b5283e7ba0", + ".kilo/skills/aidd-async-dev-03-review/evals/scenarios.json": "562d462eedcb589487585a6840d3077a8cce760ea4ecd5e416a8a01b8472d995", + ".kilo/skills/aidd-async-dev-03-review/actions/skills/01-collect-comments.md": "a7494fcd9ec705cf76d36ed9b7ce59b2d9ed6e82ce64084e2ed935d52ab57527", + ".kilo/skills/aidd-async-dev-03-review/actions/skills/02-detect-stop.md": "b5d40992028d2e0a1d59f31dd699237005ebb51d9c70a648aca7f757f7449659", + ".kilo/skills/aidd-async-dev-03-review/actions/skills/03-fix-iteration.md": "a3133409542ed6fc8e9b814658be68504e646cc44ed58ca749251c6b6dd45f25", + ".kilo/skills/aidd-async-dev-03-review/actions/skills/04-finalize.md": "bf01c103e3940fda6fd07092bd35f44993f24cdd25ec7ff5c52004b20a37cb17", + ".kilo/skills/aidd-async-dev-02-run/SKILL.md": "63fa98e5a2e3baaa8a4b1e55fa894f4d98fe47e4dbdc0ae5be2c6c5d7f894e01", + ".kilo/skills/aidd-async-dev-02-run/evals/scenarios.json": "cf78e4c46ac988912a7de98b1a1143c439d3c744bef234d7294f17b4836a84d0", + ".kilo/skills/aidd-async-dev-02-run/actions/skills/01-poll-ready.md": "38b0767d080c60149fc4dd1b04395c72b6cda204bd2152d2f9be54db814626fd", + ".kilo/skills/aidd-async-dev-02-run/actions/skills/02-resolve-deps.md": "9ede89ff3396287bde2ed9fed6e8068a8411b9190dc446ec392badaf31a52a5f", + ".kilo/skills/aidd-async-dev-02-run/actions/skills/03-acquire-lock.md": "0a9b54f4bc9ebdb653932b57bd9d61e9ee7248d86104bc95841617beb4eeeee5", + ".kilo/skills/aidd-async-dev-02-run/actions/skills/04-check-sdlc.md": "1934b9f0fb5824736349070ceca67105892ef7e4f319ca95ae955f564e821633", + ".kilo/skills/aidd-async-dev-02-run/actions/skills/05-delegate-sdlc.md": "3142a7d2ee15d1871fecc1b4977ff3fb43b9a343f25913a54cc943d9fab31a7c", + ".kilo/skills/aidd-async-dev-02-run/actions/skills/06-write-audit.md": "3cfbabf8f6c6e267994afcf189d17234eac4c3bb35ab68408776f1acb644b6ba", + ".kilo/skills/aidd-async-dev-02-run/actions/skills/07-emit-webhook.md": "4c8fe76bdf265386247a636dafc9365946114afa54c479ef13abfd929d7af3db", + ".kilo/skills/aidd-async-dev-01-setup/SKILL.md": "ce55273c1d1109267f8725edfeb654df9ad4c84e9055998b0e29f9817c6befa3", + ".kilo/skills/aidd-async-dev-01-setup/references/auth-modes.md": "4122f895e4b210fce0e8f4cac81a79f6711eca56edac02ac43235359a77c2f62", + ".kilo/skills/aidd-async-dev-01-setup/evals/scenarios.json": "79b49984a0999a3f34348bedbf8e7fe815ebdddf825701fabfedbe39f7a1ede2", + ".kilo/skills/aidd-async-dev-01-setup/assets/config-template.json": "d47d1d93014157d525f48f3c96626472d940fafffc0deb106af2371db97b4e83", + ".kilo/skills/aidd-async-dev-01-setup/assets/workflow-template.yml": "203382209de920a9405b85cc89817ddf0f731a7604e8a465fc4fb3c32589d168", + ".kilo/skills/aidd-async-dev-01-setup/actions/skills/01-detect-context.md": "83f3ba3022dd75fa2597a872a55e8f75173762f932ed39ae73d8181c0b1b4536", + ".kilo/skills/aidd-async-dev-01-setup/actions/skills/02-ask-config.md": "986335d1e86a633d0083fe4488aae58266a82ec35d0cdb0b74f0bbcea70e6f4e", + ".kilo/skills/aidd-async-dev-01-setup/actions/skills/03-generate-workflow.md": "11f7ec6c03284d0524179f71337691301a6362cf77bf3aa666fe41686b4df40b", + ".kilo/skills/aidd-async-dev-01-setup/actions/skills/04-write-config.md": "eb7ecb812e8bdaaeba2e56c71c77bf8c14fce0a2c44311ff7985444617635dd5", + ".kilo/skills/aidd-async-dev-01-setup/actions/skills/05-bootstrap-labels.md": "f53177ce1c58767f1bdfcfa3e72f7d4cc5e3d4fd782c35c3998815317be108b1", + ".kilo/agents/aidd-async-dev-async-orchestrator.md": "3eb709fb7da8f6df7d4d76c7c69fce0a00b596d7b9522b5dcf3898c7a94d91cf", + ".kilo/agents/aidd-dev-implementer.md": "4b4fe709e0ed56b097b697a49f6adfc200cccaad36a0e978a12e4f062a3a5e38", + ".kilo/agents/aidd-dev-planner.md": "c83648c34068b6fa762fdc6b073e31cb3e9dfe5bd5bf2fd7e2cb4ad3e865feee", + ".kilo/agents/aidd-dev-reviewer.md": "30e2dbb93309d23fc99cbce36a4fcfd0b6d76e49c3425979827727327ba697a6" } } diff --git a/cli/tests/helpers/ports/build-unit-deps.ts b/cli/tests/helpers/ports/build-unit-deps.ts index 0f3b7f045..86c903cd7 100644 --- a/cli/tests/helpers/ports/build-unit-deps.ts +++ b/cli/tests/helpers/ports/build-unit-deps.ts @@ -4,6 +4,7 @@ import "../../../src/domain/tools/ai/claude.js"; import "../../../src/domain/tools/ai/codex.js"; import "../../../src/domain/tools/ai/copilot.js"; import "../../../src/domain/tools/ai/cursor.js"; +import "../../../src/domain/tools/ai/kilo.js"; import "../../../src/domain/tools/ai/opencode.js"; import "../../../src/domain/tools/ide/vscode.js"; import { CLIOutput } from "../../../src/application/output.js"; diff --git a/cli/tests/infrastructure/assets/asset-loader.unit.test.ts b/cli/tests/infrastructure/assets/asset-loader.unit.test.ts index a4806078b..d0062f130 100644 --- a/cli/tests/infrastructure/assets/asset-loader.unit.test.ts +++ b/cli/tests/infrastructure/assets/asset-loader.unit.test.ts @@ -21,6 +21,14 @@ describe("BundledAssetProviderAdapter.loadConfigAsset", () => { }); }); + describe("kilo", () => { + it("returns parsed kilo.json with Kilo's schema and instructions", () => { + const asset = provider.loadConfigAsset("kilo", "kilo.json") as Record; + expect(asset).toHaveProperty("$schema", "https://app.kilo.ai/config.json"); + expect(asset).toHaveProperty("instructions"); + }); + }); + describe("codex", () => { it("returns config.toml as raw string", () => { const asset = provider.loadConfigAsset("codex", "config.toml"); diff --git a/cli/tests/infrastructure/framework-build-registry.unit.test.ts b/cli/tests/infrastructure/framework-build-registry.unit.test.ts index 3a19d3731..3230df3dc 100644 --- a/cli/tests/infrastructure/framework-build-registry.unit.test.ts +++ b/cli/tests/infrastructure/framework-build-registry.unit.test.ts @@ -15,6 +15,7 @@ const ALL_TARGETS: readonly FrameworkBuildTarget[] = [ "copilot", "codex", "opencode", + "kilo", ]; const ALL_MODES: readonly FrameworkBuildMode[] = ["marketplace", "flat"]; diff --git a/docs/FAQ.md b/docs/FAQ.md index 7cb6c08e6..f31d66ed8 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -4,14 +4,14 @@ Most "how do I…" answers live in the README; this page covers what isn't docum ## 🤔 Why AIDD instead of your own skills? -You can write your own Claude Code skills — nothing stops you. AIDD exists because that setup is work every team repeats and re-debugs alone: the router/action split ([Skill](GLOSSARY.md#-skill) glossary entry), the plan → implement → review gating, the plugin packaging and versioning, the multi-tool support (Cursor, Copilot, Codex, OpenCode). AIDD ships that scaffolding pre-built and maintained, so you start from a working SDLC loop and only author the skill content specific to your project. If your workflow doesn't match the framework's shape, [`CREATE_PLUGIN.md`](CREATE_PLUGIN.md) shows how to build on the same scaffolding instead of replacing it. +You can write your own Claude Code skills — nothing stops you. AIDD exists because that setup is work every team repeats and re-debugs alone: the router/action split ([Skill](GLOSSARY.md#-skill) glossary entry), the plan → implement → review gating, the plugin packaging and versioning, the multi-tool support (Cursor, Copilot, Codex, OpenCode, Kilo Code). AIDD ships that scaffolding pre-built and maintained, so you start from a working SDLC loop and only author the skill content specific to your project. If your workflow doesn't match the framework's shape, [`CREATE_PLUGIN.md`](CREATE_PLUGIN.md) shows how to build on the same scaffolding instead of replacing it. ## 📦 Install, update, other tools - **Install / first run** → [Quick start](../README.md#-quick-start). - **Update plugins** → `/plugin marketplace update aidd-framework`, or see [Versioning & updates](MARKETPLACE.md#-versioning--updates). - **Private repo?** Yes — `/plugin marketplace add` just needs GitHub read access (via `gh auth login` or a PAT). -- **Cursor / Copilot / Codex / OpenCode?** Each other tool installs via its own native mechanism (project files, local plugins, or a plugin command) from the [release](https://github.com/ai-driven-dev/framework/releases/latest) archives. Steps per tool → [Other tools](../README.md#other-tools). +- **Cursor / Copilot / Codex / OpenCode / Kilo Code?** Each other tool installs via its own native mechanism (project files, local plugins, or a plugin command) from the [release](https://github.com/ai-driven-dev/framework/releases/latest) archives. Steps per tool → [Other tools](../README.md#other-tools). ## 💸 Cost and quotas diff --git a/docs/MAINTAINERS.md b/docs/MAINTAINERS.md index f7cf44786..4697d1bd6 100644 --- a/docs/MAINTAINERS.md +++ b/docs/MAINTAINERS.md @@ -68,7 +68,7 @@ release-please opens/updates a `chore: release main` PR on each push to `main`. 3. CI tags each bumped package, creates the GitHub Releases, and attaches the bundles: - `aidd-framework-marketplace-X.Y.Z.zip` (`.claude-plugin/` + `plugins/`) - `-vX.Y.Z.zip` - - `aidd-framework---X.Y.Z.zip` - per-tool distributions (9 archives: 4 marketplace claude/cursor/copilot/codex + 5 flat incl. opencode), produced by the `build-per-tool` matrix job in `ci.yml` via `aidd-cli framework build`. **Pinned** to a specific `@ai-driven-dev/cli` version - bump it deliberately when adopting CLI build changes. + - `aidd-framework---X.Y.Z.zip` - per-tool distributions (10 archives: 4 marketplace claude/cursor/copilot/codex + 6 flat incl. opencode and kilo), produced by the `build-per-tool` matrix job in `ci.yml` via `aidd-cli framework build`. **Pinned** to a specific `@ai-driven-dev/cli` version - bump it deliberately when adopting CLI build changes. Versions live in `.release-please-manifest.json`. Forcing a version / pre-release: `release-as` in `release-please-config.json` (remove it after the release ships).