diff --git a/.agentic/ONRAMP.md b/.agentic/ONRAMP.md index 920a310..aceb5a3 100644 --- a/.agentic/ONRAMP.md +++ b/.agentic/ONRAMP.md @@ -8,13 +8,13 @@ This repo dogfoods its own toolbelt. When you work on `@tnezdev/agentic`, you us ```bash # 1. Orient — load the maintainer hat with live situational tokens -bun src/cli/main.ts persona activate spores-maintainer +bun packages/agentic/src/cli/main.ts persona activate spores-maintainer # 2. Pick up work — top ready task from the local queue -bun src/cli/main.ts task next +bun packages/agentic/src/cli/main.ts task next # 3. When cutting a release — run the checklist -bun src/cli/main.ts skill run release-check +bun packages/agentic/src/cli/main.ts skill run release-check ``` Read the persona output. Do what step 3 of its "Before picking up work" section tells you. Start the work. diff --git a/.agentic/README.md b/.agentic/README.md index e3822b2..e0f8b8f 100644 --- a/.agentic/README.md +++ b/.agentic/README.md @@ -22,28 +22,28 @@ From the repo root: ```bash # List what's available -bun src/cli/main.ts persona list -bun src/cli/main.ts skill list -bun src/cli/main.ts workflow list -bun src/cli/main.ts task list +bun packages/agentic/src/cli/main.ts persona list +bun packages/agentic/src/cli/main.ts skill list +bun packages/agentic/src/cli/main.ts workflow list +bun packages/agentic/src/cli/main.ts task list # Activate the maintainer hat — pipe into your LLM of choice -bun src/cli/main.ts persona activate spores-maintainer +bun packages/agentic/src/cli/main.ts persona activate spores-maintainer # Run the release check skill -bun src/cli/main.ts skill run release-check +bun packages/agentic/src/cli/main.ts skill run release-check # Pick up the next ready task -bun src/cli/main.ts task next +bun packages/agentic/src/cli/main.ts task next # Kick off a release run -bun src/cli/main.ts workflow run agentic-release --name "0.5.0-cut" +bun packages/agentic/src/cli/main.ts workflow run agentic-release --name "0.5.0-cut" # Query memories when you need the "why" -bun src/cli/main.ts memory recall "runtime scope" +bun packages/agentic/src/cli/main.ts memory recall "runtime scope" ``` -(After `npm install -g @tnezdev/agentic`, replace `bun src/cli/main.ts` with `agentic`.) +(After `npm install -g @tnezdev/agentic`, replace `bun packages/agentic/src/cli/main.ts` with `agentic`.) ## Why this shape diff --git a/.agentic/personas/spores-maintainer.md b/.agentic/personas/spores-maintainer.md index f88118b..e8dc8a2 100644 --- a/.agentic/personas/spores-maintainer.md +++ b/.agentic/personas/spores-maintainer.md @@ -20,11 +20,11 @@ The time is `{{timestamp}}`. ## Principles (non-negotiable) -- **Zero production dependencies.** `"dependencies": {}` in `package.json` stays clean. devDependencies only when absolutely required. -- **Types first.** Add shapes to `src/types.ts` before writing implementations. +- **Zero production dependencies.** `"dependencies": {}` in `packages/agentic/package.json` stays clean. devDependencies only when absolutely required. +- **Types first.** Add shapes to `packages/agentic/src/types.ts` before writing implementations. - **Adapter pattern.** Every primitive has an `adapter.ts` interface and a `filesystem.ts` implementation. New storage backends implement the same interface. -- **No `console.log` in library code.** CLI output goes through `output(ctx, data, formatter)` re-exported from `src/cli/main.ts`. -- **Test files colocated.** `src/foo/filesystem.test.ts` next to `src/foo/filesystem.ts`. Inline fixtures, no separate fixtures directory. +- **No `console.log` in library code.** CLI output goes through `output(ctx, data, formatter)` re-exported from `packages/agentic/src/cli/main.ts`. +- **Test files colocated.** `packages/agentic/src/foo/filesystem.test.ts` next to `packages/agentic/src/foo/filesystem.ts`. Inline fixtures, no separate fixtures directory. - **Identity lives outside Agentic.** Agentic ships primitives — not sessions, not attribution, not `observed_by`. If you're tempted to add an identity field, stop. ## Before picking up work diff --git a/.agentic/skills/release-check/skill.md b/.agentic/skills/release-check/skill.md index d4e7e98..1429cd5 100644 --- a/.agentic/skills/release-check/skill.md +++ b/.agentic/skills/release-check/skill.md @@ -18,9 +18,9 @@ Do this before the release PR or tag, not while a publish run is failing. The pa Open a `chore: release vX.Y.Z` PR that: -- Bumps `version` in `package.json` per semver. +- Bumps `version` in `packages/agentic/package.json` per semver. - Appends a CHANGELOG entry (or release notes section) covering user-visible changes since the last tag. -- Keeps `"dependencies": {}` in `package.json`. A non-empty production dependency is a design regression — investigate before shipping. +- Keeps `"dependencies": {}` in `packages/agentic/package.json`. A non-empty production dependency is a design regression — investigate before shipping. Merge only after CI (`.github/workflows/ci.yml`) is green on the PR. CI runs `bun test` and `bun run typecheck` — those are the authoritative gates, not a local run. diff --git a/.agentic/skills/smoke-test/skill.md b/.agentic/skills/smoke-test/skill.md index 3a96c8a..64da9e4 100644 --- a/.agentic/skills/smoke-test/skill.md +++ b/.agentic/skills/smoke-test/skill.md @@ -17,15 +17,15 @@ bash scripts/smoke-test-node.sh ## What it does -1. `npm pack` in the repo root — produces the exact tarball that `npm publish` would upload +1. `npm pack` in `packages/agentic` — produces the exact tarball that `npm publish` would upload 2. Creates a temp consumer project and installs the tarball via `bun add` 3. Runs `scripts/smoke-consumer.mjs` which imports the public API and checks that all value exports are present and constructable ## When to run - Before pushing a release tag (`vX.Y.Z`) -- After changing `package.json` fields (`files`, `main`, `exports`) -- After adding or removing public exports from `src/index.ts` +- After changing `packages/agentic/package.json` fields (`files`, `main`, `exports`) +- After adding or removing public exports from `packages/agentic/src/index.ts` CI runs these automatically in `.github/workflows/ci.yml` and `.github/workflows/publish.yml` between the test step and the publish step. diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 70db653..9bffa2e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -56,4 +56,5 @@ jobs: npm --version - name: Publish + working-directory: packages/agentic run: npm publish --provenance --access public diff --git a/.spores/ONRAMP.md b/.spores/ONRAMP.md index 679443c..b68b5a0 100644 --- a/.spores/ONRAMP.md +++ b/.spores/ONRAMP.md @@ -8,13 +8,13 @@ This repo dogfoods its own toolbelt. When you work on `@tnezdev/agentic`, you us ```bash # 1. Orient — load the maintainer hat with live situational tokens -bun src/cli/main.ts persona activate spores-maintainer +bun packages/agentic/src/cli/main.ts persona activate spores-maintainer # 2. Pick up work — top ready task from the local queue -bun src/cli/main.ts task next +bun packages/agentic/src/cli/main.ts task next # 3. When cutting a release — run the checklist -bun src/cli/main.ts skill run release-check +bun packages/agentic/src/cli/main.ts skill run release-check ``` Read the persona output. Do what step 3 of its "Before picking up work" section tells you. Start the work. diff --git a/.spores/README.md b/.spores/README.md index 476da68..64a790d 100644 --- a/.spores/README.md +++ b/.spores/README.md @@ -22,28 +22,28 @@ From the repo root: ```bash # List what's available -bun src/cli/main.ts persona list -bun src/cli/main.ts skill list -bun src/cli/main.ts workflow list -bun src/cli/main.ts task list +bun packages/agentic/src/cli/main.ts persona list +bun packages/agentic/src/cli/main.ts skill list +bun packages/agentic/src/cli/main.ts workflow list +bun packages/agentic/src/cli/main.ts task list # Activate the maintainer hat — pipe into your LLM of choice -bun src/cli/main.ts persona activate spores-maintainer +bun packages/agentic/src/cli/main.ts persona activate spores-maintainer # Run the release check skill -bun src/cli/main.ts skill run release-check +bun packages/agentic/src/cli/main.ts skill run release-check # Pick up the next ready task -bun src/cli/main.ts task next +bun packages/agentic/src/cli/main.ts task next # Kick off a release run -bun src/cli/main.ts workflow run spores-release --name "0.1.0-cut" +bun packages/agentic/src/cli/main.ts workflow run spores-release --name "0.1.0-cut" # Query memories when you need the "why" -bun src/cli/main.ts memory recall "runtime scope" +bun packages/agentic/src/cli/main.ts memory recall "runtime scope" ``` -(After `npm install -g @tnezdev/agentic`, replace `bun src/cli/main.ts` with `agentic`; `spores` remains a compatibility alias.) +(After `npm install -g @tnezdev/agentic`, replace `bun packages/agentic/src/cli/main.ts` with `agentic`; `spores` remains a compatibility alias.) ## Why this shape diff --git a/.spores/personas/spores-maintainer.md b/.spores/personas/spores-maintainer.md index b059001..7df6fc9 100644 --- a/.spores/personas/spores-maintainer.md +++ b/.spores/personas/spores-maintainer.md @@ -20,11 +20,11 @@ The time is `{{timestamp}}`. ## Principles (non-negotiable) -- **Zero production dependencies.** `"dependencies": {}` in `package.json` stays clean. devDependencies only when absolutely required. -- **Types first.** Add shapes to `src/types.ts` before writing implementations. +- **Zero production dependencies.** `"dependencies": {}` in `packages/agentic/package.json` stays clean. devDependencies only when absolutely required. +- **Types first.** Add shapes to `packages/agentic/src/types.ts` before writing implementations. - **Adapter pattern.** Every primitive has an `adapter.ts` interface and a `filesystem.ts` implementation. New storage backends implement the same interface. -- **No `console.log` in library code.** CLI output goes through `output(ctx, data, formatter)` re-exported from `src/cli/main.ts`. -- **Test files colocated.** `src/foo/filesystem.test.ts` next to `src/foo/filesystem.ts`. Inline fixtures, no separate fixtures directory. +- **No `console.log` in library code.** CLI output goes through `output(ctx, data, formatter)` re-exported from `packages/agentic/src/cli/main.ts`. +- **Test files colocated.** `packages/agentic/src/foo/filesystem.test.ts` next to `packages/agentic/src/foo/filesystem.ts`. Inline fixtures, no separate fixtures directory. - **Identity lives outside spores.** Spores ships primitives — not sessions, not attribution, not `observed_by`. If you're tempted to add an identity field, stop. ## Before picking up work diff --git a/.spores/skills/release-check/skill.md b/.spores/skills/release-check/skill.md index 8757688..7ac30c5 100644 --- a/.spores/skills/release-check/skill.md +++ b/.spores/skills/release-check/skill.md @@ -16,9 +16,9 @@ Releases are **CI-gated**. You don't run `npm publish`; you push a `vX.Y.Z` tag Open a `chore: release vX.Y.Z` PR that: -- Bumps `version` in `package.json` per semver. +- Bumps `version` in `packages/agentic/package.json` per semver. - Appends a CHANGELOG entry (or release notes section) covering user-visible changes since the last tag. -- Keeps `"dependencies": {}` in `package.json`. A non-empty production dependency is a design regression — investigate before shipping. +- Keeps `"dependencies": {}` in `packages/agentic/package.json`. A non-empty production dependency is a design regression — investigate before shipping. Merge only after CI (`.github/workflows/ci.yml`) is green on the PR. CI runs `bun test` and `bun run typecheck` — those are the authoritative gates, not a local run. diff --git a/.spores/skills/smoke-test/skill.md b/.spores/skills/smoke-test/skill.md index 7f4ccab..185c56a 100644 --- a/.spores/skills/smoke-test/skill.md +++ b/.spores/skills/smoke-test/skill.md @@ -16,15 +16,15 @@ bash scripts/smoke-test.sh ## What it does -1. `npm pack` in the repo root — produces the exact tarball that `npm publish` would upload +1. `npm pack` in `packages/agentic` — produces the exact tarball that `npm publish` would upload 2. Creates a temp consumer project and installs the tarball via `bun add` 3. Runs `scripts/smoke-consumer.ts` which imports the public API and checks that all value exports are present and constructable ## When to run - Before pushing a release tag (`vX.Y.Z`) -- After changing `package.json` fields (`files`, `main`, `exports`) -- After adding or removing public exports from `src/index.ts` +- After changing `packages/agentic/package.json` fields (`files`, `main`, `exports`) +- After adding or removing public exports from `packages/agentic/src/index.ts` CI runs this automatically in `.github/workflows/publish.yml` between the test step and the publish step. diff --git a/AGENTS.md b/AGENTS.md index 8e3cf65..5d350a4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,252 +1,28 @@ -# AGENTS.md — Agentic (formerly SPORES) +# AGENTS.md — Agentic Monorepo -Orientation for agent sessions. Concise. Read before touching code. +Orientation for agent sessions. Read this before touching code in this repo. -> **Rename in progress:** The package is migrating from `spores` / `.spores/` to `agentic` / `.agentic/`. Both names work during the compatibility window. Prefer `agentic` in new code and docs. +## Start Here -## Start here +This repo dogfoods its own toolbelt. Before touching code, run the three-command on-ramp in [`.agentic/ONRAMP.md`](.agentic/ONRAMP.md). -This repo dogfoods its own toolbelt. Before touching code, run the three-command on-ramp in [`.agentic/ONRAMP.md`](.agentic/ONRAMP.md) — it activates the `spores-maintainer` persona, pulls the top ready task, and points you at the release skill. The rest of this file is reference; ONRAMP.md is the path. +## Layout -## What is SPORES? - -A TypeScript library + CLI for agent in-loop primitives: - -1. **Memory** — remember/recall/dream with L1/L2/L3 tiers -2. **Skills** — load and run skill.md files from `.agentic/skills/` -3. **Workflow** — digraph runtime (GraphDef → Run → Transitions, state derived from history) -4. **Tasks** — typed adapter interface (ULID IDs, Taskwarrior-shaped) -5. **Persona** — activate a hat at the start of a turn: metadata (memory_tags, skills, task_filter, workflow, routing hints) + a rendered body with live situational facts. Declarative attention, not enforced scope. -6. **Artifact** — versioned content blobs with metadata (type, title, tags, finalized). The canonical place to store an agent's durable outputs within a project — briefs, memos, reports, plans. See "Artifact primitive" below. -7. **Source** — pluggable read-only loader abstraction (`read(name) → text`, `list() → names`). Personas/skills/workflows all load through the same shape. `LayeredSource` composes for seed-then-emerge (e.g. live DB shadows seed filesystem). See "Source abstraction" below. -8. **Dispatch** — foundation types for the universal inbound message primitive (`Dispatch`, `DispatchFilter`, `matchDispatch`). Spores ships the message shape and pure match logic; runtimes ship transport, scheduling, and handler execution. - -MVP scope = what an agent reaches for *inside a single turn*. No hosting, no webhooks, no session layer — those are daemon-level concerns. **Identity lives outside spores** — in the run orchestration layer. Spores provides the hat; the caller provides who's wearing it. - -## Tech stack - -- TypeScript on Bun. No build step. `bun run ` directly. -- Zero production dependencies (`"dependencies": {}` in package.json) -- Hand-rolled TOML parser in `config.ts` -- Custom arg parser in `src/cli/main.ts` — no CLI framework +| Path | Purpose | +|---|---| +| `packages/agentic` | Published `@tnezdev/agentic` core package | +| `.agentic/` | Repo-local dogfood workspace | +| `docs/` | Repo-level design docs | +| `scripts/` | Release and smoke-test helpers | ## Commands -```bash -bun test # run all tests -bun run typecheck # tsc --noEmit -``` - -## Architecture - -### Types first - -All shared types live in `src/types.ts`. Add types there before writing implementations. - -### Adapter pattern - -Every primitive has an interface in `src//adapter.ts`. Filesystem implementations are the default. Future storage backends implement the same interface. - -| Module | Interface | Implementation | -|--------|-----------|----------------| -| memory | implicit in filesystem.ts | `src/memory/filesystem.ts` | -| workflow | `WorkflowAdapter` | `src/workflow/filesystem.ts` | -| tasks | `TaskAdapter` | `src/tasks/adapter.ts` (stub only) | -| personas | `PersonaAdapter` | `src/personas/filesystem.ts` | -| artifacts | `ArtifactAdapter` | `src/artifact/filesystem.ts` | - -### Source abstraction - -Config-style primitives (personas, skills, workflows, file-style dispatch configs) load through a pluggable `Source` interface in `src/sources/`: - -```typescript -interface Source { - read(name: string): Promise // text + locator - list(): Promise -} -``` - -Reference implementations: - -- `FlatFileSource(dir, ext)` — `/` layouts (personas, workflows) -- `NestedFileSource(dir, filename)` — `//` layouts (skills) -- `InMemorySource(records, tag)` — for tests and bake-in seed templates -- `LayeredSource([liveSource, seedSource])` — first-wins read, union-dedupe list (the seed-then-emerge primitive) - -Per-primitive load functions (`loadPersonaFromSource`, `loadSkillFromSource`, `loadGraphFromSource`) accept any `Source` — Compass and other remote runtimes plug in their own (DB, HTTP) without touching spores. - -Data primitives (Memory, Artifacts, Tasks) have query semantics and live behind their own adapter shapes — `Source` is for config, not data. - -### CLI: two-word dispatch - -``` -agentic [args] # preferred -spores [args] # compatibility alias -``` - -Commands in `src/cli/commands/.ts`. Each command is a `Command` function exported as `Command`. The dispatch table is in `src/cli/main.ts`. - -Current command surface: -- `agentic init` — scaffold `.agentic/` config -- `agentic memory remember/recall/forget/dream/reinforce` -- `agentic skill list/show/run` -- `agentic workflow list/show/run/status` -- `agentic persona list/view/activate` -- `agentic artifact create/read/write/edit/inspect/list/finalize` - -### Skills on disk - -``` -~/.agentic/skills//skill.md # global (user-level) -.agentic/skills//skill.md # project-level (wins on name conflict) -# Legacy: ~/.spores/ and .spores/ are honoured when .agentic/ is absent -``` - -Frontmatter: `name`, `description`, `tags: [a, b, c]` -Body: the skill content returned by `skill run` (pipe to an LLM). - -### Personas on disk - -``` -~/.agentic/personas/.md # global (user-level) -.agentic/personas/.md # project-level (wins on name conflict) -# Legacy: ~/.spores/ and .spores/ are honoured when .agentic/ is absent -``` - -Flat-file layout (unlike skills which use a directory per skill). Frontmatter: `name`, `description`, `memory_tags: [...]`, `skills: [...]`, optional `task_filter: { tags: [...], status: ready }` (nested, one level deep), optional `workflow: `. Body is markdown with `{{cwd}}`, `{{timestamp}}`, `{{hostname}}`, `{{git_branch}}` tokens that get substituted at `persona activate` time. - -**`view` vs `activate`** is load-bearing: `view` prints the raw file with literal tokens (for humans editing or reviewing); `activate` substitutes live situational facts (for piping into an LLM). Don't let them produce identical output. - -**One hat at a time.** Personas don't compose, stack, or inherit. To pivot, deactivate one and activate another. Runtime integration for applying persona bindings (using `memory_tags` as a recall filter, etc.) is **the caller's responsibility** — spores ships the metadata, the caller wires it. Descoped from v0.1 intentionally; expected to land after we have more signal from actual use. - -### Config resolution (four-tier) - -1. Hardcoded defaults in `config.ts` -2. `~/.agentic/config.toml` — global user overrides (preferred); falls back to `~/.spores/config.toml` -3. `.agentic/config.toml` — project overrides, wins over global (preferred); falls back to `.spores/config.toml` - -### Workflow runtime - -- `GraphDef` defines a digraph (nodes + edges with conditions) -- `expandGraph` flattens nested subgraphs at register time — nesting is free -- `Runtime` is a **state machine only** — it derives current state from `Run.history` (no `current_node` field). It does NOT schedule or evaluate `EvaluatorRef` conditions — that's the caller's job. -- State is immutable: each transition appends to `history` - -### Dispatch - -Foundation only — the message shape and pure match logic. `Dispatch` carries `from`, `to`, `payload`, `timestamp`, plus optional `when` / `recurrence` delivery metadata. `DispatchFilter` is a declarative predicate over `from` / `to`; `matchDispatch(dispatch, filter)` returns boolean. `DispatchHandlerHooks` types `onRegister` / `onUnregister` for handler-level lifecycle setup (idempotency lives in the hook, not in spores). - -Runtimes own send/handle/cancel verbs, the actual transport, scheduling, and handler execution. The split — vocabulary in spores, execution in runtime — keeps spores callable from both long-running daemons and serverless deployments. - -See `PROJECTS/spores/DESIGN-runtime-description.md` for the full design conversation. - -### URI schemes - -`agentic://` is the preferred URI scheme for Agentic-owned compute. Branded type `AgenticUri = \`agentic://\${string}\`` in `types.ts`. Referenced from skill bodies, dispatched by the host runtime. - -`spores://` is the legacy scheme; `SporesUri` is preserved but deprecated. Use `AgenticUri` in new code. - -## Conventions - -- Test files colocated: `src/memory/filesystem.test.ts` next to `src/memory/filesystem.ts` -- Test fixtures: inline (no separate fixtures dir) -- IDs: ULIDs via monotonic factory (see tasks types) -- Error handling: functions throw on unexpected errors; return `undefined` for "not found" cases (e.g. `loadSkill` returns `undefined` when skill doesn't exist) -- No `console.log` in library code — CLI output goes through `output(ctx, data, formatter)` in `src/cli/main.ts` -- **Descriptions are agent-facing activation triggers, not labels.** For both skills and personas, phrase `description` as "Activate when..." rather than "The X maintainer". `list` output is meant to function as a lookup table an agent scans to decide what to reach for — good triggers make the scan useful. - -### Artifact primitive - -Artifacts are versioned markdown blobs — the agent's durable output store for a project. - -**On-disk layout** (inside `.agentic/artifacts/`): - -``` -.agentic/artifacts//meta.json — ArtifactRecord (type, title, version, finalized, tags, …) -.agentic/artifacts//v1.md — body at version 1 -.agentic/artifacts//v2.md — body at version 2 (iterate write) -``` - -`body_ref` in `meta.json` is relative to `.agentic/artifacts/` — e.g. `"/v2.md"`. -Legacy: `.spores/artifacts/` is used when `.agentic/artifacts/` does not exist. - -**Write modes:** - -| Mode | Behavior | -|------|----------| -| `iterate` (default) | Bump version, write `v.md`. Prior versions remain on disk. | -| `replace` | Overwrite current `v.md` in place. Version unchanged. | -| `create` | Fail with "already exists". Used only for first-write semantics. | - -**Finalize semantics:** `artifact finalize ` sets `finalized=true` in `meta.json`. Finalized artifacts reject `write` and `edit`. `finalize` is idempotent — finalizing an already-finalized artifact is a no-op. - -**CLI worked example:** +Run checks from the repository root: ```bash -# Create -agentic artifact create brief "## Q2 Launch\n\nTBD." --title "Q2 Brief" --tags "q2,launch" - -# Read (pipe-friendly — raw body to stdout in human mode, JSON with --json) -agentic artifact read 01JXYZ... | pbcopy - -# Iterate -agentic artifact write 01JXYZ... "## Q2 Launch\n\nUpdated content." --mode iterate - -# Targeted edit -agentic artifact edit 01JXYZ... --old "TBD." --new "Final copy." - -# Inspect metadata -agentic artifact inspect 01JXYZ... --json - -# List with filter -agentic artifact list --type brief --json - -# Finalize the artifact -agentic artifact finalize 01JXYZ... +bun test +bun run typecheck +bun run build ``` -**Hook events:** - -| Event | Fired by | -|-------|---------| -| `artifact.created` | `artifact create` | -| `artifact.written` | `artifact write`, `artifact edit` | -| `artifact.finalized` | `artifact finalize` | - -Hook env vars: `AGENTIC_ARTIFACT_ID`, `AGENTIC_ARTIFACT_TYPE`, `AGENTIC_ARTIFACT_TITLE`, `AGENTIC_ARTIFACT_TAGS` (create); `AGENTIC_ARTIFACT_ID`, `AGENTIC_ARTIFACT_VERSION`, `AGENTIC_ARTIFACT_MODE` (written); `AGENTIC_ARTIFACT_ID`, `AGENTIC_ARTIFACT_FINAL_VERSION` (finalized). Legacy `SPORES_*` mirrors are set alongside for compatibility. - -**Dogfood hook:** `.agentic/hooks/artifact.written` — indexes the artifact reference into memory after every write so it's searchable via `agentic memory recall`. - -**Workflow → artifact worked example:** - -A workflow node declares its output type via `artifact.type` (from #50): - -```yaml -nodes: - - id: write-brief - label: Write Q2 Brief - artifact: - type: brief - description: Q2 launch brief produced by the briefing workflow -``` - -After the workflow run completes and the node produces its output, the caller persists it: - -```bash -# Node output lands in the transition; caller writes it as a named artifact -BODY=$(agentic workflow status "$RUN_ID" --json | jq -r '.nodes[-1].artifact.content') -ARTIFACT_ID=$(agentic artifact create brief "$BODY" --title "Q2 Brief" --tags "briefing,q2" --json | jq -r '.artifact.id') - -# artifact.written hook fires automatically → reference indexed into memory -# Later retrieval -agentic memory recall "Q2 Brief" -``` - -The dogfood hook wires the last step without any special-cased plumbing in spores itself. - -## What NOT to add - -- Sessions, webhooks, hosting — daemon-layer, not SPORES -- Any adapter implementation for tasks until the interface is settled -- Dependencies — keep `"dependencies": {}` clean -- Per-module adapter interfaces for memory (memory follows the filesystem.ts shape directly, no separate adapter.ts) +The root package is private and only coordinates workspaces. Core package implementation rules live in [`packages/agentic/AGENTS.md`](packages/agentic/AGENTS.md). diff --git a/README.md b/README.md index a538614..39a9afe 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,23 @@ -# @tnezdev/agentic +# Agentic Monorepo -> **Compatibility window.** This package was formerly `@tnezdev/spores`. New code should use `@tnezdev/agentic`, `agentic`, `.agentic/`, and `AGENTIC_*`. The `spores` CLI alias, `.spores/`, and `SPORES_*` remain supported during migration. +This repository contains the Agentic package workspace. -**In-loop primitives for agents that run more than once.** +## Packages -Most agent tooling optimizes for the single prompt. Agentic optimizes for the agent that wakes up tomorrow — with memory, skills, workflows, tasks, and a persona that shape what it does next. It's the toolbelt inside the turn, not the runtime around it. +| Package | Path | Purpose | +|---|---|---| +| `@tnezdev/agentic` | `packages/agentic` | Core primitives and CLI | -Agentic is a primitive layer, not a host runtime. It gives your agent building blocks — store and recall memories, load skills, advance workflows, track tasks, activate personas — without owning scheduling, auth, transport, or execution. That's your daemon's job. Agentic just makes it easier to build. +Runtime packages will live beside the core package under `packages/`. -Zero production dependencies. Runs on Bun. Works from the CLI. +## Development -## Why this exists - -Agents that run in production need more than a prompt and a model call. They need: - -- **Memory** that persists across sessions — not just a growing context window. -- **Skills** that are loaded on demand, not baked into a system prompt. -- **Workflows** that define multi-step processes with real state machines, not ad-hoc prompt chains. -- **Tasks** that track commitments inside the loop, not just on an external board. -- **Personas** that activate a coherent hat — memory tags, skill set, task filter, and rendered instructions — in one declaration. - -Agentic ships all five as filesystem-backed primitives your agent can reach for inside any turn. No hosting, no webhooks, no session layer required. - -## Install +Run checks from the repository root: ```bash -npm install @tnezdev/agentic -# or: bun add @tnezdev/agentic -``` - -## Quick start - -```bash -# Scaffold .agentic/ directory in your project -agentic init - -# Store a memory -agentic memory remember "always emit types from the public API" --tags style,api - -# Load a skill -agentic skill list -agentic skill run release-check | llm - -# Track a task -agentic task add "update CHANGELOG before tagging" -agentic task next - -# Activate a persona (pipe into your LLM as system prompt) -agentic persona list -agentic persona activate spores-maintainer | llm --system - -``` - -## Primitives - -| Primitive | What it does | -|-----------|-------------| -| **Memory** | Tiered store (L1/L2/L3) with recall, reinforce, and dream consolidation | -| **Skills** | Load `.md` skill files and pipe their content into an LLM | -| **Workflow** | Directed-graph runtime — register a graph, create runs, advance node state | -| **Tasks** | ULID-keyed task queue with status transitions and annotations | -| **Persona** | Activate a "hat" at the start of a turn: memory tags, skills, task filter, workflow, and a rendered body with live situational facts | - -All five primitives read from `.agentic/` in your project root, with optional global overrides from `~/.agentic/`. Legacy `.spores/` and `~/.spores/` paths are honoured during the compatibility window when `.agentic/` is absent. - -## What Agentic is not - -Agentic is intentionally scoped. It does not ship: - -- Hosted sessions or transcript storage -- Webhook receivers or background schedulers -- Provider clients or credential management -- Approval inboxes or auth flows -- Platform-specific task adapters in core - -Those are host-runtime responsibilities. Agentic provides the vocabulary and primitives that make hosts easier to build, test, and reason about. See [`docs/framework-boundaries.md`](docs/framework-boundaries.md) for the full boundary design. - -## Flags - -``` ---json Output as JSON (machine-readable, no truncation) ---wide Disable column truncation in list output ---base-dir Override working directory +bun test +bun run typecheck +bun run build ``` -## Working example - -The `.agentic/` directory in this repo is the dogfood — a persona, a skill, a workflow, tasks, and memories that are used to build this package itself. Read [`.agentic/ONRAMP.md`](.agentic/ONRAMP.md) for a tour. - -## Architecture - -See [AGENTS.md](AGENTS.md) for the full architecture, on-disk layout, and conventions for agent sessions. +The dogfood workspace still lives at `.agentic/`. Start with [`.agentic/ONRAMP.md`](.agentic/ONRAMP.md), then read [`packages/agentic/AGENTS.md`](packages/agentic/AGENTS.md) for core package architecture. diff --git a/bun.lock b/bun.lock index d0aac9c..dd2fbc9 100644 --- a/bun.lock +++ b/bun.lock @@ -3,7 +3,15 @@ "configVersion": 0, "workspaces": { "": { + "name": "agentic-workspace", + }, + "packages/agentic": { "name": "@tnezdev/agentic", + "version": "0.5.0", + "bin": { + "agentic": "dist/cli/main.js", + "spores": "dist/cli/main.js", + }, "devDependencies": { "@cloudflare/workers-types": "^4.20260426.1", "@types/bun": "^1.3.11", @@ -14,6 +22,8 @@ "packages": { "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260426.1", "", {}, "sha512-cBYeQaWwv/jFV8ualmwp6wIxmAf0rDe2DPPQwPbslKmPHqgv861YpAvm45r05K40QboZgxNQVIPgNkmtHqZeJQ=="], + "@tnezdev/agentic": ["@tnezdev/agentic@workspace:packages/agentic"], + "@types/bun": ["@types/bun@1.3.11", "", { "dependencies": { "bun-types": "1.3.11" } }, "sha512-5vPne5QvtpjGpsGYXiFyycfpDF2ECyPcTSsFBMa0fraoxiQyMJ3SmuQIGhzPg2WJuWxVBoxWJ2kClYTcw/4fAg=="], "@types/node": ["@types/node@25.5.2", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg=="], diff --git a/docs/capability-contracts.md b/docs/capability-contracts.md index dad18bb..3e07815 100644 --- a/docs/capability-contracts.md +++ b/docs/capability-contracts.md @@ -344,7 +344,7 @@ Those are host bindings. The portable layer defines the shared vocabulary that l ## Neutral Example Set -The following examples are useful fixtures for validating the vocabulary without binding it to a specific host. Each is stored as a JSON file under `src/capability/fixtures/` and validated in tests using `validateCapability`. +The following examples are useful fixtures for validating the vocabulary without binding it to a specific host. Each is stored as a JSON file under `packages/agentic/src/capability/fixtures/` and validated in tests using `validateCapability`. ### `issue_tracker.list_issues` diff --git a/docs/lifecycle-events.md b/docs/lifecycle-events.md index e7c6cbe..fbd8116 100644 --- a/docs/lifecycle-events.md +++ b/docs/lifecycle-events.md @@ -2,7 +2,7 @@ Lifecycle events are Agentic-owned vocabulary for semantic facts about primitive operations. They answer "what happened?" without deciding who handles it, where it is stored, or how side effects run. -Agentic defines the event names and portable envelope in `src/types.ts`: +Agentic defines the event names and portable envelope in `packages/agentic/src/types.ts`: - `LifecycleEventName` - `LifecycleEvent` diff --git a/package.json b/package.json index 4bffece..7af2192 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,13 @@ { - "name": "@tnezdev/agentic", - "version": "0.5.0", - "description": "Executable toolbelt for agent self-improvement", - "license": "MIT", + "name": "agentic-workspace", + "private": true, "type": "module", - "repository": { - "type": "git", - "url": "git+https://github.com/tnezdev/agentic.git" - }, - "author": "Travis Nesland", - "publishConfig": { - "access": "public" - }, - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - } - }, - "bin": { - "agentic": "dist/cli/main.js", - "spores": "dist/cli/main.js" - }, - "files": [ - "dist/**/*.js", - "dist/**/*.d.ts", - "dist/**/*.map", - "AGENTS.md", - "CHANGELOG.md" + "workspaces": [ + "packages/*" ], "scripts": { - "build": "tsc -p tsconfig.build.json && chmod 755 dist/cli/main.js", - "typecheck": "tsc --noEmit", - "test": "bun test", - "prepack": "bun run build" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20260426.1", - "@types/bun": "^1.3.11", - "typescript": "^5.7.0" + "build": "bun run --cwd packages/agentic build", + "typecheck": "bun run --cwd packages/agentic typecheck", + "test": "bun run --cwd packages/agentic test" } } diff --git a/.npmignore b/packages/agentic/.npmignore similarity index 100% rename from .npmignore rename to packages/agentic/.npmignore diff --git a/packages/agentic/AGENTS.md b/packages/agentic/AGENTS.md new file mode 100644 index 0000000..ddbd79a --- /dev/null +++ b/packages/agentic/AGENTS.md @@ -0,0 +1,252 @@ +# AGENTS.md — Agentic (formerly SPORES) + +Orientation for agent sessions. Concise. Read before touching code. + +> **Rename in progress:** The package is migrating from `spores` / `.spores/` to `agentic` / `.agentic/`. Both names work during the compatibility window. Prefer `agentic` in new code and docs. + +## Start here + +This repo dogfoods its own toolbelt. Before touching code, run the three-command on-ramp in [`../../.agentic/ONRAMP.md`](../../.agentic/ONRAMP.md) — it activates the `spores-maintainer` persona, pulls the top ready task, and points you at the release skill. The rest of this file is reference; ONRAMP.md is the path. + +## What is SPORES? + +A TypeScript library + CLI for agent in-loop primitives: + +1. **Memory** — remember/recall/dream with L1/L2/L3 tiers +2. **Skills** — load and run skill.md files from `.agentic/skills/` +3. **Workflow** — digraph runtime (GraphDef → Run → Transitions, state derived from history) +4. **Tasks** — typed adapter interface (ULID IDs, Taskwarrior-shaped) +5. **Persona** — activate a hat at the start of a turn: metadata (memory_tags, skills, task_filter, workflow, routing hints) + a rendered body with live situational facts. Declarative attention, not enforced scope. +6. **Artifact** — versioned content blobs with metadata (type, title, tags, finalized). The canonical place to store an agent's durable outputs within a project — briefs, memos, reports, plans. See "Artifact primitive" below. +7. **Source** — pluggable read-only loader abstraction (`read(name) → text`, `list() → names`). Personas/skills/workflows all load through the same shape. `LayeredSource` composes for seed-then-emerge (e.g. live DB shadows seed filesystem). See "Source abstraction" below. +8. **Dispatch** — foundation types for the universal inbound message primitive (`Dispatch`, `DispatchFilter`, `matchDispatch`). Spores ships the message shape and pure match logic; runtimes ship transport, scheduling, and handler execution. + +MVP scope = what an agent reaches for *inside a single turn*. No hosting, no webhooks, no session layer — those are daemon-level concerns. **Identity lives outside spores** — in the run orchestration layer. Spores provides the hat; the caller provides who's wearing it. + +## Tech stack + +- TypeScript on Bun. No build step. `bun run ` directly. +- Zero production dependencies (`"dependencies": {}` in `packages/agentic/package.json` stays clean) +- Hand-rolled TOML parser in `config.ts` +- Custom arg parser in `src/cli/main.ts` — no CLI framework + +## Commands + +```bash +bun test # run all tests +bun run typecheck # tsc --noEmit +``` + +## Architecture + +### Types first + +All shared types live in `src/types.ts`. Add types there before writing implementations. + +### Adapter pattern + +Every primitive has an interface in `src//adapter.ts`. Filesystem implementations are the default. Future storage backends implement the same interface. + +| Module | Interface | Implementation | +|--------|-----------|----------------| +| memory | implicit in filesystem.ts | `src/memory/filesystem.ts` | +| workflow | `WorkflowAdapter` | `src/workflow/filesystem.ts` | +| tasks | `TaskAdapter` | `src/tasks/adapter.ts` (stub only) | +| personas | `PersonaAdapter` | `src/personas/filesystem.ts` | +| artifacts | `ArtifactAdapter` | `src/artifact/filesystem.ts` | + +### Source abstraction + +Config-style primitives (personas, skills, workflows, file-style dispatch configs) load through a pluggable `Source` interface in `src/sources/`: + +```typescript +interface Source { + read(name: string): Promise // text + locator + list(): Promise +} +``` + +Reference implementations: + +- `FlatFileSource(dir, ext)` — `/` layouts (personas, workflows) +- `NestedFileSource(dir, filename)` — `//` layouts (skills) +- `InMemorySource(records, tag)` — for tests and bake-in seed templates +- `LayeredSource([liveSource, seedSource])` — first-wins read, union-dedupe list (the seed-then-emerge primitive) + +Per-primitive load functions (`loadPersonaFromSource`, `loadSkillFromSource`, `loadGraphFromSource`) accept any `Source` — Compass and other remote runtimes plug in their own (DB, HTTP) without touching spores. + +Data primitives (Memory, Artifacts, Tasks) have query semantics and live behind their own adapter shapes — `Source` is for config, not data. + +### CLI: two-word dispatch + +``` +agentic [args] # preferred +spores [args] # compatibility alias +``` + +Commands in `src/cli/commands/.ts`. Each command is a `Command` function exported as `Command`. The dispatch table is in `src/cli/main.ts`. + +Current command surface: +- `agentic init` — scaffold `.agentic/` config +- `agentic memory remember/recall/forget/dream/reinforce` +- `agentic skill list/show/run` +- `agentic workflow list/show/run/status` +- `agentic persona list/view/activate` +- `agentic artifact create/read/write/edit/inspect/list/finalize` + +### Skills on disk + +``` +~/.agentic/skills//skill.md # global (user-level) +.agentic/skills//skill.md # project-level (wins on name conflict) +# Legacy: ~/.spores/ and .spores/ are honoured when .agentic/ is absent +``` + +Frontmatter: `name`, `description`, `tags: [a, b, c]` +Body: the skill content returned by `skill run` (pipe to an LLM). + +### Personas on disk + +``` +~/.agentic/personas/.md # global (user-level) +.agentic/personas/.md # project-level (wins on name conflict) +# Legacy: ~/.spores/ and .spores/ are honoured when .agentic/ is absent +``` + +Flat-file layout (unlike skills which use a directory per skill). Frontmatter: `name`, `description`, `memory_tags: [...]`, `skills: [...]`, optional `task_filter: { tags: [...], status: ready }` (nested, one level deep), optional `workflow: `. Body is markdown with `{{cwd}}`, `{{timestamp}}`, `{{hostname}}`, `{{git_branch}}` tokens that get substituted at `persona activate` time. + +**`view` vs `activate`** is load-bearing: `view` prints the raw file with literal tokens (for humans editing or reviewing); `activate` substitutes live situational facts (for piping into an LLM). Don't let them produce identical output. + +**One hat at a time.** Personas don't compose, stack, or inherit. To pivot, deactivate one and activate another. Runtime integration for applying persona bindings (using `memory_tags` as a recall filter, etc.) is **the caller's responsibility** — spores ships the metadata, the caller wires it. Descoped from v0.1 intentionally; expected to land after we have more signal from actual use. + +### Config resolution (four-tier) + +1. Hardcoded defaults in `config.ts` +2. `~/.agentic/config.toml` — global user overrides (preferred); falls back to `~/.spores/config.toml` +3. `.agentic/config.toml` — project overrides, wins over global (preferred); falls back to `.spores/config.toml` + +### Workflow runtime + +- `GraphDef` defines a digraph (nodes + edges with conditions) +- `expandGraph` flattens nested subgraphs at register time — nesting is free +- `Runtime` is a **state machine only** — it derives current state from `Run.history` (no `current_node` field). It does NOT schedule or evaluate `EvaluatorRef` conditions — that's the caller's job. +- State is immutable: each transition appends to `history` + +### Dispatch + +Foundation only — the message shape and pure match logic. `Dispatch` carries `from`, `to`, `payload`, `timestamp`, plus optional `when` / `recurrence` delivery metadata. `DispatchFilter` is a declarative predicate over `from` / `to`; `matchDispatch(dispatch, filter)` returns boolean. `DispatchHandlerHooks` types `onRegister` / `onUnregister` for handler-level lifecycle setup (idempotency lives in the hook, not in spores). + +Runtimes own send/handle/cancel verbs, the actual transport, scheduling, and handler execution. The split — vocabulary in spores, execution in runtime — keeps spores callable from both long-running daemons and serverless deployments. + +See `PROJECTS/spores/DESIGN-runtime-description.md` for the full design conversation. + +### URI schemes + +`agentic://` is the preferred URI scheme for Agentic-owned compute. Branded type `AgenticUri = \`agentic://\${string}\`` in `types.ts`. Referenced from skill bodies, dispatched by the host runtime. + +`spores://` is the legacy scheme; `SporesUri` is preserved but deprecated. Use `AgenticUri` in new code. + +## Conventions + +- Test files colocated: `src/memory/filesystem.test.ts` next to `src/memory/filesystem.ts` +- Test fixtures: inline (no separate fixtures dir) +- IDs: ULIDs via monotonic factory (see tasks types) +- Error handling: functions throw on unexpected errors; return `undefined` for "not found" cases (e.g. `loadSkill` returns `undefined` when skill doesn't exist) +- No `console.log` in library code — CLI output goes through `output(ctx, data, formatter)` in `src/cli/main.ts` +- **Descriptions are agent-facing activation triggers, not labels.** For both skills and personas, phrase `description` as "Activate when..." rather than "The X maintainer". `list` output is meant to function as a lookup table an agent scans to decide what to reach for — good triggers make the scan useful. + +### Artifact primitive + +Artifacts are versioned markdown blobs — the agent's durable output store for a project. + +**On-disk layout** (inside `.agentic/artifacts/`): + +``` +.agentic/artifacts//meta.json — ArtifactRecord (type, title, version, finalized, tags, …) +.agentic/artifacts//v1.md — body at version 1 +.agentic/artifacts//v2.md — body at version 2 (iterate write) +``` + +`body_ref` in `meta.json` is relative to `.agentic/artifacts/` — e.g. `"/v2.md"`. +Legacy: `.spores/artifacts/` is used when `.agentic/artifacts/` does not exist. + +**Write modes:** + +| Mode | Behavior | +|------|----------| +| `iterate` (default) | Bump version, write `v.md`. Prior versions remain on disk. | +| `replace` | Overwrite current `v.md` in place. Version unchanged. | +| `create` | Fail with "already exists". Used only for first-write semantics. | + +**Finalize semantics:** `artifact finalize ` sets `finalized=true` in `meta.json`. Finalized artifacts reject `write` and `edit`. `finalize` is idempotent — finalizing an already-finalized artifact is a no-op. + +**CLI worked example:** + +```bash +# Create +agentic artifact create brief "## Q2 Launch\n\nTBD." --title "Q2 Brief" --tags "q2,launch" + +# Read (pipe-friendly — raw body to stdout in human mode, JSON with --json) +agentic artifact read 01JXYZ... | pbcopy + +# Iterate +agentic artifact write 01JXYZ... "## Q2 Launch\n\nUpdated content." --mode iterate + +# Targeted edit +agentic artifact edit 01JXYZ... --old "TBD." --new "Final copy." + +# Inspect metadata +agentic artifact inspect 01JXYZ... --json + +# List with filter +agentic artifact list --type brief --json + +# Finalize the artifact +agentic artifact finalize 01JXYZ... +``` + +**Hook events:** + +| Event | Fired by | +|-------|---------| +| `artifact.created` | `artifact create` | +| `artifact.written` | `artifact write`, `artifact edit` | +| `artifact.finalized` | `artifact finalize` | + +Hook env vars: `AGENTIC_ARTIFACT_ID`, `AGENTIC_ARTIFACT_TYPE`, `AGENTIC_ARTIFACT_TITLE`, `AGENTIC_ARTIFACT_TAGS` (create); `AGENTIC_ARTIFACT_ID`, `AGENTIC_ARTIFACT_VERSION`, `AGENTIC_ARTIFACT_MODE` (written); `AGENTIC_ARTIFACT_ID`, `AGENTIC_ARTIFACT_FINAL_VERSION` (finalized). Legacy `SPORES_*` mirrors are set alongside for compatibility. + +**Dogfood hook:** `.agentic/hooks/artifact.written` — indexes the artifact reference into memory after every write so it's searchable via `agentic memory recall`. + +**Workflow → artifact worked example:** + +A workflow node declares its output type via `artifact.type` (from #50): + +```yaml +nodes: + - id: write-brief + label: Write Q2 Brief + artifact: + type: brief + description: Q2 launch brief produced by the briefing workflow +``` + +After the workflow run completes and the node produces its output, the caller persists it: + +```bash +# Node output lands in the transition; caller writes it as a named artifact +BODY=$(agentic workflow status "$RUN_ID" --json | jq -r '.nodes[-1].artifact.content') +ARTIFACT_ID=$(agentic artifact create brief "$BODY" --title "Q2 Brief" --tags "briefing,q2" --json | jq -r '.artifact.id') + +# artifact.written hook fires automatically → reference indexed into memory +# Later retrieval +agentic memory recall "Q2 Brief" +``` + +The dogfood hook wires the last step without any special-cased plumbing in spores itself. + +## What NOT to add + +- Sessions, webhooks, hosting — daemon-layer, not SPORES +- Any adapter implementation for tasks until the interface is settled +- Dependencies — keep `"dependencies": {}` clean +- Per-module adapter interfaces for memory (memory follows the filesystem.ts shape directly, no separate adapter.ts) diff --git a/CHANGELOG.md b/packages/agentic/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/agentic/CHANGELOG.md diff --git a/packages/agentic/README.md b/packages/agentic/README.md new file mode 100644 index 0000000..46c3c33 --- /dev/null +++ b/packages/agentic/README.md @@ -0,0 +1,92 @@ +# @tnezdev/agentic + +> **Compatibility window.** This package was formerly `@tnezdev/spores`. New code should use `@tnezdev/agentic`, `agentic`, `.agentic/`, and `AGENTIC_*`. The `spores` CLI alias, `.spores/`, and `SPORES_*` remain supported during migration. + +**In-loop primitives for agents that run more than once.** + +Most agent tooling optimizes for the single prompt. Agentic optimizes for the agent that wakes up tomorrow — with memory, skills, workflows, tasks, and a persona that shape what it does next. It's the toolbelt inside the turn, not the runtime around it. + +Agentic is a primitive layer, not a host runtime. It gives your agent building blocks — store and recall memories, load skills, advance workflows, track tasks, activate personas — without owning scheduling, auth, transport, or execution. That's your daemon's job. Agentic just makes it easier to build. + +Zero production dependencies. Runs on Bun. Works from the CLI. + +## Why this exists + +Agents that run in production need more than a prompt and a model call. They need: + +- **Memory** that persists across sessions — not just a growing context window. +- **Skills** that are loaded on demand, not baked into a system prompt. +- **Workflows** that define multi-step processes with real state machines, not ad-hoc prompt chains. +- **Tasks** that track commitments inside the loop, not just on an external board. +- **Personas** that activate a coherent hat — memory tags, skill set, task filter, and rendered instructions — in one declaration. + +Agentic ships all five as filesystem-backed primitives your agent can reach for inside any turn. No hosting, no webhooks, no session layer required. + +## Install + +```bash +npm install @tnezdev/agentic +# or: bun add @tnezdev/agentic +``` + +## Quick start + +```bash +# Scaffold .agentic/ directory in your project +agentic init + +# Store a memory +agentic memory remember "always emit types from the public API" --tags style,api + +# Load a skill +agentic skill list +agentic skill run release-check | llm + +# Track a task +agentic task add "update CHANGELOG before tagging" +agentic task next + +# Activate a persona (pipe into your LLM as system prompt) +agentic persona list +agentic persona activate spores-maintainer | llm --system - +``` + +## Primitives + +| Primitive | What it does | +|-----------|-------------| +| **Memory** | Tiered store (L1/L2/L3) with recall, reinforce, and dream consolidation | +| **Skills** | Load `.md` skill files and pipe their content into an LLM | +| **Workflow** | Directed-graph runtime — register a graph, create runs, advance node state | +| **Tasks** | ULID-keyed task queue with status transitions and annotations | +| **Persona** | Activate a "hat" at the start of a turn: memory tags, skills, task filter, workflow, and a rendered body with live situational facts | + +All five primitives read from `.agentic/` in your project root, with optional global overrides from `~/.agentic/`. Legacy `.spores/` and `~/.spores/` paths are honoured during the compatibility window when `.agentic/` is absent. + +## What Agentic is not + +Agentic is intentionally scoped. It does not ship: + +- Hosted sessions or transcript storage +- Webhook receivers or background schedulers +- Provider clients or credential management +- Approval inboxes or auth flows +- Platform-specific task adapters in core + +Those are host-runtime responsibilities. Agentic provides the vocabulary and primitives that make hosts easier to build, test, and reason about. See [`docs/framework-boundaries.md`](https://github.com/tnezdev/agentic/blob/main/docs/framework-boundaries.md) for the full boundary design. + +## Flags + +``` +--json Output as JSON (machine-readable, no truncation) +--wide Disable column truncation in list output +--base-dir Override working directory +``` + +## Working example + +The `.agentic/` directory in this repo is the dogfood — a persona, a skill, a workflow, tasks, and memories that are used to build this package itself. Read [`.agentic/ONRAMP.md`](https://github.com/tnezdev/agentic/blob/main/.agentic/ONRAMP.md) for a tour. + +## Architecture + +See [AGENTS.md](AGENTS.md) for the full architecture, on-disk layout, and conventions for agent sessions. diff --git a/packages/agentic/package.json b/packages/agentic/package.json new file mode 100644 index 0000000..62888ab --- /dev/null +++ b/packages/agentic/package.json @@ -0,0 +1,46 @@ +{ + "name": "@tnezdev/agentic", + "version": "0.5.0", + "description": "Executable toolbelt for agent self-improvement", + "license": "MIT", + "type": "module", + "repository": { + "type": "git", + "url": "git+https://github.com/tnezdev/agentic.git", + "directory": "packages/agentic" + }, + "author": "Travis Nesland", + "publishConfig": { + "access": "public" + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "bin": { + "agentic": "dist/cli/main.js", + "spores": "dist/cli/main.js" + }, + "files": [ + "dist/**/*.js", + "dist/**/*.d.ts", + "dist/**/*.map", + "AGENTS.md", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc -p tsconfig.build.json && chmod 755 dist/cli/main.js", + "typecheck": "tsc --noEmit -p tsconfig.json", + "test": "bun test", + "prepack": "bun run build" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20260426.1", + "@types/bun": "^1.3.11", + "typescript": "^5.7.0" + } +} diff --git a/src/artifact/adapter.ts b/packages/agentic/src/artifact/adapter.ts similarity index 100% rename from src/artifact/adapter.ts rename to packages/agentic/src/artifact/adapter.ts diff --git a/src/artifact/filesystem.test.ts b/packages/agentic/src/artifact/filesystem.test.ts similarity index 100% rename from src/artifact/filesystem.test.ts rename to packages/agentic/src/artifact/filesystem.test.ts diff --git a/src/artifact/filesystem.ts b/packages/agentic/src/artifact/filesystem.ts similarity index 100% rename from src/artifact/filesystem.ts rename to packages/agentic/src/artifact/filesystem.ts diff --git a/src/capability/catalog.test.ts b/packages/agentic/src/capability/catalog.test.ts similarity index 100% rename from src/capability/catalog.test.ts rename to packages/agentic/src/capability/catalog.test.ts diff --git a/src/capability/filesystem.test.ts b/packages/agentic/src/capability/filesystem.test.ts similarity index 100% rename from src/capability/filesystem.test.ts rename to packages/agentic/src/capability/filesystem.test.ts diff --git a/src/capability/filesystem.ts b/packages/agentic/src/capability/filesystem.ts similarity index 100% rename from src/capability/filesystem.ts rename to packages/agentic/src/capability/filesystem.ts diff --git a/src/capability/fixtures.test.ts b/packages/agentic/src/capability/fixtures.test.ts similarity index 100% rename from src/capability/fixtures.test.ts rename to packages/agentic/src/capability/fixtures.test.ts diff --git a/src/capability/fixtures/communication.place_call.json b/packages/agentic/src/capability/fixtures/communication.place_call.json similarity index 100% rename from src/capability/fixtures/communication.place_call.json rename to packages/agentic/src/capability/fixtures/communication.place_call.json diff --git a/src/capability/fixtures/document.create_slide_deck.json b/packages/agentic/src/capability/fixtures/document.create_slide_deck.json similarity index 100% rename from src/capability/fixtures/document.create_slide_deck.json rename to packages/agentic/src/capability/fixtures/document.create_slide_deck.json diff --git a/src/capability/fixtures/issue_tracker.create_issue.json b/packages/agentic/src/capability/fixtures/issue_tracker.create_issue.json similarity index 100% rename from src/capability/fixtures/issue_tracker.create_issue.json rename to packages/agentic/src/capability/fixtures/issue_tracker.create_issue.json diff --git a/src/capability/fixtures/issue_tracker.list_issues.json b/packages/agentic/src/capability/fixtures/issue_tracker.list_issues.json similarity index 100% rename from src/capability/fixtures/issue_tracker.list_issues.json rename to packages/agentic/src/capability/fixtures/issue_tracker.list_issues.json diff --git a/src/capability/fixtures/web.search.json b/packages/agentic/src/capability/fixtures/web.search.json similarity index 100% rename from src/capability/fixtures/web.search.json rename to packages/agentic/src/capability/fixtures/web.search.json diff --git a/src/capability/helpers.test.ts b/packages/agentic/src/capability/helpers.test.ts similarity index 100% rename from src/capability/helpers.test.ts rename to packages/agentic/src/capability/helpers.test.ts diff --git a/src/capability/helpers.ts b/packages/agentic/src/capability/helpers.ts similarity index 100% rename from src/capability/helpers.ts rename to packages/agentic/src/capability/helpers.ts diff --git a/src/cli/commands/artifact.test.ts b/packages/agentic/src/cli/commands/artifact.test.ts similarity index 100% rename from src/cli/commands/artifact.test.ts rename to packages/agentic/src/cli/commands/artifact.test.ts diff --git a/src/cli/commands/artifact.ts b/packages/agentic/src/cli/commands/artifact.ts similarity index 100% rename from src/cli/commands/artifact.ts rename to packages/agentic/src/cli/commands/artifact.ts diff --git a/src/cli/commands/capability.test.ts b/packages/agentic/src/cli/commands/capability.test.ts similarity index 100% rename from src/cli/commands/capability.test.ts rename to packages/agentic/src/cli/commands/capability.test.ts diff --git a/src/cli/commands/capability.ts b/packages/agentic/src/cli/commands/capability.ts similarity index 100% rename from src/cli/commands/capability.ts rename to packages/agentic/src/cli/commands/capability.ts diff --git a/src/cli/commands/init.ts b/packages/agentic/src/cli/commands/init.ts similarity index 100% rename from src/cli/commands/init.ts rename to packages/agentic/src/cli/commands/init.ts diff --git a/src/cli/commands/memory.test.ts b/packages/agentic/src/cli/commands/memory.test.ts similarity index 100% rename from src/cli/commands/memory.test.ts rename to packages/agentic/src/cli/commands/memory.test.ts diff --git a/src/cli/commands/memory.ts b/packages/agentic/src/cli/commands/memory.ts similarity index 100% rename from src/cli/commands/memory.ts rename to packages/agentic/src/cli/commands/memory.ts diff --git a/src/cli/commands/persona.ts b/packages/agentic/src/cli/commands/persona.ts similarity index 100% rename from src/cli/commands/persona.ts rename to packages/agentic/src/cli/commands/persona.ts diff --git a/src/cli/commands/skill.test.ts b/packages/agentic/src/cli/commands/skill.test.ts similarity index 100% rename from src/cli/commands/skill.test.ts rename to packages/agentic/src/cli/commands/skill.test.ts diff --git a/src/cli/commands/skill.ts b/packages/agentic/src/cli/commands/skill.ts similarity index 100% rename from src/cli/commands/skill.ts rename to packages/agentic/src/cli/commands/skill.ts diff --git a/src/cli/commands/task.test.ts b/packages/agentic/src/cli/commands/task.test.ts similarity index 100% rename from src/cli/commands/task.test.ts rename to packages/agentic/src/cli/commands/task.test.ts diff --git a/src/cli/commands/task.ts b/packages/agentic/src/cli/commands/task.ts similarity index 100% rename from src/cli/commands/task.ts rename to packages/agentic/src/cli/commands/task.ts diff --git a/src/cli/commands/wake.test.ts b/packages/agentic/src/cli/commands/wake.test.ts similarity index 100% rename from src/cli/commands/wake.test.ts rename to packages/agentic/src/cli/commands/wake.test.ts diff --git a/src/cli/commands/wake.ts b/packages/agentic/src/cli/commands/wake.ts similarity index 100% rename from src/cli/commands/wake.ts rename to packages/agentic/src/cli/commands/wake.ts diff --git a/src/cli/commands/workflow.test.ts b/packages/agentic/src/cli/commands/workflow.test.ts similarity index 100% rename from src/cli/commands/workflow.test.ts rename to packages/agentic/src/cli/commands/workflow.test.ts diff --git a/src/cli/commands/workflow.ts b/packages/agentic/src/cli/commands/workflow.ts similarity index 100% rename from src/cli/commands/workflow.ts rename to packages/agentic/src/cli/commands/workflow.ts diff --git a/src/cli/context.ts b/packages/agentic/src/cli/context.ts similarity index 100% rename from src/cli/context.ts rename to packages/agentic/src/cli/context.ts diff --git a/src/cli/format.ts b/packages/agentic/src/cli/format.ts similarity index 100% rename from src/cli/format.ts rename to packages/agentic/src/cli/format.ts diff --git a/src/cli/main.test.ts b/packages/agentic/src/cli/main.test.ts similarity index 100% rename from src/cli/main.test.ts rename to packages/agentic/src/cli/main.test.ts diff --git a/src/cli/main.ts b/packages/agentic/src/cli/main.ts similarity index 100% rename from src/cli/main.ts rename to packages/agentic/src/cli/main.ts diff --git a/src/cli/output.ts b/packages/agentic/src/cli/output.ts similarity index 100% rename from src/cli/output.ts rename to packages/agentic/src/cli/output.ts diff --git a/src/config.test.ts b/packages/agentic/src/config.test.ts similarity index 100% rename from src/config.test.ts rename to packages/agentic/src/config.test.ts diff --git a/src/config.ts b/packages/agentic/src/config.ts similarity index 100% rename from src/config.ts rename to packages/agentic/src/config.ts diff --git a/src/dispatch/match.test.ts b/packages/agentic/src/dispatch/match.test.ts similarity index 100% rename from src/dispatch/match.test.ts rename to packages/agentic/src/dispatch/match.test.ts diff --git a/src/dispatch/match.ts b/packages/agentic/src/dispatch/match.ts similarity index 100% rename from src/dispatch/match.ts rename to packages/agentic/src/dispatch/match.ts diff --git a/src/hooks/fire.test.ts b/packages/agentic/src/hooks/fire.test.ts similarity index 100% rename from src/hooks/fire.test.ts rename to packages/agentic/src/hooks/fire.test.ts diff --git a/src/hooks/fire.ts b/packages/agentic/src/hooks/fire.ts similarity index 100% rename from src/hooks/fire.ts rename to packages/agentic/src/hooks/fire.ts diff --git a/src/index.ts b/packages/agentic/src/index.ts similarity index 100% rename from src/index.ts rename to packages/agentic/src/index.ts diff --git a/src/lifecycle-events.test.ts b/packages/agentic/src/lifecycle-events.test.ts similarity index 100% rename from src/lifecycle-events.test.ts rename to packages/agentic/src/lifecycle-events.test.ts diff --git a/src/memory/adapter.ts b/packages/agentic/src/memory/adapter.ts similarity index 100% rename from src/memory/adapter.ts rename to packages/agentic/src/memory/adapter.ts diff --git a/src/memory/filesystem.test.ts b/packages/agentic/src/memory/filesystem.test.ts similarity index 100% rename from src/memory/filesystem.test.ts rename to packages/agentic/src/memory/filesystem.test.ts diff --git a/src/memory/filesystem.ts b/packages/agentic/src/memory/filesystem.ts similarity index 100% rename from src/memory/filesystem.ts rename to packages/agentic/src/memory/filesystem.ts diff --git a/src/personas/activate.test.ts b/packages/agentic/src/personas/activate.test.ts similarity index 100% rename from src/personas/activate.test.ts rename to packages/agentic/src/personas/activate.test.ts diff --git a/src/personas/activate.ts b/packages/agentic/src/personas/activate.ts similarity index 100% rename from src/personas/activate.ts rename to packages/agentic/src/personas/activate.ts diff --git a/src/personas/adapter.ts b/packages/agentic/src/personas/adapter.ts similarity index 100% rename from src/personas/adapter.ts rename to packages/agentic/src/personas/adapter.ts diff --git a/src/personas/filesystem.test.ts b/packages/agentic/src/personas/filesystem.test.ts similarity index 100% rename from src/personas/filesystem.test.ts rename to packages/agentic/src/personas/filesystem.test.ts diff --git a/src/personas/filesystem.ts b/packages/agentic/src/personas/filesystem.ts similarity index 100% rename from src/personas/filesystem.ts rename to packages/agentic/src/personas/filesystem.ts diff --git a/src/personas/situational.test.ts b/packages/agentic/src/personas/situational.test.ts similarity index 100% rename from src/personas/situational.test.ts rename to packages/agentic/src/personas/situational.test.ts diff --git a/src/personas/situational.ts b/packages/agentic/src/personas/situational.ts similarity index 100% rename from src/personas/situational.ts rename to packages/agentic/src/personas/situational.ts diff --git a/src/resolve-dir.ts b/packages/agentic/src/resolve-dir.ts similarity index 100% rename from src/resolve-dir.ts rename to packages/agentic/src/resolve-dir.ts diff --git a/src/skills/filesystem.test.ts b/packages/agentic/src/skills/filesystem.test.ts similarity index 100% rename from src/skills/filesystem.test.ts rename to packages/agentic/src/skills/filesystem.test.ts diff --git a/src/skills/filesystem.ts b/packages/agentic/src/skills/filesystem.ts similarity index 100% rename from src/skills/filesystem.ts rename to packages/agentic/src/skills/filesystem.ts diff --git a/src/sources/flat-file.test.ts b/packages/agentic/src/sources/flat-file.test.ts similarity index 100% rename from src/sources/flat-file.test.ts rename to packages/agentic/src/sources/flat-file.test.ts diff --git a/src/sources/flat-file.ts b/packages/agentic/src/sources/flat-file.ts similarity index 100% rename from src/sources/flat-file.ts rename to packages/agentic/src/sources/flat-file.ts diff --git a/src/sources/http.test.ts b/packages/agentic/src/sources/http.test.ts similarity index 100% rename from src/sources/http.test.ts rename to packages/agentic/src/sources/http.test.ts diff --git a/src/sources/http.ts b/packages/agentic/src/sources/http.ts similarity index 100% rename from src/sources/http.ts rename to packages/agentic/src/sources/http.ts diff --git a/src/sources/in-memory.test.ts b/packages/agentic/src/sources/in-memory.test.ts similarity index 100% rename from src/sources/in-memory.test.ts rename to packages/agentic/src/sources/in-memory.test.ts diff --git a/src/sources/in-memory.ts b/packages/agentic/src/sources/in-memory.ts similarity index 100% rename from src/sources/in-memory.ts rename to packages/agentic/src/sources/in-memory.ts diff --git a/src/sources/kv.test.ts b/packages/agentic/src/sources/kv.test.ts similarity index 100% rename from src/sources/kv.test.ts rename to packages/agentic/src/sources/kv.test.ts diff --git a/src/sources/kv.ts b/packages/agentic/src/sources/kv.ts similarity index 100% rename from src/sources/kv.ts rename to packages/agentic/src/sources/kv.ts diff --git a/src/sources/layered.test.ts b/packages/agentic/src/sources/layered.test.ts similarity index 100% rename from src/sources/layered.test.ts rename to packages/agentic/src/sources/layered.test.ts diff --git a/src/sources/layered.ts b/packages/agentic/src/sources/layered.ts similarity index 100% rename from src/sources/layered.ts rename to packages/agentic/src/sources/layered.ts diff --git a/src/sources/nested-file.test.ts b/packages/agentic/src/sources/nested-file.test.ts similarity index 100% rename from src/sources/nested-file.test.ts rename to packages/agentic/src/sources/nested-file.test.ts diff --git a/src/sources/nested-file.ts b/packages/agentic/src/sources/nested-file.ts similarity index 100% rename from src/sources/nested-file.ts rename to packages/agentic/src/sources/nested-file.ts diff --git a/src/sources/r2.test.ts b/packages/agentic/src/sources/r2.test.ts similarity index 100% rename from src/sources/r2.test.ts rename to packages/agentic/src/sources/r2.test.ts diff --git a/src/sources/r2.ts b/packages/agentic/src/sources/r2.ts similarity index 100% rename from src/sources/r2.ts rename to packages/agentic/src/sources/r2.ts diff --git a/src/sources/source.ts b/packages/agentic/src/sources/source.ts similarity index 100% rename from src/sources/source.ts rename to packages/agentic/src/sources/source.ts diff --git a/src/tasks/adapter.ts b/packages/agentic/src/tasks/adapter.ts similarity index 100% rename from src/tasks/adapter.ts rename to packages/agentic/src/tasks/adapter.ts diff --git a/src/tasks/filesystem.test.ts b/packages/agentic/src/tasks/filesystem.test.ts similarity index 100% rename from src/tasks/filesystem.test.ts rename to packages/agentic/src/tasks/filesystem.test.ts diff --git a/src/tasks/filesystem.ts b/packages/agentic/src/tasks/filesystem.ts similarity index 100% rename from src/tasks/filesystem.ts rename to packages/agentic/src/tasks/filesystem.ts diff --git a/src/types.ts b/packages/agentic/src/types.ts similarity index 100% rename from src/types.ts rename to packages/agentic/src/types.ts diff --git a/src/wake/resolve.test.ts b/packages/agentic/src/wake/resolve.test.ts similarity index 100% rename from src/wake/resolve.test.ts rename to packages/agentic/src/wake/resolve.test.ts diff --git a/src/wake/resolve.ts b/packages/agentic/src/wake/resolve.ts similarity index 100% rename from src/wake/resolve.ts rename to packages/agentic/src/wake/resolve.ts diff --git a/src/workflow/adapter.ts b/packages/agentic/src/workflow/adapter.ts similarity index 100% rename from src/workflow/adapter.ts rename to packages/agentic/src/workflow/adapter.ts diff --git a/src/workflow/expand.test.ts b/packages/agentic/src/workflow/expand.test.ts similarity index 100% rename from src/workflow/expand.test.ts rename to packages/agentic/src/workflow/expand.test.ts diff --git a/src/workflow/expand.ts b/packages/agentic/src/workflow/expand.ts similarity index 100% rename from src/workflow/expand.ts rename to packages/agentic/src/workflow/expand.ts diff --git a/src/workflow/filesystem.test.ts b/packages/agentic/src/workflow/filesystem.test.ts similarity index 100% rename from src/workflow/filesystem.test.ts rename to packages/agentic/src/workflow/filesystem.test.ts diff --git a/src/workflow/filesystem.ts b/packages/agentic/src/workflow/filesystem.ts similarity index 100% rename from src/workflow/filesystem.ts rename to packages/agentic/src/workflow/filesystem.ts diff --git a/src/workflow/parse.test.ts b/packages/agentic/src/workflow/parse.test.ts similarity index 100% rename from src/workflow/parse.test.ts rename to packages/agentic/src/workflow/parse.test.ts diff --git a/src/workflow/parse.ts b/packages/agentic/src/workflow/parse.ts similarity index 100% rename from src/workflow/parse.ts rename to packages/agentic/src/workflow/parse.ts diff --git a/src/workflow/runtime.test.ts b/packages/agentic/src/workflow/runtime.test.ts similarity index 100% rename from src/workflow/runtime.test.ts rename to packages/agentic/src/workflow/runtime.test.ts diff --git a/src/workflow/runtime.ts b/packages/agentic/src/workflow/runtime.ts similarity index 100% rename from src/workflow/runtime.ts rename to packages/agentic/src/workflow/runtime.ts diff --git a/src/workflow/yaml.test.ts b/packages/agentic/src/workflow/yaml.test.ts similarity index 100% rename from src/workflow/yaml.test.ts rename to packages/agentic/src/workflow/yaml.test.ts diff --git a/src/workflow/yaml.ts b/packages/agentic/src/workflow/yaml.ts similarity index 100% rename from src/workflow/yaml.ts rename to packages/agentic/src/workflow/yaml.ts diff --git a/tsconfig.build.json b/packages/agentic/tsconfig.build.json similarity index 100% rename from tsconfig.build.json rename to packages/agentic/tsconfig.build.json diff --git a/packages/agentic/tsconfig.json b/packages/agentic/tsconfig.json new file mode 100644 index 0000000..52d43ea --- /dev/null +++ b/packages/agentic/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src/**/*"] +} diff --git a/scripts/smoke-test-node.sh b/scripts/smoke-test-node.sh index 1b49427..3d18e2e 100755 --- a/scripts/smoke-test-node.sh +++ b/scripts/smoke-test-node.sh @@ -17,11 +17,12 @@ set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PACKAGE_DIR="$REPO_ROOT/packages/agentic" TMPDIR_BASE="$(mktemp -d)" trap 'rm -rf "$TMPDIR_BASE"' EXIT echo "==> Packing tarball (runs prepack → bun run build)..." -TARBALL=$(cd "$REPO_ROOT" && npm pack --silent --pack-destination "$TMPDIR_BASE" 2>/dev/null) +TARBALL=$(cd "$PACKAGE_DIR" && npm pack --silent --pack-destination "$TMPDIR_BASE" 2>/dev/null) TARBALL_PATH="$TMPDIR_BASE/$TARBALL" if [ ! -f "$TARBALL_PATH" ]; then diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index 2bcef06..842202c 100755 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -12,11 +12,12 @@ set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +PACKAGE_DIR="$REPO_ROOT/packages/agentic" TMPDIR_BASE="$(mktemp -d)" trap 'rm -rf "$TMPDIR_BASE"' EXIT echo "==> Packing tarball (runs prepack → bun run build)..." -TARBALL=$(cd "$REPO_ROOT" && npm pack --silent --pack-destination "$TMPDIR_BASE" 2>/dev/null) +TARBALL=$(cd "$PACKAGE_DIR" && npm pack --silent --pack-destination "$TMPDIR_BASE" 2>/dev/null) TARBALL_PATH="$TMPDIR_BASE/$TARBALL" if [ ! -f "$TARBALL_PATH" ]; then diff --git a/tsconfig.json b/tsconfig.json index 4d6e073..59dff82 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,6 +15,5 @@ "lib": ["ESNext"], "noEmit": true, "types": ["bun-types"] - }, - "include": ["src/**/*"] + } }