init
This commit is contained in:
103
.opencode/skills/ship/references/auto-detect.md
Normal file
103
.opencode/skills/ship/references/auto-detect.md
Normal file
@@ -0,0 +1,103 @@
|
||||
# Auto-Detection Logic
|
||||
|
||||
Detect test runner, version file, and changelog format from project files.
|
||||
|
||||
## Test Runner Detection
|
||||
|
||||
Check in order (first match wins):
|
||||
|
||||
| Check | Test Command |
|
||||
|-------|-------------|
|
||||
| `package.json` → `scripts.test` exists | `npm test` |
|
||||
| `Makefile` → has `test:` target | `make test` |
|
||||
| `pytest.ini` OR `pyproject.toml` has `[tool.pytest]` | `pytest` |
|
||||
| `Cargo.toml` exists | `cargo test` |
|
||||
| `go.mod` exists | `go test ./...` |
|
||||
| `Gemfile` + `Rakefile` with test task | `bundle exec rake test` |
|
||||
| `build.gradle` or `build.gradle.kts` | `./gradlew test` |
|
||||
| `pom.xml` | `mvn test` |
|
||||
| `mix.exs` | `mix test` |
|
||||
| `deno.json` | `deno test` |
|
||||
|
||||
**Detection script:**
|
||||
```bash
|
||||
if [ -f package.json ] && grep -q '"test"' package.json 2>/dev/null; then
|
||||
echo "npm test"
|
||||
elif [ -f Makefile ] && grep -q '^test:' Makefile 2>/dev/null; then
|
||||
echo "make test"
|
||||
elif [ -f pytest.ini ] || ([ -f pyproject.toml ] && grep -q '\[tool.pytest' pyproject.toml 2>/dev/null); then
|
||||
echo "pytest"
|
||||
elif [ -f Cargo.toml ]; then
|
||||
echo "cargo test"
|
||||
elif [ -f go.mod ]; then
|
||||
echo "go test ./..."
|
||||
else
|
||||
echo "NONE"
|
||||
fi
|
||||
```
|
||||
|
||||
**If NONE:** Use `AskUserQuestion` — "No test runner detected. Options: A) Skip tests, B) Provide test command"
|
||||
|
||||
## Version File Detection
|
||||
|
||||
Check in order:
|
||||
|
||||
| Check | Read Pattern |
|
||||
|-------|-------------|
|
||||
| `VERSION` file | Read as semver string |
|
||||
| `package.json` → `version` field | `jq -r .version package.json` |
|
||||
| `pyproject.toml` → `version` | grep `version = "..."` |
|
||||
| `Cargo.toml` → `version` | grep `version = "..."` |
|
||||
| `mix.exs` → `@version` | grep `@version "..."` |
|
||||
|
||||
**If none found:** Skip version bump silently. Not all projects use versioning.
|
||||
|
||||
**Bump logic:**
|
||||
```
|
||||
Lines changed < 50 → patch (X.Y.Z → X.Y.Z+1)
|
||||
Lines changed >= 50 → patch (safe default)
|
||||
User explicitly says "breaking" or "major feature" → AskUserQuestion for minor/major
|
||||
```
|
||||
|
||||
## Changelog Detection
|
||||
|
||||
| Check | Format |
|
||||
|-------|--------|
|
||||
| `CHANGELOG.md` | Keep-a-changelog format |
|
||||
| `CHANGES.md` | Same |
|
||||
| `HISTORY.md` | Same |
|
||||
|
||||
**If none found:** Skip changelog silently.
|
||||
|
||||
**Entry format:**
|
||||
```markdown
|
||||
## [X.Y.Z] - YYYY-MM-DD
|
||||
|
||||
### Added
|
||||
- New features from commits with `feat:` prefix
|
||||
|
||||
### Changed
|
||||
- Changes from commits with `refactor:`, `perf:` prefix
|
||||
|
||||
### Fixed
|
||||
- Bug fixes from commits with `fix:` prefix
|
||||
|
||||
### Removed
|
||||
- Removals mentioned in commit messages
|
||||
```
|
||||
|
||||
**Infer categories from:**
|
||||
1. Conventional commit prefixes in `git log main..HEAD --oneline`
|
||||
2. File types changed (test files → test improvements, docs → documentation)
|
||||
3. Diff content (new functions = Added, modified functions = Changed)
|
||||
|
||||
## Main Branch Detection
|
||||
|
||||
```bash
|
||||
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@'
|
||||
```
|
||||
|
||||
Fallback: check if `main` or `master` exists:
|
||||
```bash
|
||||
git rev-parse --verify origin/main 2>/dev/null && echo "main" || echo "master"
|
||||
```
|
||||
Reference in New Issue
Block a user