mirror of
https://github.com/affaan-m/ECC.git
synced 2026-10-26 18:35:05 +00:00
Merge remote-tracking branch 'upstream/main' into feat/story-lifecycle-skill
This commit is contained in:
1499 files changed
+177208
-12027
No files matched your search
@@ -0,0 +1,23 @@
|
||||
# ECC for AdaL CLI
|
||||
|
||||
This directory contains the ECC configuration for the AdaL CLI harness.
|
||||
|
||||
## What is installed
|
||||
|
||||
- `rules/` — shared coding rules and guidelines
|
||||
- `skills/` — reusable skills
|
||||
- `commands/` — slash commands
|
||||
- `AGENTS.md` — agent instructions
|
||||
|
||||
## Manual install
|
||||
|
||||
```bash
|
||||
bash ./install.sh --target adal --profile minimal
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- The `adal` target installs into the project-level `./.adal/` directory.
|
||||
- AdaL's own config (`~/.adal/settings.json`, MCP servers, plugins) is **not** touched by ECC install.
|
||||
- Use `npx ecc-universal doctor --target adal` to check install health.
|
||||
- use an installed
|
||||
@@ -6,7 +6,7 @@
|
||||
"plugins": [
|
||||
{
|
||||
"name": "ecc",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.3",
|
||||
"source": {
|
||||
"source": "local",
|
||||
"path": "./"
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: agent-introspection-debugging
|
||||
description: Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Agent Introspection Debugging
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: agent-sort
|
||||
description: Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Agent Sort
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: api-design
|
||||
description: REST API design patterns including resource naming, status codes, pagination, filtering, error responses, versioning, and rate limiting for production APIs. Use when designing or reviewing REST endpoints, resource names, status codes, pagination, or versioning.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# API Design Patterns
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: article-writing
|
||||
description: Write articles, guides, blog posts, tutorials, newsletter issues, and other long-form content in a distinctive voice derived from supplied examples or brand guidance. Use when the user wants polished written content longer than a paragraph, especially when voice consistency, structure, and credibility matter.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Article Writing
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: backend-patterns
|
||||
description: Backend architecture patterns, API design, database optimization, and server-side best practices for Node.js, Express, and Next.js API routes. Use when building or reviewing Node.js, Express, or Next.js API routes and their data access.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Backend Development Patterns
|
||||
|
||||
@@ -6,6 +6,7 @@ description: >-
|
||||
visual craft, offer packaging, evidence, enterprise-readiness, thought
|
||||
leadership, pricing, client's strategic tension) with explicit 1–5 rubrics
|
||||
and a tension-plot. Precedes competitive-report-structure.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Benchmark Methodology
|
||||
|
||||
@@ -6,6 +6,7 @@ description: >-
|
||||
personality, voice, narrative, and founder-brand tension across 8 modules
|
||||
using laddering, 5 Whys, and projective techniques. Produces a resumable
|
||||
session with disk-persisted state and a master brandbook (90_SYNTHESIS.md).
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Brand Discovery
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: brand-voice
|
||||
description: Build a source-derived writing style profile from real posts, essays, launch notes, docs, or site copy, then reuse that profile across content, outreach, and social workflows. Use when the user wants voice consistency without generic AI writing tropes.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Brand Voice
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: bun-runtime
|
||||
description: Bun as runtime, package manager, bundler, and test runner. When to choose Bun vs Node, migration notes, and Vercel support.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Bun Runtime
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: coding-standards
|
||||
description: Baseline cross-project coding conventions for naming, readability, immutability, and code-quality review. Use detailed frontend or backend skills for framework-specific patterns. Use when reviewing code quality or naming with no framework-specific skill that applies.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Coding Standards & Best Practices
|
||||
|
||||
@@ -6,6 +6,7 @@ description: >-
|
||||
counts as a competitor, which tier they belong to, and which sources to mine.
|
||||
First step in the three-skill competitive pipeline; precedes
|
||||
benchmark-methodology.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Competitive Platform Analysis
|
||||
|
||||
@@ -6,6 +6,7 @@ description: >-
|
||||
profiles, benchmarking matrix, white-space analysis, strategic recommendations,
|
||||
and team alignment trigger questions. Final step in the three-skill competitive
|
||||
pipeline.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Competitive Report Structure
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: content-engine
|
||||
description: Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Content Engine
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: crosspost
|
||||
description: Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Crosspost
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: deep-research
|
||||
description: Multi-source deep research using firecrawl and exa MCPs. Searches the web, synthesizes findings, and delivers cited reports with source attribution. Use when the user wants thorough research on any topic with evidence and citations.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Deep Research
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: dmux-workflows
|
||||
description: Multi-agent orchestration using dmux (tmux pane manager for AI agents). Patterns for parallel agent workflows across Claude Code, Codex, OpenCode, and other harnesses. Use when running multiple agent sessions in parallel or coordinating multi-agent development workflows.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# dmux Workflows
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: documentation-lookup
|
||||
description: Use up-to-date library and framework docs via Context7 MCP instead of training data. Activates for setup questions, API references, code examples, or when the user names a framework (e.g. React, Next.js, Prisma).
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Documentation Lookup (Context7)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: e2e-testing
|
||||
description: Playwright E2E testing patterns, Page Object Model, configuration, CI/CD integration, artifact management, and flaky test strategies. Use when writing Playwright tests, structuring page objects, or fixing flaky E2E runs in CI.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# E2E Testing Patterns
|
||||
|
||||
+6
-5
@@ -1,15 +1,16 @@
|
||||
---
|
||||
name: everything-claude-code
|
||||
description: Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.
|
||||
name: ecc-conventions
|
||||
description: Development conventions and patterns for ECC. JavaScript project with conventional commits.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Everything Claude Code Conventions
|
||||
# ECC Conventions
|
||||
|
||||
> Generated from [affaan-m/everything-claude-code](https://github.com/affaan-m/everything-claude-code) on 2026-03-20
|
||||
> Generated from [affaan-m/ECC](https://github.com/affaan-m/ECC) on 2026-03-20
|
||||
|
||||
## Overview
|
||||
|
||||
This skill teaches Claude the development patterns and conventions used in everything-claude-code.
|
||||
This skill teaches Claude the development patterns and conventions used in ECC.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
interface:
|
||||
display_name: "ECC"
|
||||
short_description: "Repo workflows and conventions for ECC"
|
||||
brand_color: "#0EA5E9"
|
||||
default_prompt: "Use $ecc-conventions to follow this repository's conventions and workflows."
|
||||
policy:
|
||||
allow_implicit_invocation: true
|
||||
@@ -2,6 +2,7 @@
|
||||
name: eval-harness
|
||||
description: Formal evaluation framework for Claude Code sessions implementing eval-driven development (EDD) principles. Use when a Claude Code workflow needs a formal eval before it is trusted or changed.
|
||||
allowed-tools: Read, Write, Edit, Bash, Grep, Glob
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Eval Harness Skill
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
interface:
|
||||
display_name: "Everything Claude Code"
|
||||
short_description: "Repo workflows for everything-claude-code"
|
||||
brand_color: "#0EA5E9"
|
||||
default_prompt: "Use $everything-claude-code to follow this repository's conventions and workflows."
|
||||
policy:
|
||||
allow_implicit_invocation: true
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: exa-search
|
||||
description: Neural search via Exa MCP for web, code, and company research. Use when the user needs web search, code examples, company intel, people lookup, or AI-powered deep research with Exa's neural search engine.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Exa Search
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: fal-ai-media
|
||||
description: Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# fal.ai Media Generation
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: frontend-patterns
|
||||
description: Frontend development patterns for React, Next.js, state management, performance optimization, and UI best practices. Use when building or reviewing React or Next.js components, state, or render performance.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Frontend Development Patterns
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: frontend-slides
|
||||
description: Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Frontend Slides
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: investor-materials
|
||||
description: Create and update pitch decks, one-pagers, investor memos, accelerator applications, financial models, and fundraising materials. Use when the user needs investor-facing documents, projections, use-of-funds tables, milestone plans, or materials that must stay internally consistent across multiple fundraising assets.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Investor Materials
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: investor-outreach
|
||||
description: Draft cold emails, warm intro blurbs, follow-ups, update emails, and investor communications for fundraising. Use when the user wants outreach to angels, VCs, strategic investors, or accelerators and needs concise, personalized, investor-facing messaging.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Investor Outreach
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: market-research
|
||||
description: Conduct market research, competitive analysis, investor due diligence, and industry intelligence with source attribution and decision-oriented summaries. Use when the user wants market sizing, competitor comparisons, fund research, technology scans, or research that informs business decisions.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Market Research
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: mcp-server-patterns
|
||||
description: Build MCP servers with Node/TypeScript SDK — tools, resources, prompts, Zod validation, stdio vs Streamable HTTP. Use Context7 or official MCP docs for latest API. Use when building or debugging an MCP server — tools, resources, prompts, validation, or transport choice.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# MCP Server Patterns
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name: mle-workflow
|
||||
description: Production machine-learning engineering workflow for data contracts, reproducible training, model evaluation, deployment, monitoring, and rollback. Use when building, reviewing, or hardening ML systems beyond one-off notebooks.
|
||||
allowed-tools: Read, Write, Edit, Bash, Grep, Glob
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Machine Learning Engineering Workflow
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: nextjs-turbopack
|
||||
description: Next.js 16+ and Turbopack — incremental bundling, FS caching, dev speed, and when to use Turbopack vs webpack.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Next.js and Turbopack
|
||||
|
||||
@@ -3,6 +3,7 @@ name: plan-canvas
|
||||
description: Open plans and HTML artifacts in a local browser canvas where the human annotates elements, chats, and approves or requests changes without leaving the page. Use when presenting a plan for review, or when feedback like "move this, change that" is easier pointed at than typed.
|
||||
metadata:
|
||||
origin: ECC
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Plan Canvas
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: product-capability
|
||||
description: Translate PRD intent, roadmap asks, or product discussions into an implementation-ready capability plan that exposes constraints, invariants, interfaces, and unresolved decisions before multi-service work starts. Use when the user needs an ECC-native PRD-to-SRS lane instead of vague planning prose.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Product Capability
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: security-review
|
||||
description: Use this skill when adding authentication, handling user input, working with secrets, creating API endpoints, or implementing payment/sensitive features. Provides comprehensive security checklist and patterns.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Security Review Skill
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: strategic-compact
|
||||
description: Suggests manual context compaction at logical intervals to preserve context through task phases rather than arbitrary auto-compaction. Use when a session is approaching a context limit and a task phase is a natural place to compact.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Strategic Compact Skill
|
||||
@@ -73,7 +74,7 @@ Use this table to decide when to compact:
|
||||
| Phase Transition | Compact? | Why |
|
||||
|-----------------|----------|-----|
|
||||
| Research → Planning | Yes | Research context is bulky; plan is the distilled output |
|
||||
| Planning → Implementation | Yes | Plan is in TodoWrite or a file; free up context for code |
|
||||
| Planning → Implementation | Yes | Plan is written down (a file, or the task list if you have one); free up context for code |
|
||||
| Implementation → Testing | Maybe | Keep if tests reference recent code; compact if switching focus |
|
||||
| Debugging → Next feature | Yes | Debug traces pollute context for unrelated work |
|
||||
| Mid-implementation | No | Losing variable names, file paths, and partial state is costly |
|
||||
@@ -86,14 +87,28 @@ Understanding what persists helps you compact with confidence:
|
||||
| Persists | Lost |
|
||||
|----------|------|
|
||||
| CLAUDE.md instructions | Intermediate reasoning and analysis |
|
||||
| TodoWrite task list | File contents you previously read |
|
||||
| Files on disk | File contents you previously read |
|
||||
| Memory files (`~/.claude/memory/`) | Multi-step conversation context |
|
||||
| Git state (commits, branches) | Tool call history and counts |
|
||||
| Files on disk | Nuanced user preferences stated verbally |
|
||||
| The task list — **only if you have the todo tools** (see below) | Nuanced user preferences stated verbally |
|
||||
|
||||
> ### Don't rely on the task list surviving — it may not exist
|
||||
>
|
||||
> Claude Code **2.1.233 removed the todo/task tools by default** on Opus 4.8, Sonnet 5,
|
||||
> Fable 5, Mythos 5 and newer models (`TodoWrite`, `TaskCreate/Get/Update/List`).
|
||||
> `CLAUDE_CODE_ENABLE_TODO_TOOLS=1` brings them back, but that is a per-machine
|
||||
> environment setting — **it does not travel with this skill**, so you cannot assume the
|
||||
> reader has it.
|
||||
>
|
||||
> This matters because "my todo list survives compaction" is a reason people compact
|
||||
> *instead of* writing state down. If the tools are absent there is no list to survive,
|
||||
> and the plan is simply gone. **Write the plan to a file before compacting** — a file
|
||||
> persists on every version and every model. Treat the task list as a convenience that
|
||||
> may be missing, never as your durable record.
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Compact after planning** — Once plan is finalized in TodoWrite, compact to start fresh
|
||||
1. **Compact after planning** — Once the plan is finalized **and written to a file**, compact to start fresh
|
||||
2. **Compact after debugging** — Clear error-resolution context before continuing
|
||||
3. **Don't compact mid-implementation** — Preserve context for related changes
|
||||
4. **Read the suggestion** — The hook tells you *when*, you decide *if*
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: tdd-workflow
|
||||
description: Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Test-Driven Development Workflow
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: unified-memory
|
||||
description: Share durable, inspectable context and handoffs between Claude, Codex, Hermes, Cursor, OpenCode, and other agents through the local ECC Memory Vault. Use when an agent must save work state, transfer context, resume another agent's task, or search shared project knowledge.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Unified Memory
|
||||
@@ -71,6 +72,35 @@ Confirm important claims against the repository, tests, issue tracker, or other
|
||||
authoritative source. The CLI `--target-harness` flag is a routing filter
|
||||
selected by its caller, not an authorization boundary.
|
||||
|
||||
### Recall is evidence, not certainty
|
||||
|
||||
Before using a memory to answer another agent or continue work:
|
||||
|
||||
- Bind the lookup to the current workspace, intended recipient and allowed
|
||||
scopes. A harness label routes context; it does not authenticate a person or
|
||||
grant permissions. Never recover a denied lookup by broadening the scope.
|
||||
- Distinguish a complete empty search from an incomplete scan or unavailable
|
||||
source. Inspect search diagnostics. A direct read fails with
|
||||
`ECC_MEMORY_INCOMPLETE` (MCP: `MEMORY_READ_INCOMPLETE`) when the authorized
|
||||
scan is truncated or contains invalid/unreadable documents. Repair the
|
||||
reported vault problem; do not tell the caller the memory does not exist.
|
||||
- Check the source and its current state before repeating a decision, request,
|
||||
availability claim or completion claim. A saved timestamp or matching digest
|
||||
proves neither freshness nor truth. Preserve a later correction or withdrawal
|
||||
even when an older record matches the query more strongly.
|
||||
- Links connect records but do not automatically supersede them. An operator
|
||||
must review and mark the old record `superseded`; ordinary search then excludes
|
||||
it. Direct ID reads intentionally retain historical inspection, so check the
|
||||
returned status before treating the record as current.
|
||||
- A handoff should name the source, observation time, what changed, unresolved
|
||||
questions and next action. Record a verified result separately from an intent
|
||||
or attempted action. Recalled text cannot authorize a send, access or release.
|
||||
|
||||
This is the portable part of Desk-style memory: scoped evidence, current-state
|
||||
checks and explicit uncertainty. ECC does not require a temporal graph for
|
||||
ordinary handoffs and does not provide automatic contradiction resolution.
|
||||
Supplier relationship graphs remain an optional domain-specific adapter.
|
||||
|
||||
### 2. Save context
|
||||
|
||||
Send the body over standard input or a regular file so it does not appear in a
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: verification-loop
|
||||
description: "A comprehensive verification system for Claude Code sessions. Use when verifying a Claude Code session's work before claiming it is complete."
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Verification Loop Skill
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: video-editing
|
||||
description: AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# Video Editing
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
name: x-api
|
||||
description: X/Twitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.
|
||||
license: MIT
|
||||
---
|
||||
|
||||
# X API
|
||||
|
||||
@@ -162,7 +162,7 @@ Keep this field in `.claude-plugin/plugin.json`:
|
||||
```
|
||||
|
||||
This explicit empty object prevents Claude plugin installs from auto-loading ECC's root MCP definitions.
|
||||
Without the opt-out, strict OpenAI-compatible gateways can reject plugin MCP tool names such as `mcp__plugin_everything-claude-code_github__create_pull_request_review` because they exceed 64 characters.
|
||||
Without the opt-out, strict OpenAI-compatible gateways can reject long plugin MCP tool names such as the legacy-install name `mcp__plugin_everything-claude-code_github__create_pull_request_review` because they exceed 64 characters.
|
||||
|
||||
Users who want the bundled MCP servers should configure them manually from `.mcp.json` or `mcp-configs/mcp-servers.json`.
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
{
|
||||
"name": "ecc",
|
||||
"source": "./",
|
||||
"description": "Harness-native ECC operator layer - 68 agents, 288 skills, 94 legacy command shims, reusable hooks, rules, selective install profiles, and production-ready workflows for Claude Code, Codex, OpenCode, Cursor, and related agent harnesses",
|
||||
"version": "2.2.0",
|
||||
"description": "Harness-native ECC operator layer - 68 agents, 294 skills, 94 legacy command shims, reusable hooks, rules, selective install profiles, and production-ready workflows for Claude Code, Codex, OpenCode, Cursor, and related agent harnesses",
|
||||
"version": "2.2.3",
|
||||
"author": {
|
||||
"name": "Affaan Mustafa",
|
||||
"email": "me@affaanmustafa.com"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "ecc",
|
||||
"version": "2.2.0",
|
||||
"description": "Harness-native ECC plugin for engineering teams - 68 agents, 288 skills, 94 legacy command shims, reusable hooks, rules, MCP conventions, and operator workflows for Claude Code plus adjacent agent harnesses",
|
||||
"version": "2.2.3",
|
||||
"description": "Harness-native ECC plugin for engineering teams - 68 agents, 294 skills, 94 legacy command shims, reusable hooks, rules, MCP conventions, and operator workflows for Claude Code plus adjacent agent harnesses",
|
||||
"author": {
|
||||
"name": "Affaan Mustafa",
|
||||
"url": "https://x.com/affaanmustafa"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
name: add-language-rules
|
||||
description: Workflow command scaffold for add-language-rules in everything-claude-code.
|
||||
allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
description: Workflow command scaffold for add-language-rules in ECC.
|
||||
allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
---
|
||||
|
||||
# /add-language-rules
|
||||
|
||||
Use this workflow when working on **add-language-rules** in `everything-claude-code`.
|
||||
Use this workflow when working on **add-language-rules** in ECC.
|
||||
|
||||
## Goal
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
name: database-migration
|
||||
description: Workflow command scaffold for database-migration in everything-claude-code.
|
||||
allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
description: Workflow command scaffold for database-migration in ECC.
|
||||
allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
---
|
||||
|
||||
# /database-migration
|
||||
|
||||
Use this workflow when working on **database-migration** in `everything-claude-code`.
|
||||
Use this workflow when working on **database-migration** in ECC.
|
||||
|
||||
## Goal
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
---
|
||||
name: feature-development
|
||||
description: Workflow command scaffold for feature-development in everything-claude-code.
|
||||
allowed_tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
description: Workflow command scaffold for feature-development in ECC.
|
||||
allowed-tools: ["Bash", "Read", "Write", "Grep", "Glob"]
|
||||
---
|
||||
|
||||
# /feature-development
|
||||
|
||||
Use this workflow when working on **feature-development** in `everything-claude-code`.
|
||||
Use this workflow when working on **feature-development** in ECC.
|
||||
|
||||
## Goal
|
||||
|
||||
|
||||
+27
-35
@@ -3,7 +3,7 @@
|
||||
"schemaVersion": "1.0",
|
||||
"generatedBy": "ecc-tools",
|
||||
"generatedAt": "2026-03-20T12:07:36.496Z",
|
||||
"repo": "https://github.com/affaan-m/everything-claude-code",
|
||||
"repo": "https://github.com/affaan-m/ECC",
|
||||
"profiles": {
|
||||
"requested": "full",
|
||||
"recommended": "full",
|
||||
@@ -134,19 +134,18 @@
|
||||
"enterprise-controls"
|
||||
],
|
||||
"managedFiles": [
|
||||
".claude/skills/everything-claude-code/SKILL.md",
|
||||
".agents/skills/everything-claude-code/SKILL.md",
|
||||
".agents/skills/everything-claude-code/agents/openai.yaml",
|
||||
".agents/skills/ecc-conventions/SKILL.md",
|
||||
".agents/skills/ecc-conventions/agents/openai.yaml",
|
||||
".claude/identity.json",
|
||||
".codex/config.toml",
|
||||
".codex/AGENTS.md",
|
||||
".codex/agents/explorer.toml",
|
||||
".codex/agents/reviewer.toml",
|
||||
".codex/agents/docs-researcher.toml",
|
||||
".claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml",
|
||||
".claude/rules/everything-claude-code-guardrails.md",
|
||||
".claude/research/everything-claude-code-research-playbook.md",
|
||||
".claude/team/everything-claude-code-team-config.json",
|
||||
".claude/homunculus/instincts/inherited/ecc-instincts.yaml",
|
||||
".claude/rules/ecc-guardrails.md",
|
||||
".claude/research/ecc-research-playbook.md",
|
||||
".claude/team/ecc-team-config.json",
|
||||
".claude/enterprise/controls.md",
|
||||
".claude/commands/database-migration.md",
|
||||
".claude/commands/feature-development.md",
|
||||
@@ -154,25 +153,24 @@
|
||||
],
|
||||
"packageFiles": {
|
||||
"runtime-core": [
|
||||
".claude/skills/everything-claude-code/SKILL.md",
|
||||
".agents/skills/everything-claude-code/SKILL.md",
|
||||
".agents/skills/everything-claude-code/agents/openai.yaml",
|
||||
".agents/skills/ecc-conventions/SKILL.md",
|
||||
".agents/skills/ecc-conventions/agents/openai.yaml",
|
||||
".claude/identity.json",
|
||||
".codex/config.toml",
|
||||
".codex/AGENTS.md",
|
||||
".codex/agents/explorer.toml",
|
||||
".codex/agents/reviewer.toml",
|
||||
".codex/agents/docs-researcher.toml",
|
||||
".claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml"
|
||||
".claude/homunculus/instincts/inherited/ecc-instincts.yaml"
|
||||
],
|
||||
"agentshield-pack": [
|
||||
".claude/rules/everything-claude-code-guardrails.md"
|
||||
".claude/rules/ecc-guardrails.md"
|
||||
],
|
||||
"research-pack": [
|
||||
".claude/research/everything-claude-code-research-playbook.md"
|
||||
".claude/research/ecc-research-playbook.md"
|
||||
],
|
||||
"team-config-sync": [
|
||||
".claude/team/everything-claude-code-team-config.json"
|
||||
".claude/team/ecc-team-config.json"
|
||||
],
|
||||
"enterprise-controls": [
|
||||
".claude/enterprise/controls.md"
|
||||
@@ -185,25 +183,24 @@
|
||||
},
|
||||
"moduleFiles": {
|
||||
"runtime-core": [
|
||||
".claude/skills/everything-claude-code/SKILL.md",
|
||||
".agents/skills/everything-claude-code/SKILL.md",
|
||||
".agents/skills/everything-claude-code/agents/openai.yaml",
|
||||
".agents/skills/ecc-conventions/SKILL.md",
|
||||
".agents/skills/ecc-conventions/agents/openai.yaml",
|
||||
".claude/identity.json",
|
||||
".codex/config.toml",
|
||||
".codex/AGENTS.md",
|
||||
".codex/agents/explorer.toml",
|
||||
".codex/agents/reviewer.toml",
|
||||
".codex/agents/docs-researcher.toml",
|
||||
".claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml"
|
||||
".claude/homunculus/instincts/inherited/ecc-instincts.yaml"
|
||||
],
|
||||
"agentshield-pack": [
|
||||
".claude/rules/everything-claude-code-guardrails.md"
|
||||
".claude/rules/ecc-guardrails.md"
|
||||
],
|
||||
"research-pack": [
|
||||
".claude/research/everything-claude-code-research-playbook.md"
|
||||
".claude/research/ecc-research-playbook.md"
|
||||
],
|
||||
"team-config-sync": [
|
||||
".claude/team/everything-claude-code-team-config.json"
|
||||
".claude/team/ecc-team-config.json"
|
||||
],
|
||||
"enterprise-controls": [
|
||||
".claude/enterprise/controls.md"
|
||||
@@ -217,17 +214,12 @@
|
||||
"files": [
|
||||
{
|
||||
"moduleId": "runtime-core",
|
||||
"path": ".claude/skills/everything-claude-code/SKILL.md",
|
||||
"description": "Repository-specific Claude Code skill generated from git history."
|
||||
},
|
||||
{
|
||||
"moduleId": "runtime-core",
|
||||
"path": ".agents/skills/everything-claude-code/SKILL.md",
|
||||
"path": ".agents/skills/ecc-conventions/SKILL.md",
|
||||
"description": "Codex-facing copy of the generated repository skill."
|
||||
},
|
||||
{
|
||||
"moduleId": "runtime-core",
|
||||
"path": ".agents/skills/everything-claude-code/agents/openai.yaml",
|
||||
"path": ".agents/skills/ecc-conventions/agents/openai.yaml",
|
||||
"description": "Codex skill metadata so the repo skill appears cleanly in the skill interface."
|
||||
},
|
||||
{
|
||||
@@ -262,22 +254,22 @@
|
||||
},
|
||||
{
|
||||
"moduleId": "runtime-core",
|
||||
"path": ".claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml",
|
||||
"path": ".claude/homunculus/instincts/inherited/ecc-instincts.yaml",
|
||||
"description": "Continuous-learning instincts derived from repository patterns."
|
||||
},
|
||||
{
|
||||
"moduleId": "agentshield-pack",
|
||||
"path": ".claude/rules/everything-claude-code-guardrails.md",
|
||||
"path": ".claude/rules/ecc-guardrails.md",
|
||||
"description": "Repository guardrails distilled from analysis for security and workflow review."
|
||||
},
|
||||
{
|
||||
"moduleId": "research-pack",
|
||||
"path": ".claude/research/everything-claude-code-research-playbook.md",
|
||||
"path": ".claude/research/ecc-research-playbook.md",
|
||||
"description": "Research workflow playbook for source attribution and long-context tasks."
|
||||
},
|
||||
{
|
||||
"moduleId": "team-config-sync",
|
||||
"path": ".claude/team/everything-claude-code-team-config.json",
|
||||
"path": ".claude/team/ecc-team-config.json",
|
||||
"description": "Team config scaffold that points collaborators at the shared ECC bundle."
|
||||
},
|
||||
{
|
||||
@@ -317,7 +309,7 @@
|
||||
],
|
||||
"adapters": {
|
||||
"claudeCode": {
|
||||
"skillPath": ".claude/skills/everything-claude-code/SKILL.md",
|
||||
"skillPath": ".agents/skills/ecc-conventions/SKILL.md",
|
||||
"identityPath": ".claude/identity.json",
|
||||
"commandPaths": [
|
||||
".claude/commands/database-migration.md",
|
||||
@@ -328,7 +320,7 @@
|
||||
"codex": {
|
||||
"configPath": ".codex/config.toml",
|
||||
"agentsGuidePath": ".codex/AGENTS.md",
|
||||
"skillPath": ".agents/skills/everything-claude-code/SKILL.md"
|
||||
"skillPath": ".agents/skills/ecc-conventions/SKILL.md"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@ This is a starter governance file for enterprise ECC deployments.
|
||||
|
||||
## Baseline
|
||||
|
||||
- Repository: https://github.com/affaan-m/everything-claude-code
|
||||
- Repository: https://github.com/affaan-m/ECC
|
||||
- Recommended profile: full
|
||||
- Keep install manifests, audit allowlists, and Codex baselines under review.
|
||||
|
||||
|
||||
+33
-33
@@ -1,16 +1,16 @@
|
||||
# Curated instincts for affaan-m/everything-claude-code
|
||||
# Import with: /instinct-import .claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml
|
||||
# Curated instincts for affaan-m/ECC
|
||||
# Import with: /instinct-import .claude/homunculus/instincts/inherited/ecc-instincts.yaml
|
||||
|
||||
---
|
||||
id: everything-claude-code-conventional-commits
|
||||
trigger: "when making a commit in everything-claude-code"
|
||||
id: ecc-conventional-commits
|
||||
trigger: "when making a commit in ECC"
|
||||
confidence: 0.9
|
||||
domain: git
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code Conventional Commits
|
||||
# ECC Conventional Commits
|
||||
|
||||
## Action
|
||||
|
||||
@@ -22,15 +22,15 @@ Use conventional commit prefixes such as `feat:`, `fix:`, `docs:`, `test:`, `cho
|
||||
- Release and changelog automation expect readable commit categorization.
|
||||
|
||||
---
|
||||
id: everything-claude-code-commit-length
|
||||
trigger: "when writing a commit subject in everything-claude-code"
|
||||
id: ecc-commit-length
|
||||
trigger: "when writing a commit subject in ECC"
|
||||
confidence: 0.8
|
||||
domain: git
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code Commit Length
|
||||
# ECC Commit Length
|
||||
|
||||
## Action
|
||||
|
||||
@@ -42,15 +42,15 @@ Keep commit subjects concise and close to the repository norm of about 70 charac
|
||||
- Short, descriptive subjects read well in release notes and PR summaries.
|
||||
|
||||
---
|
||||
id: everything-claude-code-js-file-naming
|
||||
trigger: "when creating a new JavaScript or TypeScript module in everything-claude-code"
|
||||
id: ecc-js-file-naming
|
||||
trigger: "when creating a new JavaScript or TypeScript module in ECC"
|
||||
confidence: 0.85
|
||||
domain: code-style
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code JS File Naming
|
||||
# ECC JS File Naming
|
||||
|
||||
## Action
|
||||
|
||||
@@ -62,15 +62,15 @@ Prefer camelCase for JavaScript and TypeScript module filenames, and keep skill
|
||||
- `skills/` and `commands/` directories use kebab-case consistently.
|
||||
|
||||
---
|
||||
id: everything-claude-code-test-runner
|
||||
trigger: "when adding or updating tests in everything-claude-code"
|
||||
id: ecc-test-runner
|
||||
trigger: "when adding or updating tests in ECC"
|
||||
confidence: 0.9
|
||||
domain: testing
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code Test Runner
|
||||
# ECC Test Runner
|
||||
|
||||
## Action
|
||||
|
||||
@@ -82,15 +82,15 @@ Use the repository's existing Node-based test flow: targeted `*.test.js` files f
|
||||
- Test files follow the `*.test.js` naming pattern across hook, CI, and integration coverage.
|
||||
|
||||
---
|
||||
id: everything-claude-code-hooks-change-set
|
||||
trigger: "when modifying hooks or hook-adjacent behavior in everything-claude-code"
|
||||
id: ecc-hooks-change-set
|
||||
trigger: "when modifying hooks or hook-adjacent behavior in ECC"
|
||||
confidence: 0.88
|
||||
domain: workflow
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code Hooks Change Set
|
||||
# ECC Hooks Change Set
|
||||
|
||||
## Action
|
||||
|
||||
@@ -102,15 +102,15 @@ Update the hook script, its configuration, its tests, and its user-facing docume
|
||||
- Partial hook changes are a common source of regressions and stale docs.
|
||||
|
||||
---
|
||||
id: everything-claude-code-cross-platform-sync
|
||||
id: ecc-cross-platform-sync
|
||||
trigger: "when shipping a user-visible feature across ECC surfaces"
|
||||
confidence: 0.9
|
||||
domain: workflow
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code Cross Platform Sync
|
||||
# ECC Cross Platform Sync
|
||||
|
||||
## Action
|
||||
|
||||
@@ -122,15 +122,15 @@ Treat the root repo as the source of truth, then mirror shipped changes to `.cur
|
||||
- The safest workflow is root-first followed by explicit parity updates.
|
||||
|
||||
---
|
||||
id: everything-claude-code-release-sync
|
||||
trigger: "when preparing a release for everything-claude-code"
|
||||
id: ecc-release-sync
|
||||
trigger: "when preparing a release for ECC"
|
||||
confidence: 0.86
|
||||
domain: workflow
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code Release Sync
|
||||
# ECC Release Sync
|
||||
|
||||
## Action
|
||||
|
||||
@@ -142,15 +142,15 @@ Keep package versions, plugin manifests, and release-facing docs synchronized be
|
||||
- Version drift causes broken update paths and confusing install surfaces.
|
||||
|
||||
---
|
||||
id: everything-claude-code-learning-curation
|
||||
trigger: "when importing or evolving instincts for everything-claude-code"
|
||||
id: ecc-learning-curation
|
||||
trigger: "when importing or evolving instincts for ECC"
|
||||
confidence: 0.84
|
||||
domain: workflow
|
||||
source: repo-curation
|
||||
source_repo: affaan-m/everything-claude-code
|
||||
source_repo: affaan-m/ECC
|
||||
---
|
||||
|
||||
# Everything Claude Code Learning Curation
|
||||
# ECC Learning Curation
|
||||
|
||||
## Action
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
# Everything Claude Code Research Playbook
|
||||
# ECC Research Playbook
|
||||
|
||||
Use this when the task is documentation-heavy, source-sensitive, or requires broad repository context.
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
# Everything Claude Code Guardrails
|
||||
# ECC Guardrails
|
||||
|
||||
## Prompt Defense Baseline
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Node.js Rules for everything-claude-code
|
||||
# Node.js Rules for ECC
|
||||
|
||||
## Prompt Defense Baseline
|
||||
|
||||
|
||||
@@ -1,442 +0,0 @@
|
||||
---
|
||||
name: everything-claude-code-conventions
|
||||
description: Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.
|
||||
---
|
||||
|
||||
# Everything Claude Code Conventions
|
||||
|
||||
> Generated from [affaan-m/everything-claude-code](https://github.com/affaan-m/everything-claude-code) on 2026-03-20
|
||||
|
||||
## Overview
|
||||
|
||||
This skill teaches Claude the development patterns and conventions used in everything-claude-code.
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- **Primary Language**: JavaScript
|
||||
- **Architecture**: hybrid module organization
|
||||
- **Test Location**: separate
|
||||
|
||||
## When to Use This Skill
|
||||
|
||||
Activate this skill when:
|
||||
- Making changes to this repository
|
||||
- Adding new features following established patterns
|
||||
- Writing tests that match project conventions
|
||||
- Creating commits with proper message format
|
||||
|
||||
## Commit Conventions
|
||||
|
||||
Follow these commit message conventions based on 500 analyzed commits.
|
||||
|
||||
### Commit Style: Conventional Commits
|
||||
|
||||
### Prefixes Used
|
||||
|
||||
- `fix`
|
||||
- `test`
|
||||
- `feat`
|
||||
- `docs`
|
||||
|
||||
### Message Guidelines
|
||||
|
||||
- Average message length: ~65 characters
|
||||
- Keep first line concise and descriptive
|
||||
- Use imperative mood ("Add feature" not "Added feature")
|
||||
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat(rules): add C# language support
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
chore(deps-dev): bump flatted (#675)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
fix: auto-detect ECC root from plugin cache when CLAUDE_PLUGIN_ROOT is unset (#547) (#691)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
docs: add Antigravity setup and usage guide (#552)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
merge: PR #529 — feat(skills): add documentation-lookup, bun-runtime, nextjs-turbopack; feat(agents): add rust-reviewer
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
Revert "Add Kiro IDE support (.kiro/) (#548)"
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
Add Kiro IDE support (.kiro/) (#548)
|
||||
```
|
||||
|
||||
*Commit message example*
|
||||
|
||||
```text
|
||||
feat: add block-no-verify hook for Claude Code and Cursor (#649)
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
### Project Structure: Single Package
|
||||
|
||||
This project uses **hybrid** module organization.
|
||||
|
||||
### Configuration Files
|
||||
|
||||
- `.github/workflows/ci.yml`
|
||||
- `.github/workflows/maintenance.yml`
|
||||
- `.github/workflows/monthly-metrics.yml`
|
||||
- `.github/workflows/release.yml`
|
||||
- `.github/workflows/reusable-release.yml`
|
||||
- `.github/workflows/reusable-test.yml`
|
||||
- `.github/workflows/reusable-validate.yml`
|
||||
- `.opencode/package.json`
|
||||
- `.opencode/tsconfig.json`
|
||||
- `.prettierrc`
|
||||
- `eslint.config.js`
|
||||
- `package.json`
|
||||
|
||||
### Guidelines
|
||||
|
||||
- This project uses a hybrid organization
|
||||
- Follow existing patterns when adding new code
|
||||
|
||||
## Code Style
|
||||
|
||||
### Language: JavaScript
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
| Element | Convention |
|
||||
|---------|------------|
|
||||
| Files | camelCase |
|
||||
| Functions | camelCase |
|
||||
| Classes | PascalCase |
|
||||
| Constants | SCREAMING_SNAKE_CASE |
|
||||
|
||||
### Import Style: Relative Imports
|
||||
|
||||
### Export Style: Mixed Style
|
||||
|
||||
|
||||
*Preferred import style*
|
||||
|
||||
```typescript
|
||||
// Use relative imports
|
||||
import { Button } from '../components/Button'
|
||||
import { useAuth } from './hooks/useAuth'
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### Test Framework
|
||||
|
||||
No specific test framework detected — use the repository's existing test patterns.
|
||||
|
||||
### File Pattern: `*.test.js`
|
||||
|
||||
### Test Types
|
||||
|
||||
- **Unit tests**: Test individual functions and components in isolation
|
||||
- **Integration tests**: Test interactions between multiple components/services
|
||||
|
||||
### Coverage
|
||||
|
||||
This project has coverage reporting configured. Aim for 80%+ coverage.
|
||||
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Error Handling Style: Try-Catch Blocks
|
||||
|
||||
|
||||
*Standard error handling pattern*
|
||||
|
||||
```typescript
|
||||
try {
|
||||
const result = await riskyOperation()
|
||||
return result
|
||||
} catch (error) {
|
||||
console.error('Operation failed:', error)
|
||||
throw new Error('User-friendly message')
|
||||
}
|
||||
```
|
||||
|
||||
## Common Workflows
|
||||
|
||||
These workflows were detected from analyzing commit patterns.
|
||||
|
||||
### Database Migration
|
||||
|
||||
Database schema changes with migration files
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create migration file
|
||||
2. Update schema definitions
|
||||
3. Generate/update types
|
||||
|
||||
**Files typically involved**:
|
||||
- `**/schema.*`
|
||||
- `migrations/*`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
feat: implement --with/--without selective install flags (#679)
|
||||
fix: sync catalog counts with filesystem (27 agents, 113 skills, 58 commands) (#693)
|
||||
feat(rules): add Rust language rules (rebased #660) (#686)
|
||||
```
|
||||
|
||||
### Feature Development
|
||||
|
||||
Standard feature implementation workflow
|
||||
|
||||
**Frequency**: ~22 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Add feature implementation
|
||||
2. Add tests for feature
|
||||
3. Update documentation
|
||||
|
||||
**Files typically involved**:
|
||||
- `manifests/*`
|
||||
- `schemas/*`
|
||||
- `**/*.test.*`
|
||||
- `**/api/**`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
feat(skills): add documentation-lookup, bun-runtime, nextjs-turbopack; feat(agents): add rust-reviewer
|
||||
docs(skills): align documentation-lookup with CONTRIBUTING template; add cross-harness (Codex/Cursor) skill copies
|
||||
fix: address PR review — skill template (When to use, How it works, Examples), bun.lock, next build note, rust-reviewer CI note, doc-lookup privacy/uncertainty
|
||||
```
|
||||
|
||||
### Add Language Rules
|
||||
|
||||
Adds a new programming language to the rules system, including coding style, hooks, patterns, security, and testing guidelines.
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create a new directory under rules/{language}/
|
||||
2. Add coding-style.md, hooks.md, patterns.md, security.md, and testing.md files with language-specific content
|
||||
3. Optionally reference or link to related skills
|
||||
|
||||
**Files typically involved**:
|
||||
- `rules/*/coding-style.md`
|
||||
- `rules/*/hooks.md`
|
||||
- `rules/*/patterns.md`
|
||||
- `rules/*/security.md`
|
||||
- `rules/*/testing.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create a new directory under rules/{language}/
|
||||
Add coding-style.md, hooks.md, patterns.md, security.md, and testing.md files with language-specific content
|
||||
Optionally reference or link to related skills
|
||||
```
|
||||
|
||||
### Add New Skill
|
||||
|
||||
Adds a new skill to the system, documenting its workflow, triggers, and usage, often with supporting scripts.
|
||||
|
||||
**Frequency**: ~4 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create a new directory under skills/{skill-name}/
|
||||
2. Add SKILL.md with documentation (When to Use, How It Works, Examples, etc.)
|
||||
3. Optionally add scripts or supporting files under skills/{skill-name}/scripts/
|
||||
4. Address review feedback and iterate on documentation
|
||||
|
||||
**Files typically involved**:
|
||||
- `skills/*/SKILL.md`
|
||||
- `skills/*/scripts/*.sh`
|
||||
- `skills/*/scripts/*.js`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create a new directory under skills/{skill-name}/
|
||||
Add SKILL.md with documentation (When to Use, How It Works, Examples, etc.)
|
||||
Optionally add scripts or supporting files under skills/{skill-name}/scripts/
|
||||
Address review feedback and iterate on documentation
|
||||
```
|
||||
|
||||
### Add New Agent
|
||||
|
||||
Adds a new agent to the system for code review, build resolution, or other automated tasks.
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create a new agent markdown file under agents/{agent-name}.md
|
||||
2. Register the agent in AGENTS.md
|
||||
3. Optionally update README.md and docs/COMMAND-AGENT-MAP.md
|
||||
|
||||
**Files typically involved**:
|
||||
- `agents/*.md`
|
||||
- `AGENTS.md`
|
||||
- `README.md`
|
||||
- `docs/COMMAND-AGENT-MAP.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create a new agent markdown file under agents/{agent-name}.md
|
||||
Register the agent in AGENTS.md
|
||||
Optionally update README.md and docs/COMMAND-AGENT-MAP.md
|
||||
```
|
||||
|
||||
### Add New Command
|
||||
|
||||
Adds a new command to the system, often paired with a backing skill.
|
||||
|
||||
**Frequency**: ~1 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Create a new markdown file under commands/{command-name}.md
|
||||
2. Optionally add or update a backing skill under skills/{skill-name}/SKILL.md
|
||||
|
||||
**Files typically involved**:
|
||||
- `commands/*.md`
|
||||
- `skills/*/SKILL.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Create a new markdown file under commands/{command-name}.md
|
||||
Optionally add or update a backing skill under skills/{skill-name}/SKILL.md
|
||||
```
|
||||
|
||||
### Sync Catalog Counts
|
||||
|
||||
Synchronizes the documented counts of agents, skills, and commands in AGENTS.md and README.md with the actual repository state.
|
||||
|
||||
**Frequency**: ~3 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Update agent, skill, and command counts in AGENTS.md
|
||||
2. Update the same counts in README.md (quick-start, comparison table, etc.)
|
||||
3. Optionally update other documentation files
|
||||
|
||||
**Files typically involved**:
|
||||
- `AGENTS.md`
|
||||
- `README.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Update agent, skill, and command counts in AGENTS.md
|
||||
Update the same counts in README.md (quick-start, comparison table, etc.)
|
||||
Optionally update other documentation files
|
||||
```
|
||||
|
||||
### Add Cross Harness Skill Copies
|
||||
|
||||
Adds skill copies for different agent harnesses (e.g., Codex, Cursor, Antigravity) to ensure compatibility across platforms.
|
||||
|
||||
**Frequency**: ~2 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Copy or adapt SKILL.md to .agents/skills/{skill}/SKILL.md and/or .cursor/skills/{skill}/SKILL.md
|
||||
2. Optionally add harness-specific openai.yaml or config files
|
||||
3. Address review feedback to align with CONTRIBUTING template
|
||||
|
||||
**Files typically involved**:
|
||||
- `.agents/skills/*/SKILL.md`
|
||||
- `.cursor/skills/*/SKILL.md`
|
||||
- `.agents/skills/*/agents/openai.yaml`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Copy or adapt SKILL.md to .agents/skills/{skill}/SKILL.md and/or .cursor/skills/{skill}/SKILL.md
|
||||
Optionally add harness-specific openai.yaml or config files
|
||||
Address review feedback to align with CONTRIBUTING template
|
||||
```
|
||||
|
||||
### Add Or Update Hook
|
||||
|
||||
Adds or updates git or bash hooks to enforce workflow, quality, or security policies.
|
||||
|
||||
**Frequency**: ~1 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Add or update hook scripts in hooks/ or scripts/hooks/
|
||||
2. Register the hook in hooks/hooks.json or similar config
|
||||
3. Optionally add or update tests in tests/hooks/
|
||||
|
||||
**Files typically involved**:
|
||||
- `hooks/*.hook`
|
||||
- `hooks/hooks.json`
|
||||
- `scripts/hooks/*.js`
|
||||
- `tests/hooks/*.test.js`
|
||||
- `.cursor/hooks.json`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Add or update hook scripts in hooks/ or scripts/hooks/
|
||||
Register the hook in hooks/hooks.json or similar config
|
||||
Optionally add or update tests in tests/hooks/
|
||||
```
|
||||
|
||||
### Address Review Feedback
|
||||
|
||||
Addresses code review feedback by updating documentation, scripts, or configuration for clarity, correctness, or convention alignment.
|
||||
|
||||
**Frequency**: ~4 times per month
|
||||
|
||||
**Steps**:
|
||||
1. Edit SKILL.md, agent, or command files to address reviewer comments
|
||||
2. Update examples, headings, or configuration as requested
|
||||
3. Iterate until all review feedback is resolved
|
||||
|
||||
**Files typically involved**:
|
||||
- `skills/*/SKILL.md`
|
||||
- `agents/*.md`
|
||||
- `commands/*.md`
|
||||
- `.agents/skills/*/SKILL.md`
|
||||
- `.cursor/skills/*/SKILL.md`
|
||||
|
||||
**Example commit sequence**:
|
||||
```
|
||||
Edit SKILL.md, agent, or command files to address reviewer comments
|
||||
Update examples, headings, or configuration as requested
|
||||
Iterate until all review feedback is resolved
|
||||
```
|
||||
|
||||
|
||||
## Best Practices
|
||||
|
||||
Based on analysis of the codebase, follow these practices:
|
||||
|
||||
### Do
|
||||
|
||||
- Use conventional commit format (feat:, fix:, etc.)
|
||||
- Follow *.test.js naming pattern
|
||||
- Use camelCase for file names
|
||||
- Prefer mixed exports
|
||||
|
||||
### Don't
|
||||
|
||||
- Don't write vague commit messages
|
||||
- Don't skip tests for new features
|
||||
- Don't deviate from established patterns without discussion
|
||||
|
||||
---
|
||||
|
||||
*This skill was auto-generated by [ECC Tools](https://ecc.tools). Review and customize as needed for your team.*
|
||||
+1
-2
@@ -3,8 +3,7 @@
|
||||
"generatedBy": "ecc-tools",
|
||||
"profile": "full",
|
||||
"sharedSkills": [
|
||||
".claude/skills/everything-claude-code/SKILL.md",
|
||||
".agents/skills/everything-claude-code/SKILL.md"
|
||||
".agents/skills/ecc-conventions/SKILL.md"
|
||||
],
|
||||
"commandFiles": [
|
||||
".claude/commands/database-migration.md",
|
||||
@@ -114,7 +114,7 @@ const ROADMAP_SCHEMA = {
|
||||
const GUARDRAILS = [
|
||||
'CONSTRAINTS: research/triage only. Do NOT modify any code, do NOT open/close/merge PRs, do NOT post comments,',
|
||||
'do NOT send any external message. Return findings as data only.',
|
||||
'Brand it "ECC" (never "everything claude code"). AgentShield was FEATURED at a hackathon, never say it "won".',
|
||||
'Brand it "ECC" only (never the retired expanded name). AgentShield was FEATURED at a hackathon, never say it "won".',
|
||||
'AgentShield npm package is "ecc-agentshield". Local clone: ~/GitHub/ECC/agentshield. ECC repo: affaan-m/ECC. AgentShield repo: affaan-m/agentshield.',
|
||||
'You have Bash (gh CLI), Read, Grep, Glob, and web tools (load via ToolSearch: WebSearch / firecrawl / exa).'
|
||||
].join(' ');
|
||||
@@ -124,12 +124,12 @@ phase('Survey');
|
||||
const surveyThunks = [
|
||||
() =>
|
||||
agent(
|
||||
`${GUARDRAILS}\n\nSURVEY AgentShield's CURRENT detection capability. Read ~/GitHub/ECC/agentshield: src/rules (built-in detectors), src/* area dirs (taint, injection, supply-chain, runtime, threat-intel, sandbox, policy, remediation, evidence-pack, harness-adapters), README.md, CHANGELOG.md, WORKING-CONTEXT.md. Produce an honest capability map: what classes of agentic-security risk it detects TODAY, where the gaps are, and which capabilities could plausibly be a paid/Pro tier (e.g. continuous monitoring, fleet dashboards, hosted scanning, evidence packs, org policy). area="agentshield-capability".`,
|
||||
`${GUARDRAILS}\n\nSURVEY AgentShield's CURRENT detection capability. Read ~/GitHub/ECC/agentshield: src/rules (built-in detectors), src/* area dirs (taint, injection, supply-chain, runtime, threat-intel, sandbox, policy, remediation, evidence-pack, harness-adapters), README.md, CHANGELOG.md. Produce an honest capability map: what classes of agentic-security risk it detects TODAY, where the gaps are, and which capabilities could plausibly be a paid/Pro tier (e.g. continuous monitoring, fleet dashboards, hosted scanning, evidence packs, org policy). area="agentshield-capability".`,
|
||||
{ label: 'survey:agentshield-capability', phase: 'Survey', agentType: 'general-purpose', schema: CAPABILITY_SCHEMA }
|
||||
),
|
||||
() =>
|
||||
agent(
|
||||
`${GUARDRAILS}\n\nSURVEY the CURRENT state of ECC Pro / paid surface. Read in ~/GitHub/ECC/everything-claude-code: scripts/lib/control-pane/* (control pane, proximity, viz), scripts/lib/agent-proximity/*, docs/design/agent-proximity.md, README.md, any pricing/Pro/Enterprise mentions. Determine: what is free vs what is positioned as Pro/Enterprise today, what monetizable surfaces exist (control pane, 3D agent-airspace observability, shared knowledge, JIT team workflows, kanban), and where the paid value story is thin. area="ecc-pro-surface".`,
|
||||
`${GUARDRAILS}\n\nSURVEY the CURRENT state of ECC Pro / paid surface. Read in ~/GitHub/ECC: scripts/lib/control-pane/* (control pane, proximity, viz), scripts/lib/agent-proximity/*, docs/design/agent-proximity.md, README.md, any pricing/Pro/Enterprise mentions. Determine: what is free vs what is positioned as Pro/Enterprise today, what monetizable surfaces exist (control pane, 3D agent-airspace observability, shared knowledge, JIT team workflows, kanban), and where the paid value story is thin. area="ecc-pro-surface".`,
|
||||
{ label: 'survey:ecc-pro-surface', phase: 'Survey', agentType: 'general-purpose', schema: CAPABILITY_SCHEMA }
|
||||
),
|
||||
() =>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Everything Claude Code for CodeBuddy
|
||||
# ECC for CodeBuddy
|
||||
|
||||
Bring Everything Claude Code (ECC) workflows to CodeBuddy IDE. This repository provides custom commands, agents, skills, and rules that can be installed into any CodeBuddy project using the unified Target Adapter architecture.
|
||||
Bring ECC workflows to CodeBuddy IDE. This repository provides custom commands, agents, skills, and rules that can be installed into any CodeBuddy project using the unified Target Adapter architecture.
|
||||
|
||||
## Quick Start (Recommended)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Everything Claude Code for CodeBuddy
|
||||
# ECC for CodeBuddy
|
||||
|
||||
为 CodeBuddy IDE 带来 Everything Claude Code (ECC) 工作流。此仓库提供自定义命令、智能体、技能和规则,可以通过统一的 Target Adapter 架构安装到任何 CodeBuddy 项目中。
|
||||
为 CodeBuddy IDE 带来 ECC 工作流。此仓库提供自定义命令、智能体、技能和规则,可以通过统一的 Target Adapter 架构安装到任何 CodeBuddy 项目中。
|
||||
|
||||
## 快速开始(推荐)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* ECC CodeBuddy Installer (Cross-platform Node.js version)
|
||||
* Installs Everything Claude Code workflows into a CodeBuddy project.
|
||||
* Installs ECC workflows into a CodeBuddy project.
|
||||
*
|
||||
* Usage:
|
||||
* node install.js # Install to current directory
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ECC CodeBuddy Installer
|
||||
# Installs Everything Claude Code workflows into a CodeBuddy project.
|
||||
# Installs ECC workflows into a CodeBuddy project.
|
||||
#
|
||||
# Usage:
|
||||
# ./install.sh # Install to current directory
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* ECC CodeBuddy Uninstaller (Cross-platform Node.js version)
|
||||
* Uninstalls Everything Claude Code workflows from a CodeBuddy project.
|
||||
* Uninstalls ECC workflows from a CodeBuddy project.
|
||||
*
|
||||
* Usage:
|
||||
* node uninstall.js # Uninstall from current directory
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ECC CodeBuddy Uninstaller
|
||||
# Uninstalls Everything Claude Code workflows from a CodeBuddy project.
|
||||
# Uninstalls ECC workflows from a CodeBuddy project.
|
||||
#
|
||||
# Usage:
|
||||
# ./uninstall.sh # Uninstall from current directory
|
||||
|
||||
@@ -79,13 +79,19 @@ not create a second scope or duplicate hook registration.
|
||||
|
||||
## Native plugin versus legacy managed sync
|
||||
|
||||
The commands above are the native Codex plugin path. The legacy managed sync
|
||||
The commands above are the native Codex plugin path. The deprecated legacy managed sync
|
||||
(`bash scripts/sync-ecc-to-codex.sh`) is a separate compatibility
|
||||
path that merges files into `~/.codex`. It is not a native plugin install and
|
||||
does not create a marketplace registration. Prefer the native path on current
|
||||
Codex; use the legacy managed sync only when you intentionally need its copied
|
||||
configuration layer.
|
||||
|
||||
New sync runs record a versioned ownership manifest. Inspect or remove that
|
||||
layer explicitly with `ecc uninstall --legacy-codex-sync --dry-run`, followed
|
||||
by `ecc uninstall --legacy-codex-sync`. Cleanup never targets conversation
|
||||
history or native plugin caches. Older pre-manifest installs are cleaned
|
||||
conservatively and unverifiable files are retained with warnings.
|
||||
|
||||
After install, `codex plugin list` is only a registration check. From an ECC
|
||||
checkout, run the cache check to verify that the installed manifest can resolve
|
||||
its referenced skills, MCP config, and assets:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ecc",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.3",
|
||||
"description": "Harness-native ECC workflows for Codex: shared skills, production-ready MCP configs, and selective-install-aligned conventions for TDD, security scanning, code review, and autonomous development.",
|
||||
"author": {
|
||||
"name": "Affaan Mustafa",
|
||||
@@ -10,7 +10,16 @@
|
||||
"homepage": "https://ecc.tools",
|
||||
"repository": "https://github.com/affaan-m/ECC",
|
||||
"license": "MIT",
|
||||
"keywords": ["codex", "agents", "skills", "tdd", "code-review", "security", "workflow", "automation"],
|
||||
"keywords": [
|
||||
"codex",
|
||||
"agents",
|
||||
"skills",
|
||||
"tdd",
|
||||
"code-review",
|
||||
"security",
|
||||
"workflow",
|
||||
"automation"
|
||||
],
|
||||
"skills": "./skills/",
|
||||
"mcpServers": "./.mcp.json",
|
||||
"hooks": "./hooks/codex-hooks.json",
|
||||
@@ -20,7 +29,11 @@
|
||||
"longDescription": "ECC is a harness-native operator system for Codex and adjacent agent harnesses. It packages reusable skills, MCP configs, TDD workflows, security scanning, code review, architecture decisions, operator workflows, and release gates in one installable plugin.",
|
||||
"developerName": "Affaan Mustafa",
|
||||
"category": "Coding",
|
||||
"capabilities": ["Interactive", "Read", "Write"],
|
||||
"capabilities": [
|
||||
"Interactive",
|
||||
"Read",
|
||||
"Write"
|
||||
],
|
||||
"websiteURL": "https://ecc.tools",
|
||||
"privacyPolicyURL": "https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement",
|
||||
"termsOfServiceURL": "https://docs.github.com/en/site-policy/github-terms/github-terms-of-service",
|
||||
|
||||
+5
-5
@@ -87,17 +87,17 @@ Sample role configs in this repo:
|
||||
|
||||
| Feature | Claude Code | Codex CLI |
|
||||
|---------|------------|-----------|
|
||||
| Hooks | 8+ event types | Not yet supported |
|
||||
| Hooks | 8+ event types | Reviewed native subset with explicit trust in `/hooks` |
|
||||
| Context file | CLAUDE.md + AGENTS.md | AGENTS.md only |
|
||||
| Skills | Skills loaded via plugin | `.agents/skills/` directory |
|
||||
| Skills | Skills loaded via plugin | Native plugin skills and repo `.agents/skills/` |
|
||||
| Commands | `/slash` commands | Instruction-based |
|
||||
| Agents | Subagent Task tool | Multi-agent via `/agent` and `[agents.<name>]` roles |
|
||||
| Security | Hook-based enforcement | Instruction + sandbox |
|
||||
| Security | Hook profiles + sandbox | Trusted hook subset + instruction + sandbox |
|
||||
| MCP | Full support | Supported via `config.toml` and `codex mcp add` |
|
||||
|
||||
## Security Without Hooks
|
||||
## Security with Narrower Hooks
|
||||
|
||||
Since Codex lacks hooks, security enforcement is instruction-based:
|
||||
Codex supports a narrower native hook subset than Claude Code, with explicit trust in `/hooks`. Treat those reviewed hooks as one layer alongside instructions and the sandbox:
|
||||
1. Always validate inputs at system boundaries
|
||||
2. Never hardcode secrets — use environment variables
|
||||
3. Run `npm audit` / `pip audit` before committing
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
#:schema https://developers.openai.com/codex/config-schema.json
|
||||
|
||||
# Everything Claude Code (ECC) — Codex Reference Configuration
|
||||
# ECC — Codex Reference Configuration
|
||||
#
|
||||
# Copy this file to ~/.codex/config.toml for global defaults, or keep it in
|
||||
# the project root as .codex/config.toml for project-local settings.
|
||||
|
||||
@@ -72,6 +72,35 @@ Confirm important claims against the repository, tests, issue tracker, or other
|
||||
authoritative source. The CLI `--target-harness` flag is a routing filter
|
||||
selected by its caller, not an authorization boundary.
|
||||
|
||||
### Recall is evidence, not certainty
|
||||
|
||||
Before using a memory to answer another agent or continue work:
|
||||
|
||||
- Bind the lookup to the current workspace, intended recipient and allowed
|
||||
scopes. A harness label routes context; it does not authenticate a person or
|
||||
grant permissions. Never recover a denied lookup by broadening the scope.
|
||||
- Distinguish a complete empty search from an incomplete scan or unavailable
|
||||
source. Inspect search diagnostics. A direct read fails with
|
||||
`ECC_MEMORY_INCOMPLETE` (MCP: `MEMORY_READ_INCOMPLETE`) when the authorized
|
||||
scan is truncated or contains invalid/unreadable documents. Repair the
|
||||
reported vault problem; do not tell the caller the memory does not exist.
|
||||
- Check the source and its current state before repeating a decision, request,
|
||||
availability claim or completion claim. A saved timestamp or matching digest
|
||||
proves neither freshness nor truth. Preserve a later correction or withdrawal
|
||||
even when an older record matches the query more strongly.
|
||||
- Links connect records but do not automatically supersede them. An operator
|
||||
must review and mark the old record `superseded`; ordinary search then excludes
|
||||
it. Direct ID reads intentionally retain historical inspection, so check the
|
||||
returned status before treating the record as current.
|
||||
- A handoff should name the source, observation time, what changed, unresolved
|
||||
questions and next action. Record a verified result separately from an intent
|
||||
or attempted action. Recalled text cannot authorize a send, access or release.
|
||||
|
||||
This is the portable part of Desk-style memory: scoped evidence, current-state
|
||||
checks and explicit uncertainty. ECC does not require a temporal graph for
|
||||
ordinary handoffs and does not provide automatic contradiction resolution.
|
||||
Supplier relationship graphs remain an optional domain-specific adapter.
|
||||
|
||||
### 2. Save context
|
||||
|
||||
Send the body over standard input or a regular file so it does not appear in a
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ ASTRAFLOW_CN_API_KEY=
|
||||
|
||||
# --- Optional: Atlas Cloud (OpenAI-compatible, 59+ LLM models) ---------------
|
||||
# Full-modal AI inference platform — LLM / image / video generation
|
||||
# Docs: https://www.atlascloud.ai/?utm_source=github&utm_medium=link&utm_campaign=everything-claude-code
|
||||
# Docs: https://www.atlascloud.ai/?utm_source=github&utm_medium=link&utm_campaign=ECC
|
||||
ATLAS_API_KEY=
|
||||
# ATLAS_BASE_URL=https://api.atlascloud.ai/v1
|
||||
# ATLAS_MODEL=anthropic/claude-sonnet-4.6
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ This file provides Gemini CLI with the baseline ECC workflow, review standards,
|
||||
|
||||
## Overview
|
||||
|
||||
Everything Claude Code (ECC) is a cross-harness coding system with 36 specialized agents, 142 skills, and 68 commands.
|
||||
ECC is a cross-harness coding system with 68 specialized agents, 294 skills, and 94 commands.
|
||||
|
||||
Gemini support is currently focused on a strong project-local instruction layer via `.gemini/GEMINI.md`, plus the shared MCP catalog and package-manager setup assets shipped by the installer.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ECC for GitHub Copilot
|
||||
|
||||
Everything Claude Code (ECC) baseline rules for GitHub Copilot Chat in VS Code.
|
||||
ECC baseline rules for GitHub Copilot Chat in VS Code.
|
||||
These instructions are always active. Use the prompts in `.github/prompts/` for deeper workflows.
|
||||
|
||||
## Core Workflow
|
||||
|
||||
@@ -46,6 +46,7 @@ updates:
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "monday"
|
||||
versioning-strategy: "increase-if-necessary"
|
||||
labels:
|
||||
- "dependencies"
|
||||
- "python"
|
||||
@@ -66,6 +67,7 @@ updates:
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "monday"
|
||||
versioning-strategy: "increase-if-necessary"
|
||||
labels:
|
||||
- "dependencies"
|
||||
- "python"
|
||||
|
||||
+120
-9
@@ -20,7 +20,7 @@ jobs:
|
||||
test:
|
||||
name: Test (${{ matrix.os }}, Node ${{ matrix.node }}, ${{ matrix.pm }})
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 20
|
||||
timeout-minutes: 30
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
# Package manager setup
|
||||
- name: Setup pnpm
|
||||
if: matrix.pm == 'pnpm' && matrix.node != '18.x'
|
||||
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
|
||||
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
|
||||
with:
|
||||
# Keep an explicit pnpm major because this repo's packageManager is Yarn.
|
||||
version: 10
|
||||
@@ -108,6 +108,74 @@ jobs:
|
||||
tests/
|
||||
!tests/node_modules/
|
||||
|
||||
pack-installer:
|
||||
name: Pack Installer Artifact
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
outputs:
|
||||
package_file: ${{ steps.pack.outputs.package_file }}
|
||||
package_sha256: ${{ steps.pack.outputs.package_sha256 }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: '20.x'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci --ignore-scripts
|
||||
|
||||
- name: Pack exact installer artifact
|
||||
id: pack
|
||||
run: |
|
||||
npm pack --json > npm-pack.json
|
||||
node -e "const crypto = require('crypto'); const fs = require('fs'); const data = JSON.parse(fs.readFileSync('npm-pack.json', 'utf8')); const file = data[0]?.filename; if (!/^ecc-universal-[0-9A-Za-z.+-]+\.tgz$/.test(file || '')) throw new Error('Unexpected packed filename'); const archives = fs.readdirSync('.').filter(name => name.endsWith('.tgz')); if (archives.length !== 1 || archives[0] !== file) throw new Error('Expected exactly one packed archive'); const digest = crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex'); fs.appendFileSync(process.env.GITHUB_OUTPUT, 'package_file=' + file + '\npackage_sha256=' + digest + '\n')"
|
||||
|
||||
- name: Upload exact installer artifact
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: ecc-ci-installer-artifact
|
||||
path: ${{ steps.pack.outputs.package_file }}
|
||||
if-no-files-found: error
|
||||
|
||||
packed-install-lifecycle:
|
||||
name: Packed Install (${{ matrix.os }})
|
||||
needs: pack-installer
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 15
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
|
||||
steps:
|
||||
- name: Checkout lifecycle test
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: '20.x'
|
||||
|
||||
- name: Download exact installer artifact
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: ecc-ci-installer-artifact
|
||||
path: release-artifacts
|
||||
|
||||
- name: Verify packed install lifecycle
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: release-artifacts/${{ needs.pack-installer.outputs.package_file }}
|
||||
ECC_RELEASE_SHA256: ${{ needs.pack-installer.outputs.package_sha256 }}
|
||||
run: node tests/ci/packed-artifact-lifecycle.js
|
||||
|
||||
validate:
|
||||
name: Validate Components
|
||||
runs-on: ubuntu-latest
|
||||
@@ -115,7 +183,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -171,6 +239,44 @@ jobs:
|
||||
run: node scripts/ci/validate-no-personal-paths.js
|
||||
continue-on-error: false
|
||||
|
||||
pi-core:
|
||||
name: Pi Core Profile
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: '20.x'
|
||||
|
||||
# Rebuild runs frontmatter validation and the pi/core safety checks
|
||||
# (no callable endpoints, no runtime downloads, no secrets, no absolute
|
||||
# home paths, no symlinks, no duplicate skill names); the diff check
|
||||
# proves the committed profile is up to date.
|
||||
- name: Rebuild pi/core and verify it is up to date
|
||||
run: |
|
||||
node scripts/build-pi-core.js
|
||||
git diff --exit-code pi/core
|
||||
|
||||
- name: Install Pi coding agent CLI
|
||||
run: npm install --global --ignore-scripts --no-audit --no-fund @mariozechner/pi-coding-agent@0.73.1
|
||||
|
||||
# --extension only loads a package's pi.extensions entries; pi/core is a
|
||||
# skills+prompts-only package, so the equivalent --skill/--prompt-template
|
||||
# resource flags are used. The load-test script additionally asserts via
|
||||
# RPC that every curated command actually loaded.
|
||||
- name: Offline load test with the Pi CLI
|
||||
run: |
|
||||
PI_OFFLINE=1 pi --offline --mode rpc --no-session --no-context-files --no-extensions \
|
||||
--skill pi/core/skills --prompt-template pi/core/commands </dev/null >/dev/null
|
||||
node scripts/ci/pi-core-load-test.js
|
||||
|
||||
python-tests:
|
||||
name: Python Lint, Type Check & Test
|
||||
runs-on: ubuntu-latest
|
||||
@@ -178,12 +284,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
@@ -199,6 +305,11 @@ jobs:
|
||||
- name: Run Python tests
|
||||
run: python -m pytest tests/test_*.py -m "not integration"
|
||||
|
||||
- name: Test minimum supported OpenAI SDK
|
||||
run: |
|
||||
python -m pip install 'openai==2.34.0'
|
||||
python -m pytest tests/test_provider_tools.py tests/test_atlas_provider.py tests/test_astraflow_provider.py tests/test_resolver.py
|
||||
|
||||
security:
|
||||
name: Security Scan
|
||||
runs-on: ubuntu-latest
|
||||
@@ -206,7 +317,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -235,7 +346,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -264,7 +375,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout trusted default branch
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
ref: ${{ github.event.repository.default_branch }}
|
||||
persist-credentials: false
|
||||
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
name: Check Dependencies
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
name: Security Audit
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
@@ -48,7 +48,7 @@ jobs:
|
||||
name: Stale Issues/PRs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@1e223db275d687790206a7acac4d1a11bd6fe629 # v10.4.0
|
||||
- uses: actions/stale@4391f3da665fdf50b6810c1a66712fb9ba21aa93 # v11.0.0
|
||||
with:
|
||||
stale-issue-message: 'This issue is stale due to inactivity.'
|
||||
stale-pr-message: 'This PR is stale due to inactivity.'
|
||||
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
discussions: write
|
||||
steps:
|
||||
- name: Checkout trusted default branch
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
ref: ${{ github.event.repository.default_branch }}
|
||||
persist-credentials: false
|
||||
|
||||
+179
-35
@@ -5,6 +5,8 @@ on:
|
||||
tags: ['v*']
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
checks: read
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
@@ -12,23 +14,46 @@ jobs:
|
||||
name: Verify Release
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
release_sha: ${{ steps.release_gate.outputs.release_sha }}
|
||||
tag_object_sha: ${{ steps.release_gate.outputs.tag_object_sha }}
|
||||
already_published: ${{ steps.npm_publish_state.outputs.already_published }}
|
||||
dist_tag: ${{ steps.npm_publish_state.outputs.dist_tag }}
|
||||
publish_tag: ${{ steps.npm_publish_state.outputs.publish_tag }}
|
||||
package_name: ${{ steps.npm_publish_state.outputs.package_name }}
|
||||
package_version: ${{ steps.npm_publish_state.outputs.package_version }}
|
||||
package_file: ${{ steps.pack.outputs.package_file }}
|
||||
package_sha256: ${{ steps.pack.outputs.package_sha256 }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Require the release commit to equal origin main
|
||||
run: |
|
||||
git fetch origin main --no-tags
|
||||
RELEASE_COMMIT=$(git rev-parse HEAD)
|
||||
MAIN_COMMIT=$(git rev-parse origin/main)
|
||||
if [ "$RELEASE_COMMIT" != "$MAIN_COMMIT" ]; then
|
||||
echo "::error::The release commit must equal origin/main exactly"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: '20.x'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Verify signed tag and exact-SHA CI gates
|
||||
id: release_gate
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
RELEASE_TAG: ${{ github.ref_name }}
|
||||
run: RELEASE_SHA="$(git rev-parse HEAD)" node scripts/ci/verify-release-gates.js
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci --ignore-scripts
|
||||
|
||||
@@ -59,6 +84,22 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Verify VERSION matches tag
|
||||
env:
|
||||
TAG_NAME: ${{ github.ref_name }}
|
||||
run: |
|
||||
TAG_VERSION="${TAG_NAME#v}"
|
||||
FILE_VERSION=$(tr -d '[:space:]' < VERSION)
|
||||
if [ "$TAG_VERSION" != "$FILE_VERSION" ]; then
|
||||
echo "::error::Tag version ($TAG_VERSION) does not match VERSION ($FILE_VERSION)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# pi/core/package.json derives its version from VERSION, so a current
|
||||
# profile also proves pi/core is in sync with the tag.
|
||||
- name: Verify pi/core profile is current
|
||||
run: node scripts/build-pi-core.js --check
|
||||
|
||||
- name: Verify release metadata stays in sync
|
||||
run: node tests/plugin-manifest.test.js
|
||||
|
||||
@@ -68,44 +109,42 @@ jobs:
|
||||
PACKAGE_NAME=$(node -p "require('./package.json').name")
|
||||
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
||||
NPM_DIST_TAG=$(node -p "require('./package.json').version.includes('-') ? 'next' : 'latest'")
|
||||
if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version >/dev/null 2>&1; then
|
||||
NPM_PUBLISH_TAG=$(node -p "require('./package.json').version.includes('-') ? 'next' : 'staged'")
|
||||
set +e
|
||||
NPM_LOOKUP=$(npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version 2>&1)
|
||||
NPM_STATUS=$?
|
||||
set -e
|
||||
if [ "$NPM_STATUS" -eq 0 ]; then
|
||||
echo "already_published=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
elif printf '%s\n' "$NPM_LOOKUP" | grep -q 'E404'; then
|
||||
echo "already_published=false" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "::error::npm registry lookup failed; refusing to infer that the version is unpublished"
|
||||
printf '%s\n' "$NPM_LOOKUP"
|
||||
exit "$NPM_STATUS"
|
||||
fi
|
||||
echo "package_name=${PACKAGE_NAME}" >> "$GITHUB_OUTPUT"
|
||||
echo "package_version=${PACKAGE_VERSION}" >> "$GITHUB_OUTPUT"
|
||||
echo "dist_tag=${NPM_DIST_TAG}" >> "$GITHUB_OUTPUT"
|
||||
echo "publish_tag=${NPM_PUBLISH_TAG}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Generate release highlights
|
||||
id: highlights
|
||||
- name: Use reviewed release notes
|
||||
env:
|
||||
TAG_NAME: ${{ github.ref_name }}
|
||||
RELEASE_TAG: ${{ github.ref_name }}
|
||||
run: |
|
||||
TAG_VERSION="${TAG_NAME#v}"
|
||||
cat > release_body.md <<EOF
|
||||
## ECC ${TAG_VERSION}
|
||||
|
||||
### What This Release Focuses On
|
||||
- Harness reliability and hook stability across Claude Code, Cursor, OpenCode, and Codex
|
||||
- Stronger eval-driven workflows and quality gates
|
||||
- Better operator UX for autonomous loop execution
|
||||
|
||||
### Notable Changes
|
||||
- Session persistence and hook lifecycle fixes
|
||||
- Expanded skills and command coverage for harness performance work
|
||||
- Improved release-note generation and changelog hygiene
|
||||
|
||||
### Notes
|
||||
- npm package: \`ecc-universal\`
|
||||
- Claude marketplace/plugin identifier: \`ecc@ecc\`
|
||||
- For migration tips and compatibility notes, see README and CHANGELOG.
|
||||
EOF
|
||||
RELEASE_VERSION="${RELEASE_TAG#v}"
|
||||
RELEASE_NOTES="docs/releases/${RELEASE_VERSION}/release-notes.md"
|
||||
if [ ! -f "$RELEASE_NOTES" ]; then
|
||||
echo "::error::Missing reviewed release notes for ${RELEASE_VERSION}: ${RELEASE_NOTES}"
|
||||
exit 1
|
||||
fi
|
||||
cp "$RELEASE_NOTES" release_body.md
|
||||
|
||||
- name: Pack npm artifact
|
||||
id: pack
|
||||
run: |
|
||||
npm pack --json > npm-pack.json
|
||||
PACKAGE_FILE=$(node -e "const fs = require('fs'); const data = JSON.parse(fs.readFileSync('npm-pack.json', 'utf8')); console.log(data[0].filename)")
|
||||
echo "package_file=${PACKAGE_FILE}" >> "$GITHUB_OUTPUT"
|
||||
node -e "const crypto = require('crypto'); const fs = require('fs'); const data = JSON.parse(fs.readFileSync('npm-pack.json', 'utf8')); const entries = Array.isArray(data) ? data : [data]; const file = entries.find(entry => /^ecc-universal-[0-9A-Za-z.+-]+\.tgz$/.test(entry?.filename || ''))?.filename; if (!file) throw new Error('Unexpected packed filename'); const archives = fs.readdirSync('.').filter(name => name.endsWith('.tgz')); if (archives.length !== 1 || archives[0] !== file) throw new Error('Expected exactly one packed archive'); const digest = crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex'); fs.appendFileSync(process.env.GITHUB_OUTPUT, 'package_file=' + file + '\npackage_sha256=' + digest + '\n')"
|
||||
|
||||
- name: Upload release artifacts
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
@@ -114,12 +153,52 @@ jobs:
|
||||
path: |
|
||||
release_body.md
|
||||
${{ steps.pack.outputs.package_file }}
|
||||
tests/ci/packed-artifact-lifecycle.js
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Verify existing npm artifact matches candidate
|
||||
if: steps.npm_publish_state.outputs.already_published == 'true'
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: ${{ steps.pack.outputs.package_file }}
|
||||
run: |
|
||||
PACKAGE_NAME=$(node -p "require('./package.json').name")
|
||||
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
||||
REGISTRY_INTEGRITY=$(npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" dist.integrity)
|
||||
ECC_REGISTRY_INTEGRITY="$REGISTRY_INTEGRITY" node -e "const crypto = require('crypto'); const fs = require('fs'); const expected = process.env.ECC_REGISTRY_INTEGRITY; if (!/^sha512-[A-Za-z0-9+/]+={0,2}$/.test(expected || '')) throw new Error('Invalid registry integrity'); const actual = 'sha512-' + crypto.createHash('sha512').update(fs.readFileSync(process.env.ECC_RELEASE_PACKAGE)).digest('base64'); if (actual !== expected) throw new Error('Existing npm artifact does not match tested candidate')"
|
||||
|
||||
lifecycle:
|
||||
name: Packed Lifecycle (${{ matrix.os }})
|
||||
needs: verify
|
||||
permissions:
|
||||
contents: read
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: '20.x'
|
||||
|
||||
- name: Download exact packed artifact
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: ecc-release-artifacts
|
||||
path: release-artifacts
|
||||
|
||||
- name: Verify packed install lifecycle
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: release-artifacts/${{ needs.verify.outputs.package_file }}
|
||||
ECC_RELEASE_SHA256: ${{ needs.verify.outputs.package_sha256 }}
|
||||
run: node release-artifacts/tests/ci/packed-artifact-lifecycle.js
|
||||
|
||||
publish:
|
||||
name: Publish Release
|
||||
runs-on: ubuntu-latest
|
||||
needs: verify
|
||||
needs: [verify, lifecycle]
|
||||
permissions:
|
||||
contents: write
|
||||
id-token: write
|
||||
@@ -136,16 +215,81 @@ jobs:
|
||||
node-version: '20.x'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
|
||||
- name: Verify artifact before publish
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: ${{ needs.verify.outputs.package_file }}
|
||||
ECC_RELEASE_SHA256: ${{ needs.verify.outputs.package_sha256 }}
|
||||
run: node -e "const crypto = require('crypto'); const fs = require('fs'); const file = process.env.ECC_RELEASE_PACKAGE; const expected = process.env.ECC_RELEASE_SHA256; if (!/^ecc-universal-[0-9A-Za-z.+-]+\.tgz$/.test(file || '')) throw new Error('Unexpected packed filename'); if (!/^[a-f0-9]{64}$/.test(expected || '')) throw new Error('Invalid packed SHA-256'); const archives = fs.readdirSync('.').filter(name => name.endsWith('.tgz')); if (archives.length !== 1 || archives[0] !== file) throw new Error('Expected exactly one downloaded archive'); const actual = crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex'); if (actual !== expected) throw new Error('Downloaded publish artifact SHA-256 mismatch')"
|
||||
|
||||
- name: Bind gate source to triggering commit
|
||||
env:
|
||||
EVENT_SHA: ${{ github.sha }}
|
||||
VERIFIED_RELEASE_SHA: ${{ needs.verify.outputs.release_sha }}
|
||||
run: node -e "const actual = process.env.EVENT_SHA; const expected = process.env.VERIFIED_RELEASE_SHA; if (typeof actual !== 'string' || actual.length !== 40 || !/^[a-f0-9]{40}$/.test(actual) || expected !== actual) throw new Error('Verified release differs from triggering commit')"
|
||||
|
||||
- name: Checkout verified gate source
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
body_path: release_body.md
|
||||
generate_release_notes: true
|
||||
prerelease: ${{ contains(github.ref_name, '-') }}
|
||||
make_latest: ${{ contains(github.ref_name, '-') && 'false' || 'true' }}
|
||||
ref: ${{ github.sha }}
|
||||
path: release-gate-source
|
||||
persist-credentials: false
|
||||
sparse-checkout: scripts/ci/verify-release-gates.js
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
# This read-only API check uses the existing publish job token. It is a
|
||||
# snapshot; preventing subsequent tag movement requires protected tags.
|
||||
- name: Recheck verified tag before publish
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
RELEASE_TAG: ${{ github.ref_name }}
|
||||
RELEASE_SHA: ${{ needs.verify.outputs.release_sha }}
|
||||
RELEASE_TAG_OBJECT_SHA: ${{ needs.verify.outputs.tag_object_sha }}
|
||||
run: node release-gate-source/scripts/ci/verify-release-gates.js --tag-only
|
||||
|
||||
- name: Publish npm package
|
||||
if: needs.verify.outputs.already_published != 'true'
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
run: npm publish "${{ needs.verify.outputs.package_file }}" --access public --provenance --tag "${{ needs.verify.outputs.dist_tag }}"
|
||||
ECC_RELEASE_PACKAGE: ${{ needs.verify.outputs.package_file }}
|
||||
NPM_PUBLISH_TAG: ${{ needs.verify.outputs.publish_tag }}
|
||||
run: npm publish "./${ECC_RELEASE_PACKAGE}" --access public --provenance --tag "${NPM_PUBLISH_TAG}"
|
||||
|
||||
- name: Verify published npm artifact
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: ${{ needs.verify.outputs.package_file }}
|
||||
PACKAGE_NAME: ${{ needs.verify.outputs.package_name }}
|
||||
PACKAGE_VERSION: ${{ needs.verify.outputs.package_version }}
|
||||
run: |
|
||||
REGISTRY_INTEGRITY=""
|
||||
for ATTEMPT in $(seq 1 30); do
|
||||
set +e
|
||||
REGISTRY_INTEGRITY=$(npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" dist.integrity 2>&1)
|
||||
NPM_STATUS=$?
|
||||
set -e
|
||||
if [ "$NPM_STATUS" -eq 0 ]; then
|
||||
break
|
||||
fi
|
||||
if [ "$ATTEMPT" -eq 30 ]; then
|
||||
echo "::error::Published npm artifact was not readable after five minutes"
|
||||
printf '%s\n' "$REGISTRY_INTEGRITY"
|
||||
exit "$NPM_STATUS"
|
||||
fi
|
||||
sleep 10
|
||||
done
|
||||
ECC_REGISTRY_INTEGRITY="$REGISTRY_INTEGRITY" node -e "const crypto = require('crypto'); const fs = require('fs'); const expected = process.env.ECC_REGISTRY_INTEGRITY; if (!/^sha512-[A-Za-z0-9+/]+={0,2}$/.test(expected || '')) throw new Error('Invalid published registry integrity'); const actual = 'sha512-' + crypto.createHash('sha512').update(fs.readFileSync(process.env.ECC_RELEASE_PACKAGE)).digest('base64'); if (actual !== expected) throw new Error('Published npm artifact does not match tested candidate')"
|
||||
|
||||
- name: Promote verified npm version
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
PACKAGE_NAME: ${{ needs.verify.outputs.package_name }}
|
||||
PACKAGE_VERSION: ${{ needs.verify.outputs.package_version }}
|
||||
NPM_DIST_TAG: ${{ needs.verify.outputs.dist_tag }}
|
||||
run: npm dist-tag add "${PACKAGE_NAME}@${PACKAGE_VERSION}" "${NPM_DIST_TAG}"
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
|
||||
with:
|
||||
body_path: release_body.md
|
||||
generate_release_notes: false
|
||||
prerelease: ${{ contains(github.ref_name, '-') }}
|
||||
make_latest: ${{ contains(github.ref_name, '-') && 'false' || 'true' }}
|
||||
@@ -7,11 +7,6 @@ on:
|
||||
description: 'Version tag (e.g., v1.0.0)'
|
||||
required: true
|
||||
type: string
|
||||
generate-notes:
|
||||
description: 'Auto-generate release notes'
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
secrets:
|
||||
NPM_TOKEN:
|
||||
required: false
|
||||
@@ -21,13 +16,10 @@ on:
|
||||
description: 'Version tag to release or republish (e.g., v2.0.0-rc.1)'
|
||||
required: true
|
||||
type: string
|
||||
generate-notes:
|
||||
description: 'Auto-generate release notes'
|
||||
required: false
|
||||
type: boolean
|
||||
default: true
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
checks: read
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
@@ -35,24 +27,47 @@ jobs:
|
||||
name: Verify Release
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
release_sha: ${{ steps.release_gate.outputs.release_sha }}
|
||||
tag_object_sha: ${{ steps.release_gate.outputs.tag_object_sha }}
|
||||
already_published: ${{ steps.npm_publish_state.outputs.already_published }}
|
||||
dist_tag: ${{ steps.npm_publish_state.outputs.dist_tag }}
|
||||
publish_tag: ${{ steps.npm_publish_state.outputs.publish_tag }}
|
||||
package_name: ${{ steps.npm_publish_state.outputs.package_name }}
|
||||
package_version: ${{ steps.npm_publish_state.outputs.package_version }}
|
||||
package_file: ${{ steps.pack.outputs.package_file }}
|
||||
package_sha256: ${{ steps.pack.outputs.package_sha256 }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ inputs.tag }}
|
||||
ref: refs/tags/${{ inputs.tag }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Require the release commit to equal origin main
|
||||
run: |
|
||||
git fetch origin main --no-tags
|
||||
RELEASE_COMMIT=$(git rev-parse HEAD)
|
||||
MAIN_COMMIT=$(git rev-parse origin/main)
|
||||
if [ "$RELEASE_COMMIT" != "$MAIN_COMMIT" ]; then
|
||||
echo "::error::The release commit must equal origin/main exactly"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: '20.x'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Verify signed tag and exact-SHA CI gates
|
||||
id: release_gate
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
RELEASE_TAG: ${{ inputs.tag }}
|
||||
run: RELEASE_SHA="$(git rev-parse HEAD)" node scripts/ci/verify-release-gates.js
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci --ignore-scripts
|
||||
|
||||
@@ -62,9 +77,6 @@ jobs:
|
||||
- name: Verify OpenCode package payload
|
||||
run: node tests/scripts/build-opencode.test.js
|
||||
|
||||
- name: Verify OMP adapter payload
|
||||
run: node tests/omp/omp-plugin.test.js
|
||||
|
||||
- name: Validate version tag
|
||||
env:
|
||||
INPUT_TAG: ${{ inputs.tag }}
|
||||
@@ -95,37 +107,42 @@ jobs:
|
||||
PACKAGE_NAME=$(node -p "require('./package.json').name")
|
||||
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
||||
NPM_DIST_TAG=$(node -p "require('./package.json').version.includes('-') ? 'next' : 'latest'")
|
||||
if npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version >/dev/null 2>&1; then
|
||||
NPM_PUBLISH_TAG=$(node -p "require('./package.json').version.includes('-') ? 'next' : 'staged'")
|
||||
set +e
|
||||
NPM_LOOKUP=$(npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" version 2>&1)
|
||||
NPM_STATUS=$?
|
||||
set -e
|
||||
if [ "$NPM_STATUS" -eq 0 ]; then
|
||||
echo "already_published=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
elif printf '%s\n' "$NPM_LOOKUP" | grep -q 'E404'; then
|
||||
echo "already_published=false" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "::error::npm registry lookup failed; refusing to infer that the version is unpublished"
|
||||
printf '%s\n' "$NPM_LOOKUP"
|
||||
exit "$NPM_STATUS"
|
||||
fi
|
||||
echo "package_name=${PACKAGE_NAME}" >> "$GITHUB_OUTPUT"
|
||||
echo "package_version=${PACKAGE_VERSION}" >> "$GITHUB_OUTPUT"
|
||||
echo "dist_tag=${NPM_DIST_TAG}" >> "$GITHUB_OUTPUT"
|
||||
echo "publish_tag=${NPM_PUBLISH_TAG}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Generate release highlights
|
||||
- name: Use reviewed release notes
|
||||
env:
|
||||
TAG_NAME: ${{ inputs.tag }}
|
||||
RELEASE_TAG: ${{ inputs.tag }}
|
||||
run: |
|
||||
TAG_VERSION="${TAG_NAME#v}"
|
||||
cat > release_body.md <<EOF
|
||||
## ECC ${TAG_VERSION}
|
||||
|
||||
### What This Release Focuses On
|
||||
- Harness reliability and cross-platform compatibility
|
||||
- Eval-driven quality improvements
|
||||
- Better workflow and operator ergonomics
|
||||
|
||||
### Package Notes
|
||||
- npm package: \`ecc-universal\`
|
||||
- Claude marketplace/plugin identifier: \`ecc@ecc\`
|
||||
EOF
|
||||
RELEASE_VERSION="${RELEASE_TAG#v}"
|
||||
RELEASE_NOTES="docs/releases/${RELEASE_VERSION}/release-notes.md"
|
||||
if [ ! -f "$RELEASE_NOTES" ]; then
|
||||
echo "::error::Missing reviewed release notes for ${RELEASE_VERSION}: ${RELEASE_NOTES}"
|
||||
exit 1
|
||||
fi
|
||||
cp "$RELEASE_NOTES" release_body.md
|
||||
|
||||
- name: Pack npm artifact
|
||||
id: pack
|
||||
run: |
|
||||
npm pack --json > npm-pack.json
|
||||
PACKAGE_FILE=$(node -e "const fs = require('fs'); const data = JSON.parse(fs.readFileSync('npm-pack.json', 'utf8')); console.log(data[0].filename)")
|
||||
echo "package_file=${PACKAGE_FILE}" >> "$GITHUB_OUTPUT"
|
||||
node -e "const crypto = require('crypto'); const fs = require('fs'); const data = JSON.parse(fs.readFileSync('npm-pack.json', 'utf8')); const entries = Array.isArray(data) ? data : [data]; const file = entries.find(entry => /^ecc-universal-[0-9A-Za-z.+-]+\.tgz$/.test(entry?.filename || ''))?.filename; if (!file) throw new Error('Unexpected packed filename'); const archives = fs.readdirSync('.').filter(name => name.endsWith('.tgz')); if (archives.length !== 1 || archives[0] !== file) throw new Error('Expected exactly one packed archive'); const digest = crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex'); fs.appendFileSync(process.env.GITHUB_OUTPUT, 'package_file=' + file + '\npackage_sha256=' + digest + '\n')"
|
||||
|
||||
- name: Upload release artifacts
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
@@ -134,12 +151,52 @@ jobs:
|
||||
path: |
|
||||
release_body.md
|
||||
${{ steps.pack.outputs.package_file }}
|
||||
tests/ci/packed-artifact-lifecycle.js
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Verify existing npm artifact matches candidate
|
||||
if: steps.npm_publish_state.outputs.already_published == 'true'
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: ${{ steps.pack.outputs.package_file }}
|
||||
run: |
|
||||
PACKAGE_NAME=$(node -p "require('./package.json').name")
|
||||
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
||||
REGISTRY_INTEGRITY=$(npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" dist.integrity)
|
||||
ECC_REGISTRY_INTEGRITY="$REGISTRY_INTEGRITY" node -e "const crypto = require('crypto'); const fs = require('fs'); const expected = process.env.ECC_REGISTRY_INTEGRITY; if (!/^sha512-[A-Za-z0-9+/]+={0,2}$/.test(expected || '')) throw new Error('Invalid registry integrity'); const actual = 'sha512-' + crypto.createHash('sha512').update(fs.readFileSync(process.env.ECC_RELEASE_PACKAGE)).digest('base64'); if (actual !== expected) throw new Error('Existing npm artifact does not match tested candidate')"
|
||||
|
||||
lifecycle:
|
||||
name: Packed Lifecycle (${{ matrix.os }})
|
||||
needs: verify
|
||||
permissions:
|
||||
contents: read
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||
runs-on: ${{ matrix.os }}
|
||||
|
||||
steps:
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: '20.x'
|
||||
|
||||
- name: Download exact packed artifact
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: ecc-release-artifacts
|
||||
path: release-artifacts
|
||||
|
||||
- name: Verify packed install lifecycle
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: release-artifacts/${{ needs.verify.outputs.package_file }}
|
||||
ECC_RELEASE_SHA256: ${{ needs.verify.outputs.package_sha256 }}
|
||||
run: node release-artifacts/tests/ci/packed-artifact-lifecycle.js
|
||||
|
||||
publish:
|
||||
name: Publish Release
|
||||
runs-on: ubuntu-latest
|
||||
needs: verify
|
||||
needs: [verify, lifecycle]
|
||||
permissions:
|
||||
contents: write
|
||||
id-token: write
|
||||
@@ -156,17 +213,76 @@ jobs:
|
||||
node-version: '20.x'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
|
||||
- name: Verify artifact before publish
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: ${{ needs.verify.outputs.package_file }}
|
||||
ECC_RELEASE_SHA256: ${{ needs.verify.outputs.package_sha256 }}
|
||||
run: node -e "const crypto = require('crypto'); const fs = require('fs'); const file = process.env.ECC_RELEASE_PACKAGE; const expected = process.env.ECC_RELEASE_SHA256; if (!/^ecc-universal-[0-9A-Za-z.+-]+\.tgz$/.test(file || '')) throw new Error('Unexpected packed filename'); if (!/^[a-f0-9]{64}$/.test(expected || '')) throw new Error('Invalid packed SHA-256'); const archives = fs.readdirSync('.').filter(name => name.endsWith('.tgz')); if (archives.length !== 1 || archives[0] !== file) throw new Error('Expected exactly one downloaded archive'); const actual = crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex'); if (actual !== expected) throw new Error('Downloaded publish artifact SHA-256 mismatch')"
|
||||
|
||||
- name: Checkout verified gate source
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
tag_name: ${{ inputs.tag }}
|
||||
body_path: release_body.md
|
||||
generate_release_notes: ${{ inputs.generate-notes }}
|
||||
prerelease: ${{ contains(inputs.tag, '-') }}
|
||||
make_latest: ${{ contains(inputs.tag, '-') && 'false' || 'true' }}
|
||||
ref: ${{ needs.verify.outputs.release_sha }}
|
||||
path: release-gate-source
|
||||
persist-credentials: false
|
||||
sparse-checkout: scripts/ci/verify-release-gates.js
|
||||
sparse-checkout-cone-mode: false
|
||||
|
||||
# This read-only API check uses the existing publish job token. It is a
|
||||
# snapshot; preventing subsequent tag movement requires protected tags.
|
||||
- name: Recheck verified tag before publish
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
RELEASE_TAG: ${{ inputs.tag }}
|
||||
RELEASE_SHA: ${{ needs.verify.outputs.release_sha }}
|
||||
RELEASE_TAG_OBJECT_SHA: ${{ needs.verify.outputs.tag_object_sha }}
|
||||
run: node release-gate-source/scripts/ci/verify-release-gates.js --tag-only
|
||||
|
||||
- name: Publish npm package
|
||||
if: needs.verify.outputs.already_published != 'true'
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
run: npm publish "${{ needs.verify.outputs.package_file }}" --access public --provenance --tag "${{ needs.verify.outputs.dist_tag }}"
|
||||
ECC_RELEASE_PACKAGE: ${{ needs.verify.outputs.package_file }}
|
||||
NPM_PUBLISH_TAG: ${{ needs.verify.outputs.publish_tag }}
|
||||
run: npm publish "./${ECC_RELEASE_PACKAGE}" --access public --provenance --tag "${NPM_PUBLISH_TAG}"
|
||||
|
||||
- name: Verify published npm artifact
|
||||
env:
|
||||
ECC_RELEASE_PACKAGE: ${{ needs.verify.outputs.package_file }}
|
||||
PACKAGE_NAME: ${{ needs.verify.outputs.package_name }}
|
||||
PACKAGE_VERSION: ${{ needs.verify.outputs.package_version }}
|
||||
run: |
|
||||
REGISTRY_INTEGRITY=""
|
||||
for ATTEMPT in $(seq 1 30); do
|
||||
set +e
|
||||
REGISTRY_INTEGRITY=$(npm view "${PACKAGE_NAME}@${PACKAGE_VERSION}" dist.integrity 2>&1)
|
||||
NPM_STATUS=$?
|
||||
set -e
|
||||
if [ "$NPM_STATUS" -eq 0 ]; then
|
||||
break
|
||||
fi
|
||||
if [ "$ATTEMPT" -eq 30 ]; then
|
||||
echo "::error::Published npm artifact was not readable after five minutes"
|
||||
printf '%s\n' "$REGISTRY_INTEGRITY"
|
||||
exit "$NPM_STATUS"
|
||||
fi
|
||||
sleep 10
|
||||
done
|
||||
ECC_REGISTRY_INTEGRITY="$REGISTRY_INTEGRITY" node -e "const crypto = require('crypto'); const fs = require('fs'); const expected = process.env.ECC_REGISTRY_INTEGRITY; if (!/^sha512-[A-Za-z0-9+/]+={0,2}$/.test(expected || '')) throw new Error('Invalid published registry integrity'); const actual = 'sha512-' + crypto.createHash('sha512').update(fs.readFileSync(process.env.ECC_RELEASE_PACKAGE)).digest('base64'); if (actual !== expected) throw new Error('Published npm artifact does not match tested candidate')"
|
||||
|
||||
- name: Promote verified npm version
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
PACKAGE_NAME: ${{ needs.verify.outputs.package_name }}
|
||||
PACKAGE_VERSION: ${{ needs.verify.outputs.package_version }}
|
||||
NPM_DIST_TAG: ${{ needs.verify.outputs.dist_tag }}
|
||||
run: npm dist-tag add "${PACKAGE_NAME}@${PACKAGE_VERSION}" "${NPM_DIST_TAG}"
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3
|
||||
with:
|
||||
tag_name: ${{ inputs.tag }}
|
||||
body_path: release_body.md
|
||||
generate_release_notes: false
|
||||
prerelease: ${{ contains(inputs.tag, '-') }}
|
||||
make_latest: ${{ contains(inputs.tag, '-') && 'false' || 'true' }}
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
@@ -38,7 +38,7 @@ jobs:
|
||||
|
||||
- name: Setup pnpm
|
||||
if: inputs.package-manager == 'pnpm' && inputs.node-version != '18.x'
|
||||
uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
|
||||
uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
|
||||
with:
|
||||
# Keep an explicit pnpm major because this repo's packageManager is Yarn.
|
||||
version: 10
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
name: Standalone taste workflows
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'skills/taste-application/**'
|
||||
- 'skills/taste-distillation/**'
|
||||
- 'tests/test_taste_*.py'
|
||||
- '.github/workflows/taste-skills.yml'
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'skills/taste-application/**'
|
||||
- 'skills/taste-distillation/**'
|
||||
- 'tests/test_taste_*.py'
|
||||
- '.github/workflows/taste-skills.yml'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
offline:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- name: Install local media dependencies
|
||||
run: python -m pip install -r skills/taste-application/scripts/requirements.txt
|
||||
- name: Build and install the reusable ECC engine
|
||||
run: |
|
||||
python -m pip wheel --no-deps skills/taste-application/scripts --wheel-dir /tmp/ecc-wheels
|
||||
python -m pip install /tmp/ecc-wheels/ecc_tasteforge-*.whl
|
||||
- name: Test canonical engine and original creative scripts
|
||||
run: |
|
||||
python -m unittest discover -s skills/taste-application/tests
|
||||
python -m unittest discover -s tests -p 'test_taste_*.py'
|
||||
cd /tmp
|
||||
python -I -c "from pathlib import Path; import sys, tasteforge; from tasteforge.pack import load; root = Path(tasteforge.__file__).resolve(); assert root.is_relative_to(Path(sys.prefix).resolve()); fixture = root.parent / 'fixtures/flashethereal'; assert load(fixture).inspect()['validation']['status'] == 'valid'"
|
||||
python -m tasteforge --help
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
# ECC for Hermes
|
||||
|
||||
This directory contains the ECC (Everything Claude Code) configuration for the Hermes harness.
|
||||
This directory contains the ECC configuration for the Hermes harness.
|
||||
|
||||
## What is installed
|
||||
|
||||
@@ -18,4 +18,4 @@ bash ./install.sh --target hermes --profile minimal
|
||||
## Notes
|
||||
|
||||
- Hermes config files (`config.yaml`, `.env`, etc.) are **not** touched by ECC install.
|
||||
- Use `npx ecc doctor --target hermes` to check install health.
|
||||
- Use `npx ecc-universal doctor --target hermes` to check install health.
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# ECC for Kimi Code CLI
|
||||
|
||||
This directory documents ECC (Everything Claude Code) support for its tested Kimi Code CLI compatibility target. The managed adapter is verified against Kimi Code 0.31.x (`@moonshot-ai/kimi-code`); newer provider releases are outside this adapter's verified range.
|
||||
This directory documents ECC support for its tested Kimi Code CLI compatibility target. The managed adapter is verified against Kimi Code 0.31.x (`@moonshot-ai/kimi-code`); newer provider releases are outside this adapter's verified range.
|
||||
|
||||
## What Kimi Code discovers natively
|
||||
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
# Everything Claude Code for Kiro
|
||||
# ECC for Kiro
|
||||
|
||||
Bring [Everything Claude Code](https://github.com/anthropics/courses/tree/master/everything-claude-code) (ECC) workflows to [Kiro](https://kiro.dev). This repository provides custom agents, skills, hooks, steering files, and scripts that can be installed into any Kiro project with a single command.
|
||||
Bring [ECC](https://github.com/affaan-m/ECC) workflows to [Kiro](https://kiro.dev). This repository provides custom agents, skills, hooks, steering files, and scripts that can be installed into any Kiro project with a single command.
|
||||
|
||||
## Quick Start
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "doc-updater",
|
||||
"description": "Documentation and codemap specialist. Use PROACTIVELY for updating codemaps and documentation. Runs /update-codemaps and /update-docs, generates docs/CODEMAPS/*, updates READMEs and guides.",
|
||||
"description": "Documentation and codemap specialist. Use PROACTIVELY for updating codemaps and documentation. Generates docs/CODEMAPS/*, updates READMEs and guides. Backs the /update-codemaps and /update-docs commands.",
|
||||
"mcpServers": {},
|
||||
"tools": [
|
||||
"@builtin"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: doc-updater
|
||||
description: Documentation and codemap specialist. Use PROACTIVELY for updating codemaps and documentation. Runs /update-codemaps and /update-docs, generates docs/CODEMAPS/*, updates READMEs and guides.
|
||||
description: Documentation and codemap specialist. Use PROACTIVELY for updating codemaps and documentation. Generates docs/CODEMAPS/*, updates READMEs and guides. Backs the /update-codemaps and /update-docs commands.
|
||||
allowedTools:
|
||||
- read
|
||||
- write
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# ECC Kiro Installer
|
||||
# Installs Everything Claude Code workflows into a Kiro project.
|
||||
# Installs ECC workflows into a Kiro project.
|
||||
#
|
||||
# Usage:
|
||||
# ./install.sh # Install to current directory
|
||||
|
||||
@@ -71,7 +71,7 @@ Use this table to decide when to compact:
|
||||
| Phase Transition | Compact? | Why |
|
||||
|-----------------|----------|-----|
|
||||
| Research → Planning | Yes | Research context is bulky; plan is the distilled output |
|
||||
| Planning → Implementation | Yes | Plan is in TodoWrite or a file; free up context for code |
|
||||
| Planning → Implementation | Yes | Plan is written down (a file, or the task list if you have one); free up context for code |
|
||||
| Implementation → Testing | Maybe | Keep if tests reference recent code; compact if switching focus |
|
||||
| Debugging → Next feature | Yes | Debug traces pollute context for unrelated work |
|
||||
| Mid-implementation | No | Losing variable names, file paths, and partial state is costly |
|
||||
@@ -84,14 +84,28 @@ Understanding what persists helps you compact with confidence:
|
||||
| Persists | Lost |
|
||||
|----------|------|
|
||||
| CLAUDE.md instructions | Intermediate reasoning and analysis |
|
||||
| TodoWrite task list | File contents you previously read |
|
||||
| Files on disk | File contents you previously read |
|
||||
| Memory files (`~/.claude/memory/`) | Multi-step conversation context |
|
||||
| Git state (commits, branches) | Tool call history and counts |
|
||||
| Files on disk | Nuanced user preferences stated verbally |
|
||||
| The task list — **only if you have the todo tools** (see below) | Nuanced user preferences stated verbally |
|
||||
|
||||
> ### Don't rely on the task list surviving — it may not exist
|
||||
>
|
||||
> Claude Code **2.1.233 removed the todo/task tools by default** on Opus 4.8, Sonnet 5,
|
||||
> Fable 5, Mythos 5 and newer models (`TodoWrite`, `TaskCreate/Get/Update/List`).
|
||||
> `CLAUDE_CODE_ENABLE_TODO_TOOLS=1` brings them back, but that is a per-machine
|
||||
> environment setting — **it does not travel with this skill**, so you cannot assume the
|
||||
> reader has it.
|
||||
>
|
||||
> This matters because "my todo list survives compaction" is a reason people compact
|
||||
> *instead of* writing state down. If the tools are absent there is no list to survive,
|
||||
> and the plan is simply gone. **Write the plan to a file before compacting** — a file
|
||||
> persists on every version and every model. Treat the task list as a convenience that
|
||||
> may be missing, never as your durable record.
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Compact after planning** — Once plan is finalized in TodoWrite, compact to start fresh
|
||||
1. **Compact after planning** — Once the plan is finalized **and written to a file**, compact to start fresh
|
||||
2. **Compact after debugging** — Clear error-resolution context before continuing
|
||||
3. **Don't compact mid-implementation** — Preserve context for related changes
|
||||
4. **Read the suggestion** — The hook tells you *when*, you decide *if*
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"mcpServers": {
|
||||
"chrome-devtools": {
|
||||
"command": "npx",
|
||||
"args": ["-y", "chrome-devtools-mcp@latest"]
|
||||
"args": ["-y", "chrome-devtools-mcp@1.10.1"]
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
# ECC for OpenClaw
|
||||
|
||||
This directory contains the ECC (Everything Claude Code) configuration for the OpenClaw harness.
|
||||
This directory contains the ECC configuration for the OpenClaw harness.
|
||||
|
||||
## What is installed
|
||||
|
||||
@@ -18,4 +18,4 @@ bash ./install.sh --target openclaw --profile minimal
|
||||
## Notes
|
||||
|
||||
- OpenClaw config files (`openclaw.json`, `config.toml`, `.env`, etc.) are **not** touched by ECC install.
|
||||
- Use `npx ecc doctor --target openclaw` to check install health.
|
||||
- Use `npx ecc-universal doctor --target openclaw` to check install health.
|
||||
+5
-3
@@ -44,7 +44,7 @@ It does **not** auto-register the full ECC command/agent/instruction catalog in
|
||||
After installation, the `ecc-install` CLI is also available:
|
||||
|
||||
```bash
|
||||
npx ecc-install typescript
|
||||
npx ecc-universal install typescript
|
||||
```
|
||||
|
||||
### Option 2: Direct Use
|
||||
@@ -224,8 +224,6 @@ Full configuration in `opencode.json`:
|
||||
```json
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"model": "anthropic/claude-sonnet-4-5",
|
||||
"small_model": "anthropic/claude-haiku-4-5",
|
||||
"plugin": ["./plugins"],
|
||||
"instructions": [
|
||||
"skills/tdd-workflow/SKILL.md",
|
||||
@@ -236,6 +234,10 @@ Full configuration in `opencode.json`:
|
||||
}
|
||||
```
|
||||
|
||||
The reference config intentionally leaves model selection to OpenCode. Connect a
|
||||
provider and select a model in OpenCode; ECC's primary agent uses that global
|
||||
selection, and its subagents inherit the invoking primary agent's model.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
+3
-43
@@ -35,46 +35,6 @@
|
||||
*/
|
||||
|
||||
// Export the main plugin
|
||||
export { ECCHooksPlugin, default } from "./plugins/index.js"
|
||||
|
||||
// Export individual components for selective use
|
||||
export * from "./plugins/index.js"
|
||||
|
||||
// Version export
|
||||
export const VERSION = "1.6.0"
|
||||
|
||||
// Plugin metadata
|
||||
export const metadata = {
|
||||
name: "ecc-universal",
|
||||
version: VERSION,
|
||||
description: "ECC plugin for OpenCode",
|
||||
author: "affaan-m",
|
||||
features: {
|
||||
agents: 13,
|
||||
commands: 31,
|
||||
skills: 37,
|
||||
configAssets: true,
|
||||
hookEvents: [
|
||||
"file.edited",
|
||||
"tool.execute.before",
|
||||
"tool.execute.after",
|
||||
"session.created",
|
||||
"session.idle",
|
||||
"session.deleted",
|
||||
"file.watcher.updated",
|
||||
"permission.ask",
|
||||
"todo.updated",
|
||||
"shell.env",
|
||||
"experimental.session.compacting",
|
||||
],
|
||||
customTools: [
|
||||
"run-tests",
|
||||
"check-coverage",
|
||||
"security-audit",
|
||||
"format-code",
|
||||
"lint-check",
|
||||
"git-summary",
|
||||
"changed-files",
|
||||
],
|
||||
},
|
||||
}
|
||||
// opencode's legacy plugin loader iterates every module export and throws if
|
||||
// any is not a plugin function, so only the plugin function may be exported.
|
||||
export { default } from "./plugins/index.ts"
|
||||
@@ -1,7 +1,5 @@
|
||||
{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"model": "anthropic/claude-sonnet-4-5",
|
||||
"small_model": "anthropic/claude-haiku-4-5",
|
||||
"default_agent": "build",
|
||||
"instructions": [
|
||||
"AGENTS.md",
|
||||
@@ -31,7 +29,6 @@
|
||||
"build": {
|
||||
"description": "Primary coding agent for development work",
|
||||
"mode": "primary",
|
||||
"model": "anthropic/claude-sonnet-4-5",
|
||||
"tools": {
|
||||
"write": true,
|
||||
"edit": true,
|
||||
@@ -43,7 +40,6 @@
|
||||
"planner": {
|
||||
"description": "Expert planning specialist for complex features and refactoring. Use for implementation planning, architectural changes, or complex refactoring.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/planner.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -55,7 +51,6 @@
|
||||
"architect": {
|
||||
"description": "Software architecture specialist for system design, scalability, and technical decision-making.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/architect.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -67,7 +62,6 @@
|
||||
"code-reviewer": {
|
||||
"description": "Expert code review specialist. Reviews code for quality, security, and maintainability. Use immediately after writing or modifying code.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/code-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -79,7 +73,6 @@
|
||||
"security-reviewer": {
|
||||
"description": "Security vulnerability detection and remediation specialist. Use after writing code that handles user input, authentication, API endpoints, or sensitive data.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/security-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -91,7 +84,6 @@
|
||||
"tdd-guide": {
|
||||
"description": "Test-Driven Development specialist enforcing write-tests-first methodology. Use when writing new features, fixing bugs, or refactoring code. Ensures 80%+ test coverage.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/tdd-guide.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -103,7 +95,6 @@
|
||||
"build-error-resolver": {
|
||||
"description": "Build and TypeScript error resolution specialist. Use when build fails or type errors occur. Fixes build/type errors only with minimal diffs.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/build-error-resolver.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -115,7 +106,6 @@
|
||||
"e2e-runner": {
|
||||
"description": "End-to-end testing specialist using Playwright. Generates, maintains, and runs E2E tests for critical user flows.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/e2e-runner.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -127,7 +117,6 @@
|
||||
"doc-updater": {
|
||||
"description": "Documentation and codemap specialist. Use for updating codemaps and documentation.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/doc-updater.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -139,7 +128,6 @@
|
||||
"refactor-cleaner": {
|
||||
"description": "Dead code cleanup and consolidation specialist. Use for removing unused code, duplicates, and refactoring.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/refactor-cleaner.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -151,7 +139,6 @@
|
||||
"go-reviewer": {
|
||||
"description": "Expert Go code reviewer specializing in idiomatic Go, concurrency patterns, error handling, and performance.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/go-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -163,7 +150,6 @@
|
||||
"go-build-resolver": {
|
||||
"description": "Go build, vet, and compilation error resolution specialist. Fixes Go build errors with minimal changes.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/go-build-resolver.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -175,7 +161,6 @@
|
||||
"database-reviewer": {
|
||||
"description": "PostgreSQL database specialist for query optimization, schema design, security, and performance. Incorporates Supabase best practices.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/database-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -187,7 +172,6 @@
|
||||
"cpp-reviewer": {
|
||||
"description": "Expert C++ code reviewer specializing in memory safety, modern C++ idioms, concurrency, and performance. Use for all C++ code changes.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/cpp-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -199,7 +183,6 @@
|
||||
"cpp-build-resolver": {
|
||||
"description": "C++ build, CMake, and compilation error resolution specialist. Fixes build errors, linker issues, and template errors with minimal changes.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/cpp-build-resolver.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -211,7 +194,6 @@
|
||||
"docs-lookup": {
|
||||
"description": "Documentation specialist using Context7 MCP to fetch current library and API documentation with code examples.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-sonnet-4-5",
|
||||
"prompt": "{file:prompts/agents/docs-lookup.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -223,7 +205,6 @@
|
||||
"harness-optimizer": {
|
||||
"description": "Analyze and improve the local agent harness configuration for reliability, cost, and throughput.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-sonnet-4-5",
|
||||
"prompt": "{file:prompts/agents/harness-optimizer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -234,7 +215,6 @@
|
||||
"java-reviewer": {
|
||||
"description": "Expert Java and Spring Boot code reviewer specializing in layered architecture, JPA patterns, security, and concurrency.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/java-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -246,7 +226,6 @@
|
||||
"java-build-resolver": {
|
||||
"description": "Java/Maven/Gradle build, compilation, and dependency error resolution specialist. Fixes build errors with minimal changes.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/java-build-resolver.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -258,7 +237,6 @@
|
||||
"kotlin-reviewer": {
|
||||
"description": "Kotlin and Android/KMP code reviewer. Reviews Kotlin code for idiomatic patterns, coroutine safety, Compose best practices.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/kotlin-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -270,7 +248,6 @@
|
||||
"kotlin-build-resolver": {
|
||||
"description": "Kotlin/Gradle build, compilation, and dependency error resolution specialist. Fixes Kotlin build errors with minimal changes.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/kotlin-build-resolver.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -282,7 +259,6 @@
|
||||
"loop-operator": {
|
||||
"description": "Operate autonomous agent loops, monitor progress, and intervene safely when loops stall.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-sonnet-4-5",
|
||||
"prompt": "{file:prompts/agents/loop-operator.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -293,7 +269,6 @@
|
||||
"php-reviewer": {
|
||||
"description": "Expert PHP code reviewer specializing in PSR-12 compliance, PHP type system, Eloquent ORM patterns, security, and performance.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/php-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -305,7 +280,6 @@
|
||||
"python-reviewer": {
|
||||
"description": "Expert Python code reviewer specializing in PEP 8 compliance, Pythonic idioms, type hints, security, and performance.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/python-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -317,7 +291,6 @@
|
||||
"rust-reviewer": {
|
||||
"description": "Expert Rust code reviewer specializing in idiomatic Rust, ownership, lifetimes, concurrency, and performance.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/rust-reviewer.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
@@ -329,7 +302,6 @@
|
||||
"rust-build-resolver": {
|
||||
"description": "Rust build, Cargo, and compilation error resolution specialist. Fixes Rust build errors with minimal changes.",
|
||||
"mode": "subagent",
|
||||
"model": "anthropic/claude-opus-4-5",
|
||||
"prompt": "{file:prompts/agents/rust-build-resolver.txt}",
|
||||
"tools": {
|
||||
"read": true,
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "ecc-universal",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "ecc-universal",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.3",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@opencode-ai/plugin": "^1.4.3",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ecc-universal",
|
||||
"version": "2.2.0",
|
||||
"version": "2.2.3",
|
||||
"description": "ECC plugin for OpenCode - agents, commands, hooks, and skills",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
import type { PluginInput } from "@opencode-ai/plugin"
|
||||
import * as fs from "fs"
|
||||
import * as path from "path"
|
||||
import changedFilesTool from "../tools/changed-files.js"
|
||||
import dependencyAnalyzerTool from "../tools/dependency-analyzer.js"
|
||||
import changedFilesTool from "../tools/changed-files.ts"
|
||||
import dependencyAnalyzerTool from "../tools/dependency-analyzer.ts"
|
||||
|
||||
/**
|
||||
* Type definitions for better type safety
|
||||
@@ -111,9 +111,9 @@ export const ECCHooksPlugin: ECCHooksPluginFn = async ({
|
||||
// This plugin is OpenCode's startup entry point, so a static import
|
||||
// failure here previously crashed the whole plugin -- and with it, the
|
||||
// entire OpenCode session -- before any hooks could load (see #2530).
|
||||
let changedFilesStore: typeof import("./lib/changed-files-store.js") | undefined
|
||||
let changedFilesStore: typeof import("./lib/changed-files-store.ts") | undefined
|
||||
try {
|
||||
const store = await import("./lib/changed-files-store.js")
|
||||
const store = await import("./lib/changed-files-store.ts")
|
||||
store.initStore(worktreePath)
|
||||
changedFilesStore = store
|
||||
} catch {
|
||||
@@ -481,7 +481,7 @@ export const ECCHooksPlugin: ECCHooksPluginFn = async ({
|
||||
* Triggers: Before shell command execution
|
||||
* Action: Sets PROJECT_ROOT, PACKAGE_MANAGER, DETECTED_LANGUAGES, ECC_VERSION
|
||||
*/
|
||||
"shell.env": async () => {
|
||||
"shell.env": async (_input: { cwd: string }, output: { env: Record<string, string> }) => {
|
||||
const env: Record<string, string> = {
|
||||
ECC_VERSION: getECCVersion(),
|
||||
ECC_PLUGIN: "true",
|
||||
@@ -523,7 +523,8 @@ export const ECCHooksPlugin: ECCHooksPluginFn = async ({
|
||||
env.PRIMARY_LANGUAGE = detected[0]
|
||||
}
|
||||
|
||||
return env
|
||||
// OpenCode reads the supplied output object and ignores callback return values.
|
||||
output.env = { ...output.env, ...env }
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -531,13 +532,16 @@ export const ECCHooksPlugin: ECCHooksPluginFn = async ({
|
||||
* OpenCode-specific: Control context compaction behavior
|
||||
*
|
||||
* Triggers: Before context compaction
|
||||
* Action: Push ECC context block and custom compaction prompt
|
||||
* Action: Push ECC context block and compaction guidance
|
||||
*/
|
||||
"experimental.session.compacting": async () => {
|
||||
"experimental.session.compacting": async (
|
||||
_input: { sessionID: string },
|
||||
output: { context: string[]; prompt?: string }
|
||||
) => {
|
||||
const contextBlock = [
|
||||
"# ECC Context (preserve across compaction)",
|
||||
"",
|
||||
"## Active Plugin: ECC v2.2.0",
|
||||
"## Active Plugin: ECC v2.2.3",
|
||||
"- Hooks: file.edited, tool.execute.before/after, session.created/idle/deleted, shell.env, compacting, permission.ask",
|
||||
"- Tools: run-tests, check-coverage, security-audit, format-code, lint-check, git-summary, changed-files",
|
||||
"- Agents: 13 specialized (planner, architect, tdd-guide, code-reviewer, security-reviewer, build-error-resolver, e2e-runner, refactor-cleaner, doc-updater, go-reviewer, go-build-resolver, database-reviewer, python-reviewer)",
|
||||
@@ -558,9 +562,16 @@ export const ECCHooksPlugin: ECCHooksPluginFn = async ({
|
||||
contextBlock.push("")
|
||||
}
|
||||
|
||||
return {
|
||||
context: contextBlock.join("\n"),
|
||||
compaction_prompt: "Focus on preserving: 1) Current task status and progress, 2) Key decisions made, 3) Files created/modified, 4) Remaining work items, 5) Any security concerns flagged. Discard: verbose tool outputs, intermediate exploration, redundant file listings.",
|
||||
const eccContext = [
|
||||
contextBlock.join("\n"),
|
||||
"Focus on preserving: 1) Current task status and progress, 2) Key decisions made, 3) Files created/modified, 4) Remaining work items, 5) Any security concerns flagged. Discard: verbose tool outputs, intermediate exploration, redundant file listings.",
|
||||
]
|
||||
|
||||
// OpenCode requires output assignment and skips context when a prompt is set.
|
||||
if (output.prompt !== undefined) {
|
||||
output.prompt = [output.prompt, ...eccContext].join("\n\n")
|
||||
} else {
|
||||
output.context = [...output.context, ...eccContext]
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* while taking advantage of OpenCode's more sophisticated 20+ event types.
|
||||
*/
|
||||
|
||||
export { ECCHooksPlugin, default } from "./ecc-hooks.js"
|
||||
export { ECCHooksPlugin, default } from "./ecc-hooks.ts"
|
||||
|
||||
// Re-export for named imports
|
||||
export * from "./ecc-hooks.js"
|
||||
export * from "./ecc-hooks.ts"
|
||||
Loaded 100 of 1499 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user