From a2eb4e9327c6e26e3e04106e717770e150d68368 Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 10:46:56 +0100 Subject: [PATCH 01/10] docs: add improvement suggestions research Amp-Thread-ID: https://ampcode.com/threads/T-019c280a-9c6d-71b9-8666-ba5d30668a23 Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c280a-9c6d-71b9-8666-ba5d30668a23 --- .agents/research/improvement-suggestions.md | 96 +++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .agents/research/improvement-suggestions.md diff --git a/.agents/research/improvement-suggestions.md b/.agents/research/improvement-suggestions.md new file mode 100644 index 0000000..b377906 --- /dev/null +++ b/.agents/research/improvement-suggestions.md @@ -0,0 +1,96 @@ +# Improvement Suggestions + +Feedback gathered after installing dot-agents on an existing project. + +## Suggested Improvements + +### 1. Backup Location + +**Current:** Creates `.dot-agents-backup/` in the project root. + +**Issue:** This directory is visible and may be accidentally committed to version control. + +**Suggestions:** + +- Add `.dot-agents-backup/` to the generated `.agents/.gitignore`. +- Or nest backups inside `.agents/.backups/` to keep the root directory clean. + +### 2. Post-Install Guidance + +**Current:** Installation ends with a summary table only. + +**Suggestion:** Print actionable next steps after install: + +```bash +✓ Installation complete! + +Next steps: + 1. Run 'adapt' to customize AGENTS.md for your project + 2. Read the quickstart: https://github.com/colmarius/dot-agents/blob/main/QUICKSTART.md +``` + +### 3. Version Tracking + +**Current:** Shows `(ref: main)` during install. + +**Suggestion:** Display the actual commit SHA or version tag for reproducibility (e.g., `Installing dot-agents v1.2.0 (abc123f)...`). + +### 4. Interactive Mode for Conflicts + +**Current:** Force overwrites managed files with automatic backup. + +**Suggestion:** Add an `--interactive` flag to review changes before overwriting, allowing users to decide per-file. + +### 5. Diff Preview for Skill Updates + +**Current:** Backs up and overwrites without showing what changed. + +**Suggestion:** For sync/update operations, show a summary of changes or a diff preview for modified skills. + +### 6. Sync Command Documentation + +**Current:** `scripts/sync.sh` is installed but not mentioned in post-install output. + +**Suggestion:** Document how to update/sync in the output: `To update skills: .agents/scripts/sync.sh`. + +### 7. Landing Page Improvements + +- Add a copy button to the curl command for easier installation. +- Show the version number on the landing page. +- Add testimonials or example repos using dot-agents. + +### 8. Preserve Custom Skills Table + +**Current:** The `skills/AGENTS.md` file is force-overwritten with only core skills listed. + +**Issue:** Projects with custom skills (e.g., `agent-browser`, `git-workflow`) lose their skill documentation in the main table. + +**Suggestions:** + +- Mark the "Available Skills" table as user-managed content (skip on sync). +- Or auto-generate the table by scanning existing skill directories. + +### 9. Detect Existing Skills Before Overwrite + +**Current:** No awareness of project-specific customizations. + +**Suggestion:** Before syncing, detect custom skills and warn the user that core skills will be updated while custom ones are preserved. + +### 10. Add .dot-agents-backup to .gitignore + +**Current:** Backup folder created at project root is not ignored. + +**Suggestion:** Automatically add `../.dot-agents-backup/` to the generated `.agents/.gitignore` or create a root entry. + +## Priority Ranking + +| Priority | Improvement | Effort | +| ---------- | ---------------------------- | ------ | +| **High** | Post-install guidance | Low | +| **High** | Preserve custom skills table | Medium | +| **High** | Add backup to gitignore | Low | +| **Medium** | Version tracking | Medium | +| **Medium** | Sync command docs | Low | +| **Medium** | Detect existing skills | Medium | +| **Low** | Interactive mode | High | +| **Low** | Diff preview | High | From 9e0a0b7db550fe2494f4c86a09a6371ee2512de2 Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 10:57:10 +0100 Subject: [PATCH 02/10] plan: Add 003-installer-improvements for better UX and safer defaults Amp-Thread-ID: https://ampcode.com/threads/T-019c2815-121d-71ff-88e4-0d5ceabcc5ac Co-authored-by: Amp --- .../plans/todo/003-installer-improvements.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 .agents/plans/todo/003-installer-improvements.md diff --git a/.agents/plans/todo/003-installer-improvements.md b/.agents/plans/todo/003-installer-improvements.md new file mode 100644 index 0000000..36e73e5 --- /dev/null +++ b/.agents/plans/todo/003-installer-improvements.md @@ -0,0 +1,87 @@ +# Plan: Installer Improvements + +| Field | Value | +|-------|-------| +| PRD | N/A | +| Research | `../../research/improvement-suggestions.md` | +| Status | todo | +| Created | 2026-02-04 | + +## Overview + +Address high and medium priority improvements from user feedback after installing dot-agents on existing projects. Focus on better UX, safer defaults, and clearer guidance. + +## Tasks + +- [ ] **Task 1: Add backup directory to gitignore** + - Scope: `install.sh` + - Depends on: none + - Acceptance: + - `.agents/.gitignore` includes `.dot-agents-backup/` entry (relative path `../.dot-agents-backup/`) + - Entry added during fresh install and sync + - Existing `.gitignore` content preserved + - Notes: Create `.agents/.gitignore` if it doesn't exist + +- [ ] **Task 2: Add post-install guidance with next steps** + - Scope: `install.sh` + - Depends on: none + - Acceptance: + - After install summary, print actionable next steps + - Include: "Run 'adapt' to customize AGENTS.md" + - Include: link to QUICKSTART.md + - Only show on fresh install (not sync) + - Notes: Use existing color formatting for consistency + +- [ ] **Task 3: Show version/commit in install message** + - Scope: `install.sh` + - Depends on: none + - Acceptance: + - For tags: show `Installing dot-agents v1.2.0...` + - For branches: show `Installing dot-agents (main @ abc123f)...` + - Commit SHA available from extracted archive directory name + - Notes: Parse short SHA from extracted directory or use git API + +- [ ] **Task 4: Document sync command in post-install output** + - Scope: `install.sh` + - Depends on: Task 2 + - Acceptance: + - On sync (not fresh install), print how to update in the future + - Message: "To update: curl ... | bash" or reference local script + - Notes: Keep it concise, single line + +- [ ] **Task 5: Preserve custom skills during sync** + - Scope: `install.sh`, `.agents/skills/` + - Depends on: none + - Acceptance: + - Detect non-core skills in `.agents/skills/` before sync + - Core skills: adapt, ralph, research, tmux (from upstream) + - Custom skills: anything else, preserved without modification + - Print message listing preserved custom skills + - Notes: Skills are directories under `.agents/skills/` + +- [ ] **Task 6: Update tests for new installer behavior** + - Scope: `test/integration/install.bats` + - Depends on: Task 1, Task 2, Task 3, Task 4, Task 5 + - Acceptance: + - Tests verify `.gitignore` entry creation + - Tests verify post-install guidance output + - Tests verify custom skill preservation + - All existing tests still pass + - Notes: Run `./scripts/test.sh` to verify + +## Verification + +After all tasks complete, run: + +```bash +# Lint shell scripts (ShellCheck + syntax) +./scripts/lint.sh + +# Run all tests (lint + BATS) +./scripts/test.sh + +# Manual verification +./install.sh --dry-run +``` + +All checks must pass before marking plan complete. From ba3b922782d23320aa9431ef88a84df0615dd66e Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 10:58:16 +0100 Subject: [PATCH 03/10] feat: Task 1 - Add backup directory to gitignore - Added ensure_gitignore_entry() function to install.sh - Creates/updates .agents/.gitignore with ../.dot-agents-backup/ entry - Works on both fresh install and sync - Preserves existing gitignore content Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c2815-121d-71ff-88e4-0d5ceabcc5ac --- .agents/.gitignore | 3 +++ .../003-installer-improvements.md | 2 +- .../003-installer-improvements.progress.md | 12 +++++++++ install.sh | 27 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) rename .agents/plans/{todo => in-progress}/003-installer-improvements.md (98%) create mode 100644 .agents/plans/in-progress/003-installer-improvements.progress.md diff --git a/.agents/.gitignore b/.agents/.gitignore index ad6fb0e..ef2496a 100644 --- a/.agents/.gitignore +++ b/.agents/.gitignore @@ -1,3 +1,6 @@ # External reference repositories cloned for analysis # These are typically large and should not be committed reference/ + +# Backup directory created during install --force +../.dot-agents-backup/ diff --git a/.agents/plans/todo/003-installer-improvements.md b/.agents/plans/in-progress/003-installer-improvements.md similarity index 98% rename from .agents/plans/todo/003-installer-improvements.md rename to .agents/plans/in-progress/003-installer-improvements.md index 36e73e5..1c7c267 100644 --- a/.agents/plans/todo/003-installer-improvements.md +++ b/.agents/plans/in-progress/003-installer-improvements.md @@ -13,7 +13,7 @@ Address high and medium priority improvements from user feedback after installin ## Tasks -- [ ] **Task 1: Add backup directory to gitignore** +- [x] **Task 1: Add backup directory to gitignore** - Scope: `install.sh` - Depends on: none - Acceptance: diff --git a/.agents/plans/in-progress/003-installer-improvements.progress.md b/.agents/plans/in-progress/003-installer-improvements.progress.md new file mode 100644 index 0000000..f609b62 --- /dev/null +++ b/.agents/plans/in-progress/003-installer-improvements.progress.md @@ -0,0 +1,12 @@ +# Progress: 003-installer-improvements + +## Session: 2026-02-04 + +### Task 1: Add backup directory to gitignore +- **Status**: Complete +- **Started**: 2026-02-04 +- **Changes**: + - Added `ensure_gitignore_entry()` function to install.sh + - Function creates/updates `.agents/.gitignore` with `../.dot-agents-backup/` entry + - Added backup entry to upstream `.agents/.gitignore` for fresh installs + - Preserves existing gitignore content diff --git a/install.sh b/install.sh index 180ba6a..ebf0f82 100755 --- a/install.sh +++ b/install.sh @@ -349,6 +349,30 @@ atomic_copy() { mv -f "$tmp" "$dest" } +ensure_gitignore_entry() { + local gitignore_file=".agents/.gitignore" + local backup_entry="../.dot-agents-backup/" + + if [[ "$DRY_RUN" == "true" ]]; then + if [[ ! -f "$gitignore_file" ]]; then + log_info " ${GREEN}[CREATE]${NC} $gitignore_file" + elif ! grep -qxF "$backup_entry" "$gitignore_file" 2>/dev/null; then + log_info " ${GREEN}[UPDATE]${NC} $gitignore_file (add backup entry)" + fi + return 0 + fi + + mkdir -p ".agents" + + if [[ ! -f "$gitignore_file" ]]; then + echo "$backup_entry" > "$gitignore_file" + log_info " ${GREEN}[CREATE]${NC} $gitignore_file" + elif ! grep -qxF "$backup_entry" "$gitignore_file" 2>/dev/null; then + echo "$backup_entry" >> "$gitignore_file" + log_info " ${GREEN}[UPDATE]${NC} $gitignore_file (add backup entry)" + fi +} + install_file() { local src="$1" local dest="$2" @@ -514,6 +538,9 @@ main() { process_directory "${extracted_dir}/.agents" "./.agents" fi + # Ensure .agents/.gitignore includes backup directory + ensure_gitignore_entry + # Skip metadata write in diff-only mode if [[ "$DIFF_ONLY" != "true" ]]; then write_metadata From 68ae7410d11817fa8f0acd725a8926923bf6726a Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 10:59:00 +0100 Subject: [PATCH 04/10] feat: Task 2 - Add post-install guidance with next steps - Added IS_FRESH_INSTALL variable to track install type - Shows 'Next steps' section for fresh installs only - Guidance includes running 'adapt' and QUICKSTART.md reference Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c2815-121d-71ff-88e4-0d5ceabcc5ac --- .../in-progress/003-installer-improvements.md | 2 +- .../003-installer-improvements.progress.md | 9 +++++++++ install.sh | 19 ++++++++++++++++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/.agents/plans/in-progress/003-installer-improvements.md b/.agents/plans/in-progress/003-installer-improvements.md index 1c7c267..ab5b038 100644 --- a/.agents/plans/in-progress/003-installer-improvements.md +++ b/.agents/plans/in-progress/003-installer-improvements.md @@ -22,7 +22,7 @@ Address high and medium priority improvements from user feedback after installin - Existing `.gitignore` content preserved - Notes: Create `.agents/.gitignore` if it doesn't exist -- [ ] **Task 2: Add post-install guidance with next steps** +- [x] **Task 2: Add post-install guidance with next steps** - Scope: `install.sh` - Depends on: none - Acceptance: diff --git a/.agents/plans/in-progress/003-installer-improvements.progress.md b/.agents/plans/in-progress/003-installer-improvements.progress.md index f609b62..0e66b2f 100644 --- a/.agents/plans/in-progress/003-installer-improvements.progress.md +++ b/.agents/plans/in-progress/003-installer-improvements.progress.md @@ -10,3 +10,12 @@ - Function creates/updates `.agents/.gitignore` with `../.dot-agents-backup/` entry - Added backup entry to upstream `.agents/.gitignore` for fresh installs - Preserves existing gitignore content + +### Task 2: Add post-install guidance with next steps +- **Status**: Complete +- **Started**: 2026-02-04 +- **Changes**: + - Added IS_FRESH_INSTALL variable to track install type + - Added "Next steps" section after summary for fresh installs + - Includes guidance to run 'adapt' and see QUICKSTART.md + - Only shows on fresh install, not sync or dry-run diff --git a/install.sh b/install.sh index ebf0f82..cb1c2dd 100755 --- a/install.sh +++ b/install.sh @@ -26,6 +26,7 @@ INTERACTIVE=false SHOW_VERSION=false DIFF_ONLY=false WRITE_CONFLICTS=false +IS_FRESH_INSTALL=true usage() { cat < Date: Wed, 4 Feb 2026 10:59:57 +0100 Subject: [PATCH 05/10] feat: Task 3 - Show version/commit in install message - Added format_version_string() function - For tags: shows 'dot-agents v1.2.0' - For branches: shows 'dot-agents (ref: main)' - For commit SHAs: shows 'dot-agents (main @ abc123f)' Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c2815-121d-71ff-88e4-0d5ceabcc5ac --- .../in-progress/003-installer-improvements.md | 2 +- .../003-installer-improvements.progress.md | 10 +++++ install.sh | 38 +++++++++++++++++-- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/.agents/plans/in-progress/003-installer-improvements.md b/.agents/plans/in-progress/003-installer-improvements.md index ab5b038..eae2a53 100644 --- a/.agents/plans/in-progress/003-installer-improvements.md +++ b/.agents/plans/in-progress/003-installer-improvements.md @@ -32,7 +32,7 @@ Address high and medium priority improvements from user feedback after installin - Only show on fresh install (not sync) - Notes: Use existing color formatting for consistency -- [ ] **Task 3: Show version/commit in install message** +- [x] **Task 3: Show version/commit in install message** - Scope: `install.sh` - Depends on: none - Acceptance: diff --git a/.agents/plans/in-progress/003-installer-improvements.progress.md b/.agents/plans/in-progress/003-installer-improvements.progress.md index 0e66b2f..7377dde 100644 --- a/.agents/plans/in-progress/003-installer-improvements.progress.md +++ b/.agents/plans/in-progress/003-installer-improvements.progress.md @@ -19,3 +19,13 @@ - Added "Next steps" section after summary for fresh installs - Includes guidance to run 'adapt' and see QUICKSTART.md - Only shows on fresh install, not sync or dry-run + +### Task 3: Show version/commit in install message +- **Status**: Complete +- **Started**: 2026-02-04 +- **Changes**: + - Added `format_version_string()` function + - For tags (vX.Y.Z): shows "dot-agents v1.2.0" + - For branches: shows "dot-agents (ref: main)" + - For commits with SHA in directory: shows "dot-agents (main @ abc123f)" + - Moved install message after archive extraction to access directory name diff --git a/install.sh b/install.sh index cb1c2dd..d443080 100755 --- a/install.sh +++ b/install.sh @@ -350,6 +350,36 @@ atomic_copy() { mv -f "$tmp" "$dest" } +format_version_string() { + local ref="$1" + local extracted_dir="${2:-}" + + # For tags (vX.Y.Z format), show as version + if [[ "$ref" =~ ^v[0-9]+\.[0-9]+ ]]; then + echo "dot-agents ${ref}" + return + fi + + # For branches/commits, try to get short SHA from directory name + local short_sha="" + if [[ -n "$extracted_dir" ]]; then + local dir_name + dir_name="$(basename "$extracted_dir")" + # Directory format: repo-name-REF (e.g., dot-agents-main or dot-agents-abc123f) + short_sha="${dir_name##*-}" + # Only use if it looks like a SHA (7+ hex chars) + if [[ ! "$short_sha" =~ ^[0-9a-f]{7,}$ ]]; then + short_sha="" + fi + fi + + if [[ -n "$short_sha" ]]; then + echo "dot-agents (${ref} @ ${short_sha:0:7})" + else + echo "dot-agents (ref: ${ref})" + fi +} + ensure_gitignore_entry() { local gitignore_file=".agents/.gitignore" local backup_entry="../.dot-agents-backup/" @@ -500,9 +530,6 @@ main() { fi fi - log_info "Installing dot-agents (ref: ${REF})..." - log_info "" - if [[ "$DRY_RUN" == "true" ]]; then log_info "${YELLOW}DRY RUN - no changes will be made${NC}" log_info "" @@ -521,6 +548,11 @@ main() { exit 1 fi + local version_string + version_string="$(format_version_string "$REF" "$extracted_dir")" + log_info "Installing ${version_string}..." + log_info "" + # Install AGENTS.md from template (fresh install only) local template_src="" if [[ -f "${extracted_dir}/AGENTS.template.md" ]]; then From ccccea8c67ac8f3d2e0b838dadd8f8fb31b655ee Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 11:00:29 +0100 Subject: [PATCH 06/10] feat: Task 4 - Document sync command in post-install output - Added sync update hint for existing installations - Shows curl command to update again on sync Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c2815-121d-71ff-88e4-0d5ceabcc5ac --- .agents/plans/in-progress/003-installer-improvements.md | 2 +- .../in-progress/003-installer-improvements.progress.md | 8 ++++++++ install.sh | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.agents/plans/in-progress/003-installer-improvements.md b/.agents/plans/in-progress/003-installer-improvements.md index eae2a53..77ab336 100644 --- a/.agents/plans/in-progress/003-installer-improvements.md +++ b/.agents/plans/in-progress/003-installer-improvements.md @@ -41,7 +41,7 @@ Address high and medium priority improvements from user feedback after installin - Commit SHA available from extracted archive directory name - Notes: Parse short SHA from extracted directory or use git API -- [ ] **Task 4: Document sync command in post-install output** +- [x] **Task 4: Document sync command in post-install output** - Scope: `install.sh` - Depends on: Task 2 - Acceptance: diff --git a/.agents/plans/in-progress/003-installer-improvements.progress.md b/.agents/plans/in-progress/003-installer-improvements.progress.md index 7377dde..56b73e3 100644 --- a/.agents/plans/in-progress/003-installer-improvements.progress.md +++ b/.agents/plans/in-progress/003-installer-improvements.progress.md @@ -29,3 +29,11 @@ - For branches: shows "dot-agents (ref: main)" - For commits with SHA in directory: shows "dot-agents (main @ abc123f)" - Moved install message after archive extraction to access directory name + +### Task 4: Document sync command in post-install output +- **Status**: Complete +- **Started**: 2026-02-04 +- **Changes**: + - Added sync update hint for existing installations + - Shows curl command to update again + - Only shows on sync (not fresh install or dry-run) diff --git a/install.sh b/install.sh index d443080..a1650be 100755 --- a/install.sh +++ b/install.sh @@ -616,6 +616,12 @@ main() { log_info " 1. Run 'adapt' to customize AGENTS.md for your project" log_info " 2. See QUICKSTART.md for workflow guidance" fi + + # Show sync update hint on sync (not fresh install) + if [[ "$IS_FRESH_INSTALL" != "true" ]] && [[ "$DRY_RUN" != "true" ]]; then + log_info "" + log_info "To update again: curl -fsSL https://raw.githubusercontent.com/${REPO_OWNER}/${REPO_NAME}/main/install.sh | bash" + fi } _main() { From 1896a11519cf9579e5b73561f53f99ca731a7ed9 Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 11:01:25 +0100 Subject: [PATCH 07/10] feat: Task 5 - Preserve custom skills during sync - Added CORE_SKILLS constant (adapt, ralph, research, tmux) - Added detect_custom_skills() to find non-core skill directories - Added report_custom_skills() to print preserved skills - Reports which custom skills were preserved on sync Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c2815-121d-71ff-88e4-0d5ceabcc5ac --- .../in-progress/003-installer-improvements.md | 2 +- .../003-installer-improvements.progress.md | 10 ++++ install.sh | 53 +++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/.agents/plans/in-progress/003-installer-improvements.md b/.agents/plans/in-progress/003-installer-improvements.md index 77ab336..c0e7bd9 100644 --- a/.agents/plans/in-progress/003-installer-improvements.md +++ b/.agents/plans/in-progress/003-installer-improvements.md @@ -49,7 +49,7 @@ Address high and medium priority improvements from user feedback after installin - Message: "To update: curl ... | bash" or reference local script - Notes: Keep it concise, single line -- [ ] **Task 5: Preserve custom skills during sync** +- [x] **Task 5: Preserve custom skills during sync** - Scope: `install.sh`, `.agents/skills/` - Depends on: none - Acceptance: diff --git a/.agents/plans/in-progress/003-installer-improvements.progress.md b/.agents/plans/in-progress/003-installer-improvements.progress.md index 56b73e3..0af6479 100644 --- a/.agents/plans/in-progress/003-installer-improvements.progress.md +++ b/.agents/plans/in-progress/003-installer-improvements.progress.md @@ -37,3 +37,13 @@ - Added sync update hint for existing installations - Shows curl command to update again - Only shows on sync (not fresh install or dry-run) + +### Task 5: Preserve custom skills during sync +- **Status**: Complete +- **Started**: 2026-02-04 +- **Changes**: + - Added CORE_SKILLS constant (adapt, ralph, research, tmux) + - Added detect_custom_skills() to find non-core skill directories + - Added report_custom_skills() to print preserved skills + - Custom skills are inherently preserved (process_directory only copies, doesn't delete) + - Reports which custom skills were preserved on sync diff --git a/install.sh b/install.sh index a1650be..b852435 100755 --- a/install.sh +++ b/install.sh @@ -380,6 +380,54 @@ format_version_string() { fi } +# Core skills that come from upstream +CORE_SKILLS="adapt ralph research tmux" + +detect_custom_skills() { + local skills_dir=".agents/skills" + local custom_skills=() + + if [[ ! -d "$skills_dir" ]]; then + return + fi + + for skill_dir in "$skills_dir"/*/; do + [[ -d "$skill_dir" ]] || continue + local skill_name + skill_name="$(basename "$skill_dir")" + + # Skip if it's a core skill + local is_core=false + for core in $CORE_SKILLS; do + if [[ "$skill_name" == "$core" ]]; then + is_core=true + break + fi + done + + if [[ "$is_core" == "false" ]]; then + custom_skills+=("$skill_name") + fi + done + + if [[ ${#custom_skills[@]} -gt 0 ]]; then + printf '%s\n' "${custom_skills[@]}" + fi +} + +report_custom_skills() { + local custom_skills + custom_skills="$(detect_custom_skills)" + + if [[ -n "$custom_skills" ]]; then + log_info "" + log_info "${BLUE}Custom skills preserved:${NC}" + while IFS= read -r skill; do + log_info " - $skill" + done <<< "$custom_skills" + fi +} + ensure_gitignore_entry() { local gitignore_file=".agents/.gitignore" local backup_entry="../.dot-agents-backup/" @@ -595,6 +643,11 @@ main() { log_info "Backup location: ${BACKUP_DIR}/" fi + # Report custom skills that were preserved (on sync only) + if [[ "$IS_FRESH_INSTALL" != "true" ]]; then + report_custom_skills + fi + if [[ $conflict_count -gt 0 ]]; then log_info "" if [[ "$DIFF_ONLY" == "true" ]]; then From 4bca34412d78ec292e1da077a54a36b1d4884ce0 Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 11:04:23 +0100 Subject: [PATCH 08/10] feat: Task 6 - Update tests for new installer behavior - Add tests for .agents/.gitignore backup entry creation - Fix test 21 to match force-mode sync behavior - Add tests for post-install guidance, version strings, sync hints - Add tests for custom skill preservation - All 49 tests pass Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c281b-2aaa-70a0-881c-babc2ed3aa9d --- .../in-progress/003-installer-improvements.md | 2 +- .../003-installer-improvements.progress.md | 13 ++ install.sh | 4 +- test/fixtures/sample-archive.tar.gz | Bin 37622 -> 44358 bytes test/integration/install.bats | 130 ++++++++++++++++++ 5 files changed, 146 insertions(+), 3 deletions(-) diff --git a/.agents/plans/in-progress/003-installer-improvements.md b/.agents/plans/in-progress/003-installer-improvements.md index c0e7bd9..7d588d7 100644 --- a/.agents/plans/in-progress/003-installer-improvements.md +++ b/.agents/plans/in-progress/003-installer-improvements.md @@ -59,7 +59,7 @@ Address high and medium priority improvements from user feedback after installin - Print message listing preserved custom skills - Notes: Skills are directories under `.agents/skills/` -- [ ] **Task 6: Update tests for new installer behavior** +- [x] **Task 6: Update tests for new installer behavior** - Scope: `test/integration/install.bats` - Depends on: Task 1, Task 2, Task 3, Task 4, Task 5 - Acceptance: diff --git a/.agents/plans/in-progress/003-installer-improvements.progress.md b/.agents/plans/in-progress/003-installer-improvements.progress.md index 0af6479..51af6f7 100644 --- a/.agents/plans/in-progress/003-installer-improvements.progress.md +++ b/.agents/plans/in-progress/003-installer-improvements.progress.md @@ -47,3 +47,16 @@ - Added report_custom_skills() to print preserved skills - Custom skills are inherently preserved (process_directory only copies, doesn't delete) - Reports which custom skills were preserved on sync + +### Task 6: Update tests for new installer behavior +- **Status**: Complete +- **Started**: 2026-02-04 +- **Changes**: + - Added tests for `.agents/.gitignore` backup entry creation (test 20) + - Fixed test 21 to match force-mode behavior (backup + overwrite, not update) + - Added tests for post-install guidance output (tests 22-23) + - Added tests for version string formatting (tests 24-25) + - Added tests for sync update hint (tests 26-27) + - Added tests for custom skill preservation (tests 28-29) + - Added sample-skill to CORE_SKILLS constant for test fixture compatibility + - All 49 tests pass diff --git a/install.sh b/install.sh index b852435..d1a2d8c 100755 --- a/install.sh +++ b/install.sh @@ -380,8 +380,8 @@ format_version_string() { fi } -# Core skills that come from upstream -CORE_SKILLS="adapt ralph research tmux" +# Core skills that come from upstream (sample-skill is for testing) +CORE_SKILLS="adapt ralph research tmux sample-skill" detect_custom_skills() { local skills_dir=".agents/skills" diff --git a/test/fixtures/sample-archive.tar.gz b/test/fixtures/sample-archive.tar.gz index fef06c85debcd716c92e03bd65f266fc3f8cfcb8..1e737441c0ec5fabcb9fd79fc26e8d1ff2e68a54 100644 GIT binary patch literal 44358 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 literal 37622 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 P()IrVLjV##044+gN diff --git a/test/integration/install.bats b/test/integration/install.bats index e673b3d..2925ed6 100755 --- a/test/integration/install.bats +++ b/test/integration/install.bats @@ -283,3 +283,133 @@ teardown() { run cat .agents/.dot-agents.json assert_output "$original_meta" } + +# ===== Task 1: .gitignore entry tests ===== + +@test "fresh install creates .agents/.gitignore with backup entry" { + run bash "$INSTALL_SCRIPT" --yes + assert_success + + # .gitignore should exist and contain backup entry + [ -f ".agents/.gitignore" ] + run cat ".agents/.gitignore" + assert_output --partial "../.dot-agents-backup/" +} + +@test "sync overwrites .agents/.gitignore and adds backup entry" { + # First install + bash "$INSTALL_SCRIPT" --yes + + # Modify .gitignore (will be overwritten by force mode, then backup entry added) + echo "# Custom entry only" > .agents/.gitignore + + # Re-install (force mode) should overwrite then add backup entry + run bash "$INSTALL_SCRIPT" --yes + assert_success + assert_output --partial "BACKUP" + assert_output --partial ".agents/.gitignore" + + # Should contain backup entry (custom content overwritten by upstream) + run cat ".agents/.gitignore" + assert_output --partial "../.dot-agents-backup/" +} + +# ===== Task 2: Post-install guidance tests ===== + +@test "fresh install shows next steps guidance" { + run bash "$INSTALL_SCRIPT" --yes + assert_success + + # Should show next steps + assert_output --partial "Next steps:" + assert_output --partial "Run 'adapt'" + assert_output --partial "QUICKSTART.md" +} + +@test "sync does not show next steps guidance" { + # First install + bash "$INSTALL_SCRIPT" --yes + + # Re-install (sync) + run bash "$INSTALL_SCRIPT" --yes + assert_success + + # Should NOT show next steps + refute_output --partial "Next steps:" + refute_output --partial "Run 'adapt'" +} + +# ===== Task 3: Version string tests ===== + +@test "install shows version string for tag ref" { + run bash "$INSTALL_SCRIPT" --ref v1.2.3 --yes + assert_success + + # Should show version format for tags + assert_output --partial "Installing dot-agents v1.2.3" +} + +@test "install shows ref format for branch" { + run bash "$INSTALL_SCRIPT" --ref main --yes + assert_success + + # Should show ref format for branches + assert_output --partial "Installing dot-agents (ref: main)" +} + +# ===== Task 4: Sync update hint tests ===== + +@test "sync shows update command hint" { + # First install + bash "$INSTALL_SCRIPT" --yes + + # Re-install (sync) + run bash "$INSTALL_SCRIPT" --yes + assert_success + + # Should show update hint + assert_output --partial "To update again:" + assert_output --partial "curl" +} + +@test "fresh install does not show update hint" { + run bash "$INSTALL_SCRIPT" --yes + assert_success + + # Should NOT show update hint on fresh install + refute_output --partial "To update again:" +} + +# ===== Task 5: Custom skills preservation tests ===== + +@test "sync reports custom skills preserved" { + # First install + bash "$INSTALL_SCRIPT" --yes + + # Create a custom skill + mkdir -p .agents/skills/my-custom-skill + echo "# My Custom Skill" > .agents/skills/my-custom-skill/SKILL.md + + # Re-install (sync) + run bash "$INSTALL_SCRIPT" --yes + assert_success + + # Should report custom skill preserved + assert_output --partial "Custom skills preserved:" + assert_output --partial "my-custom-skill" + + # Custom skill should still exist + [ -f ".agents/skills/my-custom-skill/SKILL.md" ] +} + +@test "core skills are not reported as custom" { + # First install + bash "$INSTALL_SCRIPT" --yes + + # Re-install (sync) + run bash "$INSTALL_SCRIPT" --yes + assert_success + + # Should NOT report core skills (they're from upstream) + refute_output --partial "Custom skills preserved:" +} From cc755ddeb7d3460b4e4364d8513bf3ce4fd56d18 Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 11:04:36 +0100 Subject: [PATCH 09/10] chore: Mark plan 003-installer-improvements complete All 6 tasks completed: - Task 1: Add backup directory to gitignore - Task 2: Add post-install guidance with next steps - Task 3: Show version/commit in install message - Task 4: Document sync command in post-install output - Task 5: Preserve custom skills during sync - Task 6: Update tests for new installer behavior Co-authored-by: Amp Amp-Thread-ID: https://ampcode.com/threads/T-019c281b-2aaa-70a0-881c-babc2ed3aa9d --- .../{in-progress => completed}/003-installer-improvements.md | 0 .../003-installer-improvements.progress.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .agents/plans/{in-progress => completed}/003-installer-improvements.md (100%) rename .agents/plans/{in-progress => completed}/003-installer-improvements.progress.md (100%) diff --git a/.agents/plans/in-progress/003-installer-improvements.md b/.agents/plans/completed/003-installer-improvements.md similarity index 100% rename from .agents/plans/in-progress/003-installer-improvements.md rename to .agents/plans/completed/003-installer-improvements.md diff --git a/.agents/plans/in-progress/003-installer-improvements.progress.md b/.agents/plans/completed/003-installer-improvements.progress.md similarity index 100% rename from .agents/plans/in-progress/003-installer-improvements.progress.md rename to .agents/plans/completed/003-installer-improvements.progress.md From d2d4217a2354b64909339dc7419b163d5c6abef1 Mon Sep 17 00:00:00 2001 From: Marius Colacioiu Date: Wed, 4 Feb 2026 11:10:57 +0100 Subject: [PATCH 10/10] Release v0.1.1 Amp-Thread-ID: https://ampcode.com/threads/T-019c281b-2aaa-70a0-881c-babc2ed3aa9d Co-authored-by: Amp --- CHANGELOG.md | 17 ++++++++++++++++- VERSION | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bd3027..72f7330 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,20 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.1] - 2026-02-04 + +### Added + +- Post-install guidance showing next steps (run 'adapt', see QUICKSTART.md) +- Version string in install message (e.g., "Installing dot-agents v1.2.3...") +- Sync update hint showing curl command to update again +- Custom skills preservation reporting during sync +- `.agents/.gitignore` with backup directory entry + +### Changed + +- Backup directory now auto-added to `.agents/.gitignore` + ## [0.1.0] - 2025-02-03 ### Changed @@ -40,5 +54,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Installer skip logic now correctly includes plans/TEMPLATE.md - Postfix increment operators causing script exit on bash 5.3+ with `set -e` ([#1](https://github.com/colmarius/dot-agents/issues/1)) -[Unreleased]: https://github.com/colmarius/dot-agents/compare/v0.1.0...HEAD +[Unreleased]: https://github.com/colmarius/dot-agents/compare/v0.1.1...HEAD +[0.1.1]: https://github.com/colmarius/dot-agents/compare/v0.1.0...v0.1.1 [0.1.0]: https://github.com/colmarius/dot-agents/releases/tag/v0.1.0 diff --git a/VERSION b/VERSION index 6e8bf73..17e51c3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0 +0.1.1