From 3e18641a5fb05095878a444a3490acff17f2c71c Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 12 Feb 2026 09:22:20 +0100 Subject: [PATCH] feat(swarm-extension): moved sources to src and added omp-swarm bin --- bun.lock | 19 +++++++ .../extensions/with-deps/package.json | 28 ++++----- packages/coding-agent/src/index.ts | 3 + packages/omp-extension-swarm/bun.lock | 15 ----- packages/omp-extension-swarm/package.json | 11 ---- packages/omp-extension-swarm/tsconfig.json | 16 ------ .../.gitignore | 0 .../README.md | 57 ++++++++++--------- packages/swarm-extension/package.json | 30 ++++++++++ .../src/cli.ts} | 5 +- .../src}/extension.ts | 4 +- .../src}/swarm/dag.ts | 0 .../src}/swarm/executor.ts | 32 ++++++++--- .../src}/swarm/pipeline.ts | 19 +++---- .../src}/swarm/render.ts | 6 +- .../src}/swarm/schema.ts | 7 +-- .../src}/swarm/state.ts | 0 packages/swarm-extension/tsconfig.json | 8 +++ 18 files changed, 145 insertions(+), 115 deletions(-) delete mode 100644 packages/omp-extension-swarm/bun.lock delete mode 100644 packages/omp-extension-swarm/package.json delete mode 100644 packages/omp-extension-swarm/tsconfig.json rename packages/{omp-extension-swarm => swarm-extension}/.gitignore (100%) rename packages/{omp-extension-swarm => swarm-extension}/README.md (84%) create mode 100644 packages/swarm-extension/package.json rename packages/{omp-extension-swarm/run-pipeline.ts => swarm-extension/src/cli.ts} (96%) rename packages/{omp-extension-swarm => swarm-extension/src}/extension.ts (97%) rename packages/{omp-extension-swarm => swarm-extension/src}/swarm/dag.ts (100%) rename packages/{omp-extension-swarm => swarm-extension/src}/swarm/executor.ts (78%) rename packages/{omp-extension-swarm => swarm-extension/src}/swarm/pipeline.ts (90%) rename packages/{omp-extension-swarm => swarm-extension/src}/swarm/render.ts (91%) rename packages/{omp-extension-swarm => swarm-extension/src}/swarm/schema.ts (95%) rename packages/{omp-extension-swarm => swarm-extension/src}/swarm/state.ts (100%) create mode 100644 packages/swarm-extension/tsconfig.json diff --git a/bun.lock b/bun.lock index b8ca0dc9a..904efcba7 100644 --- a/bun.lock +++ b/bun.lock @@ -144,6 +144,23 @@ "@types/react-dom": "^19.2.3", }, }, + "packages/swarm-extension": { + "name": "@oh-my-pi/swarm-extension", + "version": "11.11.0", + "bin": { + "omp-swarm": "src/cli.ts", + }, + "dependencies": { + "yaml": "^2.7.0", + }, + "devDependencies": { + "@oh-my-pi/pi-coding-agent": "workspace:*", + "@types/bun": "^1.3.9", + }, + "peerDependencies": { + "@oh-my-pi/pi-coding-agent": "^11.11.0", + }, + }, "packages/tui": { "name": "@oh-my-pi/pi-tui", "version": "11.14.2", @@ -333,6 +350,8 @@ "@oh-my-pi/react-edit-benchmark": ["@oh-my-pi/react-edit-benchmark@workspace:packages/react-edit-benchmark"], + "@oh-my-pi/swarm-extension": ["@oh-my-pi/swarm-extension@workspace:packages/swarm-extension"], + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], diff --git a/packages/coding-agent/examples/extensions/with-deps/package.json b/packages/coding-agent/examples/extensions/with-deps/package.json index 1edb82453..347be16b5 100644 --- a/packages/coding-agent/examples/extensions/with-deps/package.json +++ b/packages/coding-agent/examples/extensions/with-deps/package.json @@ -1,16 +1,16 @@ { - "name": "pi-extension-with-deps", - "version": "1.0.0", - "type": "module", - "pi": { - "extensions": [ - "./index.ts" - ] - }, - "dependencies": { - "ms": "^2.1.3" - }, - "devDependencies": { - "@types/ms": "^2.1.0" - } + "name": "pi-extension-with-deps", + "version": "1.0.0", + "type": "module", + "omp": { + "extensions": [ + "./index.ts" + ] + }, + "dependencies": { + "ms": "^2.1.3" + }, + "devDependencies": { + "@types/ms": "^2.1.0" + } } diff --git a/packages/coding-agent/src/index.ts b/packages/coding-agent/src/index.ts index e3acddcbb..4698e38f9 100644 --- a/packages/coding-agent/src/index.ts +++ b/packages/coding-agent/src/index.ts @@ -236,6 +236,9 @@ export { type SessionMessageEntry, type ThinkingLevelChangeEntry, } from "./session/session-manager"; +export { runSubprocess } from "./task/executor"; + +export type { AgentDefinition, AgentProgress, AgentSource, SingleResult, TaskParams } from "./task/types"; // Tools (detail types and utilities) export { type BashToolDetails, diff --git a/packages/omp-extension-swarm/bun.lock b/packages/omp-extension-swarm/bun.lock deleted file mode 100644 index 5bd33faa1..000000000 --- a/packages/omp-extension-swarm/bun.lock +++ /dev/null @@ -1,15 +0,0 @@ -{ - "lockfileVersion": 1, - "configVersion": 1, - "workspaces": { - "": { - "name": "omp-extension-swarm", - "dependencies": { - "yaml": "^2.7.0", - }, - }, - }, - "packages": { - "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], - } -} diff --git a/packages/omp-extension-swarm/package.json b/packages/omp-extension-swarm/package.json deleted file mode 100644 index f16052a83..000000000 --- a/packages/omp-extension-swarm/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "omp-extension-swarm", - "version": "1.0.0", - "type": "module", - "pi": { - "extensions": ["./extension.ts"] - }, - "dependencies": { - "yaml": "^2.7.0" - } -} diff --git a/packages/omp-extension-swarm/tsconfig.json b/packages/omp-extension-swarm/tsconfig.json deleted file mode 100644 index 5582ca890..000000000 --- a/packages/omp-extension-swarm/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "bundler", - "strict": true, - "noEmit": true, - "skipLibCheck": true, - "types": ["bun-types"], - "paths": { - "@oh-my-pi/pi-coding-agent": ["../coding-agent/src/index.ts"], - "@oh-my-pi/pi-coding-agent/*": ["../coding-agent/src/*.ts"] - } - }, - "include": ["extension.ts", "run-pipeline.ts", "swarm/**/*.ts"] -} diff --git a/packages/omp-extension-swarm/.gitignore b/packages/swarm-extension/.gitignore similarity index 100% rename from packages/omp-extension-swarm/.gitignore rename to packages/swarm-extension/.gitignore diff --git a/packages/omp-extension-swarm/README.md b/packages/swarm-extension/README.md similarity index 84% rename from packages/omp-extension-swarm/README.md rename to packages/swarm-extension/README.md index 124132e50..c36812322 100644 --- a/packages/omp-extension-swarm/README.md +++ b/packages/swarm-extension/README.md @@ -9,7 +9,7 @@ Use it for anything: research pipelines, code generation, data processing, conte ## Setup ```bash -cd packages/omp-extension-swarm +cd packages/swarm-extension bun install ``` @@ -19,10 +19,10 @@ bun install ```bash # Foreground — runs until complete, no timeout: -bun packages/omp-extension-swarm/run-pipeline.ts path/to/swarm.yaml +omp-swarm path/to/swarm.yaml # Background — survives terminal close: -nohup bun packages/omp-extension-swarm/run-pipeline.ts path/to/swarm.yaml \ +nohup omp-swarm path/to/swarm.yaml \ > pipeline.log 2>&1 & disown ``` @@ -34,7 +34,7 @@ Register the extension in your config (`~/.omp/config.json` or `.omp/config.json ```json { - "extensions": ["packages/omp-extension-swarm"] + "extensions": ["packages/swarm-extension"] } ``` @@ -76,11 +76,11 @@ Every swarm is a single YAML file with a top-level `swarm` key: ```yaml swarm: - name: my-pipeline # Identifier (state stored in .swarm_/) - workspace: ./workspace # Working directory (relative to YAML file location) - mode: pipeline # pipeline | parallel | sequential - target_count: 10 # Iterations (pipeline mode only, default: 1) - model: claude-opus-4-6 # Model for all agents (optional) + name: my-pipeline # Identifier (state stored in .swarm_/) + workspace: ./workspace # Working directory (relative to YAML file location) + mode: pipeline # pipeline | parallel | sequential + target_count: 10 # Iterations (pipeline mode only, default: 1) + model: claude-opus-4-6 # Model for all agents (optional) agents: first_agent: @@ -97,23 +97,23 @@ swarm: ### Top-Level Fields -| Field | Required | Default | Description | -|-------|----------|---------|-------------| -| `name` | yes | — | Pipeline identifier. State directory is `.swarm_/` | -| `workspace` | yes | — | Shared working directory. Relative paths resolve from YAML file location | -| `mode` | no | `sequential` | Execution mode (see below) | -| `target_count` | no | `1` | How many times to repeat the full pipeline. Only meaningful in `pipeline` mode | -| `model` | no | session default | Model ID for all agents. Any omp-configured model works | +| Field | Required | Default | Description | +| -------------- | -------- | --------------- | ------------------------------------------------------------------------------ | +| `name` | yes | — | Pipeline identifier. State directory is `.swarm_/` | +| `workspace` | yes | — | Shared working directory. Relative paths resolve from YAML file location | +| `mode` | no | `sequential` | Execution mode (see below) | +| `target_count` | no | `1` | How many times to repeat the full pipeline. Only meaningful in `pipeline` mode | +| `model` | no | session default | Model ID for all agents. Any omp-configured model works | ### Agent Fields -| Field | Required | Description | -|-------|----------|-------------| -| `role` | yes | Short role identifier — becomes the agent's system prompt | -| `task` | yes | Complete instructions sent as user prompt. Use YAML `\|` for multi-line | -| `extra_context` | no | Additional text appended to system prompt | -| `reports_to` | no | List of agent names that depend on this agent | -| `waits_for` | no | List of agent names this agent depends on | +| Field | Required | Description | +| --------------- | -------- | ----------------------------------------------------------------------- | +| `role` | yes | Short role identifier — becomes the agent's system prompt | +| `task` | yes | Complete instructions sent as user prompt. Use YAML `\|` for multi-line | +| `extra_context` | no | Additional text appended to system prompt | +| `reports_to` | no | List of agent names that depend on this agent | +| `waits_for` | no | List of agent names this agent depends on | ### Execution Modes @@ -154,7 +154,7 @@ swarm: role: researcher task: | Find ONE new source on the topic defined in workspace/topic.md. - + 1. Read processed.txt to see what's already been found 2. Use web_search to find a new, high-quality source 3. Append the URL to processed.txt @@ -398,6 +398,7 @@ The orchestrator starts and stops agents in the right order. It does **not** pas Design your own protocol. Common patterns: **Signal files** — lightweight status flags an agent writes when done: + ``` signals/finder_out.txt -> "FOUND:https://example.com" signals/analyzer_out.txt -> "DONE:42" @@ -405,6 +406,7 @@ signals/reviewer_out.txt -> "APPROVED" or "REJECTED:reason" ``` **Structured output** — detailed results other agents read: + ``` analyzed/item_1.md -> Full analysis document results/report.json -> Machine-readable data @@ -412,6 +414,7 @@ output/final.docx -> Accumulated deliverable ``` **Tracking files** — prevent duplicate work across pipeline iterations: + ``` processed.txt -> Items already handled (one per line) tracking/count.txt -> Current item counter @@ -445,9 +448,9 @@ Or omit `model` to use your session's default. Check `packages/ai/src/models.jso ## Architecture ``` -extension.ts TUI entry point (registers /swarm command) -run-pipeline.ts Standalone runner (no TUI, no timeout) -swarm/ +src/extension.ts TUI entry point (registers /swarm command) +src/cli.ts Standalone runner (no TUI, no timeout) +src/swarm/ schema.ts YAML parsing + validation dag.ts Dependency graph, cycle detection, topological sort executor.ts Spawns agents via oh-my-pi's runSubprocess diff --git a/packages/swarm-extension/package.json b/packages/swarm-extension/package.json new file mode 100644 index 000000000..6b05fbae6 --- /dev/null +++ b/packages/swarm-extension/package.json @@ -0,0 +1,30 @@ +{ + "name": "@oh-my-pi/swarm-extension", + "version": "11.11.0", + "description": "Swarm orchestration extension for omp", + "type": "module", + "bin": { + "omp-swarm": "src/cli.ts" + }, + "omp": { + "extensions": [ + "./src/extension.ts" + ] + }, + "dependencies": { + "yaml": "^2.7.0" + }, + "peerDependencies": { + "@oh-my-pi/pi-coding-agent": "^11.11.0" + }, + "devDependencies": { + "@oh-my-pi/pi-coding-agent": "workspace:*", + "@types/bun": "^1.3.9" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/can1357/oh-my-pi.git", + "directory": "packages/swarm-extension" + } +} diff --git a/packages/omp-extension-swarm/run-pipeline.ts b/packages/swarm-extension/src/cli.ts similarity index 96% rename from packages/omp-extension-swarm/run-pipeline.ts rename to packages/swarm-extension/src/cli.ts index 1b84025a0..f08dba853 100644 --- a/packages/omp-extension-swarm/run-pipeline.ts +++ b/packages/swarm-extension/src/cli.ts @@ -1,7 +1,8 @@ +#!/usr/bin/env bun /** * Direct pipeline runner — executes a swarm pipeline outside of the TUI. * - * Usage: bun run-pipeline.ts + * Usage: bun cli.ts */ import * as fs from "node:fs/promises"; @@ -17,7 +18,7 @@ import { StateTracker } from "./swarm/state"; const yamlPath = process.argv[2]; if (!yamlPath) { - console.error("Usage: bun run-pipeline.ts "); + console.error("Usage: omp-swarm "); process.exit(1); } diff --git a/packages/omp-extension-swarm/extension.ts b/packages/swarm-extension/src/extension.ts similarity index 97% rename from packages/omp-extension-swarm/extension.ts rename to packages/swarm-extension/src/extension.ts index 22b2ecb3c..a21f3246e 100644 --- a/packages/omp-extension-swarm/extension.ts +++ b/packages/swarm-extension/src/extension.ts @@ -11,7 +11,7 @@ import * as fs from "node:fs/promises"; import * as path from "node:path"; -import type { ExtensionAPI, ExtensionCommandContext } from "@oh-my-pi/pi-coding-agent"; +import type { AuthStorage, ExtensionAPI, ExtensionCommandContext } from "@oh-my-pi/pi-coding-agent"; import { buildDependencyGraph, buildExecutionWaves, detectCycles } from "./swarm/dag"; import { PipelineController } from "./swarm/pipeline"; import { renderSwarmProgress } from "./swarm/render"; @@ -141,7 +141,7 @@ async function handleRun(yamlPath: string, ctx: ExtensionCommandContext, pi: Ext updateWidget(); // 9. Resolve infrastructure for agent execution - let authStorage: Awaited> | undefined; + let authStorage: AuthStorage | undefined; try { authStorage = await pi.pi.discoverAuthStorage(); } catch { diff --git a/packages/omp-extension-swarm/swarm/dag.ts b/packages/swarm-extension/src/swarm/dag.ts similarity index 100% rename from packages/omp-extension-swarm/swarm/dag.ts rename to packages/swarm-extension/src/swarm/dag.ts diff --git a/packages/omp-extension-swarm/swarm/executor.ts b/packages/swarm-extension/src/swarm/executor.ts similarity index 78% rename from packages/omp-extension-swarm/swarm/executor.ts rename to packages/swarm-extension/src/swarm/executor.ts index cc9eb416e..dcd7538ad 100644 --- a/packages/omp-extension-swarm/swarm/executor.ts +++ b/packages/swarm-extension/src/swarm/executor.ts @@ -5,11 +5,16 @@ * Each agent runs in the swarm workspace with its task instructions as the user prompt. */ import * as path from "node:path"; -import type { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage"; -import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry"; -import type { Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; -import { runSubprocess } from "@oh-my-pi/pi-coding-agent/task/executor"; -import type { AgentDefinition, AgentProgress, AgentSource, SingleResult } from "@oh-my-pi/pi-coding-agent/task/types"; +import type { + AgentDefinition, + AgentProgress, + AgentSource, + AuthStorage, + ModelRegistry, + Settings, + SingleResult, +} from "@oh-my-pi/pi-coding-agent"; +import { runSubprocess } from "@oh-my-pi/pi-coding-agent"; import type { SwarmAgent } from "./schema"; import type { StateTracker } from "./state"; @@ -40,7 +45,18 @@ export async function executeSwarmAgent( index: number, options: SwarmExecutorOptions, ): Promise { - const { workspace, swarmName, iteration, modelOverride, signal, onProgress, authStorage, modelRegistry, settings, stateTracker } = options; + const { + workspace, + swarmName, + iteration, + modelOverride, + signal, + onProgress, + authStorage, + modelRegistry, + settings, + stateTracker, + } = options; const agentId = `swarm-${swarmName}-${agent.name}-${iteration}`; @@ -67,7 +83,7 @@ export async function executeSwarmAgent( id: agentId, modelOverride, signal, - onProgress: (progress) => onProgress?.(agent.name, progress), + onProgress: progress => onProgress?.(agent.name, progress), authStorage, modelRegistry, settings, @@ -75,7 +91,7 @@ export async function executeSwarmAgent( artifactsDir: path.join(stateTracker.swarmDir, "context"), }); - const status = result.exitCode === 0 ? "completed" as const : "failed" as const; + const status = result.exitCode === 0 ? ("completed" as const) : ("failed" as const); await stateTracker.updateAgent(agent.name, { status, completedAt: Date.now(), diff --git a/packages/omp-extension-swarm/swarm/pipeline.ts b/packages/swarm-extension/src/swarm/pipeline.ts similarity index 90% rename from packages/omp-extension-swarm/swarm/pipeline.ts rename to packages/swarm-extension/src/swarm/pipeline.ts index 6573ac814..3f175e21e 100644 --- a/packages/omp-extension-swarm/swarm/pipeline.ts +++ b/packages/swarm-extension/src/swarm/pipeline.ts @@ -6,13 +6,10 @@ * - Waves execute sequentially (wave N+1 starts after wave N completes) * - For pipeline mode, iterations repeat the full DAG execution */ -import type { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage"; -import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry"; -import type { Settings } from "@oh-my-pi/pi-coding-agent/config/settings"; -import type { AgentProgress, AgentSource, SingleResult } from "@oh-my-pi/pi-coding-agent/task/types"; +import type { AgentSource, AuthStorage, ModelRegistry, Settings, SingleResult } from "@oh-my-pi/pi-coding-agent"; +import { executeSwarmAgent } from "./executor"; import type { SwarmDefinition } from "./schema"; import type { StateTracker } from "./state"; -import { executeSwarmAgent } from "./executor"; // ============================================================================ // Types @@ -80,9 +77,7 @@ export class PipelineController { } await this.#stateTracker.updatePipeline({ iteration }); - await this.#stateTracker.appendOrchestratorLog( - `--- Iteration ${iteration + 1}/${targetCount} ---`, - ); + await this.#stateTracker.appendOrchestratorLog(`--- Iteration ${iteration + 1}/${targetCount} ---`); const emitProgress = (currentWave: number) => { onProgress?.({ @@ -106,12 +101,14 @@ export class PipelineController { for (const [agentName, result] of iterationResults) { allResults.get(agentName)!.push(result); if (result.exitCode !== 0) { - errors.push(`${agentName} (iteration ${iteration + 1}): ${result.error || "exit code " + result.exitCode}`); + errors.push( + `${agentName} (iteration ${iteration + 1}): ${result.error || `exit code ${result.exitCode}`}`, + ); } } } - const status = errors.length > 0 ? "failed" as const : "completed" as const; + const status = errors.length > 0 ? ("failed" as const) : ("completed" as const); await this.#stateTracker.updatePipeline({ status, completedAt: Date.now() }); await this.#stateTracker.appendOrchestratorLog(`Pipeline ${status} (${errors.length} errors)`); return { status, iterations: targetCount, agentResults: allResults, errors }; @@ -159,7 +156,7 @@ export class PipelineController { // Execute all agents in wave in parallel, catching per-agent errors const waveResults = await Promise.all( - wave.map(async (agentName) => { + wave.map(async agentName => { const agent = this.#def.agents.get(agentName)!; const currentIndex = agentIndex++; try { diff --git a/packages/omp-extension-swarm/swarm/render.ts b/packages/swarm-extension/src/swarm/render.ts similarity index 91% rename from packages/omp-extension-swarm/swarm/render.ts rename to packages/swarm-extension/src/swarm/render.ts index f0995ff2f..2e8589ab5 100644 --- a/packages/omp-extension-swarm/swarm/render.ts +++ b/packages/swarm-extension/src/swarm/render.ts @@ -35,9 +35,9 @@ export function renderSwarmProgress(state: SwarmState): string[] { } // Summary line - const completed = agents.filter((a) => a.status === "completed").length; - const failed = agents.filter((a) => a.status === "failed").length; - const running = agents.filter((a) => a.status === "running").length; + const completed = agents.filter(a => a.status === "completed").length; + const failed = agents.filter(a => a.status === "failed").length; + const running = agents.filter(a => a.status === "running").length; lines.push(""); const parts = [`${completed}/${agents.length} done`]; diff --git a/packages/omp-extension-swarm/swarm/schema.ts b/packages/swarm-extension/src/swarm/schema.ts similarity index 95% rename from packages/omp-extension-swarm/swarm/schema.ts rename to packages/swarm-extension/src/swarm/schema.ts index 5bfeb47e1..066dd6e07 100644 --- a/packages/omp-extension-swarm/swarm/schema.ts +++ b/packages/swarm-extension/src/swarm/schema.ts @@ -1,8 +1,3 @@ -/** - * YAML schema parsing, validation, and normalized types for swarm definitions. - */ -import YAML from "yaml"; - // ============================================================================ // Raw YAML shape (snake_case, optional fields) // ============================================================================ @@ -58,7 +53,7 @@ const VALID_MODES = new Set(["pipeline", "parallel", "sequential"]); const VALID_SWARM_NAME = /^[a-zA-Z0-9._-]+$/; export function parseSwarmYaml(content: string): SwarmDefinition { - const raw = YAML.parse(content) as { swarm?: RawSwarmConfig } | null; + const raw = Bun.YAML.parse(content) as { swarm?: RawSwarmConfig } | null; if (!raw?.swarm) { throw new Error("YAML must have a top-level 'swarm' key"); } diff --git a/packages/omp-extension-swarm/swarm/state.ts b/packages/swarm-extension/src/swarm/state.ts similarity index 100% rename from packages/omp-extension-swarm/swarm/state.ts rename to packages/swarm-extension/src/swarm/state.ts diff --git a/packages/swarm-extension/tsconfig.json b/packages/swarm-extension/tsconfig.json new file mode 100644 index 000000000..d18cfff3c --- /dev/null +++ b/packages/swarm-extension/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +}