OSS launch polish: fix hook paths, add OSS files, update README
- Fix slashes in agent identity causing invalid hook file paths (gt-vqhc) - Add Prerequisites section to README (gt-vzic) - Create CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md (gt-xbfw) - Update Install section for future package managers (gt-7wcf) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
36
CODE_OF_CONDUCT.md
Normal file
36
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We pledge to make participation in our project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment:
|
||||||
|
|
||||||
|
- Using welcoming and inclusive language
|
||||||
|
- Being respectful of differing viewpoints and experiences
|
||||||
|
- Gracefully accepting constructive criticism
|
||||||
|
- Focusing on what is best for the community
|
||||||
|
- Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior:
|
||||||
|
|
||||||
|
- Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
- Public or private harassment
|
||||||
|
- Publishing others' private information without explicit permission
|
||||||
|
- Other conduct which could reasonably be considered inappropriate
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying standards of acceptable behavior and will take appropriate action in response to unacceptable behavior.
|
||||||
|
|
||||||
|
Maintainers have the right to remove, edit, or reject comments, commits, code, issues, and other contributions that do not align with this Code of Conduct.
|
||||||
|
|
||||||
|
## Reporting
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting the project maintainers directly.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.0.
|
||||||
61
CONTRIBUTING.md
Normal file
61
CONTRIBUTING.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# Contributing to Gas Town
|
||||||
|
|
||||||
|
Thanks for your interest in contributing! Gas Town is experimental software, and we welcome contributions that help explore these ideas.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
1. Fork the repository
|
||||||
|
2. Clone your fork
|
||||||
|
3. Install prerequisites (see README.md)
|
||||||
|
4. Build and test: `go build -o gt ./cmd/gt && go test ./...`
|
||||||
|
|
||||||
|
## Development Workflow
|
||||||
|
|
||||||
|
We use a direct-to-main workflow for trusted contributors. For external contributors:
|
||||||
|
|
||||||
|
1. Create a feature branch from `main`
|
||||||
|
2. Make your changes
|
||||||
|
3. Ensure tests pass: `go test ./...`
|
||||||
|
4. Submit a pull request
|
||||||
|
|
||||||
|
## Code Style
|
||||||
|
|
||||||
|
- Follow standard Go conventions (`gofmt`, `go vet`)
|
||||||
|
- Keep functions focused and small
|
||||||
|
- Add comments for non-obvious logic
|
||||||
|
- Include tests for new functionality
|
||||||
|
|
||||||
|
## What to Contribute
|
||||||
|
|
||||||
|
Good first contributions:
|
||||||
|
- Bug fixes with clear reproduction steps
|
||||||
|
- Documentation improvements
|
||||||
|
- Test coverage for untested code paths
|
||||||
|
- Small, focused features
|
||||||
|
|
||||||
|
For larger changes, please open an issue first to discuss the approach.
|
||||||
|
|
||||||
|
## Commit Messages
|
||||||
|
|
||||||
|
- Use present tense ("Add feature" not "Added feature")
|
||||||
|
- Keep the first line under 72 characters
|
||||||
|
- Reference issues when applicable: `Fix timeout bug (gt-xxx)`
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Run the full test suite before submitting:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go test ./...
|
||||||
|
```
|
||||||
|
|
||||||
|
For specific packages:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go test ./internal/wisp/...
|
||||||
|
go test ./cmd/gt/...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Questions?
|
||||||
|
|
||||||
|
Open an issue for questions about contributing. We're happy to help!
|
||||||
19
README.md
19
README.md
@@ -15,12 +15,31 @@ Beads = Railroad Tracks (the persistent ledger)
|
|||||||
|
|
||||||
The goal is a "village" architecture - not rigid hierarchy, but distributed awareness where agents can help neighbors when something is stuck. Whether this actually works at scale is something we're still discovering.
|
The goal is a "village" architecture - not rigid hierarchy, but distributed awareness where agents can help neighbors when something is stuck. Whether this actually works at scale is something we're still discovering.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- **Go 1.23+** - For building from source
|
||||||
|
- **Git** - For rig management and beads sync
|
||||||
|
- **tmux** - Required for agent sessions (all workers run in tmux panes)
|
||||||
|
- **Claude Code CLI** - Required for agents (`claude` command must be available)
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
|
**From source (recommended for now):**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go install github.com/steveyegge/gastown/cmd/gt@latest
|
go install github.com/steveyegge/gastown/cmd/gt@latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Package managers (coming soon):**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Homebrew (macOS/Linux)
|
||||||
|
brew install gastown
|
||||||
|
|
||||||
|
# npm (cross-platform)
|
||||||
|
npm install -g @anthropic/gastown
|
||||||
|
```
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
38
SECURITY.md
Normal file
38
SECURITY.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
If you discover a security vulnerability in Gas Town, please report it responsibly:
|
||||||
|
|
||||||
|
1. **Do not** open a public issue for security vulnerabilities
|
||||||
|
2. Email the maintainers directly with details
|
||||||
|
3. Include steps to reproduce the vulnerability
|
||||||
|
4. Allow reasonable time for a fix before public disclosure
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
Gas Town is experimental software focused on multi-agent coordination. Security considerations include:
|
||||||
|
|
||||||
|
- **Agent isolation**: Workers run in separate tmux sessions but share filesystem access
|
||||||
|
- **Git operations**: Workers can push to configured remotes
|
||||||
|
- **Shell execution**: Agents execute shell commands as the running user
|
||||||
|
- **Beads data**: Work tracking data is stored in `.beads/` directories
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
When using Gas Town:
|
||||||
|
|
||||||
|
- Run in isolated environments for untrusted code
|
||||||
|
- Review agent output before pushing to production branches
|
||||||
|
- Use appropriate git remote permissions
|
||||||
|
- Monitor agent activity via `gt peek` and logs
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 0.1.x | :white_check_mark: |
|
||||||
|
|
||||||
|
## Updates
|
||||||
|
|
||||||
|
Security updates will be released as patch versions when applicable.
|
||||||
@@ -100,11 +100,7 @@ func ListHooks(root string) ([]string, error) {
|
|||||||
|
|
||||||
var agents []string
|
var agents []string
|
||||||
for _, e := range entries {
|
for _, e := range entries {
|
||||||
name := e.Name()
|
if agent := AgentFromHookFilename(e.Name()); agent != "" {
|
||||||
if len(name) > len(HookPrefix)+len(HookSuffix) &&
|
|
||||||
name[:len(HookPrefix)] == HookPrefix &&
|
|
||||||
name[len(name)-len(HookSuffix):] == HookSuffix {
|
|
||||||
agent := name[len(HookPrefix) : len(name)-len(HookSuffix)]
|
|
||||||
agents = append(agents, agent)
|
agents = append(agents, agent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
package wisp
|
package wisp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -72,6 +73,25 @@ func NewSlungWork(beadID, createdBy string) *SlungWork {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// HookFilename returns the filename for an agent's hook file.
|
// HookFilename returns the filename for an agent's hook file.
|
||||||
|
// Agent identities may contain slashes (e.g., "gastown/crew/max"),
|
||||||
|
// which are replaced with underscores to create valid filenames.
|
||||||
func HookFilename(agent string) string {
|
func HookFilename(agent string) string {
|
||||||
return HookPrefix + agent + HookSuffix
|
safe := strings.ReplaceAll(agent, "/", "_")
|
||||||
|
return HookPrefix + safe + HookSuffix
|
||||||
|
}
|
||||||
|
|
||||||
|
// AgentFromHookFilename extracts the agent identity from a hook filename.
|
||||||
|
// Reverses the slash-to-underscore transformation done by HookFilename.
|
||||||
|
func AgentFromHookFilename(filename string) string {
|
||||||
|
if len(filename) <= len(HookPrefix)+len(HookSuffix) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if filename[:len(HookPrefix)] != HookPrefix {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if filename[len(filename)-len(HookSuffix):] != HookSuffix {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
safe := filename[len(HookPrefix) : len(filename)-len(HookSuffix)]
|
||||||
|
return strings.ReplaceAll(safe, "_", "/")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user