{"_id":"@dusan.djordjevic/sentinel","_rev":"4-efa54eeb1f868d67adf4436e8e697486","name":"@dusan.djordjevic/sentinel","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@dusan.djordjevic/sentinel","version":"1.0.0","keywords":["ci-cd","code-review","security","git-hooks","sentinel","claude","ai","code-guardian","pre-push","static-analysis","security-scanner","api-testing","claude-ai"],"author":{"name":"Dusan Djordjevic","email":"dusan.djordjevic@itc.rs"},"license":"MIT","_id":"@dusan.djordjevic/sentinel@1.0.0","maintainers":[{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"}],"homepage":"https://bitbucket.org/itc-solution/sentinel#readme","bugs":{"url":"https://bitbucket.org/itc-solution/sentinel/issues"},"bin":{"sentinel":"src/index.js"},"dist":{"shasum":"12830b22a9a86d8a7598987f04a45b0220934250","tarball":"https://registry.npmjs.org/@dusan.djordjevic/sentinel/-/sentinel-1.0.0.tgz","fileCount":25,"integrity":"sha512-8oMyUJtSwvFlZ7yuBMe3XWLuvALrICvbG7Oph62tWAVRg8GcVE6v25Du4ldOrcjSNY9bV3mqiijzoSVkuvm3dg==","signatures":[{"sig":"MEUCIQDpBl84lMlPi/xyVnMX5DvHwfnvZU3XuzZnBHb6AVbHlAIgGQQK2Lncv/Q8RKdjyMy11QrrhkckAmmlotCnw3/wHs8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129213},"main":"src/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"80519d1a4886f2122feae9ea43a73075c1862490","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node src/index.js"},"_npmUser":{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"},"repository":{"url":"git+https://bitbucket.org/itc-solution/sentinel.git","type":"git"},"_npmVersion":"10.9.2","description":"AI-powered code guardian using Claude for framework-agnostic code review, security analysis, and API testing","directories":{},"_nodeVersion":"23.11.1","dependencies":{"ora":"^8.0.1","diff":"^5.2.0","yaml":"^2.3.4","boxen":"^7.1.1","chalk":"^5.3.0","inquirer":"^9.2.0","commander":"^12.0.0","minimatch":"^10.0.1","cli-highlight":"^2.1.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sentinel_1.0.0_1763374309269_0.610578523590481","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@dusan.djordjevic/sentinel","version":"1.0.1","keywords":["ci-cd","code-review","security","git-hooks","sentinel","claude","ai","code-guardian","pre-push","static-analysis","security-scanner","api-testing","claude-ai"],"author":{"name":"Dusan Djordjevic","email":"dusan.djordjevic@itc.rs"},"license":"MIT","_id":"@dusan.djordjevic/sentinel@1.0.1","maintainers":[{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"}],"homepage":"https://bitbucket.org/itc-solution/sentinel#readme","bugs":{"url":"https://bitbucket.org/itc-solution/sentinel/issues"},"bin":{"sentinel":"src/index.js"},"dist":{"shasum":"50060870aa72d7a07fa746ab6c906d83aaf309fe","tarball":"https://registry.npmjs.org/@dusan.djordjevic/sentinel/-/sentinel-1.0.1.tgz","fileCount":25,"integrity":"sha512-nwTTxqhJMuy1GHDrmMF4mkxw08Mr9wHb+AxADGs7pPOG2a1h2v352KjwLvQ+ibjXv6i/PDwCgUdbtlx6j9j+zA==","signatures":[{"sig":"MEQCIAti823+elQcuygVAZJaHr2fTs/zxt1D7yC3Xp0FAB0hAiBzM7jKSAkQNzYSYXlXHtqxB28CFe9+Ww5obQDTCJRUuw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129507},"main":"src/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"457593f1298b1b7ef3d865089835481fff745933","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node src/index.js"},"_npmUser":{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"},"repository":{"url":"git+https://bitbucket.org/itc-solution/sentinel.git","type":"git"},"_npmVersion":"10.9.2","description":"AI-powered code guardian using Claude for framework-agnostic code review, security analysis, and API testing","directories":{},"_nodeVersion":"23.11.1","dependencies":{"ora":"^8.0.1","diff":"^5.2.0","yaml":"^2.3.4","boxen":"^7.1.1","chalk":"^5.3.0","inquirer":"^9.2.0","commander":"^12.0.0","minimatch":"^10.0.1","cli-highlight":"^2.1.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sentinel_1.0.1_1763379368932_0.7432711676289685","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@dusan.djordjevic/sentinel","version":"1.0.2","keywords":["ci-cd","code-review","security","git-hooks","sentinel","claude","ai","code-guardian","pre-push","static-analysis","security-scanner","api-testing","claude-ai"],"author":{"name":"Dusan Djordjevic","email":"dusan.djordjevic@itc.rs"},"license":"MIT","_id":"@dusan.djordjevic/sentinel@1.0.2","maintainers":[{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"}],"homepage":"https://bitbucket.org/itc-solution/sentinel#readme","bugs":{"url":"https://bitbucket.org/itc-solution/sentinel/issues"},"bin":{"sentinel":"src/index.js"},"dist":{"shasum":"71ad37f5a122d1f02fef7cc0f2c903ab312f2393","tarball":"https://registry.npmjs.org/@dusan.djordjevic/sentinel/-/sentinel-1.0.2.tgz","fileCount":25,"integrity":"sha512-N6p45QqwLV9r1pF1f33DNTNrgGCMM0KfwQ2/dHCcBrfB5PD4V+5MDBrXjNYH5vpGPZq48kgsyfRx6IGkbiDq5Q==","signatures":[{"sig":"MEUCIQCNoDIgBZFn9Qpjr+jcnT7hbF0Ux67P0xE6/SwUDAO/iAIgDnzOrcvXGxb7XnWdA8k8BZYStJXKe2pa2dOWLG/Y/Ds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129487},"main":"src/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"8e257e5a3ebc421abd280a6e82db751e4235f4f5","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node src/index.js"},"_npmUser":{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"},"repository":{"url":"git+https://bitbucket.org/itc-solution/sentinel.git","type":"git"},"_npmVersion":"10.9.2","description":"AI-powered code guardian using Claude for framework-agnostic code review, security analysis, and API testing","directories":{},"_nodeVersion":"23.11.1","dependencies":{"ora":"^8.0.1","diff":"^5.2.0","yaml":"^2.3.4","boxen":"^7.1.1","chalk":"^5.3.0","inquirer":"^9.2.0","commander":"^12.0.0","minimatch":"^10.0.1","cli-highlight":"^2.1.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/sentinel_1.0.2_1763380814561_0.5784590973950012","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@dusan.djordjevic/sentinel","version":"1.0.3","description":"AI-powered code guardian using Claude for framework-agnostic code review, security analysis, and API testing","main":"src/index.js","type":"module","bin":{"sentinel":"src/index.js"},"scripts":{"start":"node src/index.js","test":"echo \"Error: no test specified\" && exit 1"},"keywords":["ci-cd","code-review","security","git-hooks","sentinel","claude","ai","code-guardian","pre-push","static-analysis","security-scanner","api-testing","claude-ai"],"author":{"name":"Dusan Djordjevic","email":"dusan.djordjevic@itc.rs"},"license":"MIT","repository":{"type":"git","url":"git+https://bitbucket.org/itc-solution/sentinel.git"},"bugs":{"url":"https://bitbucket.org/itc-solution/sentinel/issues"},"homepage":"https://bitbucket.org/itc-solution/sentinel#readme","dependencies":{"commander":"^12.0.0","chalk":"^5.3.0","yaml":"^2.3.4","ora":"^8.0.1","minimatch":"^10.0.1","inquirer":"^9.2.0","diff":"^5.2.0","cli-highlight":"^2.1.11","boxen":"^7.1.1"},"engines":{"node":">=18.0.0"},"publishConfig":{"access":"public"},"_id":"@dusan.djordjevic/sentinel@1.0.3","gitHead":"1b6e6c3d7a35cba82e9f603716b87647e0d0b552","_nodeVersion":"23.11.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-0AHlM/kj7n7NwLSxwttJc5MPxbBRQVdnw3NsTR/yLSsii9uZwk41y/wGbz/9OyjBumCY77dudWGkKVaGEvaJmg==","shasum":"0eab95a0d0e8baa0a35dfcf8fefff18ae605b729","tarball":"https://registry.npmjs.org/@dusan.djordjevic/sentinel/-/sentinel-1.0.3.tgz","fileCount":25,"unpackedSize":129495,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG5mVrd98Vh5SSJw0mtNQn8lyGZPfg7qrnDlZsPUZ2skAiEAnOybA12Ht4vzaZBkLVR3lGu/r9l9qMLOJokS0iKZmKU="}]},"_npmUser":{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"},"directories":{},"maintainers":[{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sentinel_1.0.3_1763380997261_0.03525602202972533"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-17T10:11:49.139Z","modified":"2025-11-17T12:03:17.684Z","1.0.0":"2025-11-17T10:11:49.467Z","1.0.1":"2025-11-17T11:36:09.147Z","1.0.2":"2025-11-17T12:00:14.730Z","1.0.3":"2025-11-17T12:03:17.452Z"},"bugs":{"url":"https://bitbucket.org/itc-solution/sentinel/issues"},"author":{"name":"Dusan Djordjevic","email":"dusan.djordjevic@itc.rs"},"license":"MIT","homepage":"https://bitbucket.org/itc-solution/sentinel#readme","keywords":["ci-cd","code-review","security","git-hooks","sentinel","claude","ai","code-guardian","pre-push","static-analysis","security-scanner","api-testing","claude-ai"],"repository":{"type":"git","url":"git+https://bitbucket.org/itc-solution/sentinel.git"},"description":"AI-powered code guardian using Claude for framework-agnostic code review, security analysis, and API testing","maintainers":[{"name":"dusan.djordjevic","email":"dusan.djordjevic@itcentar.rs"}],"readme":"# Sentinel\n\nAI-powered code guardian that uses Claude for framework-agnostic code review, security analysis, and API testing.\n\n## What It Does\n\nSentinel is a pre-push git hook that automatically analyzes your code changes before they reach the repository. It uses Claude AI to:\n\n1. **Quick Sanity Check** - Catch obvious errors, syntax issues, and critical security vulnerabilities\n2. **Comprehensive Code Review** - Deep analysis of code quality, security, potential bugs, and adherence to project guidelines\n3. **API Security Testing** - Automatically detect, test, and validate API endpoints for functionality and security issues\n\n**The key difference**: This tool is **completely framework and language agnostic**. It uses AI intelligence to understand any codebase, rather than hardcoded rules.\n\n## Features\n\n- **Framework Agnostic** - Works with any language or framework (JavaScript, TypeScript, PHP, Python, Go, etc.)\n- **AI-Powered Analysis** - Uses Claude Code for intelligent code review\n- **Security First** - Blocks pushes with security vulnerabilities\n- **API Testing** - Automatically detects and tests API endpoints\n- **Project-Aware** - Reads CLAUDE.md for project-specific guidelines\n- **Customizable** - Configure what issues should block vs. warn\n- **Detailed Reports** - Terminal summaries + detailed markdown reports\n\n## Prerequisites\n\n1. **Node.js 18+** - Required to run the tool\n2. **Claude Code** - Must be installed and available in PATH\n   - Install from: https://claude.ai/download\n   - Verify with: `claude --version`\n3. **Git** - Must be a git repository\n\n## Installation\n\n### Global Installation (Recommended)\n\n```bash\nnpm install -g @dusan.djordjevic/sentinel\n```\n\n### Per-Project Installation\n\n```bash\nnpm install --save-dev @dusan.djordjevic/sentinel\n```\n\n## Quick Start\n\n1. **Navigate to your project**:\n   ```bash\n   cd your-project\n   ```\n\n2. **Initialize sentinel**:\n   ```bash\n   sentinel init\n   ```\n\n   This will:\n   - Create `.sentinel/config.yml`\n   - Install the pre-push git hook\n   - Set up reports directory\n   - Update `.gitignore`\n\n3. **Customize configuration** (optional):\n   Edit `.sentinel/config.yml` to adjust blocking rules\n\n4. **Create CLAUDE.md** (optional but recommended):\n   Add project-specific guidelines, coding standards, and context\n\n5. **Push your code**:\n   ```bash\n   git add .\n   git commit -m \"Your changes\"\n   git push  # <- The hook runs automatically here\n   ```\n\n## Managing False Positives with Ignores\n\nSometimes the AI may flag code that you know is safe (false positives), or you may have intentional design decisions that trigger warnings. The ignores system lets you tell the tool to skip these sections while still using them for context.\n\n### Two Ways to Ignore Code\n\n#### 1. Inline Comments (Quick & Temporary)\n\nAdd a comment directly in your code:\n\n```javascript\n// sentinel-ignore: Using Sequelize ORM - SQL injection prevented\nconst query = db.query('SELECT * FROM users WHERE id = ' + userId);\n\n// sentinel-ignore\n// Reason: Legacy endpoint scheduled for removal in v2.0\nfunction oldApiEndpoint() { ... }\n```\n\n#### 2. Ignores File (Permanent & Team-Wide)\n\nEdit `.sentinel/ignores.json`:\n\n```json\n{\n  \"ignores\": [\n    {\n      \"file\": \"src/api/users.js\",\n      \"line\": 45,\n      \"reason\": \"Using Sequelize ORM - SQL injection prevented\"\n    },\n    {\n      \"file\": \"database/migrations/**\",\n      \"line\": \"*\",\n      \"reason\": \"Migration files reviewed separately\"\n    }\n  ]\n}\n```\n\n### CLI Commands\n\n```bash\n# List all ignores\nsentinel ignores list\n\n# Add an ignore\nsentinel ignores add src/api/users.js:45 \"Using ORM\"\n\n# Ignore entire file\nsentinel ignores add src/legacy.js:* \"Legacy code\"\n\n# Remove an ignore\nsentinel ignores remove src/api/users.js:45\n\n# Check for stale ignores\nsentinel ignores validate\n```\n\n### Smart Validation\n\nClaude doesn't just skip ignored code - it **validates your ignore reasons**:\n\n```bash\n⚠️ Questionable Ignores Detected:\n\n1. src/api/users.js:45\n   Ignore Reason: \"Using ORM\"\n   Actual Issue: This is direct SQL concatenation, not ORM usage.\n                 The ignore reason appears incorrect.\n   Suggestion: Review this ignore - the code doesn't match the stated reason\n```\n\nThis prevents dangerous code from hiding behind incorrect ignore reasons!\n\n### When to Use Ignores\n\n**✅ Good Use Cases:**\n- False positives (AI incorrectly flags safe code)\n- Intentional design decisions with documented reasoning\n- Legacy code under controlled review process\n- Test fixtures and mock data\n\n**❌ Avoid:**\n- Hiding real security vulnerabilities\n- Using vague reasons like \"will fix later\"\n- Over-ignoring entire categories of issues\n\n## Configuration\n\nThe `.sentinel/config.yml` file controls the pipeline behavior:\n\n```yaml\nversion: 1\n\n# What should block the push?\nblock_on:\n  - security_vulnerabilities  # Any security issue blocks\n  - critical_bugs             # Critical severity bugs block\n  - api_security_issues       # API security issues block\n\n# Should we test APIs if changes are detected?\ntest_apis: true\n\n# Optional: Help Claude understand your project\nproject:\n  type: \"Laravel API\"  # e.g., \"React SPA\", \"Express API\"\n  description: \"RESTful API for e-commerce platform\"\n\n# Optional: Exclude specific paths from analysis\nexclude:\n  - legacy-code/\n  - generated/\n```\n\n## CLAUDE.md Integration\n\nCreate a `CLAUDE.md` file in your project root to provide context to the AI:\n\n```markdown\n# My Project\n\n## Architecture\n- Clean architecture with service layer\n- Repository pattern for data access\n- API versioning with /v1/, /v2/ prefixes\n\n## Coding Standards\n- Always use TypeScript strict mode\n- Prefer functional components in React\n- Use async/await over promises\n- Validate all user input with Zod\n\n## Security Requirements\n- All API endpoints require JWT authentication\n- Sanitize all database queries through Prisma ORM\n- Rate limit all public endpoints\n\n## Testing\n- Unit tests required for all services\n- E2E tests for critical user flows\n```\n\nThe AI will use this context to provide project-specific analysis.\n\n## How It Works\n\n### Stage 1: Quick Sanity Check (30-60s)\n\nFast scan for obvious issues:\n- Syntax errors\n- Hardcoded secrets (API keys, passwords)\n- Clear security vulnerabilities (SQL injection, XSS)\n- Committed sensitive files (.env, credentials)\n\n**Result**: Pass or Block\n\n### Stage 2: Comprehensive Code Review (2-5 min)\n\nDeep analysis covering:\n- **Security**: Injection vulnerabilities, auth issues, data exposure, crypto misuse\n- **Code Quality**: Architecture violations, code smells, error handling\n- **Potential Bugs**: Logic errors, race conditions, null checks, edge cases\n- **Project Standards**: Adherence to CLAUDE.md guidelines\n\n**Result**: Pass, Warn, or Block\n\n### Stage 3: API Testing (2-5 min, if applicable)\n\nIf API changes detected:\n1. Identify new/modified endpoints\n2. Detect where API is running (port, URL)\n3. Generate test scenarios (functionality + security)\n4. Execute tests against local API\n5. Validate responses and security\n\n**Result**: Pass or Block\n\n## Usage Examples\n\n### Manual Analysis\n\nRun analysis without pushing:\n\n```bash\nsentinel analyze\n```\n\n### Skip API Testing\n\n```bash\nsentinel analyze --skip-api\n```\n\n### Verbose Output\n\n```bash\nsentinel analyze --verbose\n```\n\n### Reinitialize (Force)\n\n```bash\nsentinel init --force\n```\n\n## Reports\n\nAfter each run, you'll get:\n\n1. **Terminal Summary** - Immediate feedback on issues\n2. **Detailed Markdown Report** - Saved to `.sentinel/reports/`\n\nExample report location:\n```\n.sentinel/reports/2024-11-15T14-30-45-blocked.md\n```\n\nReports include:\n- Summary of all stages\n- Detailed issue descriptions\n- File locations and line numbers\n- Suggestions for fixes\n- Test results (if applicable)\n\n## Example Output\n\n### Success\n\n```\n🛡️  Sentinel Code Guardian Starting...\n\nℹ️  Gathering context...\n✅ Analyzing 3 unpushed commit(s) on branch \"feature/user-auth\"\nℹ️  Changed files: 12\n\n🔍 Stage 1: Quick Sanity Check\n✅ Quick check passed\n✅ No critical issues found in quick scan\n\n🔍 Stage 2: Comprehensive Code Review\n✅ Code review passed\n✅ Code quality meets standards. 2 minor suggestions noted.\n\n🔍 Stage 3: API Security & Testing\nℹ️  Found 2 endpoint(s), preparing tests...\n⚠️  API testing requires your server to be running\nℹ️  Detected API URL: http://localhost:3000\nPress Enter when your API is running...\n✅ API tests passed\n✅ Tested 8 scenarios successfully\n\n──────────────────────────────────────────────────\n✅ All Checks Passed - Push Allowed!\n──────────────────────────────────────────────────\n\n📄 Report saved to: .sentinel/reports/2024-11-15T14-30-45-passed.md\n```\n\n### Blocked\n\n```\n🔍 Stage 2: Comprehensive Code Review\n❌ Code review failed - blocking issues found\n\n──────────────────────────────────────────────────\n❌ PUSH BLOCKED - Issues found in Stage 2\n──────────────────────────────────────────────────\n\nIssues Found:\n\nCRITICAL (2):\n\n1. SQL Injection vulnerability in user query\n   File: src/api/users.js:45\n   Fix: Use parameterized queries or ORM\n\n2. Hardcoded JWT secret in environment file\n   File: .env:12\n   Fix: Remove from .env and use environment variables\n\n📄 Full report saved to: .sentinel/reports/2024-11-15T14-32-10-blocked.md\n```\n\n## Troubleshooting\n\n### \"Claude Code not installed\"\n\nEnsure Claude is installed and in your PATH:\n```bash\nclaude --version\n```\n\nIf not installed: https://claude.ai/download\n\n### \"No unpushed commits found\"\n\nThe tool only analyzes changes that haven't been pushed to the remote. Commit and push once to establish a baseline.\n\n### API tests failing\n\n1. Ensure your API is running locally\n2. Check the detected URL in the output\n3. Verify the port matches your configuration\n4. Use `--skip-api` to skip API testing if needed\n\n### Hook not running\n\n1. Check if `.git/hooks/pre-push` exists and is executable\n2. Reinstall: `sentinel init --force`\n3. Verify git hooks aren't disabled: `git config core.hooksPath`\n\n## Development\n\n### Project Structure\n\n```\nsentinel/\n├── src/\n│   ├── index.js           # CLI entry point\n│   ├── commands/          # Commands (init, analyze)\n│   ├── core/              # Core logic (git, claude, orchestrator)\n│   ├── stages/            # Three analysis stages\n│   ├── reporters/         # Terminal and markdown reporters\n│   └── utils/             # Logger, config loader\n├── hooks/                 # Pre-push hook template\n├── templates/             # Config template\n└── package.json\n```\n\n### Testing Locally\n\n```bash\ncd sentinel\nnpm install\nnpm link\n\n# Now use in another project\ncd ../your-test-project\nsentinel init\n```\n\n## FAQ\n\n**Q: Does this work with monorepos?**\nA: Yes, it analyzes the entire diff from unpushed commits.\n\n**Q: What languages are supported?**\nA: All languages - the AI understands any codebase.\n\n**Q: Can I customize the AI prompts?**\nA: Currently no, but you can use CLAUDE.md to guide the analysis.\n\n**Q: Does this replace linters/formatters?**\nA: No, it complements them. Use both for best results.\n\n**Q: How much does it cost?**\nA: You need a Claude Code installation. Pricing depends on your Claude subscription.\n\n**Q: Can I use this in CI/CD (GitHub Actions, GitLab CI)?**\nA: Currently designed for pre-push hooks. CI/CD integration coming soon.\n\n## License\n\nMIT\n\n## Contributing\n\nContributions welcome! Please open an issue or PR.\n\n## Support\n\n- Issues: https://bitbucket.org/itc-solution/sentinel/issues\n- Repository: https://bitbucket.org/itc-solution/sentinel\n- Docs: This README\n- Claude Code: https://claude.ai/download\n","readmeFilename":"README.md"}