Awesome-omni-skill project-context-discovery
Discover project structure, package managers, test frameworks, and automation without hardcoded assumptions
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/project-context-discovery" ~/.claude/skills/diegosouzapw-awesome-omni-skill-project-context-discovery && rm -rf "$T"
skills/development/project-context-discovery/SKILL.mdProject Context Discovery Skill
Provides expertise in discovering project characteristics through exploration rather than assumptions.
Purpose
This skill equips agents with strategies for:
- Identifying package managers and build systems
- Discovering test frameworks and commands
- Finding automation scripts and tooling
- Learning project conventions from configuration
When to Use
Use this skill when:
- Need to run tests but don't know the framework
- Setting up a new project environment
- Installing dependencies without hardcoded assumptions
- Discovering how CI/CD runs commands
Discovery Strategy
Phase 1: Project Structure Exploration
-
List root directory contents
ls -la -
Identify language(s) from file extensions
→ Ruby.rb
/.js
→ JavaScript/TypeScript.ts
→ Python.py
→ Go.go
→ Rust.rs- Multiple languages? Note all
-
Find configuration files
Look for package manager indicators:
+package.json
→ npmpackage-lock.json
+package.json
→ yarnyarn.lock
+package.json
→ pnpmpnpm-lock.yaml
+Gemfile
→ Bundler (Ruby)Gemfile.lock
+Cargo.toml
→ Cargo (Rust)Cargo.lock
+go.mod
→ Go modulesgo.sum
+pyproject.toml
→ Poetrypoetry.lock
→ piprequirements.txt
Phase 2: Test Framework Discovery
-
Check CI configuration first
CI config is the source of truth for what actually runs:
→ GitHub Actions.github/workflows/*.yml
→ GitLab CI.gitlab-ci.yml
→ CircleCI.circleci/config.yml
→ Travis CI.travis.yml
→ JenkinsJenkinsfile
→ Azure Pipelinesazure-pipelines.yml
-
Parse CI test commands
Look for
orrun:
sections with test commands Identify job names like: test, tests, unit-test, integration-test, ciscript: -
Check package manager configuration
→ checkpackage.json
fieldscripts.test
→ check for test-related gemsGemfile
→ check for test dependenciesCargo.toml
→ check test tool configurationpyproject.toml
-
Look for test directories
ls -d test/ tests/ spec/ __tests__/ 2>/dev/null -
Check for framework config files
Common test framework indicators:
,jest.config.js
→ JavaScript test frameworksvitest.config.js
,.rspec
→ RSpecspec/spec_helper.rb
,pytest.ini
→ pytest or minitesttest/test_helper.rb- Config in package.json, pyproject.toml, or setup.cfg
Phase 3: Automation Script Discovery
-
Check documented commands (prefer explicit over implicit)
→ look for "Testing", "Development", "Getting Started"README.md
→ look for contribution workflowCONTRIBUTING.md
→ look for test targetsMakefile
-
Check automation directories
ls bin/ scripts/ script/ .local/bin/ 2>/dev/null -
Check package manager scripts
- npm:
(lists all scripts)npm run - Bundler:
bundle exec rake -T - Make:
ormake helpmake -n
- npm:
Phase 4: Dependency Installation
Based on discovered package manager, use appropriate install command:
General strategy:
- Prefer lockfile-based installs (reproducible, CI-friendly)
- Use CI-optimized commands when available (
vsnpm ci
)npm install - Check for frozen-lockfile options to prevent unexpected updates
Example decision tree for Node.js:
if [ -f package-lock.json ]; then npm ci elif [ -f yarn.lock ]; then yarn install --frozen-lockfile elif [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile else npm install; fi
Other languages follow similar patterns:
- Ruby: Check for
→ useGemfile.lockbundle install - Python: Check for
orpoetry.lock
→ usepyproject.toml
orpoetry installpip install - Go: Check for
→ usego.sumgo mod download - Rust: Check for
→ useCargo.lockcargo build
Phase 5: Test Command Construction
Preference order (highest to lowest priority):
- Explicit documentation (README/CONTRIBUTING) - what humans are told to run
- CI configuration (source of truth) - what automation actually runs
- Package manager scripts (npm test, rake test) - defined shortcuts
- Framework defaults (only as fallback) - conventions when nothing explicit exists
Decision process:
If CI config defines test command → use that (it's what's actually running in production)
If package.json/Gemfile/etc has test script → use the defined script
If neither, infer from framework detection:
- JavaScript with Jest config → likely
npx jest - Ruby with RSpec directories → likely
bundle exec rspec - Python with pytest.ini → likely
pytest - Go with test files → likely
go test ./... - Rust with tests/ → likely
cargo test
Graceful Degradation
If discovery fails at any phase:
- Note what couldn't be determined
- Make best-effort guess with caveats
- Provide fallback options
- Report incomplete discovery to user
Never fail completely - always provide a path forward.
Example Usage
Agent using this skill: 1. Read project root directory 2. Identify languages: JavaScript (package.json found) 3. Check CI: .github/workflows/test.yml exists 4. Parse CI: runs "npm run test:unit && npm run test:integration" 5. Check package.json scripts: confirms test:unit and test:integration exist 6. Determine package manager: package-lock.json exists → npm 7. Discovery complete: - Language: JavaScript - Package manager: npm - Install command: npm ci (uses lockfile) - Test command: npm run test:unit && npm run test:integration (from CI) 8. Execute: npm ci && npm run test:unit && npm run test:integration
Key Principles
- Discover, don't assume: Never hardcode project-specific commands
- Prefer explicit over implicit: Use documented/configured commands over framework defaults
- CI is truth: What runs in CI is what the project actually uses
- Multiple indicators: Combine signals from configs, directories, and dependencies
- Priority order matters: Check sources in order of reliability (CI → docs → conventions)
- Graceful degradation: Provide best-effort fallbacks when discovery is incomplete