Skip to content

v1.0.0 Rebirth — Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Squash entire git history into a single v1.0.0 commit, restructure directories (src/, docs/plans/, docs/research/, scripts/), add all open source documentation, and force-push as a fresh public project.

Architecture: Move core code under src/ (lib/ → src/lib/, modes/ → src/modes/), relocate plans and research into docs/, move ai-router utilities to scripts/. Update all shell script paths. Create standard open source docs. Orphan commit + force push.

Tech Stack: Bash 4.0+, Git, GitHub CLI

Global Constraints

  • No new features — only restructuring and documentation
  • All existing functionality must remain identical
  • bash -n must pass on all .sh files after restructuring
  • ShellCheck must pass on all .sh files after restructuring
  • Test suite must pass after restructuring
  • Single orphan commit: "v1.0.0: Initial public release"
  • Tag: v1.0.0
  • Old tags v33.9, v33.10, v35.0 deleted from GitHub remote
  • No secrets committed (verify with grep scan)

Task 1: Local Backup

Files: - None

Interfaces: - Produces: tag archive/pre-v1.0.0 on HEAD

  • Step 1: Create local backup tag
git tag archive/pre-v1.0.0 HEAD
  • Step 2: Verify tag exists

git tag -l 'archive/*'
Expected: archive/pre-v1.0.0

  • Step 3: Delete old tags from GitHub remote
git push github --delete v33.9 v33.10 v35.0 2>/dev/null; echo "done"

Task 2: Restructure Directories

Files: - Move: lib/ → src/lib/ - Move: modes/ → src/modes/ - Move: plans/ → docs/plans/ - Move: research/ → docs/research/ - Move: ai-router.sh → scripts/ai-router.sh - Move: ai-router.json → scripts/ai-router.json

  • Step 1: Create target directories
mkdir -p src docs/plans docs/research
  • Step 2: Move lib/ to src/lib/
mv lib src/lib
  • Step 3: Move modes/ to src/modes/
mv modes src/modes
  • Step 4: Move plans/ to docs/plans/
mv plans/* docs/plans/
rmdir plans
  • Step 5: Move research/ to docs/research/
mv research/* docs/research/
rmdir research
  • Step 6: Move ai-router files to scripts/
mv ai-router.sh scripts/ai-router.sh
mv ai-router.json scripts/ai-router.json
  • Step 7: Verify new structure
ls src/lib/helpers.sh && ls src/modes/health.sh && ls docs/plans/ && ls docs/research/ && ls scripts/ai-router.sh

Task 3: Update Paths in setup.sh

Files: - Modify: setup.sh

Interfaces: - Consumes: src/lib/, src/modes/ directories from Task 2

  • Step 1: Update all lib/ → src/lib/ references

Replace all 24 occurrences of lib/ with src/lib/ in setup.sh:

sed -i 's|lib/helpers\.sh|src/lib/helpers.sh|g' setup.sh
sed -i 's|lib/00-core\.sh|src/lib/00-core.sh|g' setup.sh
sed -i 's|lib/01-system\.sh|src/lib/01-system.sh|g' setup.sh
sed -i 's|lib/02-docker\.sh|src/lib/02-docker.sh|g' setup.sh
sed -i 's|lib/03-chrome\.sh|src/lib/03-chrome.sh|g' setup.sh
sed -i 's|lib/04-zsh\.sh|src/lib/04-zsh.sh|g' setup.sh
sed -i 's|lib/05-java\.sh|src/lib/05-java.sh|g' setup.sh
sed -i 's|lib/06-node\.sh|src/lib/06-node.sh|g' setup.sh
sed -i 's|lib/07-python\.sh|src/lib/07-python.sh|g' setup.sh
sed -i 's|lib/08-go\.sh|src/lib/08-go.sh|g' setup.sh
sed -i 's|lib/09-rust\.sh|src/lib/09-rust.sh|g' setup.sh
sed -i 's|lib/10-dotnet\.sh|src/lib/10-dotnet.sh|g' setup.sh
sed -i 's|lib/11-opencode\.sh|src/lib/11-opencode.sh|g' setup.sh
sed -i 's|lib/12-mcp-lsp\.sh|src/lib/12-mcp-lsp.sh|g' setup.sh
sed -i 's|lib/13-chromadb\.sh|src/lib/13-chromadb.sh|g' setup.sh
sed -i 's|lib/14-shokunin\.sh|src/lib/14-shokunin.sh|g' setup.sh
sed -i 's|lib/15-security\.sh|src/lib/15-security.sh|g' setup.sh
sed -i 's|lib/16-llm\.sh|src/lib/16-llm.sh|g' setup.sh
sed -i 's|lib/17-project\.sh|src/lib/17-project.sh|g' setup.sh
sed -i 's|lib/18-opencode-json\.sh|src/lib/18-opencode-json.sh|g' setup.sh
sed -i 's|lib/19-finalize\.sh|src/lib/19-finalize.sh|g' setup.sh
sed -i 's|lib/20-autoupdate\.sh|src/lib/20-autoupdate.sh|g' setup.sh
  • Step 2: Update all modes/ → src/modes/ references
sed -i 's|modes/health\.sh|src/modes/health.sh|g' setup.sh
sed -i 's|modes/fix-zshrc\.sh|src/modes/fix-zshrc.sh|g' setup.sh
sed -i 's|modes/upgrade\.sh|src/modes/upgrade.sh|g' setup.sh
sed -i 's|modes/interactive\.sh|src/modes/interactive.sh|g' setup.sh
  • Step 3: Verify no old paths remain

grep -n 'lib/0[0-9]\|lib/1[0-9]\|lib/2[0-9]\|lib/helpers\|lib/pre-session\|lib/version-check\|modes/' setup.sh && echo "OLD PATHS FOUND" || echo "CLEAN"
Expected: CLEAN

  • Step 4: Syntax check setup.sh

bash -n setup.sh && echo "PASS" || echo "FAIL"
Expected: PASS


Task 4: Update Paths in dev.sh

Files: - Modify: dev.sh

  • Step 1: Update paths in dev.sh
sed -i 's|lib/helpers\.sh|src/lib/helpers.sh|g' dev.sh
sed -i 's|lib/version-check\.sh|src/lib/version-check.sh|g' dev.sh
sed -i 's|"$SCRIPTS_DIR/lib"|"$SCRIPTS_DIR/src/lib"|g' dev.sh
  • Step 2: Syntax check dev.sh

bash -n dev.sh && echo "PASS" || echo "FAIL"
Expected: PASS

  • Step 3: Verify no old paths remain

grep -n 'lib/' dev.sh && echo "OLD PATHS FOUND" || echo "CLEAN"
Expected: CLEAN


Task 5: Update Paths in lib/ Files (now src/lib/)

Files: - Modify: src/lib/helpers.sh - Modify: src/lib/version-check.sh - Modify: src/lib/pre-session-check.sh - Modify: src/lib/19-finalize.sh

  • Step 1: Update helpers.sh SCRIPT_DIR for new depth

src/lib/helpers.sh line 12: dirname now needs ../.. instead of ..

sed -i 's|dirname "\${BASH_SOURCE\[0\]}")/\.\."|dirname "${BASH_SOURCE[0]}")/../.."|' src/lib/helpers.sh
  • Step 2: Update version-check.sh comment
sed -i 's|source lib/version-check\.sh|source src/lib/version-check.sh|g' src/lib/version-check.sh
  • Step 3: Update pre-session-check.sh comment
sed -i 's|~/opencode_initializer/lib/pre-session-check\.sh|~/opencode_initializer/src/lib/pre-session-check.sh|g' src/lib/pre-session-check.sh
  • Step 4: Update 19-finalize.sh DEV_SRC path
sed -i 's|opencode_initializer}/dev\.sh"|opencode_initializer}/dev.sh" --no change-needed-check|' src/lib/19-finalize.sh

Note: 19-finalize.sh uses SCRIPTS_DIR which is set by setup.sh — no path changes needed in this file.

  • Step 5: Syntax check all src/lib files

for f in src/lib/*.sh; do bash -n "$f" && echo "OK: $(basename "$f")" || echo "FAIL: $(basename "$f")"; done
Expected: all OK


Task 6: Update Paths in modes/ Files (now src/modes/)

Files: - Modify: src/modes/health.sh - Modify: src/modes/fix-zshrc.sh - Modify: src/modes/upgrade.sh - Modify: src/modes/interactive.sh

  • Step 1: Update mode file comments (informational only — no functional change needed)

Mode files use the comment header # modes/NAME.sh — ... and # Sources: lib/helpers.sh, lib/00-core.sh. Update these comments:

sed -i 's|modes/health\.sh|src/modes/health.sh|g' src/modes/health.sh
sed -i 's|modes/fix-zshrc\.sh|src/modes/fix-zshrc.sh|g' src/modes/fix-zshrc.sh
sed -i 's|modes/upgrade\.sh|src/modes/upgrade.sh|g' src/modes/upgrade.sh
sed -i 's|modes/interactive\.sh|src/modes/interactive.sh|g' src/modes/interactive.sh
sed -i 's|lib/helpers\.sh|src/lib/helpers.sh|g' src/modes/health.sh src/modes/fix-zshrc.sh src/modes/upgrade.sh src/modes/interactive.sh
sed -i 's|lib/00-core\.sh|src/lib/00-core.sh|g' src/modes/health.sh src/modes/upgrade.sh src/modes/interactive.sh
  • Step 2: Syntax check all src/modes files

for f in src/modes/*.sh; do bash -n "$f" && echo "OK: $(basename "$f")" || echo "FAIL: $(basename "$f")"; done
Expected: all OK


Task 7: Update Paths in All Test Files

Files: - Modify: tests/run_tests.sh - Modify: tests/e2e/test_critical_path.sh - Modify: tests/e2e/test_full_install.sh - Modify: tests/e2e/test_finalize.sh - Modify: tests/e2e/test_dev_cli.sh - Modify: tests/integration/test_modules.sh - Modify: tests/integration/test_opencode_json_gen.sh - Modify: tests/unit/test_mirrors.sh - Modify: tests/unit/test_helpers.sh - Modify: tests/unit/test_core.sh - Modify: tests/unit/test_mcp_registry.sh

  • Step 1: Update tests/run_tests.sh
sed -i 's|"$PROJECT_DIR/lib/"|"$PROJECT_DIR/src/lib/"|g' tests/run_tests.sh
sed -i 's|"$PROJECT_DIR/modes/"|"$PROJECT_DIR/src/modes/"|g' tests/run_tests.sh
  • Step 2: Update tests/e2e/test_critical_path.sh
sed -i 's|"$SCRIPTS_DIR/lib/"|"$SCRIPTS_DIR/src/lib/"|g' tests/e2e/test_critical_path.sh
sed -i 's|"$SCRIPTS_DIR/modes/"|"$SCRIPTS_DIR/src/modes/"|g' tests/e2e/test_critical_path.sh
  • Step 3: Update tests/e2e/test_full_install.sh
sed -i 's|source.*lib/|source.*src/lib/|g' tests/e2e/test_full_install.sh
sed -i 's|"$SETUP" "$PROJECT_DIR/lib/"|"$SETUP" "$PROJECT_DIR/src/lib/"|g' tests/e2e/test_full_install.sh
sed -i 's|"$PROJECT_DIR/lib/"\*.sh|"$PROJECT_DIR/src/lib/"*.sh|g' tests/e2e/test_full_install.sh
sed -i 's|"$PROJECT_DIR/modes/"|"$PROJECT_DIR/src/modes/"|g' tests/e2e/test_full_install.sh
sed -i 's|lib/helpers\.sh|src/lib/helpers.sh|g' tests/e2e/test_full_install.sh
sed -i 's|lib/00-core\.sh|src/lib/00-core.sh|g' tests/e2e/test_full_install.sh
  • Step 4: Update tests/e2e/test_finalize.sh
sed -i 's|lib/19-finalize\.sh|src/lib/19-finalize.sh|g' tests/e2e/test_finalize.sh
sed -i 's|lib/11-opencode\.sh|src/lib/11-opencode.sh|g' tests/e2e/test_finalize.sh
  • Step 5: Update tests/e2e/test_dev_cli.sh
sed -i 's|lib/helpers\.sh|src/lib/helpers.sh|g' tests/e2e/test_dev_cli.sh
  • Step 6: Update tests/integration/test_modules.sh
sed -i 's|"$PROJECT_DIR/lib/"|"$PROJECT_DIR/src/lib/"|g' tests/integration/test_modules.sh
sed -i 's|"$PROJECT_DIR/modes/"|"$PROJECT_DIR/src/modes/"|g' tests/integration/test_modules.sh
sed -i 's|lib/helpers\.sh|src/lib/helpers.sh|g' tests/integration/test_modules.sh
sed -i 's|lib/00-core\.sh|src/lib/00-core.sh|g' tests/integration/test_modules.sh
  • Step 7: Update tests/integration/test_opencode_json_gen.sh
sed -i 's|lib/18-opencode-json\.sh|src/lib/18-opencode-json.sh|g' tests/integration/test_opencode_json_gen.sh
  • Step 8: Update tests/unit/test_mirrors.sh
sed -i 's|"$PROJECT_DIR/lib/|"$PROJECT_DIR/src/lib/|g' tests/unit/test_mirrors.sh
  • Step 9: Update tests/unit/test_helpers.sh
sed -i 's|"$PROJECT_DIR/lib/|"$PROJECT_DIR/src/lib/|g' tests/unit/test_helpers.sh
  • Step 10: Update tests/unit/test_core.sh
sed -i 's|"$PROJECT_DIR/lib/|"$PROJECT_DIR/src/lib/|g' tests/unit/test_core.sh
  • Step 11: Update tests/unit/test_mcp_registry.sh
sed -i 's|"$PROJECT_DIR/lib/|"$PROJECT_DIR/src/lib/|g' tests/unit/test_mcp_registry.sh
sed -i 's|"$PROJECT_DIR/modes/|"$PROJECT_DIR/src/modes/|g' tests/unit/test_mcp_registry.sh
  • Step 12: Syntax check all test files

for f in tests/**/*.sh tests/*.sh; do bash -n "$f" && echo "OK: $f" || echo "FAIL: $f"; done
Expected: all OK


Task 8: Update .gitignore

Files: - Modify: .gitignore

  • Step 1: Remove plans/ and research/ exclusion (now in docs/)
sed -i '/^# Internal plans/d' .gitignore
sed -i '/^plans\/$/d' .gitignore
sed -i '/^research\/$/d' .gitignore
  • Step 2: Exclude ai-router files (moved to scripts/)
echo "ai-router.sh" >> .gitignore
echo "ai-router.json" >> .gitignore
  • Step 3: Verify final .gitignore

cat .gitignore
Expected: no plans/ or research/ lines present


Task 9: Create CHANGELOG.md

Files: - Create: CHANGELOG.md

  • Step 1: Write CHANGELOG.md
# Changelog

All notable changes to opencode_initializer will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.0.0] — 2026-06-22

### Added
- Initial public release of OpenCode Initializer
- 8 programming languages (Java 25, Node.js 24, Python 3.14, Go 1.26, Rust 1.96, .NET 10, Kotlin, Zig)
- 21 MCP servers for AI-assisted development
- 15+ OpenCode plugins (token-tracker, dcp, swarm, goal-mode, vibeguard, orchestrator, notify, pty, snip, snippets, envsitter-guard, command-inject, ignore, auto-fallback)
- 13 LSP servers (gopls, rust-analyzer, tsserver, pyright, omnisharp, yaml, marksman, taplo, lua, zls, bash, dockerfile, css/html/json)
- Infrastructure: Docker, ChromaDB + Muninn, GPU/LLM runtimes (Ollama, vLLM, SGLang, Open WebUI)
- ZSH + Oh My Zsh + Powerlevel10k with 18 plugins
- Google Chrome + ChromeDriver (WSL2-aware)
- CLI `dev` tool for post-install management
- Auto-update via systemd weekly timer + topgrade
- Cross-distro support (apt/dnf/pacman/apk/zypper/brew)
- Russian mirrors for network-constrained environments
- Progress tracking with retry logic and exponential backoff
- WSL2 optimization (DNS fix, memory limits, mirrored networking)
- Comprehensive test suite (unit, integration, E2E)
- ShellCheck CI on every push/PR
- Full documentation (guide, reference, FAQ, troubleshooting)

[1.0.0]: https://github.com/AlexanderNarbaev/opencode_initializer/releases/tag/v1.0.0
  • Step 2: Verify file
wc -l CHANGELOG.md && head -3 CHANGELOG.md

Task 10: Create .editorconfig

Files: - Create: .editorconfig

  • Step 1: Write .editorconfig
# EditorConfig — https://editorconfig.org
root = true

[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.sh]
indent_style = space
indent_size = 2

[*.md]
indent_style = space
indent_size = 4

[*.json]
indent_style = space
indent_size = 2

[*.yml,*.yaml]
indent_style = space
indent_size = 2

[Makefile]
indent_style = tab
indent_size = 4
  • Step 2: Verify
head -5 .editorconfig

Task 11: Create .gitattributes

Files: - Create: .gitattributes

  • Step 1: Write .gitattributes
# Auto-detect text files, normalize to LF
* text=auto eol=lf

# Shell scripts — always LF
*.sh text eol=lf

# Documentation — always LF
*.md text eol=lf

# Config files
*.json text eol=lf
*.yml text eol=lf
*.yaml text eol=lf

# OpenCode architecture files — vendored (not our code)
.opencode/* linguist-vendored

# Excluded from release archives
tests/ export-ignore
docs/ export-ignore
migrations/ export-ignore
  • Step 2: Verify
head -5 .gitattributes

Task 12: Create Issue and PR Templates

Files: - Create: .github/ISSUE_TEMPLATE/bug_report.md - Create: .github/ISSUE_TEMPLATE/feature_request.md - Create: .github/PULL_REQUEST_TEMPLATE.md

  • Step 1: Create directory and bug_report.md
mkdir -p .github/ISSUE_TEMPLATE
---
name: Bug Report
about: Report a bug in opencode_initializer
title: "[Bug]: "
labels: bug
assignees: AlexanderNarbaev
---

## Description

<!-- Clearly describe the bug -->

## Steps to Reproduce

1.
2.
3.

## Expected Behavior

<!-- What should have happened -->

## Actual Behavior

<!-- What actually happened, with error messages -->

## Environment

- OS: [e.g., Ubuntu 24.04, WSL2, macOS]
- Shell: [e.g., zsh 5.9, bash 5.2]
- Installer version: [e.g., v1.0.0]

## Additional Context

<!-- Logs, screenshots, etc. -->
  • Step 2: Create feature_request.md
---
name: Feature Request
about: Suggest a feature for opencode_initializer
title: "[Feature]: "
labels: enhancement
assignees: AlexanderNarbaev
---

## Problem Statement

<!-- What problem are you trying to solve? -->

## Proposed Solution

<!-- What would you like to see? -->

## Alternatives Considered

<!-- Any alternative approaches you've thought about -->

## Additional Context

<!-- Any other context, screenshots, etc. -->
  • Step 3: Create PULL_REQUEST_TEMPLATE.md
## Description

<!-- Briefly describe the changes -->

## Type of Change

- [ ] Bug fix
- [ ] New feature
- [ ] Documentation
- [ ] Test addition/fix
- [ ] Refactoring
- [ ] CI / maintenance

## Checklist

- [ ] Code follows [style guide](../../CONTRIBUTING.md#code-style) (2-space indent, snake_case)
- [ ] No hardcoded secrets
- [ ] New features have corresponding tests
- [ ] `bash -n` passes on all modified files
- [ ] `bash tests/run_tests.sh` passes
- [ ] `AGENTS.md` updated if architecture changes
- [ ] Commit messages follow [conventional format](https://www.conventionalcommits.org/)

## Related Issues

<!-- Link related issues: Closes #123, Relates to #456 -->
  • Step 4: Verify files exist
ls .github/ISSUE_TEMPLATE/bug_report.md .github/ISSUE_TEMPLATE/feature_request.md .github/PULL_REQUEST_TEMPLATE.md

Task 13: Create FUNDING.yml and CITATION.cff

Files: - Create: FUNDING.yml - Create: CITATION.cff

  • Step 1: Write FUNDING.yml
github: AlexanderNarbaev
custom: ["https://boosty.to/alexandernarbaev"]
  • Step 2: Write CITATION.cff
cff-version: 1.2.0
title: OpenCode Initializer
message: "If you use this software, please cite it as below."
type: software
authors:
  - given-names: Alexander
    family-names: Narbaev
    email: alexander.narbayev@gmail.com
    orcid: ""
repository-code: "https://github.com/AlexanderNarbaev/opencode_initializer"
abstract: "One-command AI-enhanced development environment setup for WSL2, Linux, and macOS."
keywords:
  - dev-machine
  - bootstrap
  - opencode
  - ai
  - wsl2
  - linux
license: MIT
version: 1.0.0
date-released: 2026-06-22
  • Step 3: Verify files
ls FUNDING.yml CITATION.cff

Task 14: Update README.md for v1.0.0

Files: - Modify: README.md

  • Step 1: Update architecture diagram in README.md

Replace the ASCII directory tree (lines 141-178) with the new src/ structure:


opencode_initializer/ ├── setup.sh # Orchestrator (284 lines) ├── dev.sh # CLI: dev install|remove|update|health|list|config ├── opencode.json # OpenCode multi-provider config ├── src/ │ ├── lib/ # 24 modules │ │ ├── helpers.sh # _curl, _retry, _npm_install infrastructure │ │ ├── 00-core.sh # OS/PKG/ARCH detection, mirrors, progress tracking │ │ ├── 01-system.sh # System packages (cross-distro) │ │ ├── ... │ │ └── 20-autoupdate.sh # topgrade + systemd timer │ └── modes/ # 4 + 6 built-in modes │ ├── health.sh # Diagnostics (60+ checks) │ ├── fix-zshrc.sh # .zshrc repair │ ├── upgrade.sh # Full system upgrade │ └── interactive.sh # Component-by-component selection ├── tests/ # Unit, integration, and E2E tests ├── migrations/ # Timestamped, idempotent migrations ├── scripts/ # Utility scripts (ai-router) ├── docs/ # Extended documentation + plans + research ├── .github/ # CI workflows, issue/PR templates ├── CHANGELOG.md ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md ├── SECURITY.md ├── LICENSE └── README.md

  • Step 2: Update version references
# Ensure all bash commands reference correct paths
grep -q 'lib/' README.md && echo "Check README for old paths" || echo "OK"
  • Step 3: Update badges if needed

Badges should remain as-is (they point to the repo, not local paths).


Task 15: Update CONTRIBUTING.md and AGENTS.md

Files: - Modify: CONTRIBUTING.md - Modify: AGENTS.md

  • Step 1: Update CONTRIBUTING.md paths
sed -i 's|lib/|src/lib/|g' CONTRIBUTING.md
sed -i 's|modes/|src/modes/|g' CONTRIBUTING.md
sed -i 's|for f in setup.sh dev.sh lib/|for f in setup.sh dev.sh src/lib/|g' CONTRIBUTING.md
  • Step 2: Update AGENTS.md structure diagrams

Update the two ASCII tree diagrams in AGENTS.md (lines 11-22 and lines 143-166):

First diagram (lines 11-22):


opencode_initializer/ ├── setup.sh ← оркестратор (284 строки, source модули из src/lib/) ├── src/ │ ├── lib/ ← 24 модуля (00-core.sh … 20-autoupdate.sh + helpers.sh + version-check.sh + pre-session-check.sh) │ └── modes/ ← 4 режимных скрипта (+ 6 встроенных режимов) ├── dev.sh ← CLI ├── scripts/ ← утилиты (ai-router) ├── tests/ ← unit, integration, e2e ├── migrations/ ← timestamped, idempotent ├── docs/ ← документация + plans + research ├── .github/ ← CI + issue/PR шаблоны ├── README.md └── AGENTS.md ← этот файл

Second diagram (lines 143-166):


opencode_initializer/ ├── setup.sh ← оркестратор (284 строки) ├── dev.sh ← CLI ├── opencode.json ← конфиг OpenCode ├── src/ │ ├── lib/ │ │ ├── helpers.sh ← _curl, _retry, _npm_install │ │ ├── pre-session-check.sh │ │ └── version-check.sh │ └── modes/ │ └── health.sh ... ← режимные скрипты ├── tests/ ← unit / integration / e2e ├── migrations/ ├── scripts/ ← утилиты ├── docs/ ← документация + plans + research ├── .github/workflows/ ← CI ├── README.md ├── CONTRIBUTING.md └── AGENTS.md

  • Step 3: Update paths in AGENTS.md section references
sed -i 's|lib/|src/lib/|g' AGENTS.md
sed -i 's|modes/|src/modes/|g' AGENTS.md
  • Step 4: Update version references
sed -i 's|v36\.0|v1.0.0|g' AGENTS.md
  • Step 5: Verify
grep -n 'v36' AGENTS.md && echo "OLD VERSION FOUND" || echo "CLEAN"

Task 16: Update setup.sh Version String

Files: - Modify: setup.sh

  • Step 1: Update version header
sed -i 's|v36\.0|v1.0.0|g' setup.sh
  • Step 2: Verify

head -3 setup.sh
Expected: # Ultimate Dev Machine Bootstrap v1.0.0 — Modular


Task 17: Run Full Verification

Files: - None (verification only)

  • Step 1: Syntax check all shell files
for f in setup.sh dev.sh src/lib/*.sh src/modes/*.sh tests/**/*.sh tests/*.sh migrations/*.sh scripts/*.sh; do
  [ -f "$f" ] || continue
  bash -n "$f" || echo "FAIL: $f"
done
echo "Syntax check complete"
  • Step 2: Run test suite

bash tests/run_tests.sh
Expected: all PASS

  • Step 3: Run ShellCheck

shellcheck setup.sh dev.sh src/lib/*.sh src/modes/*.sh scripts/*.sh 2>&1
Expected: no errors (SC1091 "not following" is acceptable for source)

  • Step 4: Secret scan

grep -rni 'sk-[a-zA-Z0-9]\{20,\}' setup.sh src/lib/*.sh src/modes/*.sh 2>/dev/null && echo "WARNING: API keys found" || echo "CLEAN"
grep -rni 'ghp_[a-zA-Z0-9]\{20,\}' setup.sh src/lib/*.sh src/modes/*.sh 2>/dev/null && echo "WARNING: tokens found" || echo "CLEAN"
grep -rni 'xai-[a-zA-Z0-9]\{20,\}' setup.sh src/lib/*.sh src/modes/*.sh 2>/dev/null && echo "WARNING: keys found" || echo "CLEAN"
Expected: all CLEAN

  • Step 5: Check for remaining old paths

grep -rn 'lib/0[0-9]\|lib/1[0-9]\|lib/2[0-9]' setup.sh dev.sh src/ tests/ docs/ scripts/ 2>/dev/null | grep -v '.git' | grep -v 'node_modules' && echo "OLD PATHS FOUND" || echo "CLEAN"
grep -rn 'modes/' setup.sh dev.sh src/ tests/ 2>/dev/null | grep -v '.git' | grep -v 'node_modules' | grep -v 'src/modes/' && echo "OLD MODES PATHS FOUND" || echo "CLEAN"
Expected: both CLEAN


Task 18: Orphan Commit, Tag, and Force Push

Files: - None (git operations)

Interfaces: - Consumes: all previous tasks must be complete and verified - Produces: single commit on main, tag v1.0.0, force-pushed to GitHub

  • Step 1: Stage ALL files from repo root
git add -A
  • Step 2: Verify staged content (spot check)

git status --short | head -30
Expected: shows deletions (old paths), additions (new paths), no unexpected files

  • Step 3: Check for any unintended files

git diff --cached --name-only | grep -v -E '(src/|docs/|scripts/|tests/|migrations/|.github/|.opencode/|setup\.sh|dev\.sh|opencode\.json|README\.md|AGENTS\.md|CONTRIBUTING\.md|CHANGELOG\.md|CODE_OF_CONDUCT\.md|SECURITY\.md|LICENSE|\.editorconfig|\.gitattributes|\.gitignore|FUNDING\.yml|CITATION\.cff)'
Expected: no output (all files accounted for)

  • Step 4: Create orphan branch and commit
git checkout --orphan temp-main
git add -A
git commit -m "v1.0.0: Initial public release

Universal Dev Machine Bootstrap — one-command AI-enhanced
development environment setup for WSL2, Linux, and macOS.

- 8 programming languages, 21 MCP servers, 15+ plugins, 13 LSPs
- Cross-distro support (6 package managers), amd64 + arm64
- ZSH + Oh My Zsh + Powerlevel10k, Docker, ChromaDB
- GPU/LLM runtimes (Ollama, vLLM, SGLang, Open WebUI)
- Auto-update via systemd timer, CLI 'dev' tool
- Comprehensive test suite (unit, integration, E2E)
- ShellCheck CI, MIT license

Result of 36 internal development iterations."
  • Step 5: Tag v1.0.0
git tag -a v1.0.0 -m "v1.0.0: Initial public release"
  • Step 6: Verify orphan history

git log --oneline
Expected: exactly 1 commit

  • Step 7: Replace main with temp-main
git branch -D main
git branch -m temp-main main
  • Step 8: Force push to GitHub
git push --force github main
git push github v1.0.0
  • Step 9: Verify GitHub remote

git ls-remote --tags github | grep v1.0.0
Expected: shows v1.0.0 tag

  • Step 10: Verify no old tags remain on GitHub

git ls-remote --tags github | grep -E 'v33\.|v35\.' && echo "OLD TAGS STILL PRESENT" || echo "CLEAN"
Expected: CLEAN


Task 19: Cleanup and Final Checks

  • Step 1: Remove stale local refs
git remote prune github
  • Step 2: Verify final state

git log --oneline --decorate
git tag
Expected: single commit v1.0.0 (HEAD -> main, tag: v1.0.0, github/main), tag list includes v1.0.0 and archive/pre-v1.0.0

  • Step 3: Final structure verification

ls -la setup.sh dev.sh opencode.json src/lib/helpers.sh src/modes/health.sh docs/plans/ docs/research/ scripts/ai-router.sh CHANGELOG.md .editorconfig .gitattributes FUNDING.yml CITATION.cff .github/PULL_REQUEST_TEMPLATE.md .github/ISSUE_TEMPLATE/bug_report.md .github/ISSUE_TEMPLATE/feature_request.md
Expected: all files exist

  • Step 4: Commit (if any cleanup changes needed)

Only if post-push adjustments needed after review.