{"id":35551260,"url":"https://github.com/lex00/wetwire-core-go","last_synced_at":"2026-01-20T06:01:05.217Z","repository":{"id":331779050,"uuid":"1126981695","full_name":"lex00/wetwire-core-go","owner":"lex00","description":"Shared agent core for wetwire domain packages","archived":false,"fork":false,"pushed_at":"2026-01-13T22:22:33.000Z","size":114,"stargazers_count":0,"open_issues_count":8,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-13T22:59:53.971Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lex00.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-02T23:48:39.000Z","updated_at":"2026-01-13T22:22:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/lex00/wetwire-core-go","commit_stats":null,"previous_names":["lex00/wetwire-core-go"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/lex00/wetwire-core-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lex00%2Fwetwire-core-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lex00%2Fwetwire-core-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lex00%2Fwetwire-core-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lex00%2Fwetwire-core-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lex00","download_url":"https://codeload.github.com/lex00/wetwire-core-go/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lex00%2Fwetwire-core-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28405148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T21:51:37.118Z","status":"ssl_error","status_checked_at":"2026-01-13T21:45:14.585Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-04T07:24:24.450Z","updated_at":"2026-01-20T06:01:05.195Z","avatar_url":"https://github.com/lex00.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wetwire-core-go\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/lex00/wetwire-core-go.svg)](https://pkg.go.dev/github.com/lex00/wetwire-core-go)\n[![CI](https://github.com/lex00/wetwire-core-go/actions/workflows/ci.yml/badge.svg)](https://github.com/lex00/wetwire-core-go/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/lex00/wetwire-core-go/branch/main/graph/badge.svg)](https://codecov.io/gh/lex00/wetwire-core-go)\n[![Go Report Card](https://goreportcard.com/badge/github.com/lex00/wetwire-core-go)](https://goreportcard.com/report/github.com/lex00/wetwire-core-go)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nShared agent infrastructure for wetwire domain packages.\n\n## Overview\n\nwetwire-core-go provides the AI agent framework used by wetwire domain packages (like wetwire-aws-go).\n\n### Core Hypothesis\n\nWetwire validates that **typed constraints reduce required model capability**:\n\n\u003e Typed input + smaller model ≈ Semantic input + larger model\n\nThe type system and lint rules act as a force multiplier — cheaper models can produce quality output when guided by schema-generated types and iterative lint feedback. Scenarios test this by comparing output quality across model/constraint combinations.\n\n### Package Summary\n\n- **agents** - Unified Agent architecture with MCP tool integration\n- **mcp** - MCP server for Claude Code integration with standard tool definitions\n- **providers** - AI provider abstraction (Anthropic API, Claude Code, Kiro)\n- **personas** - Developer persona definitions (Beginner, Intermediate, Expert) with custom persona support\n- **scoring** - 4-dimension evaluation rubric (0-12 scale)\n- **results** - Session tracking and RESULTS.md generation\n- **orchestrator** - Developer/Runner agent coordination\n- **scenario** - Multi-domain scenario definitions with cross-domain validation\n- **recording** - Animated SVG recordings of user/agent conversations\n- **version** - Version info exposure via runtime/debug\n- **cmd** - CLI command framework with cobra\n- **serialize** - Struct-to-map conversion and JSON/YAML serialization\n\n## Installation\n\n```bash\ngo get github.com/lex00/wetwire-core-go\n```\n\n## Quick Start\n\n### Unified Agent (Recommended)\n\nThe unified Agent is the recommended pattern for all domain packages:\n\n```go\nimport (\n    \"github.com/lex00/wetwire-core-go/agent/agents\"\n    \"github.com/lex00/wetwire-core-go/mcp\"\n    \"github.com/lex00/wetwire-core-go/providers/anthropic\"\n)\n\n// 1. Create MCP server with tools\nmcpServer := mcp.NewServer(mcp.Config{\n    Name:    \"wetwire-mydomain\",\n    Version: \"1.0.0\",\n})\n\n// 2. Register standard tools\nmcp.RegisterStandardToolsWithDefaults(mcpServer, \"mydomain\", mcp.StandardToolHandlers{\n    Init:  myInitHandler,\n    Build: myBuildHandler,\n    Lint:  myLintHandler,\n})\n\n// 3. Create provider\nprovider, _ := anthropic.New(anthropic.Config{})\n\n// 4. Create unified Agent\nagent, _ := agents.NewAgent(agents.AgentConfig{\n    Provider:     provider,\n    MCPServer:    agents.NewMCPServerAdapter(mcpServer),\n    SystemPrompt: \"You are an infrastructure code generator...\",\n    Developer:    developer,  // nil for autonomous mode\n})\n\n// 5. Run\nagent.Run(ctx, \"Create an S3 bucket with versioning\")\n```\n\n### MCP Server for Claude Code\n\nExpose tools to Claude Code via MCP:\n\n```go\nimport \"github.com/lex00/wetwire-core-go/mcp\"\n\nserver := mcp.NewServer(mcp.Config{\n    Name:    \"wetwire-mydomain\",\n    Version: \"1.0.0\",\n})\n\nmcp.RegisterStandardToolsWithDefaults(server, \"mydomain\", handlers)\nserver.Start(context.Background())  // Runs on stdio\n```\n\n### Provider Abstraction\n\nSame code works with different AI backends:\n\n```go\nimport (\n    \"github.com/lex00/wetwire-core-go/providers\"\n    \"github.com/lex00/wetwire-core-go/providers/anthropic\"\n    \"github.com/lex00/wetwire-core-go/providers/claude\"\n)\n\nvar provider providers.Provider\n\nif useClaudeCode {\n    // No API key needed - uses Claude Code CLI\n    provider, _ = claude.New(claude.Config{\n        SystemPrompt: \"You are an infrastructure generator...\",\n    })\n} else {\n    // Direct API access\n    provider, _ = anthropic.New(anthropic.Config{})\n}\n\n// Same API for both\nresp, _ := provider.CreateMessage(ctx, req)\n```\n\n## Examples\n\n| Example | Description |\n|---------|-------------|\n| [unified_agent](examples/unified_agent/) | Unified Agent with MCP tools (recommended pattern) |\n| [mcp_server](examples/mcp_server/) | MCP server for Claude Code integration |\n| [claude_provider](examples/claude_provider/) | Using Claude Code as AI backend (no API key) |\n| [kiro_provider](examples/kiro_provider/) | Using Kiro provider (enterprise) |\n\n### Running Scenarios\n\nResults are organized by persona:\n```\noutput/\n├── SUMMARY.md           # Results table with all personas\n├── default/\n│   ├── RESULTS.md       # Response and generated files\n│   ├── cfn-templates/s3-bucket.yaml\n│   └── .gitlab-ci.yml\n├── beginner/\n├── intermediate/\n└── expert/\n```\n\n## Package Reference\n\n### agents\n\n```go\n// Create unified Agent\nagent, _ := agents.NewAgent(agents.AgentConfig{\n    Provider:     provider,\n    MCPServer:    mcpServer,\n    SystemPrompt: \"...\",\n    Developer:    developer,  // nil for autonomous mode\n    Session:      session,    // optional, for result tracking\n})\n\n// Wrap MCP server for Agent\nadapter := agents.NewMCPServerAdapter(mcpServer)\n```\n\n### mcp\n\n```go\n// Create server\nserver := mcp.NewServer(mcp.Config{Name: \"domain\", Version: \"1.0.0\"})\n\n// Register tools with default file handlers\nmcp.RegisterStandardToolsWithDefaults(server, \"domain\", handlers)\n\n// In-process tool execution (for Agent)\nresult, _ := server.ExecuteTool(ctx, \"tool_name\", args)\ntools := server.GetTools()\n```\n\n### providers\n\n```go\n// Claude Code (no API key needed - recommended for local dev)\nprovider, _ := claude.New(claude.Config{\n    SystemPrompt:  \"You are an infrastructure generator...\",\n    MCPConfigPath: \"/path/to/mcp.json\",  // Optional: MCP tools\n})\n\n// Anthropic (direct API - recommended for production)\nprovider, _ := anthropic.New(anthropic.Config{APIKey: \"...\"})\n\n// Kiro (enterprise - uses kiro-cli)\nprovider, _ := kiro.New(kiro.Config{AgentName: \"...\", MCPCommand: \"...\"})\n\n// All implement providers.Provider interface\nresp, _ := provider.CreateMessage(ctx, req)\nresp, _ := provider.StreamMessage(ctx, req, handler)\n```\n\n### personas\n\n```go\npersona, _ := personas.Get(\"beginner\")  // beginner, intermediate, expert (+ custom)\nfmt.Println(persona.Name, persona.Description)\n```\n\n### results\n\n```go\nsession := results.NewSession(\"domain\", \"scenario\")\nsession.Complete()\nwriter := results.NewResultsWriter()\nwriter.Write(session, \"./RESULTS.md\")\n```\n\n## Implementing a Domain\n\nDomain packages implement the `domain.Domain` interface to get automatic CLI and MCP generation.\n\n### Required Interface\n\n```go\nimport \"github.com/lex00/wetwire-core-go/domain\"\n\ntype MyDomain struct{}\n\n// Compile-time check - fails if any method is missing\nvar _ domain.Domain = (*MyDomain)(nil)\n\nfunc (d *MyDomain) Name() string    { return \"mydomain\" }\nfunc (d *MyDomain) Version() string { return \"1.0.0\" }\nfunc (d *MyDomain) Builder() domain.Builder       { return \u0026MyBuilder{} }\nfunc (d *MyDomain) Linter() domain.Linter         { return \u0026MyLinter{} }\nfunc (d *MyDomain) Initializer() domain.Initializer { return \u0026MyInitializer{} }\nfunc (d *MyDomain) Validator() domain.Validator   { return \u0026MyValidator{} }\n```\n\n### Usage\n\n```go\nfunc main() {\n    cli := domain.Run(\u0026MyDomain{})\n    cli.Execute()\n}\n```\n\nThis generates:\n- CLI with `build`, `lint`, `init`, `validate` commands\n- Persistent `--format` and `--verbose` flags\n\n### MCP Server\n\n```go\nserver := domain.BuildMCPServer(\u0026MyDomain{})\nserver.Start()\n```\n\nThis generates MCP tools: `wetwire_build`, `wetwire_lint`, `wetwire_init`, `wetwire_validate`\n\n### Optional Interfaces\n\nDomains may implement additional capabilities:\n\n```go\n// Import external configs\nfunc (d *MyDomain) Importer() domain.Importer { return \u0026MyImporter{} }\nvar _ domain.ImporterDomain = (*MyDomain)(nil)\n\n// List discovered resources\nfunc (d *MyDomain) Lister() domain.Lister { return \u0026MyLister{} }\nvar _ domain.ListerDomain = (*MyDomain)(nil)\n\n// Visualize dependencies\nfunc (d *MyDomain) Grapher() domain.Grapher { return \u0026MyGrapher{} }\nvar _ domain.GrapherDomain = (*MyDomain)(nil)\n```\n\n### Adding Custom Commands\n\nDomain-specific commands are added after `Run()`:\n\n```go\nfunc main() {\n    cli := domain.Run(\u0026MyDomain{})\n    cli.AddCommand(newDesignCmd())  // AI-assisted design\n    cli.AddCommand(newTestCmd())    // Persona testing\n    cli.AddCommand(newMCPCmd())     // MCP server\n    cli.Execute()\n}\n```\n\n## Documentation\n\n- [mcp/README.md](mcp/README.md) - MCP server and standard tools\n- [docs/CLAUDE_PROVIDER.md](docs/CLAUDE_PROVIDER.md) - Claude Code provider (no API key)\n- [docs/KIRO_PROVIDER.md](docs/KIRO_PROVIDER.md) - Kiro provider (enterprise)\n- [docs/SCENARIOS.md](docs/SCENARIOS.md) - Multi-domain scenario definitions\n- [docs/RECORDING.md](docs/RECORDING.md) - SVG recording of conversations\n- [docs/FAQ.md](docs/FAQ.md) - Frequently asked questions\n\n## Migration from RunnerAgent\n\nThe `RunnerAgent` is deprecated. Migrate to the unified Agent:\n\n```go\n// OLD (deprecated):\nrunner, _ := agents.NewRunnerAgent(agents.RunnerConfig{\n    Domain:    myDomain,\n    WorkDir:   \"./output\",\n    Developer: developer,\n})\nrunner.Run(ctx, prompt)\n\n// NEW (recommended):\nmcpServer := mcp.NewServer(mcp.Config{Name: \"domain\"})\nmcp.RegisterStandardToolsWithDefaults(mcpServer, \"domain\", handlers)\n\nagent, _ := agents.NewAgent(agents.AgentConfig{\n    Provider:     provider,\n    MCPServer:    agents.NewMCPServerAdapter(mcpServer),\n    Developer:    developer,\n    SystemPrompt: systemPrompt,\n})\nagent.Run(ctx, prompt)\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flex00%2Fwetwire-core-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flex00%2Fwetwire-core-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flex00%2Fwetwire-core-go/lists"}