--- name: init-deps-install description: Automatically triggered when Tapestry is first launched on a new environment or lacks dependencies. Intelligently detects environment and installs Tapestry dependencies with user confirmation. argument-hint: [project-path-or-empty] auto-trigger: true trigger-condition: missing-dependencies --- # 📦 Tapestry Init Deps Install **Automatic Dependency Installation with Environment Detection** This skill is automatically triggered when Tapestry is first launched on a new environment or when dependencies are missing. It detects the user's Python environment (venv, conda, system Python, etc.) and provides a comprehensive installation plan for all project dependencies, including both Python packages and system-level tools. ## When This Skill is Triggered This skill is automatically invoked when: - Tapestry is first launched on a new environment (one-time auto-trigger) - Required dependencies are missing or cannot be imported - The user explicitly asks to "install dependencies" or "set up the project" - After creating a new project that requires dependencies **Important**: The automatic trigger only occurs the first time Tapestry runs in a new environment. After successful initialization, the skill will not auto-trigger on subsequent runs to avoid wasting tokens. Manual invocation is always available if needed. ## How This Skill Works 1. **Configuration Setup**: Checks for user configuration and creates it if missing: - Detects if `tapestry.config.json` exists - If not, copies from `tapestry.config.example.json` - Determines the real project root path - Updates `paths.project_root` in the config with the actual path 2. **Environment Detection**: Analyzes the current environment to determine: - Python version and location - Virtual environment status (venv, virtualenv, conda) - Package manager availability (pip, conda, poetry, uv) - Existing installed packages 3. **Dependency Analysis**: Scans for dependency files: - `pyproject.toml` (preferred) - `requirements.txt` - `setup.py` - `environment.yml` (conda) 4. **Plan Generation**: Creates a comprehensive installation plan including: - Configuration file setup (if needed) - Python package installation commands - System-level dependencies (e.g., `playwright install chromium`) - Optional dependencies and recommendations - Environment-specific considerations 5. **User Confirmation**: Presents the plan and asks for approval before executing 6. **Installation**: Executes the approved plan and reports results ## Usage This skill is automatically triggered when dependencies are missing. It can also be manually invoked: ```bash # Manually trigger from the project root /init-deps-install # Or specify a project path /init-deps-install /path/to/project ``` ## Implementation When this skill is invoked: 1. **Check and setup configuration** if needed 2. **Detect the environment** by running the detection script 3. **Analyze dependencies** from project files 4. **Generate an installation plan** with clear steps 5. **Present the plan** to the user with AskUserQuestion 6. **Execute approved steps** and report results ### Step 0: Configuration Setup Before installing dependencies, check if this is the first run: ```bash # Check if already initialized python init-deps-install/_scripts/check_initialized.py # Exit code 0 = already initialized, 1 = needs initialization # If not initialized, setup configuration python init-deps-install/_scripts/setup_config.py [project-root] ``` The setup script will: 1. Check if `tapestry.config.json` exists 2. If not, copy from `tapestry.config.example.json` 3. Determine the project root path (argument or CWD) 4. Update `paths.project_root` in the config **Project Root Detection:** - If invoked with an argument, use that path as project root - Otherwise, use the current working directory - Convert to absolute path - Update the `paths.project_root` field in `tapestry.config.json` **Example Output:** ```json { "config_existed": false, "config_path": "/path/to/skills/tapestry/config/tapestry.config.json", "project_root": "/home/user/my-tapestry-project", "created": true, "updated": true } ``` **Initialization Marker:** After successful setup and installation, create a marker file: ```bash # Create .tapestry_initialized marker python init-deps-install/_scripts/mark_initialized.py ``` This marker file indicates that Tapestry has been successfully initialized and prevents the skill from auto-triggering on future runs, saving tokens. ### Step 1: Environment Detection Run the environment detection script: ```bash python init-deps-install/_scripts/detect_env.py ``` This outputs JSON with: - `python_version`: Python version string - `python_path`: Path to Python executable - `env_type`: "venv", "conda", "system", or "unknown" - `env_name`: Name of the environment (if applicable) - `env_path`: Path to the environment (if applicable) - `package_manager`: "pip", "conda", "poetry", "uv", or "pip" (default) - `installed_packages`: List of currently installed packages ### Step 2: Dependency Analysis Read and parse dependency files in order of preference: 1. `pyproject.toml` - Parse `[project.dependencies]` and `[project.optional-dependencies]` 2. `requirements.txt` - Parse line by line 3. `setup.py` - Look for `install_requires` Identify: - Core dependencies (required) - Optional dependencies (browser support, dev tools, etc.) - Post-install commands (e.g., `playwright install chromium`) ### Step 3: Generate Installation Plan Create a structured plan with: **Environment Summary:** - Current Python version and path - Environment type and name - Package manager to use **Installation Steps:** 1. Core dependencies installation command 2. Optional dependencies (with recommendations) 3. Post-install commands (system-level tools) 4. Verification steps **Example Plan:** ``` Configuration: ✓ Created tapestry.config.json from example ✓ Set project_root to: /home/user/my-project Environment: Python 3.11.5 in conda environment 'myenv' Package Manager: conda (with pip fallback) Installation Steps: 1. Install core dependencies: conda install httpx pydantic selectolax readability-lxml chardet 2. Install browser support (recommended for JavaScript-heavy sites): pip install playwright>=1.40.0 playwright install chromium 3. [Optional] Install development tools: pip install pytest pytest-asyncio pytest-cov black ruff mypy ``` ### Step 4: User Confirmation Use `AskUserQuestion` to present the plan: ```json { "questions": [{ "question": "I've detected your environment and prepared an installation plan. Would you like to proceed?", "header": "Install", "multiSelect": false, "options": [ { "label": "Install all (recommended)", "description": "Install core dependencies, browser support, and post-install tools" }, { "label": "Core only", "description": "Install only required dependencies, skip optional packages" }, { "label": "Custom selection", "description": "Let me choose which components to install" } ] }] } ``` If user selects "Custom selection", present a second multi-select question with individual components. ### Step 5: Execute Installation Based on user selection, execute the appropriate commands: ```bash # Example for pip in venv pip install -e . # If pyproject.toml exists # OR pip install -r requirements.txt # Post-install commands playwright install chromium ``` Monitor output and report: - ✅ Successfully installed packages - ⚠️ Warnings or issues - ❌ Failed installations with error messages ### Step 6: Verification After installation, verify: ```bash python init-deps-install/_scripts/verify_install.py ``` This checks: - All required packages are importable - Versions meet requirements - System tools are available (e.g., chromium for playwright) Report verification results to the user. ## Error Handling Common issues and solutions: **Issue**: No package manager detected **Solution**: Recommend installing pip or conda **Issue**: Permission denied **Solution**: Suggest using virtual environment or `--user` flag **Issue**: Conflicting dependencies **Solution**: Show conflict details and suggest resolution strategies **Issue**: Network errors **Solution**: Suggest checking internet connection or using mirrors ## Important Notes - **Never install without confirmation**: Always present the plan first - **Respect user environment**: Don't modify system Python without explicit permission - **Handle failures gracefully**: If one package fails, continue with others and report at the end - **Provide context**: Explain why certain dependencies are needed - **Support multiple package managers**: Detect and use the appropriate tool for the environment ## Directory Structure ``` skills/tapestry/init-deps-install/ ├── SKILL.md # This file ├── README.md # Developer documentation ├── _scripts/ │ ├── check_initialized.py # Check if Tapestry is initialized │ ├── setup_config.py # Configuration setup from example │ ├── mark_initialized.py # Create initialization marker │ ├── detect_env.py # Environment detection │ ├── parse_deps.py # Dependency parsing utilities │ ├── verify_install.py # Post-install verification │ └── install_deps.py # Installation orchestrator └── _specs/ └── env_detection.md # Environment detection specification ``` ## Example Workflows ### Workflow 1: Fresh Project Setup ``` User: "Set up this project" Actions: 1. Check for tapestry.config.json, create from example if missing 2. Detect project root and update config 3. Detect environment (conda with Python 3.11) 4. Find pyproject.toml with dependencies 5. Generate plan: - Configuration setup - pip install -e . - playwright install chromium 6. Ask user for confirmation 7. Execute approved steps 8. Verify installation 9. Create .tapestry_initialized marker 10. Report: "✅ Installed 8 packages successfully. Project ready!" ``` ### Workflow 2: Missing Dependencies ``` User: "Install the missing dependencies" Actions: 1. Detect environment (venv with Python 3.10) 2. Compare installed vs required packages 3. Generate plan for missing packages only 4. Ask user for confirmation 5. Execute: pip install 6. Verify installation 7. Report: "✅ Installed 3 missing packages" ``` ### Workflow 3: System Python (Risky) ``` User: "Install dependencies" Actions: 1. Detect environment (system Python, no venv) 2. Generate plan with WARNING 3. Ask user: "⚠️ You're using system Python. Recommend creating a virtual environment first. Proceed anyway?" 4. If user confirms, install with --user flag 5. Report results with reminder to use venv ``` --- **Key Principle**: Be transparent about what will be installed and why. Never surprise the user with unexpected system modifications.