- Transform tufte-press from reference guide to conversation-aware generator - Add JSON generation from conversation context following strict schema - Create build automation scripts with Nix environment handling - Integrate CUPS printing with duplex support - Add comprehensive workflow documentation Scripts added: - skills/tufte-press/scripts/generate-and-build.sh (242 lines) - skills/tufte-press/scripts/build-card.sh (23 lines) Documentation: - Updated SKILL.md with complete workflow instructions (370 lines) - Updated README.md with usage examples (340 lines) - Created SKILL-DEVELOPMENT-STRATEGY-tufte-press.md (450 lines) - Added worklog: 2025-11-10-tufte-press-skill-evolution.org Features: - Agent generates valid JSON from conversation - Schema validation before build (catches errors early) - Automatic Nix shell entry for dependencies - PDF build via tufte-press toolchain - Optional print with duplex support - Self-contained margin notes enforced - Complete end-to-end testing Workflow: Conversation → JSON → Validate → Build → Print Related: niri-window-capture, screenshot-latest, worklog skills
369 lines
8.1 KiB
Markdown
369 lines
8.1 KiB
Markdown
# Quickstart: Screenshot Analysis Skill
|
|
|
|
**Feature**: 001-screenshot-analysis
|
|
**Target**: Developers implementing or testing the screenshot analysis skill
|
|
|
|
## Goal
|
|
|
|
Get the screenshot analysis skill running in under 5 minutes for local development and testing.
|
|
|
|
---
|
|
|
|
## Prerequisites
|
|
|
|
**Required**:
|
|
- Bash 4.0 or later
|
|
- GNU coreutils (find, stat, sort, test)
|
|
- jq (JSON processor)
|
|
|
|
**Optional** (for testing):
|
|
- bats-core (bash testing framework)
|
|
- Sample screenshot files
|
|
|
|
**Check Prerequisites**:
|
|
```bash
|
|
# Check bash version (need 4.0+)
|
|
bash --version | head -1
|
|
|
|
# Check jq availability
|
|
jq --version
|
|
|
|
# Check bats (optional, for testing)
|
|
bats --version
|
|
```
|
|
|
|
**Install Missing Tools**:
|
|
```bash
|
|
# Ubuntu/Debian
|
|
sudo apt install jq bats
|
|
|
|
# Fedora
|
|
sudo dnf install jq bats
|
|
|
|
# NixOS (add to environment.systemPackages or use nix-shell)
|
|
nix-shell -p jq bats
|
|
```
|
|
|
|
---
|
|
|
|
## Quick Setup
|
|
|
|
### Step 1: Create Skill Directory Structure
|
|
|
|
```bash
|
|
# From repository root
|
|
cd skills
|
|
mkdir -p screenshot-analysis/{scripts,templates,examples}
|
|
cd screenshot-analysis
|
|
```
|
|
|
|
### Step 2: Create Helper Scripts
|
|
|
|
Create the four core scripts from the [script interface contract](./contracts/script-interface.md):
|
|
|
|
**File**: `scripts/find-latest-screenshot.sh`
|
|
```bash
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
DIR="${1:-$($(dirname "$0")/load-config.sh)}"
|
|
|
|
[[ -d "$DIR" ]] || { echo "Error: Directory not found: $DIR" >&2; exit 1; }
|
|
[[ -r "$DIR" ]] || { echo "Error: Directory not readable: $DIR" >&2; exit 1; }
|
|
|
|
find "$DIR" -maxdepth 1 -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" \) \
|
|
-exec stat -c '%Y %n' {} + 2>/dev/null | sort -rn -k1,1 -k2,2 | head -1 | cut -d' ' -f2-
|
|
```
|
|
|
|
**File**: `scripts/load-config.sh`
|
|
```bash
|
|
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
DEFAULT_DIR="$HOME/Pictures/Screenshots"
|
|
|
|
# Check for config files
|
|
for config in "$HOME/.config/opencode/skills/screenshot-analysis/config.json" \
|
|
"$HOME/.claude/skills/screenshot-analysis/config.json"; do
|
|
[[ -f "$config" ]] || continue
|
|
|
|
if command -v jq &>/dev/null; then
|
|
CUSTOM_DIR=$(jq -r '.screenshot_dir // empty' "$config" 2>/dev/null || true)
|
|
if [[ -n "$CUSTOM_DIR" ]]; then
|
|
echo "${CUSTOM_DIR/#\~/$HOME}"
|
|
exit 0
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo "$DEFAULT_DIR"
|
|
```
|
|
|
|
**Make scripts executable**:
|
|
```bash
|
|
chmod +x scripts/*.sh
|
|
```
|
|
|
|
### Step 3: Create SKILL.md
|
|
|
|
**File**: `SKILL.md`
|
|
```markdown
|
|
---
|
|
name: screenshot-analysis
|
|
description: Automatically find and analyze recent screenshots without typing file paths. Use when user requests screenshot analysis.
|
|
---
|
|
|
|
# Screenshot Analysis Skill
|
|
|
|
Automatically locates the most recent screenshot from ~/Pictures/Screenshots.
|
|
|
|
## When to Use
|
|
|
|
- "look at my last screenshot"
|
|
- "analyze my recent screenshot"
|
|
- "what's in my latest screenshot"
|
|
- "show me the previous screenshot"
|
|
|
|
## Process
|
|
|
|
1. Load screenshot directory:
|
|
```bash
|
|
SCREENSHOT_DIR=$(~/.claude/skills/screenshot-analysis/scripts/load-config.sh)
|
|
```
|
|
|
|
2. Find latest screenshot:
|
|
```bash
|
|
SCREENSHOT_PATH=$(~/.claude/skills/screenshot-analysis/scripts/find-latest-screenshot.sh "$SCREENSHOT_DIR")
|
|
```
|
|
|
|
3. Check if screenshot found:
|
|
```bash
|
|
if [[ -z "$SCREENSHOT_PATH" ]]; then
|
|
echo "No screenshots found in $SCREENSHOT_DIR"
|
|
exit 0
|
|
fi
|
|
```
|
|
|
|
4. Pass screenshot path to image analysis and display result.
|
|
|
|
## Requirements
|
|
|
|
- Bash environment with find, stat, sort
|
|
- jq for JSON config parsing
|
|
- Screenshots directory readable
|
|
```
|
|
|
|
### Step 4: Create Example Config
|
|
|
|
**File**: `templates/config.json`
|
|
```json
|
|
{
|
|
"screenshot_dir": "~/Pictures/Screenshots"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Testing
|
|
|
|
### Manual Test
|
|
|
|
```bash
|
|
# Create test directory with sample screenshots
|
|
mkdir -p ~/Pictures/Screenshots
|
|
touch ~/Pictures/Screenshots/test-{1,2,3}.png
|
|
|
|
# Test find-latest-screenshot.sh
|
|
./scripts/find-latest-screenshot.sh
|
|
|
|
# Expected output: Path to most recently created/modified file
|
|
# Example: /home/user/Pictures/Screenshots/test-3.png
|
|
```
|
|
|
|
### Unit Test (with bats)
|
|
|
|
**File**: `tests/skills/screenshot-analysis/unit/test-find-latest.bats`
|
|
```bash
|
|
#!/usr/bin/env bats
|
|
|
|
setup() {
|
|
TEST_DIR="$(mktemp -d)"
|
|
export TEST_DIR
|
|
|
|
# Create test screenshots
|
|
touch -t 202501010900 "$TEST_DIR/old.png"
|
|
touch -t 202501011200 "$TEST_DIR/latest.png"
|
|
}
|
|
|
|
teardown() {
|
|
rm -rf "$TEST_DIR"
|
|
}
|
|
|
|
@test "finds latest screenshot" {
|
|
result=$(./scripts/find-latest-screenshot.sh "$TEST_DIR")
|
|
[[ "$result" == "$TEST_DIR/latest.png" ]]
|
|
}
|
|
```
|
|
|
|
**Run tests**:
|
|
```bash
|
|
# From repository root
|
|
bats tests/skills/screenshot-analysis/unit/
|
|
```
|
|
|
|
---
|
|
|
|
## Integration with Agents
|
|
|
|
### Deploy to Claude Code
|
|
|
|
```bash
|
|
# Symlink for development
|
|
ln -s $(pwd)/skills/screenshot-analysis ~/.claude/skills/screenshot-analysis
|
|
|
|
# Or copy for testing
|
|
cp -r skills/screenshot-analysis ~/.claude/skills/screenshot-analysis
|
|
```
|
|
|
|
### Deploy to OpenCode
|
|
|
|
```bash
|
|
# Symlink for development
|
|
ln -s $(pwd)/skills/screenshot-analysis ~/.config/opencode/skills/screenshot-analysis
|
|
|
|
# Or copy for testing
|
|
cp -r skills/screenshot-analysis ~/.config/opencode/skills/screenshot-analysis
|
|
|
|
# Ensure opencode-skills plugin is enabled in ~/.config/opencode/config.json
|
|
```
|
|
|
|
### Test with Agent
|
|
|
|
**Claude Code / OpenCode**:
|
|
1. Take a screenshot (or create a test file in ~/Pictures/Screenshots)
|
|
2. Ask the agent: "look at my last screenshot"
|
|
3. Verify the agent finds and analyzes the file without asking for the path
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Scripts Not Executable
|
|
|
|
**Symptom**: `Permission denied` when running scripts
|
|
|
|
**Solution**:
|
|
```bash
|
|
chmod +x skills/screenshot-analysis/scripts/*.sh
|
|
```
|
|
|
|
---
|
|
|
|
### jq Not Found
|
|
|
|
**Symptom**: `Warning: jq not found, using default directory`
|
|
|
|
**Solution**: Install jq (see Prerequisites section) or accept default directory behavior
|
|
|
|
---
|
|
|
|
### No Screenshots Found
|
|
|
|
**Symptom**: Empty output from find-latest-screenshot.sh
|
|
|
|
**Check**:
|
|
```bash
|
|
# Verify directory exists
|
|
ls -la ~/Pictures/Screenshots
|
|
|
|
# Create test screenshot
|
|
touch ~/Pictures/Screenshots/test.png
|
|
|
|
# Retry script
|
|
./scripts/find-latest-screenshot.sh
|
|
```
|
|
|
|
---
|
|
|
|
### Symlinks Not Ignored
|
|
|
|
**Symptom**: Script returns symlinked files
|
|
|
|
**Debug**:
|
|
```bash
|
|
# Check if symlinks present
|
|
find ~/Pictures/Screenshots -type l
|
|
|
|
# Verify -type f flag in script
|
|
grep "type f" scripts/find-latest-screenshot.sh
|
|
```
|
|
|
|
**Expected**: Script uses `find -type f` which excludes symlinks
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
1. **Implement remaining scripts**:
|
|
- `find-nth-screenshot.sh` (P2 feature)
|
|
- `filter-by-time.sh` (P2 feature)
|
|
|
|
2. **Write comprehensive tests**:
|
|
- Edge cases (empty directory, permissions, symlinks)
|
|
- Performance tests (1000+ files)
|
|
|
|
3. **Create README.md**:
|
|
- User-facing documentation
|
|
- Installation instructions
|
|
- Usage examples
|
|
|
|
4. **Add examples**:
|
|
- Example agent interactions
|
|
- Screenshot of skill in action
|
|
|
|
---
|
|
|
|
## Development Workflow
|
|
|
|
**Branch Strategy**: Feature is developed on `001-screenshot-analysis` branch
|
|
|
|
**File Organization**:
|
|
```
|
|
specs/001-screenshot-analysis/ # Planning docs (you are here)
|
|
skills/screenshot-analysis/ # Implementation
|
|
tests/skills/screenshot-analysis/ # Tests
|
|
```
|
|
|
|
**Iterate**:
|
|
1. Update scripts based on testing
|
|
2. Run tests (`bats tests/skills/screenshot-analysis/unit/`)
|
|
3. Test with real agent
|
|
4. Commit incremental progress
|
|
|
|
---
|
|
|
|
## Reference Documentation
|
|
|
|
- [Specification](./spec.md) - Complete feature requirements
|
|
- [Implementation Plan](./plan.md) - Technical architecture
|
|
- [Research](./research.md) - Technology decisions
|
|
- [Data Model](./data-model.md) - Data structures
|
|
- [Script Interface Contract](./contracts/script-interface.md) - API specifications
|
|
|
|
---
|
|
|
|
## Success Criteria Checklist
|
|
|
|
- [ ] Scripts are executable and have proper shebang
|
|
- [ ] find-latest-screenshot.sh returns correct file
|
|
- [ ] Config loading works (with and without config file)
|
|
- [ ] Symlinks are excluded
|
|
- [ ] Timestamp tiebreaker works (lexicographic ordering)
|
|
- [ ] Error messages are clear and actionable
|
|
- [ ] Performance: <1s for 1000 files
|
|
- [ ] Unit tests pass (if bats available)
|
|
- [ ] Agent can invoke skill via natural language
|
|
- [ ] No file paths required from user
|
|
|
|
**When all checked**: Skill is ready for implementation phase (`/speckit.implement`)
|