Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ env:
# module's dependencies" and that "CI systems should generally not be allowed to
# use the go.work file". Because ./.github/actions/checkout-eyrie clones the
# siblings at branch HEAD into the workspace parent, workspace mode would silently
# hide version skew (e.g. a eagle pin that no longer matches).
# hide version skew (e.g. a shared pin that no longer matches).
# The `module` job opts back in (GOWORK: "auto") since `go work sync` and the
# go.work content checks genuinely require the workspace.
GOWORK: "off"
Expand Down Expand Up @@ -141,8 +141,6 @@ jobs:
(cd "$dir" && GOWORK=off go mod verify)
(cd "$dir" && GOWORK=off go test ./... -count=1 -timeout=300s -skip='TestDefaultSkillDirsCrossAgent|TestCopySelectionE2E')
done < <(find . -name go.mod -not -path './.git/*' -print | sort)
- name: contracts parity guard
run: bash ./scripts/check-contracts-parity.sh

public-modules:
name: public module graph
Expand Down
1 change: 0 additions & 1 deletion .shared-templates/docs/coverage-matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ repo's threshold, update both the CI file and this table in the same PR.**
| `merlin` | 76% | `THRESHOLD=` in `ci.yml` (go-ci.yml.tmpl) |
| `sparrow` | 80% | `THRESHOLD=` in `ci.yml` (go-ci.yml.tmpl) |
| `robin` | 78% | `--cov-fail-under=` in `ci.yml` (python-ci.yml.tmpl) |
| `eagle` | none enforced | leaf library; add one before it grows past a handful of files |
| `falcon` | none enforced | leaf library; add one before it grows past a handful of files |
| `starling` | n/a | no Go/Python test suite (skill/content registry) |

Expand Down
2 changes: 1 addition & 1 deletion .shared-templates/lefthook.yml.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ prepare-commit-msg:
sed '/^[Cc]o-[Aa]uthored-[Bb]y:/d' "{1}" > "{1}.tmp" && mv "{1}.tmp" "{1}"

# ---------------------------------------------------------------------------
# Notes for foundation repos (eagle, falcon): these have
# Notes for foundation repos (falcon): these have
# no graycode-eco dependencies at all, so `pre-push.commands.boundaries` checks
# for *zero* GrayCodeAI/* imports rather than checking against a peer-engine
# allowlist. The command line above is identical either way — only
Expand Down
6 changes: 3 additions & 3 deletions .shared-templates/scripts/check-ecosystem-boundaries.sh.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ cd "$ROOT_DIR"

# =============================================================================
# VARIANT 1 — Support engine (eyrie, harrier, shrike, swift, kestrel, merlin).
# Engines are peers: they may depend on eagle and falcon,
# Engines are peers: they may depend on falcon,
# but never on graycode/internal/* or another engine.
# =============================================================================
FORBIDDEN_GRAYCODE='github\.com/GrayCodeAI/graycode-cli/(internal/|shared/types)'
Expand All @@ -34,7 +34,7 @@ if [[ -n "${violations}" ]]; then
echo "forbidden Graycode imports found:"
echo "${violations}"
echo
echo "support repos must use eagle or local contracts, not graycode/internal or removed graycode/shared/types"
echo "support repos must use local contracts, not graycode/internal or removed graycode/shared/types"
exit_code=1
fi

Expand All @@ -53,7 +53,7 @@ fi
echo "ecosystem boundary guard passed"

# =============================================================================
# VARIANT 2 — Foundation repo (eagle, falcon).
# VARIANT 2 — Foundation repo (falcon).
# Foundation repos sit below everything: zero graycode-eco dependencies at all.
# =============================================================================
#
Expand Down
2 changes: 1 addition & 1 deletion .shared-templates/workflows/go-ci.yml.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ jobs:
run: go build ./...

# -----------------------------------------------------------------------------
# Foundation repos (eagle, falcon) have zero graycode-eco
# Foundation repos (falcon) have zero graycode-eco
# dependencies, so they drop the GOPROXY/GOPRIVATE/GONOSUMDB env block above
# and every "Clone <peer repo>" step that other repos may add for local
# workspace deps — there is nothing to clone.
Expand Down
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ alwaysApply: false
# Extending graycode

graycode is an open-source code intelligence platform. It lives in the `graycode-eco`
workspace alongside the ecosystem repos that power it (`eyrie`, `eagle`,
workspace alongside the ecosystem repos that power it (`eyrie`,
`shrike`, `harrier`, `swift`, `kestrel`, `merlin`). This document describes how to extend
graycode with custom tools, skills, hooks, and integrations.

Expand Down Expand Up @@ -187,7 +187,7 @@ graycode verify

### Architecture note: cross-repo contracts

Legacy `graycode/shared/types` has been removed. Cross-repo severity and finding contracts now live in `github.com/GrayCodeAI/eagle` (`eagle/types`) — extensions and support repos must import that module instead of Graycode internals.
Legacy `graycode/shared/types` has been removed. Cross-repo severity and finding contracts now live in graycode-cli's `internal/contracts` (vendored from the removed `github.com/GrayCodeAI/eagle` module) — extensions and support repos must vendor the needed DTOs instead of Graycode internals until a published contracts module exists.

### Architecture note: provider ownership

Expand Down Expand Up @@ -245,7 +245,7 @@ This project is indexed by GitNexus as **graycode** (97743 symbols, 322940 relat

### Workspace workflow (sibling repos)

graycode depends on ecosystem repos (`eyrie`, `eagle`, etc.) as independent sibling repos in the `graycode-eco` workspace. Graycode's `go.work` lists them as `../<repo>`, so local changes in any sibling are automatically picked up by graycode. Each sibling is its own git repo, versioned and released independently.
graycode depends on ecosystem repos (`eyrie`, etc.) as independent sibling repos in the `graycode-eco` workspace. Graycode's `go.work` lists them as `../<repo>`, so local changes in any sibling are automatically picked up by graycode. Each sibling is its own git repo, versioned and released independently.

1. Edit + test in `../<repo>` — run its tests, run `make test` in graycode
2. Push from the sibling: `git push origin <branch>`
Expand Down
7 changes: 2 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ GORELEASER := $(GOBIN_DIR)/goreleaser
# ---------------------------------------------------------------------------
# Phony declarations (alphabetical).
# ---------------------------------------------------------------------------
.PHONY: all bench boundaries build check-replace ci clean contracts-guard contracts-parity ecosystem-guard eyrie-client-guard eyrie-engine-guard manifest-guard peer-guard internal-layers-guard package-boundaries-guard release-parity cover cover-new fmt help install lint lint-fix \
.PHONY: all bench boundaries build check-replace ci clean contracts-guard ecosystem-guard eyrie-client-guard eyrie-engine-guard manifest-guard peer-guard internal-layers-guard package-boundaries-guard release-parity cover cover-new fmt help install lint lint-fix \
release security setup smoke path sync test test-10x test-live test-new test-race tidy version vet api-docs api-validate workspace

check-replace: ## Fail if go.mod has local replace directives (run before tagging)
Expand Down Expand Up @@ -133,10 +133,7 @@ internal-layers-guard: ## Enforce one-way dependencies across stable Graycode in
package-boundaries-guard: ## Enforce AST/package-graph boundaries with file/line diagnostics.
bash ./scripts/check-package-boundaries.sh

contracts-parity: ## Fail if ecosystem repos pin different Eagle versions (see ecosystem.yaml).
bash ./scripts/check-contracts-parity.sh

boundaries: manifest-guard check-replace contracts-guard contracts-parity ecosystem-guard eyrie-client-guard eyrie-engine-guard peer-guard internal-layers-guard package-boundaries-guard ## Alias for all boundary guards (matches `make boundaries` in engine repos).
boundaries: manifest-guard check-replace contracts-guard ecosystem-guard eyrie-client-guard eyrie-engine-guard peer-guard internal-layers-guard package-boundaries-guard ## Alias for all boundary guards (matches `make boundaries` in engine repos).

release-parity: ## Verify every go.mod ecosystem version resolves to a reachable remote commit.
bash ./scripts/check-module-release-parity.sh
Expand Down
28 changes: 16 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,6 @@ graycode/
Ecosystem sibling repos (independent Git repos in the `graycode-eco` parent
folder):
├── eyrie/ # LLM provider runtime
├── eagle/ # Shared cross-repo contracts
├── merlin/ # Merlin security audit library
├── kestrel/ # Kestrel diff-based code review
├── shrike/ # Shrike tokenizer, compression, secrets scanning
Expand All @@ -452,7 +451,7 @@ three runtime layers plus optional tooling/platform services:

- **Primary product:** **graycode** is the only end-user product surface in this ecosystem.
- **Support engines mounted by Graycode:** **eyrie**, **harrier**, **shrike**, **swift**, **kestrel**, **merlin**. Graycode imports or shells into these engines behind its own command surface.
- **Shared foundations:** **eagle** holds neutral cross-repo types and **falcon**
- **Shared foundations:** **falcon**
provides shared MCP server scaffolding.
- **API consumers/extensions:** **sparrow**, **robin**, and **wren** consume
Graycode's daemon API; **starling** provides Graycode skills.
Expand All @@ -462,20 +461,26 @@ three runtime layers plus optional tooling/platform services:

Local development uses:

- **`go.mod` modules:** pinned requirements for the support engines and `eagle`
- **`go.mod` modules:** pinned requirements for the support engines
- **Workspace + `go.work`:** sibling support repos are cloned in the `graycode-eco` workspace (as `../<repo>`); `go.work` resolves the module paths to those local checkouts
- **Module-mode builds:** standalone / Docker builds resolve the pinned `go.mod` versions from the module proxy (no workspace)

Cross-repo contracts now live in **`github.com/GrayCodeAI/eagle`** so support repos do not depend on Graycode internals. The old `graycode/shared/types` path has been removed; use `eagle/types` for shared severity and finding contracts.
Cross-repo contracts now live in `internal/contracts` (vendored from the
removed `github.com/GrayCodeAI/eagle` module) so support repos do not depend
on Graycode internals. The old `graycode/shared/types` path has been removed;
external consumers should vendor the needed DTOs from `internal/contracts`
until a published contracts module exists.

Current contract packages:
Current contract packages (`internal/contracts/`):

- `eagle/types` — severity, findings
- `eagle/review` — normalized review findings, comments, stats, results
- `eagle/verify` — normalized verification findings, stats, reports
- `eagle/tools` — tool call/result contracts
- `eagle/events` — normalized tool/swift events
- `eagle/policy` — permission and policy verdict contracts
- `types` — severity, findings
- `graph` — portable graph vocabulary: nodes, edges, events, provenance
- `agent` — typed subagent spawn DTOs and hook events
- `policy` — permission and policy verdict contracts
- `contracts/review` — normalized review findings, comments, stats, results
- `contracts/verify` — normalized verification findings, stats, reports
- `events` — tool, trace, and usage events
- `harness` — harness evaluation reports and dimension scores

You may keep a **personal** parent **`go.work`** that lists alternate clones on disk for multi-repo development.

Expand All @@ -488,7 +493,6 @@ You may keep a **personal** parent **`go.work`** that lists alternate clones on
| **shrike** | [GrayCodeAI/shrike](https://github.com/GrayCodeAI/shrike) | Compression, redaction, token/cost budgets, and privacy-safe runtime graph facts |
| **harrier** | [GrayCodeAI/harrier](https://github.com/GrayCodeAI/harrier) | Graph-based memory |
| **swift** | [GrayCodeAI/swift](https://github.com/GrayCodeAI/swift) | Session capture and replay engine mounted as `graycode swift ...` |
| **eagle** | [GrayCodeAI/eagle](https://github.com/GrayCodeAI/eagle) | Shared contracts and neutral cross-repo vocabulary |

For the consolidated repo map and the current-vs-proposed architecture diagrams, see [docs/architecture/graycode-current-vs-proposed.md](docs/architecture/graycode-current-vs-proposed.md).
For execution-graph ownership, automatic capture seams, export/sync commands,
Expand Down
2 changes: 1 addition & 1 deletion cmd/chat_permission_keys_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"time"

tea "charm.land/bubbletea/v2"
contracts "github.com/GrayCodeAI/eagle/policy"
contracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/policy"
"github.com/GrayCodeAI/graycode-cli/internal/engine"
)

Expand Down
2 changes: 1 addition & 1 deletion cmd/chat_prompt_timeout_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"strings"
"testing"

contracts "github.com/GrayCodeAI/eagle/policy"
contracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/policy"
"github.com/GrayCodeAI/graycode-cli/internal/engine"
)

Expand Down
1 change: 0 additions & 1 deletion cmd/compat-test/drift.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
// in graycode's newer version at build time without the consumer's own CI ever
// having tested it. See docs/compatibility.md.
var trackedPins = []string{
"github.com/GrayCodeAI/eagle",
"github.com/GrayCodeAI/falcon",
}

Expand Down
10 changes: 5 additions & 5 deletions cmd/compat-test/drift_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,14 @@ func TestCheckDrift_DetectsDrift(t *testing.T) {

go 1.26

require github.com/GrayCodeAI/eagle v1.5.0
require github.com/GrayCodeAI/falcon v1.5.0
`)
// Consumer sibling pins an older version of the shared contract.
writeMod(t, filepath.Join(ws, "merlin", "go.mod"), `module github.com/GrayCodeAI/merlin

go 1.26

require github.com/GrayCodeAI/eagle v1.2.0
require github.com/GrayCodeAI/falcon v1.2.0
`)

var buf bytes.Buffer
Expand Down Expand Up @@ -110,13 +110,13 @@ func TestCheckDrift_NoDriftWhenVersionsMatch(t *testing.T) {

go 1.26

require github.com/GrayCodeAI/eagle v1.5.0
require github.com/GrayCodeAI/falcon v1.5.0
`)
writeMod(t, filepath.Join(ws, "kestrel", "go.mod"), `module github.com/GrayCodeAI/kestrel

go 1.26

require github.com/GrayCodeAI/eagle v1.5.0
require github.com/GrayCodeAI/falcon v1.5.0
`)

var buf bytes.Buffer
Expand Down Expand Up @@ -144,7 +144,7 @@ func TestCheckDrift_SkipsMissingSiblings(t *testing.T) {

go 1.26

require github.com/GrayCodeAI/eagle v1.5.0
require github.com/GrayCodeAI/falcon v1.5.0
`)
// Directory present but no go.mod — must be skipped silently.
if err := os.MkdirAll(filepath.Join(ws, "not-checked-out"), 0o755); err != nil {
Expand Down
4 changes: 2 additions & 2 deletions cmd/execution_graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import (
"strings"
"time"

graphcontracts "github.com/GrayCodeAI/eagle/graph"
policycontracts "github.com/GrayCodeAI/eagle/policy"
graphcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/graph"
policycontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/policy"
"github.com/GrayCodeAI/graycode-cli/internal/executiongraph"
"github.com/GrayCodeAI/graycode-cli/internal/fsutil"
"github.com/GrayCodeAI/graycode-cli/internal/graphjournal"
Expand Down
4 changes: 2 additions & 2 deletions cmd/execution_graph_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import (
"testing"
"time"

graphcontracts "github.com/GrayCodeAI/eagle/graph"
policycontracts "github.com/GrayCodeAI/eagle/policy"
graphcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/graph"
policycontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/policy"
"github.com/GrayCodeAI/graycode-cli/internal/executiongraph"
"github.com/GrayCodeAI/graycode-cli/internal/graphjournal"
"github.com/GrayCodeAI/graycode-cli/internal/session"
Expand Down
6 changes: 3 additions & 3 deletions cmd/merlin_pipeline.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import (
"fmt"
"strings"

graphcontracts "github.com/GrayCodeAI/eagle/graph"
contracts "github.com/GrayCodeAI/eagle/types"
verifycontracts "github.com/GrayCodeAI/eagle/verify"
graycodeMerlin "github.com/GrayCodeAI/graycode-cli/internal/bridge/merlin"
graphcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/graph"
contracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/types"
verifycontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/verify"
merlinLib "github.com/GrayCodeAI/merlin"
)

Expand Down
4 changes: 2 additions & 2 deletions cmd/merlin_pipeline_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package cmd
import (
"testing"

contracts "github.com/GrayCodeAI/eagle/types"
verifycontracts "github.com/GrayCodeAI/eagle/verify"
contracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/types"
verifycontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/verify"
)

func TestMerlinToReviewFindings_NilReport(t *testing.T) {
Expand Down
2 changes: 1 addition & 1 deletion cmd/review_analyze.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (
"strings"
"time"

reviewcontracts "github.com/GrayCodeAI/eagle/review"
graycodeKestrel "github.com/GrayCodeAI/graycode-cli/internal/bridge/kestrel"
graycodeconfig "github.com/GrayCodeAI/graycode-cli/internal/config"
reviewcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/review"
"github.com/GrayCodeAI/graycode-cli/internal/engine"
"github.com/GrayCodeAI/graycode-cli/internal/ui/icons"
kestrelLib "github.com/GrayCodeAI/kestrel"
Expand Down
2 changes: 1 addition & 1 deletion cmd/review_run.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import (
"strings"
"time"

reviewcontracts "github.com/GrayCodeAI/eagle/review"
graycodeKestrel "github.com/GrayCodeAI/graycode-cli/internal/bridge/kestrel"
graycodeconfig "github.com/GrayCodeAI/graycode-cli/internal/config"
reviewcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/review"
"github.com/GrayCodeAI/graycode-cli/internal/engine"
"github.com/GrayCodeAI/graycode-cli/internal/ui/icons"
kestrelLib "github.com/GrayCodeAI/kestrel"
Expand Down
4 changes: 2 additions & 2 deletions cmd/review_run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
"strings"
"testing"

reviewcontracts "github.com/GrayCodeAI/eagle/review"
contracts "github.com/GrayCodeAI/eagle/types"
reviewcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/review"
contracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/types"
)

// captureStdout runs fn with stdout redirected to a pipe and returns what was
Expand Down
2 changes: 1 addition & 1 deletion cmd/review_store.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
"sync"
"time"

reviewcontracts "github.com/GrayCodeAI/eagle/review"
reviewcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/review"
"github.com/GrayCodeAI/graycode-cli/internal/storage"
)

Expand Down
4 changes: 2 additions & 2 deletions cmd/review_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import (
"strings"
"testing"

reviewcontracts "github.com/GrayCodeAI/eagle/review"
contracts "github.com/GrayCodeAI/eagle/types"
reviewcontracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/review"
contracts "github.com/GrayCodeAI/graycode-cli/internal/contracts/types"

"github.com/GrayCodeAI/graycode-cli/internal/storage"
"github.com/GrayCodeAI/graycode-cli/internal/ui/icons"
Expand Down
1 change: 0 additions & 1 deletion docs/DEVELOPER-PATH.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ workspace; they are not nested under Graycode:
```bash
mkdir graycode-eco && cd graycode-eco
git clone https://github.com/GrayCodeAI/graycode-cli
git clone https://github.com/GrayCodeAI/eagle
git clone https://github.com/GrayCodeAI/eyrie
git clone https://github.com/GrayCodeAI/falcon
git clone https://github.com/GrayCodeAI/harrier
Expand Down
6 changes: 5 additions & 1 deletion docs/ECOSYSTEM-WIRING.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# GrayCode ecosystem wiring

This document is the implementation contract for the 15 repositories in the
> NOTE (2026-09-04): the `eagle` repository has been removed; its contracts
> were vendored into graycode-cli's `internal/contracts` and `ecosystem.yaml`
> no longer lists it. Diagrams below predate the removal.

This document is the implementation contract for the 14 repositories in the
GrayCodeAI ecosystem. `ecosystem.yaml` is the canonical machine-readable
inventory; generated workspaces, boundary checks, release parity, and Owl's
repository catalog derive from it.
Expand Down
1 change: 0 additions & 1 deletion docs/architecture/ecosystem-implementation-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ bash owl/scripts/sync-ecosystem.sh
Acceptance checks:

```text
bash graycode/scripts/check-contracts-parity.sh
bash graycode/scripts/check-ecosystem-boundaries.sh
bash graycode/scripts/check-support-repo-coupling.sh
bash graycode/scripts/check-eyrie-engine-boundary.sh
Expand Down
4 changes: 2 additions & 2 deletions docs/architecture/graycode-contract-spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ list in sync with the code (it is the inventory the dependency rules assume).
## Current status

- severity and finding contracts are live in `eagle`
- review result contracts now exist in `eagle/review`
- verification result contracts now exist in `eagle/verify`
- review result contracts now exist in `contracts/review`
- verification result contracts now exist in `contracts/verify`
- tool contracts now exist in `eagle/tools`
- event contracts now exist in `eagle/events`
- policy contracts now exist in `eagle/policy`
Expand Down
Loading